没有传递到WPF装饰器层的事件

没有传递到WPF装饰器层的事件,wpf,adorner,Wpf,Adorner,我试图在WPF中创建一个很好的“拖放区”,当一些东西被拖入主应用程序时,它会显示在装饰层中。问题是,我没有从我的装饰器中获取任何事件,即使根据文档,它应该接收所有输入事件,因为它处于更高的z顺序 为了调试我的问题,我创建了一个非常简单的示例,其中我有一个用户控件,其中只有一个按钮。此用户控件显示在装饰器层中,但我无法单击该按钮。为什么?我做错了什么 我的装饰器类是这样构造的: public ShellOverlayAdorner(UIElement element, AdornerLay

我试图在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);

    }

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

我不知道你是否已经试过了: 如果您希望添加元素以响应事件,我认为该元素必须绑定到装饰器的可视树。 这样做的方法是使用一个可视化集合,初始化到装饰器本身,或者至少,它看起来是这样工作的:

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

通过这种方式,事件被正确路由。

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

装饰器只接收输入事件 与任何其他框架元素一样。 因为一个装饰者总是有更高的 z阶比它所修饰的元素, 装饰器接收输入事件 (如Drop或MouseMove)可能 用于底层装饰 元素。一个装饰者可以倾听你的声音 某些输入事件并将其传递 到基础装饰元素 我们提出了这个事件

要启用的直通命中测试 装饰器下的元素,设置命中 将IshitteVisible属性测试为 装饰物上有假


i、 e在装饰器本身中,确保IshitteVisible=false对我来说工作正常。。。你确定没有在装饰器上将IshittetVisible设置为false吗?嗯。。奇怪,因为我在创建的所有测试项目中都得到了这个。不,我没有将IsHitTestVisible设置为false。我已经测试过将其设置为true和false以获得更改,但什么也没有发生。