如何在装饰层下触发事件

3

我想要点击装饰层下的一个按钮。当然,在可视树中,装饰层与控件是不同的分支。 无法处理PreviewMouseDown事件

怎样才能在装饰层下触发事件呢?

XAML如下:

<Canvas Name="_canvas" Width="100" Height="100">
    <Button Name="_btn" Width="120" Height="120"/>
</Canvas>

以下是codebehind。

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);
    }
}
2个回答

5

如果您不需要Adorner进行命中测试,请将GrayAdorner的IsHitTestVisible属性设置为false。鼠标事件将忽略Adorner并传递到下面的按钮。


谢谢,sjw。我在装饰器类的构造函数中添加了"IsHitTestVisible = False"。这样就完成了。非常感谢! - Kei Okuma

0
尝试使用一个带有子控件的装饰器(需要设置IsHitTestVisible = True):
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);
            }));
        });
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接