2012-02-10 2 views
3

Примечание: Я нашел решение моей проблемы, поэтому размещаю это для справки, хотя я был бы рад получить образование с лучшим решением.Silverlight DataGrid MouseLeftButtonDown событие не отображается при нажатии на строки

Я пытаюсь обеспечить двойную функциональность нажмите на Silverlight DataGrid, зацепив в UIElement.MouseLeftButtonDown но когда я подписаться на DataGrid.MouseLeftButtonDown с помощью XAML или синтаксис DataGrid.MouseLeftButtonDown +=, мой обработчик не вызывается, когда я нажимаю на строки в DataGrid. Если я нажму на заголовок, событие будет поднято.

Если я подписываюсь на то же событие у родителя UserControl уровня, обработчик события вызывается успешно, как можно было бы ожидать на основе Silverlight RoutedEvents, но тогда я должен обнаружить, произошло ли щелчок на DataGrid или где-нибудь еще.

Если я подписываюсь на мероприятие, используя этот синтаксис UIElement.AddHandler, как показано ниже, он работает как ожидается на основе параметра handledEventsToo: true.

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

Представляется, что реализация DataGrid отмечает эти события как обработанные, предотвращение пузырения событий, по умолчанию в одном из дочернего UiElements, который не то, что я изначально ожидал. С большим размышлением я вижу, что поведение кликов приводит в движение всевозможные вещи (выберите элемент, поле редактирования и т. Д.), Поэтому, возможно, реализация имеет смысл.

ответ

2

У меня была такая же проблема, и я использовал MouseLeftButtonUp, который запускает событие, но значение ClickCount всегда 1.

Вот исправление для этого:

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; 
} 
Смежные вопросы