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

235
14 марта 2018, 03:52

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

Answer 1

Возможно нашел решение, но оно не настолько изящно как хотелось бы. Собственно, есть два варианта решения:

  1. Для ToolTip установить свойство Placement как Custom. Далее к свойству ToolTip CustomPopupPlacementCallback прикрепить делегат:

    CustomPopupPlacement[] placeToolTip(Size popupSize,
                                        Size targetSize,
                                        Point offset)
    

    в котором описать варианты отображения ToolTip.

  2. Второй вариант представляет собой определение размещения 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;
            }
        }
    }
    

Оба варианта работают, вот только как упоминалось выше, оба способа является не особо изящными.

READ ALSO
Как сгенерировать числа c#

Как сгенерировать числа c#

Доброго времени суток! Как сгенерировать числа для стекаФункция Generate - ввыводит, но потом не могу отобразить ее через Display()

316
Задать номер месяца по его названию. C#

Задать номер месяца по его названию. C#

Имеется ComboBox, который хранит месяца года в текстовом форматеКак можно записать номер месяца в DataTime?

316
Вызов конструктора наследуемого типа C#

Вызов конструктора наследуемого типа C#

ЗдравствуйтеУ меня есть вопрос, возможно ли вызвать конструктор объекта, если точно не знаешь какого он типа? От одного базового класса наследуются...

310