没有事件传递给 WPF 装饰层

Posted

技术标签:

【中文标题】没有事件传递给 WPF 装饰层【英文标题】:No events passed to WPF adorner layer 【发布时间】:2010-05-31 12:32:03 【问题描述】:

我正在尝试在 WPF 中创建一个漂亮的“拖放区”,当某些东西被拖入主应用程序时,它会显示在装饰层中。问题是我没有从我的装饰器那里得到任何事件,即使根据文档它应该接收所有输入事件,因为它处于更高的 z 顺序。

为了调试我的问题,我创建了一个非常简单的示例,其中我有一个用户控件,其中只有一个按钮。此用户控件显示在装饰层中,但我无法单击该按钮。为什么?我做错了什么?

我的装饰类是这样构造的:

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

    

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

【问题讨论】:

它对我来说工作正常...你确定你没有在你的装饰器上将 IsHitTestVisible 设置为 false 吗? 嗯.. 奇怪,因为我为我创建的所有测试项目都得到了这个。不,我没有将 IsHitTestVisible 设置为 false。我已经测试将其设置为 true 和 false 以获得更改,但没有任何反应。 【参考方案1】:

我不知道您是否已经尝试过: 如果您希望添加的元素对事件做出反应,我认为该元素必须绑定到装饰器的可视化树。 这样做的方法是使用 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];
    

这样事件被正确路由。

【讨论】:

【参考方案2】:

我也遇到了同样的问题。按照 MSDN 的建议为我排序:

装饰器只接收输入事件 像任何其他 FrameworkElement 一样。 因为装饰者总是有更高的 z-order 比它装饰的元素, 装饰器接收输入事件 (例如 Drop 或 MouseMove)可能 用于底层装饰 元素。装饰者可以聆听 某些输入事件并将其传递给 到底层的装饰元素 重新提出事件。

启用直通命中测试 装饰器下的元素,设置命中 测试 IsHitTestVisible 属性到 装饰器上的错误。

即在装饰器本身中,确保 IsHitTestVisible = false

【讨论】:

以上是关于没有事件传递给 WPF 装饰层的主要内容,如果未能解决你的问题,请参考以下文章

Android 事件分发事件分发源码分析 ( 驱动层通过中断传递事件 | WindowManagerService 向 View 层传递事件 )

WPF button 的点击事件怎么传递参数到事件中

将触摸事件传递给 UICollectionViewCell 内容?

关于android中事件传递和分发的一些小理解

《深入浅出WPF》学习笔记之深入浅出话事件

如何将html5画布上的点击事件传递给兄弟画布元素上的事件监听器