WPF 檢查滑鼠有沒有點到物件
在WPF中,XAML的樹狀的結構,主要分成兩種。
一種是LogicalTree,簡單的說就是訊息傳遞的路徑
另一種是VisualTree,就是我們視覺上的物件階層
會遇到這個主題,是因為我的WPF AP有一個DataGrid,
並且有滑鼠右鍵選單的功能,不過我希望滑鼠右鍵在有資料的ROW上面點選和單純DataGrid背景點選時
出現的Menu是不同的,所以我必須知道點下去的時候點到了哪個東西,進而找到了這個主題
在Row上點右鍵
沒有在Row上點右鍵
先簡單介紹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:
這是我目前的解法