2012-02-10 2 views
3

Note: J'ai trouvé une solution à mon problème et je le poste à des fins de référence, bien que je serais heureux d'être éduqué avec une meilleure solution.Silverlight DataGrid Événement MouseLeftButtonDown non déclenché en cliquant sur les lignes

Je suis en train de fournir un double clic fonctionnalité sur un DataGrid Silverlight en accrochant dans le UIElement.MouseLeftButtonDown mais quand je souscris à l'DataGrid.MouseLeftButtonDown en utilisant XAML ou la syntaxe DataGrid.MouseLeftButtonDown +=, mon gestionnaire d'événements est pas appelé quand je clique sur les lignes dans le DataGrid. Si je clique sur l'en-tête, l'événement est déclenché.

Si je souscris au même événement au parent niveau UserControl, le gestionnaire d'événements est appelé avec succès que vous attendez basé sur Silverlight RoutedEvents mais je dois détecter si le clic a eu lieu sur le DataGrid ou ailleurs.

Si je m'abonne à l'événement en utilisant cette syntaxe UIElement.AddHandler, comme indiqué ci-dessous, alors cela fonctionne comme prévu en fonction du paramètre processedEventsToo: true.

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

Il semble que la mise en œuvre de DataGrid est marquant ces événements comme la manipulation, à éviter bouillonnement d'événements, par défaut dans l'un des UIElements de l'enfant, ce qui est pas ce que je pensais au départ. Avec plus de réflexion, je peux voir que le comportement du clic entraîne toutes sortes de choses (sélectionner un élément, modifier un champ, etc.) alors peut-être que l'implémentation a du sens.

Répondre

2

J'ai eu le même problème et moi MouseLeftButtonUp qui déclenche l'événement, mais la valeur clickCount est toujours 1.

Voici le correctif pour que:

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; 
} 
Questions connexes