Страницы

Поиск по вопросам

воскресенье, 7 июля 2019 г.

Определение положения ToolTip относительно PlacementTarget

Доброго времени суток. Вожусь с собственным представлением ToolTip. Вопрос в следующем. Есть ToolTip у которого свойство Placement установлено как Right. Если элемент на котором отображается ToolTip не приближен к правой границе экрана и достаточно места для его отображения то ToolTip отображается правильно, если же не хватает, то ToolTip отображается как будто его свойство Placement установлено как Left. Подскажите как можно узнать с какой именно стороны, в данный момент отображен ToolTip.


Ответ

Возможно нашел решение, но оно не настолько изящно как хотелось бы. Собственно, есть два варианта решения:
Для ToolTip установить свойство Placement как Custom. Далее к свойству ToolTip CustomPopupPlacementCallback прикрепить делегат:
CustomPopupPlacement[] placeToolTip(Size popupSize, Size targetSize, Point offset)
в котором описать варианты отображения ToolTip. Второй вариант представляет собой определение размещения ToolTip относительно его родителя:
private void ToolTip_IsVisibleChanged(object sender, RoutedEventArgs e) { if ((bool)e.NewValue) { Point p = (sender as ToolTip).PointToScreen(new Point()); Point t = ((sender as ToolTip).PlacementTarget).PointToScreen(new Point());
if ((sender as ToolTip).Placement == PlacementMode.Right || (sender as ToolTip).Placement == PlacementMode.Left) { if (p.X > t.X) (sender as ToolTip).Placement = PlacementMode.Right; else if (p.X < t.X) (sender as ToolTip).Placement = PlacementMode.Left; }
if ((sender as ToolTip).Placement == PlacementMode.Bottom || (sender as ToolTip).Placement == PlacementMode.Top) { if (p.Y > t.Y) (sender as ToolTip).Placement = PlacementMode.Top; else if (p.Y < t.Y) (sender as ToolTip).Placement = PlacementMode.Bottom; } } }
Оба варианта работают, вот только как упоминалось выше, оба способа является не особо изящными.

Комментариев нет:

Отправить комментарий