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

时间:2016-07-25 19:29:58

标签: c# wpf xaml

我正在编写一个程序来纠正文本文件中的值。在我的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来说相对较新。

感谢。

3 个答案:

答案 0 :(得分:2)

当您开始运行时,在结束运行当前线程之前,您的UI不会更新。 完成任务后,您的状态将从处理到结束非常快速地更新,因此您将看不到更改。 我建议使用后台工作程序执行更长时间的操作,并且仍然可以运行UI。

请参阅此指南:Use a background worker

答案 1 :(得分:2)

您可能需要查看使用BackgroundWorker。在处理您的请求时,UI似乎被阻止了。

MSDN BackgroundWorker Class

答案 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类。