Wpf Adorner没有回应互动

时间:2010-12-28 13:17:49

标签: 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);
}

此外,在课堂上(当然),我还有MeasureOverride和ArrangeOverride的ovverrides,为装饰者提供正确尺寸的装饰元素,GetVisualChild和VisualChildCount ......

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

AdornerLayer layer = AdornerLayer.GetAdornerLayer(textBoxProva);
layer.Add(new DarkOverlayAdorner(textBoxProva, new Button{Content = "prova"}));

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

2 个答案:

答案 0 :(得分: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];
    }

这样就可以正确路由事件。

答案 1 :(得分:0)

您可能需要查看ChildWindow中的Extended WPF Toolkit控件。它是一个控件,弹出一个带有模态背景效果的窗口,你可以指定放在窗口内的内容。