3

本例使用 C# WPF。我想在单击按钮后立即禁用它,以防止在短时间内连续单击两次。我禁用了按钮,OnClick_Event但仍然可以点击。

部分来源如下。

private void Button_Click_UpdateBurndownChart(object sender, RoutedEventArgs e)
{
   if(threadNotWorking)
   {
      updateButton.IsEnabled = false;
      startWorkThread();
   }
}

private void startWorkThread()
{
     ... ...
    //after finish required process
    updateButton.IsEnabled = true;
}

有没有办法做到这一点?

4

3 回答 3

3

您可能想要使用调度程序,可能存在线程问题(在单独线程上运行的回调函数并尝试访问在另一个线程上运行的 ui)。尝试这个 。.

updateButton.Dispatcher.BeginInvoke(
    new ThreadStart(() => updateButton.IsEnabled = false), 
    System.Windows.Threading.DispatcherPriority.Input, null);

代替

updateButton.IsEnabled = false;
于 2012-12-17T03:55:39.117 回答
0

如果您改为更改事件的顺序,会发生什么情况:

  updateButton.IsEnabled = false;
  startWorkThread();

  startWorkThread();
  updateButton.IsEnabled = false;

让我知道这是怎么回事。

于 2012-12-17T04:39:27.677 回答
0

看起来你正在启动你的线程,然后在你的线程完成之前立即启用你的按钮。您最好使用BackgroundWorker并在 RunWorkerCompleted 事件中启用您的 Button。尽管您可以通过在流程结束时使用 BeginInvoke 启用按钮来做类似的事情。

public void doWork()
{
    System.Threading.Thread.Sleep(10000); //Simulating your Process
    Dispatcher.BeginInvoke(new System.Threading.ThreadStart(delegate() { updateButton.IsEnabled = true; }), System.Windows.Threading.DispatcherPriority.Background);
}

BackgroundWorker 示例

using System.ComponentModel;

public partial class MainWindow : Window
{
    BackgroundWorker bgw;
    public MainWindow()
    {
        InitializeComponent();
        bgw = new BackgroundWorker();
        bgw.DoWork += new DoWorkEventHandler(bgw_DoWork);
        bgw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bgw_RunWorkerCompleted);

    }

    void bgw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        updateButton.IsEnabled = true;
    }

    void bgw_DoWork(object sender, DoWorkEventArgs e)
    {
        System.Threading.Thread.Sleep(10000); //Simulating your work
    }



    private void startWorkThread()
    {
        bgw.RunWorkerAsync();
    }

    private void updateButton_Click(object sender, RoutedEventArgs e)
    {
        if (bgw.IsBusy != true)
        {
            updateButton.IsEnabled = false;
            startWorkThread();
        }
    }
}
于 2012-12-17T05:04:36.803 回答