質問
数ページのWPFブラウザのようなアプリケーションがあります。ページを切り替えるとき、キーボードフォーカスを設定したいです。
ページが初めてロードされるとき、これはコンストラクターで Control.Focus()
を呼び出すことで機能します。
しかし、ページを切り替えると、これはもう機能しません-フォーカスは最初のフィールドにあるだけで、それを他のものに変更しようとする試みを無視します:(
ページには属性 KeepAlive = true
があります-それもフォーカスを維持し続けても問題ありませんが、最初のフィールドにフォーカスを設定するだけで面倒です。
読み込まれたイベントにフォーカスを設定しようとしましたが、うまくいきませんでした。ページのリロード後にデフォルトのフォーカスが設定されているようです。
2回目のページ入力にフォーカスを設定する方法はありますか? ブラウザのようなアプリケーションでWPFページを切り替えるとき、いつ、どのように、どこでフォーカスを設定する必要がありますか?
解決 4
この問題の解決策が見つからなかったため、簡単な回避策を使用しました:
ページがロードされた後にフォーカスを変更するセカンダリスレッドを起動します。
幸いなことに、これはBeginInvokeを使用して非常に簡単に実行できます。
myControl.Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Background,
(System.Threading.SendOrPostCallback)delegate(object state)
{
myControl.Focus();
});
これは予想以上にうまく機能したため、この回避策は長い間使用され続けるでしょう。
他のヒント
FocusManager.FocusedElement =" {Binding ElementName = [...]}" ``を追加してみてください ページの最初の要素に移動し、[...]にフォーカスを取得する要素の名前を設定します。
コンストラクタではなくLoadedイベントハンドラにフォーカスを設定しようとしましたか?ページに戻っても、ページは再構築されませんが、正しく思い出せばページはリロードされます。
「WPF Initial Focus Nightmare」を取得し、スタックに関するいくつかの回答に基づいて、次のことが最良のソリューションであることを証明しました。
まず、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の初期フォーカスがほとんど失敗するため、スレッドの問題を使用する必要があります。
アプリ全体でグローバルに使用されているため、次のソリューションが最適であることがわかりました。
ご希望の場合...
オラン