2016-09-21 150 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

我认为你需要设置调度线程的财产,你是不是在事件处理程序