2008-10-07 131 views
0

我有一个WPF浏览器样的应用程序与几页。当我在页面之间切换时,我想设置键盘焦点。如何在WPF页面重新载入中设置焦点?

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

但是,当我的网页之间切换,这并不工作了 - 焦点仅仅是第一场,而忽略我尝试将其更改为别的:(

的页面具有属性KeepAlive=true - 它会如果这样可以让焦点保持活跃状态​​,但只是将焦点设置到第一个区域很烦人。

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

有什么方法可以设置重点进入第二次浏览页面? 在类似浏览器的应用程序中切换WPF页面时,应该如何以及在哪里设置焦点

回答

0

因为我发现没有解决这个问题,我用一个简单的解决方法:

我火了辅助线程,在页面加载后,其改变的重点。

幸运的是,这是使用的BeginInvoke很容易实现:

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

这样的工作比我预期它更好的,所以可能这个解决办法将留在使用很长一段时间。

1

你有没有尝试在Loaded事件处理程序而不是构造函数中设置焦点?当您重新导航到页面时页面不会重新构建,但如果我正确记得,它们会重新加载。

+0

是的,我试图设置Loaded事件的焦点 - 不工作了。 – Sam 2008-10-07 12:19:46

4

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

1

经过“WPF初始焦点梦魇”并基于堆栈上的一些答案,以下证明对我来说是最好的解决方案。

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

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

然后还加了 'WindowLoaded' 事件中的App.xaml:

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最初的重点大多因为一些框架竞争条件而失败。

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

希望它可以帮助...

奥兰

+0

MoveFocus(新的TraversalRequest(FocusNavigationDirection。首先))是一种将焦点转移到控制的第一个可调焦孩子的巧妙方法。爱它! – 2011-06-09 15:42:16