为什么禁用按钮可以点击?

时间:2012-12-17 03:43:21

标签: c# wpf button mouseevent

这种情况是使用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;
}

有没有办法实现这个目标?

3 个答案:

答案 0 :(得分:2)

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

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

而不是

updateButton.IsEnabled = false;

答案 1 :(得分:0)

如果您改变了以下事件的顺序,会发生什么:

  updateButton.IsEnabled = false;
  startWorkThread();

  startWorkThread();
  updateButton.IsEnabled = false;

让我知道这是怎么回事。

答案 2 :(得分: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();
        }
    }
}