特定の文字のみをTextBox
入力できる があります。イベントでこのロジックを処理していPreviewTextInput
ます。許可された文字である場合はイベントが発生し、許可されていTextChanged
ない場合はイベントがキャンセルされますTextChanged
。
TextBox
実行中に別のアプリケーションを 2 番目の画面で開いていますが、他のアプリケーションがアクティブなときにキーボード入力があったとしても、メイン アプリケーションに現在フォーカスされているアプリケーションを更新する必要があります。これを行うために、2 番目のアプリケーションのイベントにリスナーを追加しました。これにより、メイン アプリケーションでフォーカスされOnKeyPress()
たイベントが呼び出されます。PreviewTextInput
TextBox
コードは次のとおりです。
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 が更新されます。