按钮不是从禁用状态切换到启用状态
我终于摆脱了所有错误信息,因为我试图找到控制并启用它。按钮不是从禁用状态切换到启用状态
在属性窗格中,我禁用了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;
});
}
}
当我复制在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;
}
}
尝试使用Dispatcher
。 GUI可能会阻止来自代码的控件更改。该Dispatcher
协调从多个线程访问一个元素:
this.Dispatcher.Invoke(() => {
btnMyButton.IsEnabled = true;
});
谢谢!那样做了。现在,我将不得不了解各种线程。 – DavidG
我认为你需要设置调度线程的财产,你是不是在事件处理程序
感谢您的信息。当我第一次尝试添加计时器时,我看到两个选项都是快速修复的。我首先执行了'System.Windows.Threading.DispatcherTimer',然后还为定时器类添加了using语句。我是一个完整的小白。我很感激你花时间向我解释。我一定会详细阅读这个主题。谢谢。 – DavidG