wpf - 设置默认键盘焦点加载用户控件

标签 wpf

我有一个包含 ContentControl 的主窗口的 MVVM 设置。
我将它设置为一个特定的 View 模型,然后映射到一个 View 。
View 是一个用户控件。
我希望能够在加载时将默认键盘焦点设置为用户控件( View )中的默认元素,以便最终可以通过使用向上、向下、向左、向右和输入来驱动应用程序。
我的一些失败尝试正在设置

FocusManager.FocusedElement="{Binding ElementName=DefaultElement}"

在我的内容控制标签中。这会设置逻辑焦点,但不会设置键盘焦点

如果可能的话,我宁愿将解决方案保留在 xaml 中,但已尝试将以下代码放在后面。
Keyboard.Focus(DefaultElement);  

这不起作用,但如果我首先弹出一个消息框,它会起作用。我有点困惑为什么。
MessageBox.Show(Keyboard.FocusedElement.ToString());
Keyboard.Focus(DefaultElement);

编辑::::
我只是把它放在我的用户控件的加载事件中。它似乎有效,但任何人都可以看到在此优先级上可能出现的任何问题。即行动永远不会运行的情况?
Dispatcher.BeginInvoke(
            DispatcherPriority.ContextIdle,
            new Action(delegate()
                {
                    Keyboard.Focus(DefaultElement);
                }));

最佳答案

似乎这个 wpf 您必须根据具体情况实现解决方法。对我来说,大多数情况下似乎效果最好的解决方案是在 OnVisible 更改时在调度程序中插入焦点代码。这不仅会在 View /用户控件加载时设置焦点,还会在您通过可见性更改 View 时设置焦点。如果您隐藏然后显示映射到您的 ViewModel 的 ContentControl,则不会触发 Loaded 事件,您将被迫使用鼠标输入或制表符(如果您想使用 Remote 导航应用程序,则不太好) .
但是,VisibilityChanged 将始终触发。这就是我最终为我的列表框所做的。

private void ItemsFlowListBox_IsVisibleChanged(object sender, DependencyPropertyChangedEventArgs e)
    {
        if ((bool)e.NewValue == true)
        {
            Dispatcher.BeginInvoke(
            DispatcherPriority.ContextIdle,
            new Action(delegate()
            {
                ItemsFlowListBox.Focus();
                ItemsFlowListBox.ScrollIntoView(ItemsFlowListBox.SelectedItem);
            }));
        }
    }

关于wpf - 设置默认键盘焦点加载用户控件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9535784/

相关文章:

c# - WPF DataGrid 删除 IEditableCollectionView.CancelNew() 上的 NewItemPlaceholder

c# - 基于窗口上设置的样式的样式未在设计器中显示(仅在运行时)

wpf - MahApps 进度指示器未延伸至内容

.net - 在 WPF 窗口中嵌入控制台窗口

c# - 如何在 C# 代码中设置默认样式(而不是在 App.xaml 中)?

c# - WPF DVC :Lineseries Style and axes settings using c#

c# - WPF:使用 MVVM 时更改数据绑定(bind)

wpf - 实际用于Dispatcher.DisableProcessing吗?

c# - 如何在运行时创建 WPF UserControl 的图像

c# - 当我引发事件时,它始终为null