2010-03-29 42 views
6

我有一個裝飾邊框的Adorner(請看下面的截圖)。然而,只有在裝飾者中點擊元素時纔會引發Adorner的MouseDown事件。當點擊裝飾元素上方的裝飾物中的任何位置時,我需要引發MouseDown事件。如何才能做到這一點?我是否必須在裝飾者中添加透明控件,或者有其他方法嗎?謝謝你的幫助!WPF:Adorner命中測試/ 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); 
    } 
} 

回答

3

當我已經在過去做到了這一點,我一直使用的透明容器。有一個null Brush是不夠的;你實際上需要使用顏色#00000000(或其他一些alpha 0顏色)。您可以關閉容器內部元素的IsHitTestVisible,以便容器將接收所有鼠標停止事件。

+0

感謝您的回覆,但您如何在裝飾者上設置畫筆? drawingcontext並填充整個渲染? – 2010-03-29 02:33:23

+0

好吧,明白了(只需使用drawingcontext繪製一個透明的矩形,沒什麼特別的),它工作正常!非常感謝你!仍然想知道你是否真的需要一個額外的矩形。無論如何,它現在只是工作。 – 2010-03-29 12:30:18

1

所以問題在於你的裝飾者只能在你的裝飾中有可見元素的地方舉起鼠標事件......角落裏的兩個方格。

如果您想要在整個元素中監聽mouseevents,您應該註冊AdornedElement.PreviewMouseDown這會讓您的裝飾者有機會在裝飾元素觸發MouseDown事件之前完成其工作。

+0

你好邁克,我試過,對我來說它不工作? – 2010-03-29 12:30:36