如何在Buton Click期间更改TextBlock文本?

时间:2018-02-27 14:20:03

标签: c# wpf textblock

我希望在WPF中的TextBlock期间更改Button_Click的文本。 我试过这个,但它不起作用:

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

    //Do Something

    myTextBlock.Text = "Status: Ready";

}

3 个答案:

答案 0 :(得分:3)

从UI线程中调用

Button_Click。这意味着执行的代码将阻止更新您的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线程来第二次更新文本。

答案 1 :(得分:0)

您需要将注释//Do Something替换为在另一个线程上实际执行某些操作的代码。如果你不这样做,你将永远不会有机会看到"状态:未准备好" Text属性的消息将设置为"状态:就绪"几乎在你点击Button之后立即。

试试这个:

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
});

答案 2 :(得分:0)

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

        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";
        }