我希望在WPF中的TextBlock
期间更改Button_Click
的文本。
我试过这个,但它不起作用:
private void Button_Click(object sender, RoutedEventArgs e)
{
myTextBlock.Text = "Status: Not ready";
//Do Something
myTextBlock.Text = "Status: Ready";
}
答案 0 :(得分:3)
Button_Click
。这意味着执行的代码将阻止更新您的UI。一个简单的解决方案是使用async
和await
以及一个新线程来运行阻止操作。这允许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";
}