Событие Silverlight DataGrid MouseLeftButtonDown не возникает при нажатии на строки - PullRequest
3 голосов
/ 10 февраля 2012

Примечание: Я нашел решение своей проблемы, поэтому я публикую его в справочных целях, хотя я был бы рад получить лучшее решение.

Япытаясь обеспечить функциональность двойной щелчок в DataGrid Silverlight, подключив 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, что не то, что я ожидал изначально.С большим размышлением я вижу, что поведение щелчка управляет всеми видами вещей (выберите элемент, поле редактирования и т. Д.), Поэтому, возможно, реализация имеет смысл.

1 Ответ

2 голосов
/ 15 сентября 2012

У меня была такая же проблема, и я использовал 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;
}
...