我正在尝试在WPF中创建一个漂亮的"拖放区域",当将某些内容拖入主应用程序时,该区域将显示在adorner层中.问题是我没有从我的装饰者那里得到任何事件,即使它根据文档应该接收所有输入事件,因为它处于更高的z顺序.
为了调试我的问题,我创建了一个非常简单的示例,其中我有一个用户控件,其中只有一个按钮.此用户控件显示在装饰图层中,但我无法单击该按钮.为什么?我做错了什么?
我的adorner类是这样构造的:
public ShellOverlayAdorner(UIElement element, AdornerLayer adornerLayer)
:base(element)
{
_adornerLayer = adornerLayer;
_overlayView = new AdornedElement();
_overlayView.AllowDrop = true;
_adornerLayer.Add(this);
}
Run Code Online (Sandbox Code Playgroud)
并在主窗口中创建
private void Window_Loaded(object sender, RoutedEventArgs e)
{
adornerLayer = AdornerLayer.GetAdornerLayer(MyTopGridWithButtonInIt);
ShellOverlayAdorner shell = new ShellOverlayAdorner(MyTopGridWithButtonInIt, adornerLayer);
}
Run Code Online (Sandbox Code Playgroud)
我没有从我的控制中获得任何事件,即没有鼠标点击,鼠标悬停,按钮点击.我甚至无法点击装饰图层中的按钮.我做错了什么?
nem*_*nos 11
我不知道您是否已经尝试过:如果您希望添加的元素对事件做出反应,我认为该元素必须绑定到装饰器的可视树.这样做的方法是使用一个VisualCollection,初始化为adorner本身,或者至少,这样它似乎正在工作:
VisualCollection visualChildren;
FrameworkElement @object;
public CustomAdorner(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)
这样就可以正确地路由事件.