2012-02-10 10 views
3

注:私はこの問題を解決する方法を見つけましたので、私は参考のためにこの記事を投稿しています。Silverlight DataGrid MouseLeftButtonDownイベントが行をクリックしても表示されない

は私がUIElement.MouseLeftButtonDownに引っ掛けることにより、SilverlightのDataGridの上ダブルクリック機能性を提供しようとしているが、私はXAMLまたはDataGrid.MouseLeftButtonDown +=構文を使用してDataGrid.MouseLeftButtonDownに加入したときに、私は上をクリックしたときに、私のイベントハンドラが呼び出されていませんDataGrid内の行。ヘッダーをクリックすると、イベントが発生します。

私は親ユーザーコントロールレベルで同じイベントにサブスクライブする場合は、Silverlight RoutedEventsに基づいて期待されるが、その後、私はクリックがどこかのDataGridまたは上で発生したかどうかを検出する必要があるとして、イベントハンドラが正常に呼び出されます。

このUIElement.AddHandler構文を使用してイベントを購読すると、次に示すように、handlesEventsToo:trueパラメータに基づいて期待どおりに動作します。

dataGrid.AddHandler(UIElement.MouseLeftButtonDownEvent, 
        new MouseButtonEventHandler(dataGrid_MouseLeftButtonDown) 
        , handledEventsToo: true); 

私が最初に期待したものではありませんこれは、子のUIElementsの一つで、デフォルトでは、イベントバブリングを防止するため、扱いとしてDataGridの実装はこれらのイベントをマーキングされているようです。もっと考えれば、クリックの振る舞いはあらゆる種類のもの(項目の選択、フィールドの編集など)を駆動するので、おそらく実装が理にかなっていることがわかります。

答えて

2

私は同じ問題を抱えていたと私はイベントを発生さが、clickCountは値がここで常に1

あるのMouseLeftButtonUpそのための修正です使用:

private const int MOUSE_SENSITIVITY = 300; 

private DateTime _previousClick; 

private void exceptionsDataGrid_MouseLeftButtonUp(object sender, MouseButtonEventArgs e) 
{ 
     DataGrid dg = (sender as DataGrid); 
     DateTime current=DateTime.Now; 
     LoggerService.Exception exception = (LoggerService.Exception)dg.SelectedItem; 
     if (_previousClick != null) 
     { 
      TimeSpan clickSpan = current - _previousClick; 
      if (clickSpan.TotalMilliseconds < MOUSE_SENSITIVITY) 
      { 
       MessageBox.Show("You double clicked!"); 
      } 
     } 
     _previousClick = current; 
} 
関連する問題