2011-04-22 56 views
3

我有一個需要通過dll文件和文本框連接的硬件設備更新的gui。我的問題是gui沒有更新,直到事件結束,我需要顯示一些暫停,然後顯示其他內容。 Application.DoWork的黑客沒有改變任何東西。任何人有任何建議?我讀過的所有東西都使用invoke或DoEvents,而且都沒有改變行爲。直到事件結束才更新GUI

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

回答

2

你讓GUI線程睡眠,很顯然,當它的線程睡在GUI無法更新。創建一個單獨的線程並使用Dispatcher來更新UI元素(如果必須的話),可以保存地發送該線程進入睡眠狀態,並且GUI仍然會響應。

編輯:System.Windows.Forms.Application.DoEvents();你確定那個WPF標籤,不是嗎?

+0

如果它在同一個線程上,那麼在它導致睡眠之前GUI不會被更新?我開始時選擇了WPF應用程序而不是Windows窗體。 – haywire 2011-04-22 04:02:56

+0

這就是人們所期待的,但那不是發生了什麼,我不知道爲什麼...... – 2011-04-22 11:40:11

0

我想use a backgroundworker並在點擊處理程序中啓動它。

這樣GUI將繼續可用並顯示進度。

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; 
     })); 
    } 
相關問題