代码之家  ›  专栏  ›  技术社区  ›  Sam

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

  •  0
  • Sam  · 技术社区  · 16 年前

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

    当第一次加载页面时,通过调用 Control.Focus() 在构造函数中。

    但是,当我在页面之间切换时,这就不再有效了——重点只放在第一个字段上,而忽略了我将其更改为其他任何字段的尝试:(

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

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

    有没有办法把焦点放在第二次输入页面上? 在类似浏览器的应用程序中在WPF页之间切换时,应在何时、如何和何处设置焦点 ?

    4 回复  |  直到 14 年前
        1
  •  4
  •   Sven Hecht    16 年前

    尝试添加focusmanager.focusedelement=“binding elementname=[…]”`` 到页面中的第一个元素,并将“…”设置为应获得焦点的元素的名称。

        2
  •  1
  •   Matt Hamilton    16 年前

    是否尝试在已加载的事件处理程序而不是构造函数中设置焦点?当您导航回页面时,页面不会被重新构造,但是如果我正确地回忆,它们会被重新加载。

        3
  •  1
  •   OrPaz    14 年前

    在经历了“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的初始焦点使用,由于某些框架争用条件,大多数情况下都会失败。

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

    希望有帮助…

    奥兰

        4
  •  0
  •   Sam    16 年前

    因为我找不到解决这个问题的方法,所以我使用了一个简单的解决方法:

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

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

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

    这比我想象中的效果要好,所以这个解决方案可能会在使用中很长一段时间。