ユーザーがサーバーの応答後に新しい画面が表示されるのを待っている画面の「間」にいるときでも、データを入力できるように、WPF ビジネス アプリケーションの応答性を改善しようとしています。(バックグラウンド パネルで PreviewKeyDown イベント ハンドラーを使用して) イベントをキューに入れることはできますが、新しいパネルが読み込まれると、デキューしたイベントを新しいパネルにスローするだけで問題が発生します。特に、新しいパネルの TextBoxes はテキストを取得していません。同じイベントを発生させようとしました (それらをキャプチャするときに Handled を true に設定し、再度発生させるときに Handled を false に設定します)、新しい KeyDown イベント、新しい PreviewKeyDown イベントを作成し、ProcessInput を実行し、パネルで RaiseEvent を実行し、右側にフォーカスを設定しましたTextBox と、TextBox で RaiseEvent を実行するなど、多くのこと。
本当に単純なはずですが、わかりません。
ここに私が試したことのいくつかがあります。EventQ と呼ばれる KeyEventArgs のキューを考えてみましょう。
動作しないことが 1 つあります。
while (EventQ.Count > 0)
{
KeyEventArgs kea = EventQ.Dequeue();
tbOne.Focus(); // tbOne is a text box
kea.Handled = false;
this.RaiseEvent(kea);
}
ここに別のものがあります:
while (EventQ.Count > 0)
{
KeyEventArgs kea = EventQ.Dequeue();
tbOne.Focus(); // tbOne is a text box
var key = kea.Key; // Key to send
var routedEvent = Keyboard.PreviewKeyDownEvent; // Event to send
KeyEventArgs keanew = new KeyEventArgs(
Keyboard.PrimaryDevice,
PresentationSource.FromVisual(this),
0,
key) { RoutedEvent = routedEvent, Handled = false };
InputManager.Current.ProcessInput(keanew);
}
そしてもう一つ:
while (EventQ.Count > 0)
{
KeyEventArgs kea = EventQ.Dequeue();
tbOne.Focus(); // tbOne is a text box
var key = kea.Key; // Key to send
var routedEvent = Keyboard.PreviewKeyDownEvent; // Event to send
this.RaiseEvent(
new KeyEventArgs(
Keyboard.PrimaryDevice,
PresentationSource.FromVisual(this),
0,
key) { RoutedEvent = routedEvent, Handled = false }
);
}
私が気付いた奇妙なことの 1 つは、InputManager メソッド (#2) を使用するとスペースが表示されることです。しかし、通常のテキスト キーはそうではありません。