首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >没有传递给WPF装饰器层的事件。

没有传递给WPF装饰器层的事件。
EN

Stack Overflow用户
提问于 2010-05-31 12:32:03
回答 2查看 4K关注 0票数 6

我试图在WPF中创建一个很好的“拖放区域”,当一些东西被拖动到主应用程序中时,它会显示在装饰层中。问题是,我没有从我的装饰器获得任何事件,尽管根据文档,它应该接收所有的输入事件,因为它是一个较高的z级。

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

我的装饰类构造如下:

代码语言:javascript
复制
    public ShellOverlayAdorner(UIElement element, AdornerLayer adornerLayer)
        :base(element)
    {
        _adornerLayer = adornerLayer;

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

并在主窗口中创建

代码语言:javascript
复制
    private void Window_Loaded(object sender, RoutedEventArgs e)
    {
        adornerLayer = AdornerLayer.GetAdornerLayer(MyTopGridWithButtonInIt);
        ShellOverlayAdorner shell = new ShellOverlayAdorner(MyTopGridWithButtonInIt, adornerLayer);

    }

我完全没有从我的控制任何事件,即没有鼠标点击,鼠标过去,按钮点击。我甚至不能点击装饰层中的按钮。我做错了什么?

EN

回答 2

Stack Overflow用户

发布于 2010-12-29 08:26:50

我不知道您是否已经尝试过:如果您希望添加元素来响应事件,我认为元素必须绑定到装饰器的可视树。做这件事的方法是使用一个对装饰者本身不合适的VisualCollection,,或者至少是这样,它似乎在工作:

代码语言:javascript
复制
    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];
    }

这样就可以正确地路由事件。

票数 12
EN

Stack Overflow用户

发布于 2011-04-06 09:41:58

我只是遇到了同样的问题。按照MSDN的建议对我进行了排序:

Adorner和任何其他FrameworkElement一样接收输入事件。因为装饰器的z阶总是高于它所装饰的元素,所以装饰器接收输入事件(例如Drop或MouseMove),这些事件可能是为底层装饰元素设计的。装饰器可以侦听某些输入事件,并通过重新引发事件将这些事件传递给底层装饰元素。

若要对装饰器下的元素启用传递命中测试,请在装饰器上将命中测试IsHitTestVisible属性设置为false。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2943525

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档