没有事件传递给WPF adorner层

时间:2010-05-31 12:32:04

标签: wpf adorner

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

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

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

    }

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

2 个答案:

答案 0 :(得分:11)

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

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

  

Adorners只接收输入事件   像任何其他FrameworkElement一样。   因为装饰品总是有更高的   z序比它所装饰的元素,   装饰者接收输入事件   (如Drop或MouseMove)可能   适用于底层装饰   元件。装饰师可以倾听   某些输入事件并传递这些事件   到底层的装饰元素   重新举起活动。

     

启用传递命中测试   装饰下的元素,设置命中   测试IsHitTestVisible属性   在装饰师身上是假的。

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