如何在WPF页面重新加载中设置焦点?

时间:2008-10-07 10:44:06

标签: wpf focus

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

第一次加载页面时,这可以通过在构造函数中调用Control.Focus()来实现。

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

这些页面具有属性KeepAlive=true - 如果这样可以使焦点保持活跃状态​​也可以,但只是将焦点设置为第一个字段很烦人。

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

有没有办法将重点放在第二次进入页面? 在类似浏览器的应用程序中切换WPF页面时,何时,如何以及在何处设置焦点

4 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

在'WPF初始焦点噩梦'并基于堆栈上的一些答案后,以下证明我是最佳解决方案。

首先,添加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的初始焦点主要是由于某些框架竞争条件而失败。

我发现以下解决方案最佳,因为它在整个应用程序中全局使用。

希望它有所帮助...

奥兰

答案 3 :(得分:0)

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

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

幸运的是,这可以使用BeginInvoke非常轻松地完成:

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

这比我预期的要好,所以这种解决方法可能会长期使用。