0

いくつかのページを持つ WPF ブラウザーのようなアプリケーションがあります。ページを切り替えるときに、キーボード フォーカスを設定したいと思います。

ページが初めてロードされるとき、これControl.Focus()はコンストラクターを呼び出すことによって機能します。

しかし、ページを切り替えると、これはもう機能しません-フォーカスは最初のフィールドだけにあり、それを他のものに変更しようとしても無視されます:(

ページには 属性があります。KeepAlive=trueこれでフォーカスが維持されれば問題ありませんが、フォーカスを最初のフィールドに設定するだけでは面倒です。

ロードされたイベントにフォーカスを設定しようとしましたが、それも機能しませんでした。ページをリロードした後、デフォルトのフォーカスが設定されているようです。

2 回目にページを入力することにフォーカスを設定する方法はありますか? ブラウザのようなアプリケーションで WPF ページを切り替えるときに、いつ、どのように、どこにフォーカスを設定する必要がありますか?

4

4 に答える 4

4

ページの最初の要素にFocusManager.FocusedElement="{Binding ElementName = [...]}" ``を追加し、フォーカスを取得する要素の名前に[...]を設定してみてください。

于 2009-02-20T16:53:08.937 に答える
2

「WPF Initial Focus Nightmare」を経験した後、スタックに関するいくつかの回答に基づいて、次のことが最善の解決策であることが証明されました。

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

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

それが役に立てば幸い...

オラン

于 2011-01-24T17:40:09.273 に答える
1

コンストラクターではなく、Loaded イベント ハンドラーでフォーカスを設定しようとしましたか? ページに戻ってもページは再構築されませんが、私の記憶が正しければ再読み込みされます。

于 2008-10-07T11:15:33.080 に答える
0

この問題の解決策が見つからなかったため、簡単な回避策を使用しました。

セカンダリスレッドを起動します。これにより、ページが読み込まれた後にフォーカスが変更されます。

幸い、これはBeginInvokeを使用して非常に簡単に実行できます。

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

これは私が予想していたよりもはるかにうまく機能したので、おそらくこの回避策は長期間使用され続けるでしょう。

于 2008-10-21T13:28:56.817 に答える