2

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

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

xaml 如下。

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

代码隐藏如下。

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);
    }
}
4

2 回答 2

4

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

于 2014-07-01T03:57:41.060 回答
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);
            }));
        });
    }
于 2020-11-21T15:31:39.950 回答