首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Adorner层下触发事件

如何在Adorner层下触发事件
EN

Stack Overflow用户
提问于 2014-07-01 03:44:59
回答 2查看 1.3K关注 0票数 2

我想点击Adorner层下的按钮。当然,在可视树中,Adorner与控件是不同的分支。Not able to handle PreviewMouseDown

如何在装饰层下触发事件?

xaml在下面。

代码语言:javascript
复制
<Canvas Name="_canvas" Width="100" Height="100">
    <Button Name="_btn" Width="120" Height="120"/>
</Canvas>

代码隐藏在下面。

代码语言:javascript
复制
public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        Loaded += delegate { AdornerLayer.GetAdornerLayer(_canvas).Add(new GrayAdorner(_canvas)); };

        _btn.Click += (sender, e) => MessageBox.Show("Mouse Click is working.");
    }
}

public class GrayAdorner : Adorner
{
    public GrayAdorner(UIElement element)
        : base(element) { }

    protected override void OnRender(DrawingContext drawingContext)
    {
        drawingContext.DrawRectangle(Brushes.Gray, null, new Rect(new Point(0, 0), DesiredSize));
        base.OnRender(drawingContext);
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-07-01 03:57:41

如果不需要Adorner被测试,请将GrayAdorner的GrayAdorner属性设置为false。鼠标事件将忽略Adorner并传递到下面的Button。

票数 4
EN

Stack Overflow用户

发布于 2020-11-21 15:31:39

对于带有子控件的Adorner (需要为IsHitTestVisible =True)尝试这样做:

代码语言:javascript
复制
private void AdornerChildMouseDown(object sender, MouseButtonEventArgs e)
    {
        Adorner parentAdorner = VisualTreeHelper.GetParent(sender as DependencyObject) as Adorner;

        Trace.WriteLine("Adorner Child clicked");
        parentAdorner.Visibility = Visibility.Collapsed;

        Task.Factory.StartNew(() =>
        {
            Application.Current.Dispatcher.BeginInvoke(new Action(() =>
            {
                UIElement underMouse = Mouse.DirectlyOver as UIElement;
                if (underMouse != null) underMouse.RaiseEvent(e);
            }));
        });
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24502160

复制
相关文章

相似问题

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