.net 装饰器上的工具提示没有';我没有出现

.net 装饰器上的工具提示没有';我没有出现,.net,wpf,tooltip,hittest,adorner,.net,Wpf,Tooltip,Hittest,Adorner,我的装饰器定义如下: private class ErrorAdorner : Adorner { private readonly Border _errorBorder; public ErrorAdorner(UIElement adornedElement) : base(adornedElement) { _errorBorder = new Border();

我的装饰器定义如下:

    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
属性设置为非空值时,将向元素添加装饰器

我的问题是,当装饰器正确渲染时,当我将鼠标移到图像上时,图像上的工具提示不会显示。我知道这不是绑定问题:当我使用Snoop检查控件时,我可以看到
ToolTip
属性具有预期的值。我怀疑问题与命中测试有关,因为我无法在装饰器中接收任何与鼠标相关的事件。。。
ishitestvisible
属性设置为true,因此我不明白为什么不接收事件


有什么想法吗?

好的,这是以前也咬过我的东西。当您定义自己的可视化树时,仅仅返回可视化子级是不够的,您还需要告诉WPF您已经添加了它们。在构造函数末尾,只需添加以下内容:

this.AddVisualChild(_errorBorder);
this.AddLogicalChild(_errorBorder);
您还应该实现
LogicalChildren
属性:

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

如果您有多个孩子,我会使用
UIElementCollection
。它会将它们添加到可视化和逻辑树中,您可以从
LogicalChildren
VisualChildrenCount
GetVisualChild
覆盖中使用它。

是否可以尝试以编程方式打开工具提示?使用TooltipService?@AngelWPF,正如我所说,我没有收到任何鼠标事件,所以我怎么知道何时打开工具提示?装饰器已经没有收到任何鼠标事件,所以我认为它没有吞下任何东西。无论如何我都试过了,但是没有用……是的,我在发布这篇文章后意识到装饰者没有背景,所以可能没有得到它。元素是否已禁用?如果是这样,您可以使用ToolTipService.ShowOnDisabled=“True”允许它显示。不,它未被禁用。我也试着给自己加个背景,但也没用(而且无论如何,这不是一个可接受的解决方案,因为它会隐藏装饰元素),我要么称自己为白痴,要么因为我之前缺乏阅读理解力而声称缺乏咖啡因。我认为装饰元素有工具提示,但我没有意识到装饰器中的图像需要显示它。我已经清醒过来,确定了我的答案。