WPF文本框在DoEvents循环中不响应输入

WPF文本框在DoEvents循环中不响应输入,wpf,textbox,doevents,Wpf,Textbox,Doevents,出于某种原因,我的程序需要在函数中暂停,同时仍然对用户输入做出反应。这目前是在循环中使用DoEvents完成的 不幸的是,当我处于DoEvents循环中时,我的textbox无法正常工作。我打不进去。它似乎可以获得KeyDown和keydup事件,但是Text属性和dispaly不显示我正在键入的内容 为了让事情变得更神秘,它会对退格和Ctrl+V组合键做出反应来粘贴文本,只需键入文本是不起作用的。只要我停止循环,它就会再次正常工作 有什么想法吗 附件是一个演示该问题的示例。以防万一,我正在VS

出于某种原因,我的程序需要在函数中暂停,同时仍然对用户输入做出反应。这目前是在循环中使用
DoEvents
完成的

不幸的是,当我处于
DoEvents
循环中时,我的
textbox
无法正常工作。我打不进去。它似乎可以获得
KeyDown
keydup
事件,但是
Text
属性和dispaly不显示我正在键入的内容

为了让事情变得更神秘,它会对退格和Ctrl+V组合键做出反应来粘贴文本,只需键入文本是不起作用的。只要我停止循环,它就会再次正常工作

有什么想法吗

附件是一个演示该问题的示例。以防万一,我正在VS2010上使用VB

这是xaml文件:

<Window x:Class="MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="200" Width="200">
    <StackPanel>
        <TextBox x:Name="txtTest" Text="Testing" Margin="10"/>
        <Button x:Name="btnStartLoop" Content="Start DoEvents Loop"         
                Click="StartLoop_Click" Margin="10"/>
        <Button x:Name="btnStopLoop" Content="Stop DoEvents Loop" 
                Click="StopLoop_Click" Margin="10"/>
    </StackPanel>
</Window>

我认为您不应该为此使用
应用程序.DoEvents
。WPF有自己的机制,可以通过
Dispatchers
处理事件,因此我认为您应该使用
Dispatcher
来处理消息。调度器有自己的消息队列,我假设WPF会忽略Windows消息队列直接向调度器发送一些消息

如果您仍然想使用像hack这样的DoEvents,我建议您改用它:

Dispatcher.BeginInvoke(new Action(() => {}), DispatcherPriority.Background);

另一个单独的问题是,为什么要在这里使用这种黑客方法?无论如何,在Windows世界中停止主线程不是一个好主意。

我认为您不应该为此使用
应用程序。DoEvents
。WPF有自己的机制,可以通过
Dispatchers
处理事件,因此我认为您应该使用
Dispatcher
来处理消息。调度器有自己的消息队列,我假设WPF会忽略Windows消息队列直接向调度器发送一些消息

如果您仍然想使用像hack这样的DoEvents,我建议您改用它:

Dispatcher.BeginInvoke(new Action(() => {}), DispatcherPriority.Background);

另一个单独的问题是,为什么要在这里使用这种黑客方法?停止主线程在Windows世界中无论如何都不是一个好主意。

看看
ElementHost.EnableModelessKeyboardInterop(Window)
方法,当使用
Winform的DoEvent
功能时,它将使
wpf
窗口的控件正常工作。

看看
ElementHost.EnableModelessKeyboardInterop(窗口)
方法,当使用
Winform的DoEvent
功能时,它将使您的
wpf
窗口控件正常工作。

不使用Application.DoEvents.Don't use Application.DoEvents。关于我为什么使用DoEvents循环的好问题。我一直在想是否有替代方法。我的程序是一种de执行的代码(标准的C dll)使用回调将其进度通知VB.NET前端。当用户想要中断执行时,我需要在前端中循环,而不从回调函数返回。我仍然需要对用户输入作出反应。整个代码是从VB6移植的,在VB6中,Windows消息循环被程序中的消息循环替换。我尝试了在循环中添加
Dispatcher.Invoke(DispatcherPriority.Render,New Action(AddressOf EmptyMethod))
,但这没有帮助。您知道一个使用Dispatchers而不是使用DoEvents来处理消息的示例吗?@Margarita。您已经使用了相当高优先级的
Render
priority(),你应该使用较低的优先级,我想你可以选择
ApplicationIdle
例如,你是一个明星!!更改优先级使一切变得不同。我使用了Render,因为在程序的其他地方,我们使用同一行专门更新显示,我只是复制并粘贴了该行。我可能仍然会更深入地了解该行调度器,看看我是否能改进设计。关于我为什么使用DoEvents循环的好问题。我一直在想是否会有其他方法。我的程序是一种调试器。执行的代码(标准C dll)使用回调将其进度通知VB.NET前端。当用户想要中断执行时,我需要在前端中循环,而不从回调函数返回。我仍然需要对用户输入作出反应。整个代码是从VB6移植的,在VB6中,Windows消息循环被程序中的消息循环替换。我尝试了在循环中添加
Dispatcher.Invoke(DispatcherPriority.Render,New Action(AddressOf EmptyMethod))
,但这没有帮助。您知道一个使用Dispatchers而不是使用DoEvents来处理消息的示例吗?@Margarita。您已经使用了相当高优先级的
Render
priority(),你应该使用较低的优先级,我想你可以选择
ApplicationIdle
例如,你是一个明星!!更改优先级使一切变得不同。我使用了Render,因为在程序的其他地方,我们使用同一行专门更新显示,我只是复制并粘贴了该行。我可能仍然会更深入地了解该行调度员来看看我能不能改进设计。