1

申し訳ありませんが、私は WPF に関しては初心者です。

ボタンをクリックすると、関数の開始時にラベルに 1 つのメッセージが表示され、関数の完了時に別のメッセージが表示されるようにしたいと考えています。

ここのコードでは、ボタンがクリックされたときに表示される最後のメッセージの値のみが表示されます。誰かが私に理由を説明できますか?

これはうまくいかないので、私が本当にやりたいことを達成するにはどうすればよいでしょうか? あるメッセージ (「処理中」など) をしばらく表示し、関数が完了したときに別のメッセージ (「完了」など) を表示するにはどうすればよいでしょうか?

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        MessageLabel.Content = "I never see this";

        System.Threading.Thread.Sleep(2000);

        MessageLabel.Content = "I only see this";
    }
}

ありがとうブラシュマ!これは、BackgroundWorker オブジェクトで必要なことを行うコードです。

public partial class MainWindow : Window
{
    private BackgroundWorker backgroundWorker1 = new BackgroundWorker();

    public MainWindow()
    {
        InitializeComponent();

        backgroundWorker1.WorkerReportsProgress = true;
        backgroundWorker1.WorkerSupportsCancellation = false;

        backgroundWorker1.DoWork += worker_DoWork;
        backgroundWorker1.RunWorkerCompleted += worker_RunWorkerCompleted;
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        MessageLabel.Content = "I see this now";

        if (backgroundWorker1.IsBusy != true)
        {
            backgroundWorker1.RunWorkerAsync(); 
        }
    }

    private void worker_DoWork(object sender, DoWorkEventArgs e)
    {
        System.Threading.Thread.Sleep(2000);
    }

    private void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        MessageLabel.Content = "and I see this too";
    }
}
4

1 に答える 1

2

変更が表示されない理由は、これがすべて UI スレッドで実行され、ラベルが 2 回目に更新されるまで画面を更新する機会がないためです。コードの「重い」部分を実行するには、 BackgroundWorker
を 使用する必要があります (たとえば、Sleep + ラベルの更新)。

コードの簡単な例:

private void Button_Click(object sender, RoutedEventArgs e)
{
    MessageLabel.Content = "I never see this";

    BackgroundWorker bw = new BackgroundWorker();
    bw.DoWork += (s,a) =>
          {
                Thread.Sleep(2000);
          };
    bw.RunWorkerCompleted += (s, a) =>
          {
                MessageLabel.Content = "I saw it now";
          };
    bw.RunWorkerAsync(); // Start BackgroundWorker
于 2013-03-25T23:53:28.930 に答える