2016-09-21 185 views
0

我終於擺脫了所有錯誤信息,因爲我試圖找到控制並啓用它。按鈕不是從禁用狀態切換到啓用狀態

在屬性窗格中,我禁用了mainwindow上的按鈕。

此代碼成功運行,儘管令人討厭,因爲每秒我都會給我另一個msgbox來顯示代碼被觸發。但它不啓用按鈕。我是C#的新手,所以對我來說看起來像阿拉伯語。在VB中這純粹是:

btnMyButton.Enabled = True 

這背後是我的代碼:

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
     System.Timers.Timer myTimer = new System.Timers.Timer(); 
     myTimer.Elapsed += new ElapsedEventHandler(DisplayTimeEvent); 
     myTimer.Interval = 1000; // 1000 ms is one second 
     myTimer.Start(); 
    } 

    public void DisplayTimeEvent(object source, ElapsedEventArgs e) 
    { 
     DateTime now = DateTime.Now; 
     DateTime today3am = now.Date.AddHours(3); 

     if (DateTime.Today == today3am.Date && now >= today3am) 
     { 
      MessageBox.Show("Code is being triggered"); 
      btnMyButton.IsEnabled = true; 
     } 
    } 
} 

解決:響應建議如下:(它的工作)

public void DisplayTimeEvent(object source, ElapsedEventArgs e) 
{ 
    DateTime now = DateTime.Now; 
    DateTime today3am = now.Date.AddHours(3); 

    if (DateTime.Today == today3am.Date && now >= today3am) 
    { 
     MessageBox.Show("Button Should Enable"); 
     this.Dispatcher.Invoke(() => { 
      btnMyButton.IsEnabled = true; 
     }); 
    } 
} 

回答

2

當我複製在UI線程

,因爲不同的線程擁有它調用線程不能訪問該對象:和嘗試設置IsEnabled屬性時粘貼您所提供的代碼並運行它,我得到(預期)例外。

這是標準的「錯誤線程」異常。你沒有看到異常(顯然),因爲你沒有在調試器中運行。 Timer線程捕獲異常並忽略它。要解決這個問題

的一種方法是,通過別人的建議,使用Dispatcher.Invoke()

public void DisplayTimeEvent(object source, ElapsedEventArgs e) 
{ 
    DateTime now = DateTime.Now; 
    DateTime today3am = now.Date.AddHours(3); 

    if (DateTime.Today == today3am.Date && now >= today3am) 
    { 
     Dispatcher.Invoke(() => btnMyButton.IsEnabled = true); 
    } 
} 

然而,因爲這個問題基本上由您使用System.Timers.Timer類造成的,它更有意義,只是使用正確的計時器類,System.Windows.Threading.DispatcherTimer

public MainWindow() 
{ 
    InitializeComponent(); 
    var myTimer = new DispatcherTimer(); 
    myTimer.Tick += DisplayTimeEvent; 
    myTimer.Interval = TimeSpan.FromSeconds(1); 
    myTimer.Start(); 
} 

public void DisplayTimeEvent(object source, EventArgs e) 
{ 
    DateTime now = DateTime.Now; 
    DateTime today3am = now.Date.AddHours(3); 

    if (DateTime.Today == today3am.Date && now >= today3am) 
    { 
     btnMyButton.IsEnabled = true; 
    } 
} 
+0

感謝您的信息。當我第一次嘗試添加計時器時,我看到兩個選項都是快速修復的。我首先執行了'System.Windows.Threading.DispatcherTimer',然後還爲定時器類添加了using語句。我是一個完整的小白。我很感激你花時間向我解釋。我一定會詳細閱讀這個主題。謝謝。 – DavidG

1

嘗試使用Dispatcher。 GUI可能會阻止來自代碼的控件更改。該Dispatcher協調從多個線程訪問一個元素:

this.Dispatcher.Invoke(() => { 
    btnMyButton.IsEnabled = true; 
}); 
+0

謝謝!那樣做了。現在,我將不得不瞭解各種線程。 – DavidG

0

我認爲你需要設置調度線程的財產,你是不是在事件處理程序