我有这个小问题,但不容易解决。目前,我的程序有2个按钮,一个"开始"和"取消"。当用户点击开始时,按钮应立即显示:
StartButton.IsEnabled = false;
CancelButton.IsEnabled = true;
但这只发生在BackgroundWorker完成后(按下按钮后将运行的所有代码),因为UI总是最后更新。我无法将这些命令添加到" ProgressChanged"或"已完成"背景工作者的事件。这些事件最多可能需要10分钟才能完成。
一种简单的方法是将这些命令添加到" ProgressChanged"部分,最后"完成"再次改变他们的状态。但是我想避免这种情况,因为按钮应该始终显示其真实状态,而不是在几个" ProgressChanged"之后。事件。当然,总有办法,比如不使用按钮的UI属性。
这有什么简短的解决方案吗?
将Button.Property更改添加到ClickEvent并不起作用。这是这个问题的主要问题。我可以很容易地使用"已完成" BGW的一部分将Button改回以匹配起始状态。问题是在所有事件和BGW之前将它们设置好。
答案 0 :(得分:0)
如果你有一个开始按钮,如:
this.StartButton = new System.Windows.Forms.Button();
然后你可以做
this.StartButton.Click += new System.EventHandler(this.button1_Click);
然后再做
private void button1_Click(object sender, EventArgs e)
{
StartButton.IsEnabled = false;
CancelButton.IsEnabled = true;
Thread bg = new Thread(new ThreadStart( UpdateDatabase()));
bg.Start();
}
如果您希望bg
主题向UI发送消息,请使用here等Invoke
方法
public delegate void UpdateUIHndler();
public void UpdateUI()
{
}
并做
if (InvokeRequired)
{
Invoke(new UpdateUIHndler(UpdateUI));
}
答案 1 :(得分:0)
看看我之前的一个问题(非常类似)。我应该选择选项1.
ASP.NET Application log while code is running / progress bar
用户界面只会延迟5秒。而不是文本使用AJAX更新按钮样式。
答案 2 :(得分:0)
您可以在该按钮本身的单击事件中禁用启动按钮,并在BGW的RunWorkerCompleted事件上再次启用它,如下所示
BackgroundWorker _worker = new BackgroundWorker();
_worker.DoWork += new DoWorkEventHandler(_worker_DoWork);
private void StartButton_Click(object sender, RoutedEventArgs e)
{
startButton.IsEnabled = false;
}
void _worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
stratButton.IsEnabled = true;
}
void _worker_DoWork(object sender, DoWorkEventArgs e)
{
//Your processing code
}