我正在尝试改进一个WPF业务应用程序的响应性,以便当用户处于“屏幕之间”等待服务器响应后出现新屏幕时,他们仍可以输入数据。我能够排队事件(在后台面板上使用PreviewKeyDown事件处理程序),但我遇到了一些困难,即在加载新面板后,只是将我出列的事件抛回到新面板上。特别是,新面板上的TextBoxes没有获取文本。我尝试了许多方法,例如引发相同的事件(在捕获它们时设置Handled为true,在再次引发它们时设置Handled为false)、创建新的KeyDown事件、新的PreviewKeyDown事件、ProcessInput、在面板上引发RaiseEvent、设置焦点在正确的TextBox上并在TextBox上引发RaiseEvent等。
这似乎应该非常简单,但我想不出来。
以下是我尝试过的一些方法。假设有一个名为EventQ的KeyEventArgs队列:
以下是无效的方法之一:
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 }
);
}
我注意到的一个奇怪的事情是,在使用InputManager方法(#2)时,空格会出现。但普通文本键则不会。