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)
此处显示按钮,但我无法单击该按钮,并且不会对按钮鼠标悬停应用任何效果.我仍然无法弄清楚问题.
好吧,我已经失去了很多时间试图找出问题所在.最后我找到了解决方案:
如果您希望添加的元素对事件做出反应,我认为该元素必须绑定到装饰器的可视树.这样做的方法是使用一个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)
这样就可以正确地路由事件.
| 归档时间: |
|
| 查看次数: |
1451 次 |
| 最近记录: |