我正在尝试在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"}));
此处显示按钮,但我无法单击该按钮,并且不会对按钮鼠标悬停应用任何效果。 我仍然无法弄清楚问题。
答案 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控件。它是一个控件,弹出一个带有模态背景效果的窗口,你可以指定放在窗口内的内容。