5


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

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

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"}));

此处显示了按钮,但我无法单击该按钮,并且对按钮鼠标悬停没有任何影响。我仍然无法弄清楚问题所在。

4

2 回答 2

7

好的,我已经浪费了很多时间试图找出问题所在。最后我找到了解决方案:

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

    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];
    }

这样事件被正确路由。

于 2010-12-29T08:19:29.403 回答
0

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

于 2010-12-28T15:10:11.137 回答