单击行时未引发Silverlight DataGrid MouseLeftButtonDown事件

时间:2012-02-10 04:28:02

标签: silverlight silverlight-4.0 datagrid event-handling

注意:我找到了解决问题的方法,所以我发布这个是为了参考,尽管我很乐意接受更好的解决方案。

我正在尝试通过挂钩UIElement.MouseLeftButtonDown在Silverlight DataGrid上提供双击功能,但是当我使用XAML或DataGrid.MouseLeftButtonDown +=订阅DataGrid.MouseLeftButtonDown时语法,当我单击DataGrid中的行时,不会调用我的事件处理程序。如果我点击标题,则会引发该事件。

如果我在父 UserControl 级别订阅同一事件,则会根据Silverlight RoutedEvents成功调用事件处理程序,但我必须检测是否发生了单击在DataGrid或其他地方。

如果我使用此UIElement.AddHandler语法订阅该事件,如下所示,那么它将根据requestedEventsToo:true参数按预期工作。

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

似乎DataGrid实现将这些事件标记为已处理,默认情况下在其中一个子UIElements中阻止事件冒泡,这不是我最初的预期。随着更多的考虑,我可以看到点击行为驱动各种事物(选择项目,编辑字段等),所以也许实施是有道理的。

1 个答案:

答案 0 :(得分: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;
}