注意:我已经找到了问题的解决方案,所以我发布这篇文章是为了参考,尽管我很乐意接受更好的解决方案的教育。
我试图通过挂接到UIElement.MouseLeftButtonDown来在Silverlight DataGrid上提供双击功能,但当我使用XAML或DataGrid.MouseLeftButtonDown +=
语法订阅DataGrid.Mouse左派ButtonDown时,当我单击DataGrid中的行时,不会调用我的事件处理程序。如果单击标题,则会引发事件。
如果我在父级UserControl订阅了同一事件,则会根据Silverlight RoutedEvents成功调用事件处理程序,但随后我必须检测单击是发生在DataGrid上还是其他地方。
如果我使用这个UIElement.AddHandler语法订阅事件,如下所示,那么它将根据handledEventsToo:true参数按预期工作。
dataGrid.AddHandler(UIElement.MouseLeftButtonDownEvent,
new MouseButtonEventHandler(dataGrid_MouseLeftButtonDown)
, handledEventsToo: true);
DataGrid实现似乎默认情况下在其中一个子UIElement中将这些事件标记为已处理,以防止事件冒泡,这不是我最初所期望的。经过更多的思考,我可以看到点击行为驱动了各种事情(选择项目、编辑字段等),所以也许实现是有意义的。
我遇到了同样的问题,我使用了MouseLeftButtonUp来触发事件,但点击计数值始终为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;
}