单击按钮更改文本,然后在运行时再次更改
本文关键字:运行时 按钮 文本 单击 然后 | 更新日期: 2023-09-27 17:58:36
我正在编写一个程序来更正文本文件中的值。在我的xaml中,我有一个文本框,用来报告状态/进度。"waiting"=程序启动前,"processing"=程序正在处理文件,"done"=文件已处理完毕。
这是我的文本字段和RUN按钮的xaml代码:
<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来说相对较新。
谢谢。
当您开始运行时,您的UI将不会更新,直到它结束运行当前线程。完成任务后,您的状态将很快从处理更新到完成,因此您不会看到更改。我建议使用后台工作程序来执行更长的操作,并且仍然可以操作UI。
请参阅以下操作:使用后台工作程序
您可能需要了解一下BackgroundWorker
的使用情况。在处理您的请求时,UI似乎被阻止了。
MSDN BackgroundWorker类
正如其他人所说,问题是所有代码都在同一个线程上执行。你的操作是在UI线程上运行的,这意味着它不能像你试图做的那样对更改做出响应
解决这个问题的方法是将你的工作转移到一个新的线程上。
(这假设.NET框架的更新版本支持异步/等待语法)
public class Operate
{
public async void operations()
{
statusBox.Text = "processing";
await Task.Run(()=>{
//do work here
});
status.Text = "finished";
}
}
请记住,从那项任务开始。Run命令在无法访问UI的其他线程上执行。如果您需要它从UI中获得一些信息,您可以在Task中传递它。像这样运行调用:
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类。