C# WPF:装饰器命中测试/鼠标下降事件
我有一个装饰边框的装饰器(请参见下面的屏幕截图)。但是,仅当单击装饰器中的元素时,才会引发装饰器的MouseDown事件。我需要在单击装饰元素上方装饰器中的任何位置时引发MouseDown事件。如何做到这一点?我是否必须在装饰器中添加透明控件,或者是否有其他方法?谢谢你的帮助 截图和VS 2008项目: 装饰器的代码:C# WPF:装饰器命中测试/鼠标下降事件,c#,wpf,adorner,C#,Wpf,Adorner,我有一个装饰边框的装饰器(请参见下面的屏幕截图)。但是,仅当单击装饰器中的元素时,才会引发装饰器的MouseDown事件。我需要在单击装饰元素上方装饰器中的任何位置时引发MouseDown事件。如何做到这一点?我是否必须在装饰器中添加透明控件,或者是否有其他方法?谢谢你的帮助 截图和VS 2008项目: 装饰器的代码: class myAdorner : Adorner { public myAdorner(UIElement element) : base(elemen
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绘制一个透明的矩形,没什么特别的),它工作得很好!非常感谢你!仍然想知道你是否真的需要一个额外的矩形。不管怎样,它现在只是工作。