문제
몇 페이지가있는 WPF 브라우저와 같은 응용 프로그램이 있습니다. 페이지간에 전환하면 키보드 초점을 설정하고 싶습니다.
페이지가 처음로드되면 전화를 통해 작동합니다. Control.Focus()
생성자에서.
그러나 페이지 사이를 전환 할 때 더 이상 작동하지 않습니다. 초점은 첫 번째 필드에만 있으며 다른 것으로 변경하려는 시도를 무시합니다.
페이지에는 속성이 있습니다 KeepAlive=true
- 초점을 유지하면 괜찮을 것입니다. 그러나 첫 번째 필드에 초점을 맞추는 것만으로도 성가시다.
로드 된 이벤트에서 초점을 맞추려고 노력했지만 작동하지 않았습니다. 페이지를 다시로드 한 후 기본 초점이 설정된 것 같습니다.
두 번째로 페이지를 입력하는 데 집중할 수있는 방법이 있습니까? 브라우저 유사 애플리케이션에서 WPF 페이지간에 전환 할 때 초점을 설정해야 할 때?
해결책 4
이 문제에 대한 해결책이 없기 때문에 간단한 해결 방법을 사용했습니다.
2 차 스레드를 발사하여 페이지가로드 된 후 초점이 변경됩니다.
운 좋게도 이것은 beginvoke를 사용하여 매우 쉽게 이루어집니다.
myControl.Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Background,
(System.Threading.SendOrPostCallback)delegate(object state)
{
myControl.Focus();
});
이것은 내가 예상했던 것보다 더 잘 작동 했으므로 아마도이 해결 방법은 오랫동안 계속 사용할 것입니다.
다른 팁
Try Adding FocusManager.FocusedElement="{Binding ElementName=[...]}"`` to the first Element in your Page and set [...] to the name of the element which should get the focus.
생성자가 아닌로드 된 이벤트 핸들러에서 초점을 설정해 보셨습니까? 페이지를 다시 탐색 할 때 페이지가 재구성되지 않지만 올바르게 기억하면 다시로드됩니다.
'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 초기 초점이 대부분 실패하기 때문에 사용해야합니다.
전체 앱에 전 세계적으로 사용되는 다음 솔루션을 가장 잘 찾았습니다.
도움이되기를 바랍니다 ...
오란