private void but_Click(object sender, RoutedEventArgs e)
{
(sender as Button).IsEnabled = false;
doSomeThing();//e.g run for more than 20 seconds
(sender as Button).IsEnabled = true;
}
Run Code Online (Sandbox Code Playgroud)
当我第一次按下按钮时它会禁用.然后启动doSomeThing()
它包含UI代码或更新的一些UI变量.我的意思是,如果我在进行doSomeThing()
中再次按下按钮,则but_Click
此按钮启用后会再次触发事件.它保持触发事件的队列,即我按下的n次.
那么,如何在禁用按钮时阻止触发事件?请考虑在这种情况下'doSomething'包含UI控件绑定到代码.所以我们不能在这种情况下运行后台线程.帮我解决问题.
此代码的问题是doSomeThing()
方法正在 UI 线程中运行。因此,按钮没有被正确禁用。如果我们重构代码以便该doSomeThing()
方法在不同的线程中运行,它将正常工作。这是一个使用的简单示例BackgroundWorker
;然而我们的想法是我们不应该在 UI 线程中运行耗时的东西。这是重构后的代码:
public partial class ButtonEnableTest : Window
{
private BackgroundWorker worker = new BackgroundWorker();
public ButtonEnableTest()
{
InitializeComponent();
this.worker.DoWork += new DoWorkEventHandler(worker_DoWork);
this.worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);
}
void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (this.btn.IsEnabled == false)
{
this.btn.IsEnabled = true;
}
}
void worker_DoWork(object sender, DoWorkEventArgs e)
{
doSomeThing();
}
private void doSomeThing()
{
int i = 5;
while ( i > 0)
{
Thread.Sleep(TimeSpan.FromMilliseconds(2000));
System.Diagnostics.Debug.WriteLine("Woke up " + i);
i--;
}
}
private void button1_Click(object sender, RoutedEventArgs e)
{
Button btn = (Button) sender;
System.Diagnostics.Debug.WriteLine("at ButtonClick");
if (btn.IsEnabled)
{
btn.IsEnabled = false;
this.worker.RunWorkerAsync();
}
}
}
Run Code Online (Sandbox Code Playgroud)
我在这里没有遵循任何编码转换,因为我只是想分享我的想法。请注意,我将 WPF 按钮命名为“btn”。
归档时间: |
|
查看次数: |
4314 次 |
最近记录: |