24

wpfで修正するこのような単純な問題のように見えることに頭を悩ませていますが、アプリを計画どおりに動作させることができない理由をまだ発見していません。

ユーザーがctrl+fを押すと、wpfアプリケーションにポップアップする小さな検索ボックスがあります。私が欲しいのは、キャレットが検索ボックスのテキストボックス内で点滅し、ユーザーがクリックしなくてもユーザー入力を受け取る準備ができていることです。これは、表示、有効化、ヒットテスト可能、タブストップ可能、フォーカス可能なテキストボックスのxamlコードです。

   <TextBox x:Name="SearchCriteriaTextBox" Text="{Binding SearchCriteria}" Focusable="True" IsEnabled="True" IsTabStop="True" IsHitTestVisible="True" Style="{DynamicResource SearchTextBoxStyle}" Grid.Column="1" Margin="5,10,0,5" />

コードビハインドでは、検索ボックスの表示が影響を受けたときにこのメソッドを呼び出しています。検索ボックスはアプリの起動時に読み込まれます。

    /// <summary>
    /// Handles events triggered from focusing on this view.
    /// </summary>
    /// <param name="sender">The sender.</param>
    /// <param name="dependencyPropertyChangedEventArgs">The key event args.</param>
    private void OnIsVisibleChanged(object sender, DependencyPropertyChangedEventArgs dependencyPropertyChangedEventArgs)
    {
        if (!((bool) dependencyPropertyChangedEventArgs.NewValue))
        {
            return;
        }

        SearchCriteriaTextBox.Focus();
        Keyboard.Focus(SearchCriteriaTextBox);
        SearchCriteriaTextBox.Select(0, 0);

        if (SearchCriteriaTextBox.Text.Length > 0)
        {
            SearchCriteriaTextBox.SelectAll();
        }
    }

問題は、コードが呼び出され、コンポーネントがIsFocused = trueになりますが、キーボードフォーカスが取得されないことです。私は何かが足りないのですか?別のコントロールがキーボードのフォーカスを激しく保持し続けない限り、私はコーディングしなかったと確信していますが、なぜこのかなり単純なコードが正しく機能しないのでしょうか。

4

4 に答える 4

72

回避策として、 を使用して、後のDispatcherPriorityDispatcherフォーカスを設定してみてください。Input

Dispatcher.BeginInvoke(DispatcherPriority.Input,
    new Action(delegate() { 
        SearchCriteriaTextBox.Focus();         // Set Logical Focus
        Keyboard.Focus(SearchCriteriaTextBox); // Set Keyboard Focus
     }));

問題の説明によると、キーボード フォーカスが設定されていないようです。WPF は複数のフォーカス スコープを持つことができるため、複数の要素が論理フォーカス ( IsFocused = true) を持つことができますが、キーボード フォーカスを持つことができ、キーボード入力を受け取る要素は 1 つだけです。

投稿したコードはフォーカスを正しく設定する必要があるため、キーボード フォーカスをTextBox. ディスパッチャーの優先順位を上げてフォーカスを設定することで、キーボード フォーカスをSearchCriteriaTextBox最後に完了させることができます。

于 2012-12-19T15:31:34.543 に答える