【问题标题】:WPF DataGrid loses focus after row delete / cutWPF DataGrid 在行删除/剪切后失去焦点
【发布时间】:2013-04-05 17:54:44
【问题描述】:

我在 MVVM/Prism 应用程序中实现了 DataGridDataGrid 通过上下文菜单和键盘手势支持剪切/复制/粘贴/删除。

我发现当删除/剪切一行时,整个DataGrid 失去焦点,键盘焦点移动到最后一个焦点控件。

有没有办法防止这种情况发生?

删除一行后,我可能想重新粘贴到DataGrid。此外,如果网格为空,则根本无法获得键盘焦点。单击空网格不会使其获得焦点。

这是一个类似的问题,但它并没有解决我的问题: DataGrid Looses Focus When Delete Key is Pressed

【问题讨论】:

    标签: wpf wpfdatagrid


    【解决方案1】:

    您可以在 PreviewKeyDown-Event 中设置 DataGrids 焦点

    private void TheDataGrid_PreviewKeyDown(object sender, KeyEventArgs e)
    {
        if (e.Key == Key.Delete)
        {
           var grid = (DataGrid)sender;
           FocusManager.SetFocusedElement(Window.GetWindow(grid), grid); //not tested
        }
    }
    

    如果您不想将代码放在代码隐藏中,请结合使用 AttachedPropertiesDependencyPropertyChanged-Event
    How to set set focus

    【讨论】:

    • 是的...这很好用,谢谢。我发现我必须处理 Delete 和 Ctrl-X。另外,我强制关注 MouseDown(用于聚焦空网格)和 ContextMenuClosing(用于在单击 Cut/Delete 后聚焦)。
    • 我说得太早了。 PreviewKeyDown 具有在编辑单元格时被调用的不幸副作用。在这些情况下,它会从牢房中窃取焦点。我发现在 UnloadingRow 中设置焦点效果很好。
    【解决方案2】:

    一个肮脏的解决方案可能是处理DataGrid 暴露的LostFocus 事件并将焦点设置在控件上。

    可以说它略微违反了 MVVM 模式,即让视图保持愚蠢,但它仍然是视图代码。

    【讨论】:

    • 您建议如何区分用户在 DataGrid 类型丢失焦点之外单击和删除某些内容时的用户?
    猜你喜欢
    • 1970-01-01
    • 2013-04-03
    • 1970-01-01
    • 2012-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-20
    相关资源
    最近更新 更多