【发布时间】:2013-04-11 04:44:41
【问题描述】:
我正在尝试提高 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) 时,确实会出现空格。但是普通的文本键没有。
【问题讨论】:
-
msdn.microsoft.com/en-us/library/ms741870.aspx 也许你需要不同的线程模型?比如两个 UI 线程,所以你不必引发事件
-
@Erti-ChrisEelmaa 我的 OP 中可能不清楚,但我需要显示新屏幕,而不是同一个屏幕。这不是正在运行的后台进程,而是在服务器响应之前屏幕变为空白。当服务器响应时,会显示一个带有全新组件的新屏幕,并且用户在此期间所做的任何输入都应该在新屏幕上抛出。我也对您提到的“两个 UI 线程”感到困惑,我认为 WPF 都是 STA?
-
你真的需要用事件来做,你不能简单地设置文本吗?
-
@LukeMarlin 是的,我有很多非标准的光标导航和功能键链接到现在可以工作的命令,我希望对所有这些事件进行单一处理,因为这些事件已经过测试他们工作。此外,文本比您想象的更难,因为我需要将光标从一个字段移动到下一个字段,正确大写等。我想重用已经存在的内容并有效
-
你能展示你如何尝试发送关键事件吗?