Подсказка на Adorner не отображается

У меня есть украшение, определенное следующим образом:

    private class ErrorAdorner : Adorner
    {
        private readonly Border _errorBorder;

        public ErrorAdorner(UIElement adornedElement)
            : base(adornedElement)
        {
            _errorBorder = new Border();
            _errorBorder.BorderThickness = new Thickness(2);
            _errorBorder.BorderBrush = Brushes.Red;
            Image img = new Image();
            img.HorizontalAlignment = HorizontalAlignment.Right;
            img.VerticalAlignment = VerticalAlignment.Center;
            img.Stretch = Stretch.None;
            Binding imgBinding = new Binding
            {
                Source = adornedElement,
                Path = new PropertyPath(IconProperty)
            };
            img.SetBinding(Image.SourceProperty, imgBinding);
            Binding ttBinding = new Binding
            {
                Source = adornedElement,
                Path = new PropertyPath(ErrorMessageProperty)
            };
            img.SetBinding(ToolTipProperty, ttBinding);
            _errorBorder.Child = img;
        }

        protected override Size MeasureOverride(Size constraint)
        {
            AdornedElement.Measure(constraint);
            return AdornedElement.RenderSize;
        }

        protected override Size ArrangeOverride(Size finalSize)
        {
            _errorBorder.Arrange(new Rect(finalSize));
            return finalSize;
        }

        protected override Visual GetVisualChild(int index)
        {
            if (index == 0)
                return _errorBorder;
            throw new ArgumentOutOfRangeException("index");
        }

        protected override int VisualChildrenCount
        {
            get
            {
                return 1;
            }
        }
    }

ErrorMessage и Icon — присоединенные свойства, объявленные во включающем классе (ErrorProvider). Украшение добавляется к элементу, когда для свойства ErrorMessage установлено ненулевое значение.

Моя проблема в том, что, хотя украшение отображается правильно, ToolTip на изображении не отображается, когда я навожу на него указатель мыши. Я знаю, что это не проблема привязки: когда я проверяю элементы управления с помощью Snoop, я вижу, что свойство ToolTip имеет ожидаемое значение. Я подозреваю, что проблема связана с проверкой нажатий, потому что я не могу получить какое-либо событие, связанное с мышью, в декораторе... Для свойства IsHitTestVisible установлено значение true, поэтому я не понимаю, почему я не не получают события.

Есть идеи?


person Thomas Levesque    schedule 04.08.2011    source источник
comment
Можете ли вы попробовать открыть всплывающую подсказку программно? Используете TooltipService?   -  person WPF-it    schedule 04.08.2011
comment
@AngelWPF, как я уже сказал, я не получаю никаких событий мыши, так как я узнаю, когда открывать всплывающую подсказку?   -  person Thomas Levesque    schedule 04.08.2011


Ответы (1)


Хорошо, это то, что укусило меня и раньше. Когда вы определяете собственное визуальное дерево, недостаточно просто вернуть визуальные дочерние элементы, вам также необходимо сообщить WPF, что вы их добавили. В конце вашего конструктора просто добавьте это:

this.AddVisualChild(_errorBorder);
this.AddLogicalChild(_errorBorder);

Вы также должны реализовать свойство LogicalChildren:

protected override System.Collections.IEnumerator LogicalChildren
{
    get 
    { 
        yield return _errorBorder;
    }
}

Если бы у вас было несколько детей, я бы использовал UIElementCollection. Он добавит их в визуальное и логическое деревья, и вы можете просто использовать его из переопределений LogicalChildren, VisualChildrenCount и GetVisualChild.

person Abe Heidebrecht    schedule 04.08.2011
comment
Adorner уже не получает никаких событий мыши, поэтому я не думаю, что он что-то проглатывает. Я как-то пробовал, но не получается... - person Thomas Levesque; 04.08.2011
comment
Да, я понял после публикации этого, что у Adorner нет фона, так что, вероятно, он его не понимает. Элемент отключен? Если это так, вы можете использовать ToolTipService.ShowOnDisabled=True, чтобы разрешить его отображение. - person Abe Heidebrecht; 04.08.2011
comment
Нет, не отключен. Я также пытался поставить фон, но он тоже не работает (и в любом случае это не будет приемлемым решением, так как оно скроет украшаемый элемент) - person Thomas Levesque; 04.08.2011
comment
Я либо назову себя идиотом, либо заявлю о недостатке кофеина из-за того, что раньше не понимал прочитанного. Я думал, что у украшенного элемента есть всплывающая подсказка, и я не понимал, что Изображение в украшении должно показывать это. Я пришел в себя и зафиксировал свой ответ. - person Abe Heidebrecht; 04.08.2011