禁用按钮在WPF中触发事件

Hel*_*rld 6 c# wpf events

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控件绑定到代码.所以我们不能在这种情况下运行后台线程.帮我解决问题.

Ami*_*mit 1

此代码的问题是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”。