2012-01-17 9 views
1

DataGridをダブルクリックしたときに特定の操作を実行するには、アプリが必要です。スクロールバーがダブルクリックされた場合、アクションは実行しないでください。だから私は、ダブルクリックされているかを確認してみてください:DataGridでダブルクリックでスクロールバーがクリックされていないか確認する

private void DataGrid_MouseDoubleClick(object sender, MouseButtonEventArgs e) 
     { 
      Point p = Mouse.GetPosition(this.DataGrid1); 
      IInputElement ie = this.DataGrid1.InputHitTest(p); 
     } 

しかし、私はスクロールバーをダブルクリックすると、その後、IInputElementはもののすべての並べ替えのように見える: Microsoft.Windows.Themes.ScrollChromeまたはSystem.Windows.Shapes.Rectangle。だから私はスクロールバーをクリックしたかわからない。

スクロールバーを実際にダブルクリックしたかどうかを確認するにはどうすればよいですか?

答えて

4

ここでヒットテストを使用する必要はありません。e.OriginalSourceの親がScrollBarのタイプであるかどうかを確認するには、ビジュアルツリーをトラバースしてください。このアプローチには1つの潜在的な問題があります。UI要素をロードする必要があります。これは、マウスイベントを処理する場合によく使用されます。 Heresは、UIElementが特定の型の親を持っているかどうかをチェックするコードです。

public static T GetParentOfType<T>(DependencyObject current) 
      where T : DependencyObject 
     { 
      for (DependencyObject parent = VisualTreeHelper.GetParent(current); 
       parent != null; 
       parent = VisualTreeHelper.GetParent(parent)) 
      { 
       T result = parent as T; 

       if (result != null) 
        return result; 
      } 

      return null; 
     } 
+0

回答ありがとうございます!ちなみに、テキストセルをダブルクリックすると、e.OriginalSourceでTextBlockが取得され、VisualTreeHelper.GetParentはnullを返します。なぜなのかご存知ですか? –

+0

@ Bogdan0x400あなたはどのようなタイプをTとして渡しますか? –

+0

私はこのコードを使用しません。私はセルをダブルクリックするとVisualTreeHelper.GetParent(e.OriginalSource)を試してみて、驚いたことにnullを返します。 –

関連する問題