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



注意:我已经找到了问题的解决方案,所以我发布这篇文章是为了参考,尽管我很乐意接受更好的解决方案的教育。

我试图通过挂接到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;
}

相关内容

  • 没有找到相关文章

最新更新