轉帖|其它|編輯:郝浩|2011-03-09 13:11:11.000|閱讀 910 次
概述:在WPF中,XAML的樹狀的結構,主要分成兩種。一種是LogicalTree,簡單的說就是訊息傳遞的路徑;另一種是VisualTree,就是我們視覺上的物件階層。會遇到這個主題,是因為我的WPF AP有一個DataGrid,并且有滑鼠右鍵選單的功能,不過我希望滑鼠右鍵在有資料的ROW上面點選和單純DataGrid背景點選時出現的Menu是不同的,所以我必須知道點下去的時候點到了哪個東西,進而找到了這個主題。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
在WPF中,XAML的樹狀的結構,主要分成兩種。一種是LogicalTree,簡單的說就是訊息傳遞的路徑;另一種是VisualTree,就是我們視覺上的物件階層。會遇到這個主題,是因為我的WPF AP有一個DataGrid,并且有滑鼠右鍵選單的功能,不過我希望滑鼠右鍵在有資料的ROW上面點選和單純DataGrid背景點選時出現的Menu是不同的,所以我必須知道點下去的時候點到了哪個東西,進而找到了這個主題。
在Row上點右鍵
沒有在Row上點右鍵
先簡單介紹InputHitTest
先簡單介紹InputHitTest
他定義在UIElement中,回傳IInputElement介面
主要功能是依據傳入的座標取得此座標下的物件
而傳入的座標是相對于唿叫此方法的物件
再來會用到VisualTreeHelper.GetParent這個方法
他會依據視覺樹找到傳入物件的上層物件
因此,要完成檢查滑鼠是不是有點到ROW
只要不斷往上找,看有沒有找到DataGridRow
如果已經找到DataGrid了卻還沒遇到DataGridRow,那就表示沒有點在ROW上
程式碼像是這樣:
1: private void ClearSelect(object obj) {
2: System.Windows.Controls.DataGrid dg = obj as System.Windows.Controls.DataGrid;
3: System.Windows.IInputElement element = dg.InputHitTest(Mouse.GetPosition(dg));
4: while (element != dg) {
5: if (element != null && element is System.Windows.Controls.DataGridRow) {
6: //有點到資料,看要做甚麼
7: return;
8: } else {
9: element = System.Windows.Media.VisualTreeHelper.GetParent(element as System.Windows.DependencyObject) as System.Windows.IInputElement;
10: }
11: }
12: //沒點到資料,看要做甚麼
13: }
14:
本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉載自:網絡轉載