WPF装饰层未传递任何事件

6
我正在尝试在WPF中创建一个漂亮的“拖放区域”,当将某些内容拖入主应用程序时,它会显示在adorner层中。问题是,即使我的adorner处于更高的z顺序中,我仍然无法从其中获得任何事件,尽管根据文档,它应该接收所有输入事件。
为了调试我的问题,我创建了一个非常简单的示例,其中只有一个按钮的用户控件。这个用户控件显示在adorner层中,但我无法点击该按钮。为什么?我做错了什么?
我的adorner类构造如下:
    public ShellOverlayAdorner(UIElement element, AdornerLayer adornerLayer)
        :base(element)
    {
        _adornerLayer = adornerLayer;

        _overlayView = new AdornedElement();
        _overlayView.AllowDrop = true;
        _adornerLayer.Add(this);
     }

并由主窗口创建

    private void Window_Loaded(object sender, RoutedEventArgs e)
    {
        adornerLayer = AdornerLayer.GetAdornerLayer(MyTopGridWithButtonInIt);
        ShellOverlayAdorner shell = new ShellOverlayAdorner(MyTopGridWithButtonInIt, adornerLayer);

    }

我从我的控件中没有得到任何事件,例如鼠标单击、鼠标悬停、按钮单击。我甚至无法在装饰层中单击按钮。我做错了什么?


1
对我来说它运行得很好...你确定你没有在你的装饰器上将IsHitTestVisible设置为false吗? - Thomas Levesque
嗯...奇怪,因为我创建的所有测试项目都会出现这种情况。不,我没有将IsHitTestVisible设置为false。我已经尝试将其设置为true和false以进行更改,但什么都没有发生。 - Johanna
2个回答

12

我不知道你是否已经尝试过这样做: 如果您想要添加到反应事件的元素,我认为该元素必须绑定到装饰器的可视树。 实现这个目标的方法是使用一个 VisualCollection,初始化为装饰器本身,或者至少,这种方式似乎是有效的:

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

这种方式可以正确地路由事件。


1

我有同样的问题。按照MSDN的建议,成功解决了:

Adorners像任何其他FrameworkElement一样接收输入事件。 由于adorner始终具有高于其所装饰元素的z顺序, 所以adorner接收输入事件(例如Drop或MouseMove), 可能是针对底层被装饰元素的。 adorner可以监听某些输入事件,并通过重新引发事件将这些事件传递给底层被装饰的元素。

为了启用在adorner下面的元素的穿透式命中测试, 请在adorner上将hit test IsHitTestVisible属性设置为false。

也就是说,在adorner本身中,请确保IsHitTestVisible = false。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接