设置默认键盘焦点加载UserControl

Oli*_*Oli 10 wpf

我有一个MVVM设置,主窗口包含一个ContentControl.我将其设置为特定的视图模型,然后映射到视图.视图是用户控件.我希望能够在加载时将默认键盘焦点设置为usercontrol(View)中的默认元素,这样最终只需使用向上,向下,向左,向右和输入即可驱动应用程序.我的一些失败尝试正在进行

FocusManager.FocusedElement="{Binding ElementName=DefaultElement}"
Run Code Online (Sandbox Code Playgroud)

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

我宁愿将解决方案保留在xaml中,如果可能的话,但是我已经尝试将以下内容放在代码中.

Keyboard.Focus(DefaultElement);  
Run Code Online (Sandbox Code Playgroud)

这不起作用,但如果我首先弹出一个消息框,它会.我有点困惑为什么.

MessageBox.Show(Keyboard.FocusedElement.ToString());
Keyboard.Focus(DefaultElement);
Run Code Online (Sandbox Code Playgroud)

编辑::::我刚把它放在我的用户控件的onloaded事件中.它似乎有效但任何人都可以看到任何可能在这个优先级别上出现的问题.IE动作永远不会运行的情况?

Dispatcher.BeginInvoke(
            DispatcherPriority.ContextIdle,
            new Action(delegate()
                {
                    Keyboard.Focus(DefaultElement);
                }));
Run Code Online (Sandbox Code Playgroud)

Oli*_*Oli 25

看来,这个必须根据具体情况实施变通方法.对我来说似乎效果最好的解决方案是在更改OnVisible时将焦点代码插入调度程序中.这不仅在View/Usercontrol加载时设置焦点,而且如果您通过Visibility更改Views也是如此.如果您隐藏然后显示映射到ViewModel的ContentControl,则Loaded事件将不会触发,您将被强制进入鼠标输入或Tabbing(如果您想使用遥控器导航您的应用程序,则不太好) .然而,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);
            }));
        }
    }
Run Code Online (Sandbox Code Playgroud)