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

单击行时未引发Silverlight DataGrid MouseLeftButtonDown事件,silverlight,silverlight-4.0,datagrid,event-handling,Silverlight,Silverlight 4.0,Datagrid,Event Handling,注意:我已经找到了解决问题的方法,因此我将此贴出来供参考,尽管我很乐意接受更好的解决方案的教育 我试图通过挂接到提供Silverlight数据网格上的双击功能,但当我使用XAML或DataGrid.MouseLeftButtonDown+=语法订阅DataGrid.MouseLeftButtonDown时,当我单击DataGrid内的行时,不会调用我的事件处理程序。如果单击标题,则引发事件 如果我在父级UserControl级别订阅了相同的事件,那么事件处理程序将按照您所期望的那样成功调用,但是

注意:我已经找到了解决问题的方法,因此我将此贴出来供参考,尽管我很乐意接受更好的解决方案的教育

我试图通过挂接到提供Silverlight数据网格上的双击功能,但当我使用XAML或
DataGrid.MouseLeftButtonDown+=
语法订阅DataGrid.MouseLeftButtonDown时,当我单击DataGrid内的行时,不会调用我的事件处理程序。如果单击标题,则引发事件

如果我在父级UserControl级别订阅了相同的事件,那么事件处理程序将按照您所期望的那样成功调用,但是我必须检测单击是发生在DataGrid还是其他地方

如果我使用如下所示的语法订阅事件,那么它将根据handleEventsTo:true参数按预期工作

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

看起来DataGrid实现正在将这些事件标记为已处理,以防止事件冒泡,默认情况下在一个子UIElement中,这不是我最初期望的。经过更多的思考,我可以看到点击行为驱动了各种事情(选择项目、编辑字段等),因此也许实现是有意义的。

我也有同样的问题,我使用了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;
}
private const int MOUSE_灵敏度=300;
private DateTime(私人日期时间)\ u先前单击;
私有无效例外DataGrid_MouseLeftButtonUp(对象发送器,MouseButtonEventArgs e)
{
DataGrid dg=(发送方为DataGrid);
DateTime current=DateTime.Now;
LoggerService.Exception异常=(LoggerService.Exception)dg.SelectedItem;
如果(_previousClick!=null)
{
TimeSpan clickSpan=当前-\u上一次单击;
如果(单击span.total毫秒<鼠标灵敏度)
{
Show(“你双击了!”);
}
}
_上一次单击=当前;
}