我需要通过dll文件和文本框附加的硬件设备更新gui。我的问题是gui直到事件结束才更新,我需要显示暂停然后显示其他内容。 Application.DoWork的黑客没有改变任何东西。有人有什么建议吗?我正在阅读的所有内容都使用了invoke或DoEvents,似乎都没有改变行为。
private void textBox1_KeyDown(object sender, KeyEventArgs e)
{
if (e.Key == Key.Enter)
{
App.myMainWindow.image1.Visibility = Visibility.Hidden;
System.Windows.Forms.Application.DoEvents();
}
Thread.Sleep(4000);
}
答案 0 :(得分:2)
使GUI线程处于休眠状态,显然当线程休眠时,GUI无法更新。如果必须,创建一个单独的线程并使用Dispatcher更新UI元素,您可以将该线程保存为休眠状态,您的GUI仍然会响应。
编辑: System.Windows.Forms.Application.DoEvents();
您确定该WPF标记,不是吗?
答案 1 :(得分:1)
答案 2 :(得分:0)
我use a backgroundworker并在点击处理程序中启动它。
这样GUI将继续可用,并且可以显示进度。
答案 3 :(得分:0)
我认为使用定时器就像vittore建议的那样。这必须是这样做的,因为在GUI事件处理程序期间无法睡眠GUI线程。
public partial class MainWindow : Window
{
static Timer _timer;
private void textBox1_KeyDown(object sender, KeyEventArgs e)
{
if (e.Key == Key.Enter)
{
this.image1.Visibility = Visibility.Hidden;
this.image2.Visibility = Visibility.Visible;
_timer = new Timer(2000);
_timer.Elapsed += new ElapsedEventHandler(_timer_Elapsed);
_timer.Enabled = true; // Enable it
}
}
private void _timer_Elapsed(object sender, ElapsedEventArgs e)
{
textBox1.Dispatcher.Invoke(new Action(delegate()
{
_timer.Enabled = false;
this.image1.Visibility = Visibility.Visible;
this.image2.Visibility = Visibility.Hidden;
}));
}