注意:我找到了解决问题的方法,所以我发布这个是为了参考,尽管我很乐意接受更好的解决方案。
我正在尝试通过挂钩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中阻止事件冒泡,这不是我最初的预期。随着更多的考虑,我可以看到点击行为驱动各种事物(选择项目,编辑字段等),所以也许实施是有道理的。
答案 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;
}