Wpf装饰程序不响应交互

Wpf装饰程序不响应交互,wpf,adorner,adornerlayer,Wpf,Adorner,Adornerlayer,我正在尝试在wpf中创建一个覆盖(背景变暗),类似于您可以在web上找到的用于弹出图像的覆盖。 我希望它能够在应用程序的多个部分中重用,并具有不同类型的内容 这是adorner类的构造函数的临时代码(仅供尝试) 除此之外(当然),我还有MeasureOverride和ArrangeOverride的ovverrides,用于为装饰器提供装饰元素、GetVisualChild和VisualChildCount的正确大小 这里的问题是正确显示了装饰器,但没有在装饰元素上应用任何事件或行为。例如: A


我正在尝试在wpf中创建一个覆盖(背景变暗),类似于您可以在web上找到的用于弹出图像的覆盖。 我希望它能够在应用程序的多个部分中重用,并具有不同类型的内容

这是adorner类的构造函数的临时代码(仅供尝试)

除此之外(当然),我还有MeasureOverride和ArrangeOverride的ovverrides,用于为装饰器提供装饰元素、GetVisualChild和VisualChildCount的正确大小

这里的问题是正确显示了装饰器,但没有在装饰元素上应用任何事件或行为。例如:

AdornerLayer layer = AdornerLayer.GetAdornerLayer(textBoxProva);
layer.Add(new DarkOverlayAdorner(textBoxProva, new Button{Content = "prova"}));
此处显示的按钮,但我无法单击该按钮,并且不会对按钮鼠标上方产生任何影响。
我仍然无法找出问题所在。

您可能需要查看中的控件。它是一个弹出具有模式背景效果的窗口的控件,您可以指定要放在窗口内的内容。

好的,我花了很多时间试图找出问题所在。 最后我找到了解决办法:

如果您希望添加元素以响应事件,我认为该元素必须绑定到装饰器的可视树。 方法是使用一个可视化集合,初始化到装饰器本身:

    VisualCollection visualChildren;
    FrameworkElement @object;

    public DarkOverlayAdorner(UIElement adornedElement) :
        base(adornedElement)
    {
        visualChildren = new VisualCollection(this);
        @object = new Button {Content = "prova"};
        visualChildren.Add(@object);
    }
    protected override Visual GetVisualChild(int index)
    {
        return visualChildren[index];
    }

通过这种方式,事件被正确地路由。

谢谢,这可能是一个更好的解决方案(而且是免费的),但与此同时,我更愿意了解我的问题是什么
    VisualCollection visualChildren;
    FrameworkElement @object;

    public DarkOverlayAdorner(UIElement adornedElement) :
        base(adornedElement)
    {
        visualChildren = new VisualCollection(this);
        @object = new Button {Content = "prova"};
        visualChildren.Add(@object);
    }
    protected override Visual GetVisualChild(int index)
    {
        return visualChildren[index];
    }