我有一个类似WPF浏览器的应用程序,只有几页。当我在页面之间切换时,我想设置键盘焦点。
第一次加载页面时,这可以通过在构造函数中调用Control.Focus()
来实现。
但是当我在页面之间切换时,这不再起作用了 - 焦点只在第一个字段上,而忽略了我将其改为其他任何东西的尝试:(
这些页面具有属性KeepAlive=true
- 如果这样可以使焦点保持活跃状态也可以,但只是将焦点设置为第一个字段很烦人。
我尝试在加载的事件中设置焦点,但它也不起作用。似乎在重新加载页面后设置了默认焦点。
有没有办法将重点放在第二次进入页面? 在类似浏览器的应用程序中切换WPF页面时,何时,如何以及在何处设置焦点?
答案 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();
});
这比我预期的要好,所以这种解决方法可能会长期使用。