Подсказка на Adorner не отображается - PullRequest
0 голосов
/ 04 августа 2011

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

    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 имеет ожидаемое значение.Я подозреваю, что проблема связана с тестированием попаданий, потому что я не могу получить любое событие, связанное с мышью, в adorner ... Свойство IsHitTestVisible установлено в true, поэтому я не понимаю, почему яне получать события.

Есть идеи?

1 Ответ

2 голосов
/ 04 августа 2011

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

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

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

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

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

...