WPF 檢查滑鼠有沒有點到物件

  • 4043
  • 0
  • WPF
  • 2010-12-14

WPF 檢查滑鼠有沒有點到物件

在WPF中,XAML的樹狀的結構,主要分成兩種。

一種是LogicalTree,簡單的說就是訊息傳遞的路徑

另一種是VisualTree,就是我們視覺上的物件階層

 

會遇到這個主題,是因為我的WPF AP有一個DataGrid,

並且有滑鼠右鍵選單的功能,不過我希望滑鼠右鍵在有資料的ROW上面點選和單純DataGrid背景點選時

出現的Menu是不同的,所以我必須知道點下去的時候點到了哪個東西,進而找到了這個主題

 

在Row上點右鍵

image_thumb2

沒有在Row上點右鍵

image_thumb3

 

先簡單介紹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:   

 

這是我目前的解法