如何在单击按钮期间更改 TextBlock 文本?

How do I change a TextBlock Text during Buton Click?

我想在 WPF 中的 Button_Click 期间更改 TextBlock 的文本。 我试过了,但没用:

private void Button_Click(object sender, RoutedEventArgs e)
{
    myTextBlock.Text = "Status: Not ready";

    //Do Something

    myTextBlock.Text = "Status: Ready";

}

Button_Click 从 UI 线程中调用。这意味着执行的代码将阻止更新您的 UI。一个简单的解决方案是使用 asyncawait 以及一个新线程来 运行 您的阻塞操作。这允许 UI 线程在阻塞操作期间更新 UI。

private async void Button_Click(object sender, RoutedEventArgs e)
{
    myTextBlock.Text = "Status: Not ready";

    await Task.Run(() =>
    {
        //Your code here
    }).ConfigureAwait(true);

    myTextBlock.Text = "Status: Ready";
}

注意需要添加ConfigureAwait(true)才能再次使用UI线程第二次更新正文

您需要将注释 //Do Something 替换为一些在另一个线程上实际执行某些操作的代码。如果不这样做,您将永远没有机会看到 "Status: Not ready" 消息,因为 Text 属性 将在您单击 [ 后几乎立即设置为 "Status: Ready" =14=].

试试这个:

private async void Button_Click(object sender, RoutedEventArgs e)
{
    myTextBlock.Text = "Status: Not ready";

    await Task.Delay(3000); //wait asynchronously for 3 seconds..

    myTextBlock.Text = "Status: Ready";

}

在您确认这按预期工作后,您可能想要开始一项任务,按照@Fruchtzwerg 的建议做一些有意义的事情。 ConfigureAwait(true) 在这里是多余的:

await Task.Run(() =>
{
    //Do something
});

为了避免在线程中写入所有处理,我这样做了:

        private async void Button_Click(object sender, RoutedEventArgs e)
        {
            
             myTextBlock.Text = "Status: Not ready";
             await Task.Run(() =>
             {
                 Thread.Sleep(1000);
             }).ConfigureAwait(true);

             //Do your processing
             Treatment();

             myTextBlock.Text = "Status: Ready";
        }