WPF:Adorner命中测试/ MouseDown事件

时间:2010-03-29 01:13:56

标签: c# wpf adorner

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

截图和VS 2008项目:http://cid-0432ee4cfe9c26a0.skydrive.live.com/browse.aspx/%C3%96ffentlich?uc=2

装饰代码:

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

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

所以问题是你的装饰师只能在你的装饰师中有可见元素的地方举起鼠标事件......角落里的两个方格。

如果您想要在整个元素中监听鼠标事件,您应该注册AdornedElement.PreviewMouseDown这将使您的装饰者有机会在装饰元素触发MouseDown事件之前完成其工作。