GUI直到事件结束才更新

时间:2011-04-22 03:19:49

标签: c# wpf

我需要通过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);
    }

4 个答案:

答案 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;
        }));
    }