0

特定の文字のみをTextBox入力できる があります。イベントでこのロジックを処理していPreviewTextInputます。許可された文字である場合はイベントが発生し、許可されていTextChangedない場合はイベントがキャンセルされますTextChanged

TextBox実行中に別のアプリケーションを 2 番目の画面で開いていますが、他のアプリケーションがアクティブなときにキーボード入力があったとしても、メイン アプリケーションに現在フォーカスされているアプリケーションを更新する必要があります。これを行うために、2 番目のアプリケーションのイベントにリスナーを追加しました。これにより、メイン アプリケーションでフォーカスされOnKeyPress()たイベントが呼び出されます。PreviewTextInputTextBox

コードは次のとおりです。

private void ImageEventController_OnKeyPress(char c)
        {
            object focusedElement = this.CurrentKeyboardFocus;
            if (focusedElement != null)
            {
                if (focusedElement is TextBox)
                {
                    TextBox target = (TextBox)focusedElement;
                    if (target.IsEnabled)
                    {
                        string text = c.ToString();
                        var routedEvent = TextCompositionManager.PreviewTextInputEvent;


         target.RaiseEvent(new TextCompositionEventArgs(
                    InputManager.Current.PrimaryKeyboardDevice,
                    new TextComposition(InputManager.Current, target, text)) { RoutedEvent = routedEvent });
                }
            }
        }
    }

PreviewTextInputこれが呼び出されるとイベントを通過しますがTextChanged、有効な文字であってもイベントが発生することはありません。TextChangedプログラムで呼び出されたときに起動されない理由はありPreviewTextInputますか?

アップデート:

このコードをPreviewTextInputイベント リスナーの一番下に追加しました。

if (!e.Handled)
{
     textbox.Text = e.Text;
}

これにより、2 番目のアプリケーションにフォーカスがある場合にイベントが強制TextChanged的に発生し、機能が修正されます。ただし、メイン アプリケーションにフォーカスがある場合、1 つのボタンを押すだけで 2 つの TextBox が更新されます。

4

1 に答える 1

0

TextChangedからイベントを呼び出す方法を理解できませんでしたがPreviewTextInput、必要なことは何とか達成できました。

押されたキーがイベント内で有効であることを検証するロジックを実行する代わりに、PreviewTextInputすべてのロジックを取り出してパブリック関数に入れました。次に、私のImageEventController_OnKeyPressイベントでは、LogicalTreeHelper.GetParent()メソッドを使用して必要なコントロールを見つけています。そこから public 関数を呼び出して有効なキーが押されたことを検証し、押された場合はTextInput直接呼び出します。

于 2012-11-07T22:13:55.323 に答える