【发布时间】:2019-02-20 16:03:41
【问题描述】:
我正在使用 WPF,并希望它像控制台应用程序一样工作。请多多包涵,因为这是我第一次尝试使用 WPF。基本上我现在拥有的是一个全屏的白色窗口,里面有一个文本框。
我有一个调用方法的 ContentRendered 事件。这种方法需要做一些进程(包括启动和杀死一些应用程序)。在每个进程和另一个进程之间,它正在更改 textBox.Text 并附加状态,类似于“Process x ready...”等。
我遇到的问题是窗口正在加载一个空的文本框,并且在所有进程准备好之后,textBox.Text 更改都会在最后立即呈现。
我做错了什么?
public partial class MainWindow : Window
{
public MainWindow()
{
Topmost = true;
InitializeComponent();
}
private async void Window_ContentRendered(object sender, System.EventArgs e)
{
await ProcessFlow.Start();
}
}
class ProcessFlow
{
public async static Task Start()
{
await Logger.Write("Opening App...");
ProcessStartInfo startInfo = new ProcessStartInfo(@"C:\Program Files (x86)\App\App.exe");
startInfo.WindowStyle = ProcessWindowStyle.Hidden;
using (var process = Process.Start(startInfo))
{
await Logger.WriteLine(" done!");
Thread.Sleep(30000);
await Logger.Write("Closing App...");
process.Kill();
await Logger.WriteLine(" done!");
}
}
}
public class Logger
{
static MainWindow Form = Application.Current.Windows[0] as MainWindow;
public async static Task Write(string text)
{
Form.textBox1.Text += text;
}
public async static Task WriteLine(string text)
{
Form.textBox1.Text += text + "\r\n";
}
}
【问题讨论】:
-
你能展示一下你是如何更新文本框的吗?
-
你在 UI 线程上工作。在 UI 线程返回到消息循环之前,UI 无法更新。您要么需要执行异步操作(例如 IO),要么使用后台线程。
-
@JeffR。公共类 Logger { static MainWindow Form = Application.Current.Windows[0] as MainWindow;公共异步静态任务写入(字符串文本){ Form.textBox1.Text += text; } public async static Task WriteLine(string text) { Form.textBox1.Text += text + "\r\n"; } }
-
@glenebob ContentRendered 是一个异步事件处理程序,它通过等待 ProcessFlow.Start() 调用我的异步方法;
-
请编辑问题并在此处添加代码以便我们阅读。