【问题标题】:Only execute WPF MouseDoubleClick event when DataGrid row is clicked仅在单击 DataGrid 行时执行 WPF MouseDoubleClick 事件
【发布时间】:2012-07-25 07:53:43
【问题描述】:

我在 WPF 中有一个 DataGrid。当我双击一行时,应该执行对数据库的查询。

这个 DataGrid 有水平和垂直滚动条,我注意到当我快速单击其中一个滚动条的箭头按钮时,它会将查询发送到数据库。

问题是我使用的是DataGrid的MouseDoubleClick事件,所以滚动条属于DataGrid,双击的时候会引发这个事件。

有没有什么方法可以只在双击DataGrid的一行而不是双击滚动条的一部分时才执行双击事件?

【问题讨论】:

    标签: wpf datagrid double-click


    【解决方案1】:

    在您的 MouseDoubleClick 事件中尝试这样做:

    private void DataGridMouseDoubleClick(object sender, MouseButtonEventArgs e)
    {
        DependencyObject src = VisualTreeHelper.GetParent((DependencyObject)e.OriginalSource);
    
        // Checks if the user double clicked on a row in the datagrid [ContentPresenter]
        if (src.GetType() == typeof(ContentPresenter))
        {
            // Your logic..
        }
    }
    

    【讨论】:

    • 我认为这行不通。 DataGrid 中有许多 ContentPresenter(不仅用于行),您不能确定 ContentPresenter 是 e.OriginalSource 的直接父级。
    • 我以前成功使用过这种方法。关键是,如果 e.OriginalSource 的直接 Parent 是 ContentPresenter,您可以假设用户单击了一行或该行的其中一列中的对象,因此您可以获得选定的行。如果是其他东西,例如边框或网格,请忽略它。你有任何可能出错的例子吗?
    • 我没试过。这只是我的想法。我的意思是 ContentPresenter 不是一行的指示。这真的不会在 ColumnHeaders 和 ScrollBars 上触发吗?如果模板不是默认的怎么办?
    • ColumnHeader 的 Parent 是 Grid,而 ScrollBar 是 RepeatButton 或 Thumb。我猜你可能会编辑模板以使用这种方法产生不希望的结果,但我相信你可以相应地调整它?我还没有让它失败,但我不知道这种方法是否是防弹的。如果不是,我想知道:)
    • ContentPresenter 不工作(DataGrid es: Headers 中有很多 ContentPresenter)
    【解决方案2】:

    是的,在RowStyle注册活动。

    <DataGrid.RowStyle>
        <Style TargetType="{x:Type DataGridRow}">
            <EventSetter Event="PreviewMouseDoubleClick" Handler="Row_PreviewMouseDoubleClick" />
        </Style>
    </DataGrid.RowStyle>
    

    【讨论】:

    • 向数据网格中的每一行添加事件设置器的开销是多少?
    • 我觉得没什么好说的,因为所有行只有一个处理程序实例。
    • 干得好!效果很好,我没有看到性能下降(关于 Mark 的要求)。
    猜你喜欢
    • 2012-11-16
    • 1970-01-01
    • 1970-01-01
    • 2011-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-24
    • 1970-01-01
    相关资源
    最近更新 更多