特定の文字のみを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 が更新されます。