0

我有一个带有几页的类似 WPF 浏览器的应用程序。当我在页面之间切换时,我想设置键盘焦点。

第一次加载页面时,这通过调用Control.Focus()构造函数来工作。

但是当我在页面之间切换时,这不再起作用 - 焦点仅在第一个字段上,并且忽略了我将其更改为其他任何内容的尝试:(

页面有这个属性KeepAlive=true——如果这也能让焦点保持活动状态就可以了,但是仅仅将焦点设置到第一个字段是很烦人的。

我试图在加载的事件中设置焦点,但它也不起作用。似乎在重新加载页面后设置了默认焦点。

有什么办法可以将焦点设置在第二次进入页面上?在类似浏览器的应用程序中的 WPF 页面之间切换时,我应该何时、如何以及在何处设置焦点

4

4 回答 4

4

尝试将 FocusManager.FocusedElement="{Binding ElementName=[...]}"`` 添加到页面中的第一个元素,并将 [...] 设置为应该获得焦点的元素的名称。

于 2009-02-20T16:53:08.937 回答
2

在经历了“WPF Initial Focus Nightmare”并基于堆栈上的一些答案之后,以下证明对我来说是最好的解决方案。

首先,添加您的 App.xaml OnStartup() 以下内容:

EventManager.RegisterClassHandler(typeof(Window), Window.LoadedEvent,
          new RoutedEventHandler(WindowLoaded));

然后在 App.xaml 中添加 'WindowLoaded' 事件:

void WindowLoaded(object sender, RoutedEventArgs e)
    {
        var window = e.Source as Window;
        System.Threading.Thread.Sleep(100);
        window.Dispatcher.Invoke(
        new Action(() =>
        {
            window.MoveFocus(new TraversalRequest(FocusNavigationDirection.First));

        }));
    }

必须使用线程问题,因为 WPF 初始焦点主要由于某些框架竞争条件而失败。

我发现以下解决方案最好,因为它在全球范围内用于整个应用程序。

希望能帮助到你...

奥兰

于 2011-01-24T17:40:09.273 回答
1

您是否尝试在 Loaded 事件处理程序而不是构造函数中设置焦点?导航回页面时不会重新构建页面,但如果我没记错的话,它们会重新加载。

于 2008-10-07T11:15:33.080 回答
0

由于我没有找到解决此问题的方法,因此我使用了一个简单的解决方法:

我启动了一个辅助线程,它会在页面加载后更改焦点。

幸运的是,使用 BeginInvoke 很容易做到这一点:

myControl.Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Background, 
(System.Threading.SendOrPostCallback)delegate(object state) 
{ 
  myControl.Focus(); 
});

这比我预期的要好得多,所以这种解决方法可能会持续使用很长时间。

于 2008-10-21T13:28:56.817 回答