我正在编写一个程序来纠正文本文件中的值。在我的xaml中,我有一个文本框,应该报告状态/进度。 “等待”=在程序启动之前,“处理”=程序正在处理文件,“完成”=文件已被处理。
这是我的文本字段的xaml代码和RUN按钮:
<TextBox x:Name="statusBox" HorizontalAlignment="Left" Height="23" Margin="130,332,0,0" TextWrapping="Wrap" Text="waiting" VerticalAlignment="Top" Width="120" FontSize="14" TextAlignment="Center" IsReadOnlyCaretVisible="True" >
<Button Content="Run"
Name="Run"
HorizontalAlignment="Left"
Margin="562,27,0,0"
VerticalAlignment="Top"
Width="53"
Click="Run_Click"
RenderTransformOrigin="-0.305,0.487" Height="19">
<Button.BindingGroup>
<BindingGroup Name="btnOpen"/>
</Button.BindingGroup>
<Button.RenderTransform>
<TransformGroup>
<ScaleTransform/>
<SkewTransform/>
<RotateTransform Angle="-0.848"/>
<TranslateTransform/>
</TransformGroup>
</Button.RenderTransform>
</Button>
以下是我遇到的问题:
我尝试了很多不同的方法。我下面的内容是最近的尝试。
//In XAML, the status defaults to "waiting".
public class Operate
{
public void operations()
{
statusBox.Text = "processing";
... Perform Text Operations
status.Text = "finished";
}
}
当我运行程序时,我会在状态文本框中看到“等待”。但是,当我单击“运行”时,程序开始,但文本仍然显示“正在等待”。然后,当程序运行完毕后,文本将更改为“已完成”,而不会更改为“处理”。
非常感谢任何帮助。我编写了许多控制台应用程序,但对wpf来说相对较新。
感谢。
答案 0 :(得分:2)
当您开始运行时,在结束运行当前线程之前,您的UI不会更新。 完成任务后,您的状态将从处理到结束非常快速地更新,因此您将看不到更改。 我建议使用后台工作程序执行更长时间的操作,并且仍然可以运行UI。
请参阅此指南:Use a background worker
答案 1 :(得分:2)
您可能需要查看使用BackgroundWorker
。在处理您的请求时,UI似乎被阻止了。
答案 2 :(得分:1)
正如其他人所说,问题是所有代码都在同一个线程上执行。您的操作正在UI线程上运行,这意味着它无法像您尝试的那样响应更改等内容。
解决这个问题的方法是将你的工作转移到新的线程上。
(这假定支持async / await语法的.NET框架的更新版本)
public class Operate
{
public async void operations()
{
statusBox.Text = "processing";
await Task.Run(()=>{
//do work here
});
status.Text = "finished";
}
}
请记住,由于Task.Run命令在不同的线程上执行,因此无法访问UI。如果您需要它来从UI获取一些信息,您可以在Task.Run调用中传递它,如下所示:
await Task.Run(mydata=>{
//do stuff, with mydata variable
});
如果您需要返回要在UI上显示的内容,则可以执行以下操作:
var myReturnValue = await Task.Run(mydata=>{
//do work
return myNewReturnData;
});
//can do something with your return data here.
如果您需要能够让用户单击其他按钮取消事务,请查找CancellationToken类。