C# WPF:装饰器命中测试/鼠标下降事件

C# WPF:装饰器命中测试/鼠标下降事件,c#,wpf,adorner,C#,Wpf,Adorner,我有一个装饰边框的装饰器(请参见下面的屏幕截图)。但是,仅当单击装饰器中的元素时,才会引发装饰器的MouseDown事件。我需要在单击装饰元素上方装饰器中的任何位置时引发MouseDown事件。如何做到这一点?我是否必须在装饰器中添加透明控件,或者是否有其他方法?谢谢你的帮助 截图和VS 2008项目: 装饰器的代码: class myAdorner : Adorner { public myAdorner(UIElement element) : base(elemen

我有一个装饰边框的装饰器(请参见下面的屏幕截图)。但是,仅当单击装饰器中的元素时,才会引发装饰器的MouseDown事件。我需要在单击装饰元素上方装饰器中的任何位置时引发MouseDown事件。如何做到这一点?我是否必须在装饰器中添加透明控件,或者是否有其他方法?谢谢你的帮助

截图和VS 2008项目:

装饰器的代码:

class myAdorner : Adorner
{
    public myAdorner(UIElement element)
        : base(element)
    {
        this.MouseDown += new System.Windows.Input.MouseButtonEventHandler(myAdorner_MouseDown);
    }


    void myAdorner_MouseDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
    {
        MessageBox.Show("ok");
    }


    // Draws two rectangles: one in the upper-left and another one in the lower-right corner
    protected override void OnRender(System.Windows.Media.DrawingContext drawingContext)
    {
        Size size = this.AdornedElement.RenderSize;

        Rect r1 = new Rect(0.5, 0.5, 20, 20);
        Rect r4 = new Rect(size.Width - 20.5, size.Height - 20.5, 20, 20);


        SolidColorBrush brush = new SolidColorBrush(Colors.AliceBlue);
        Pen pen = new Pen(Brushes.Black, 1);

        drawingContext.DrawRectangle(brush, pen, r1);
        drawingContext.DrawRectangle(brush, pen, r4);
    }
}

当我在过去这样做的时候,我总是使用一个透明的容器。光有一个空笔刷是不够的;实际上,您需要使用颜色#00000000(或其他alpha 0颜色)。您可以为容器内的元素禁用IshittesVisible,以便容器将接收所有鼠标按下事件。

因此,问题是,您的装饰器只能在装饰器中有可见元素的地方引发鼠标事件…角落中的两个正方形


如果要在正在装饰的元素中侦听鼠标事件,应注册AdornedElement.PreviewMouseDown这将使装饰程序有机会在装饰元素触发MouseDown事件之前完成其工作。

感谢您的回复,但如何在装饰程序上设置笔刷?drawingcontext并填充整个rendersize?好的,明白了(只需使用drawingcontext绘制一个透明的矩形,没什么特别的),它工作得很好!非常感谢你!仍然想知道你是否真的需要一个额外的矩形。不管怎样,它现在只是工作。