WPFページのリロードでフォーカスを設定する方法は?

StackOverflow https://stackoverflow.com/questions/177911

  •  05-07-2019
  •  | 
  •  

質問

数ページの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の初期フォーカスがほとんど失敗するため、スレッドの問題を使用する必要があります。

アプリ全体でグローバルに使用されているため、次のソリューションが最適であることがわかりました。

ご希望の場合...

オラン

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top