Wpf Adorner没有回应互动

nem*_*nos 5 wpf adorner adornerlayer


我正在尝试在wpf中创建一个叠加层(背景变暗),类似于在网络上可以找到弹出图像的叠加层.我希望它可以在应用程序的多个部分中重用,具有不同类型的内容.

这是adorner类的构造函数的临时代码(只是为了尝试)

private readonly Grid _grid = new Grid();

public DarkOverlayAdorner(UIElement adornedElement, Object content) :
        base(adornedElement)
{
     _grid.Background = new SolidColorBrush(Color.FromArgb(99, 0, 0, 0));
     IsHitTestVisible = true;
     var visual = content as UIElement;
     if (visual != null)
        _grid.Children.Add(visual);
}
Run Code Online (Sandbox Code Playgroud)

另外在课堂上(当然),我有MeasureOverride和ArrangeOverride的ovverrides给予装饰者正确的装饰元素大小,GetVisualChild和VisualChildCount ......

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

AdornerLayer layer = AdornerLayer.GetAdornerLayer(textBoxProva);
layer.Add(new DarkOverlayAdorner(textBoxProva, new Button{Content = "prova"}));
Run Code Online (Sandbox Code Playgroud)

此处显示按钮,但我无法单击该按钮,并且不会对按钮鼠标悬停应用任何效果.我仍然无法弄清楚问题.

nem*_*nos 7

好吧,我已经失去了很多时间试图找出问题所在.最后我找到了解决方案:

如果您希望添加的元素对事件做出反应,我认为该元素必须绑定到装饰器的可视树.这样做的方法是使用一个VisualCollection,初始化为adorner本身:

    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];
    }
Run Code Online (Sandbox Code Playgroud)

这样就可以正确地路由事件.