单击按钮更改文本,然后在运行时再次更改

本文关键字:运行时 按钮 文本 单击 然后 | 更新日期: 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类。