3

このケースでは、C#WPFを使用しています。ボタンをクリックするとすぐに無効にして、2回続けてクリックしないようにします。ボタンを無効にしまし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 に答える