WPF 等待文本框更新

WPF Wait for textbox to update

我有一个 WPF window,它应该更新一个文本框来告诉用户发生了什么,然后执行一个 bat 文件。 然而它只是执行这些文件而不更新文本框。

 MainLine.Text = "Running for " + customer;
 DataInput.Text = "Running Data input.";
 ExecuteProcess(Baseloco + "01_DataInput.bat");
 Mailsort.Text = "Running Mailsort.";
 ExecuteProcess(Baseloco + "02_Mailsort.bat");
 SampleandRecon.Text = "Running sample + recon.";
 ExecuteProcess(Baseloco + "03_SampleandRecon.bat");

执行过程只是调用我写的bat文件的方法

所以我希望文本框在 运行 bat 文件

之前更新并完全完成更新

有什么帮助吗?

我建议您初始化一个新线程来完成这项工作,然后使用 dispatcher.invoke 设置文本框。像这样:

Task.Run(() =>
{
    Dispatcher.Invoke(() =>
    {
        MainLine.Text = "Running for " + customer;
        DataInput.Text = "Running Data input.";
    });
    ExecuteProcess(Baseloco + "01_DataInput.bat");
    Dispatcher.Invoke(() => Mailsort.Text = "Running Mailsort.");
    ExecuteProcess(Baseloco + "02_Mailsort.bat");
    Dispatcher.Invoke(() => SampleandRecon.Text = "Running sample + recon.");
    ExecuteProcess(Baseloco + "03_SampleandRecon.bat");
});

编辑:

由于说明批处理文件可能需要 运行 并行,我建议使用此代码以获得更好的性能:

Task.Run(() =>
{
    Dispatcher.Invoke(() =>
    {
        MainLine.Text = "Running for " + customer;
        DataInput.Text = "Running Data input.";
    });
    ExecuteProcess(Baseloco + "01_DataInput.bat");
});

Task.Run(() =>
{
    Dispatcher.Invoke(() => Mailsort.Text = "Running Mailsort.");
    ExecuteProcess(Baseloco + "02_Mailsort.bat");
});

Task.Run(() =>
{
    Dispatcher.Invoke(() => SampleandRecon.Text = "Running sample + recon.");
    ExecuteProcess(Baseloco + "03_SampleandRecon.bat");
});

您应该将 ExecuteProcess 方法声明为异步的:

private async Task ExecuteProcess(string file)
{
    await Task.Run(() =>
    {
        // run file...
    });
}

然后 运行 您的执行步骤,例如在异步事件处理程序中:

private async void Button_Click(object sender, RoutedEventArgs e)
{
    MainLine.Text = "Running for " + customer;
    DataInput.Text = "Running Data input.";
    await ExecuteProcess(Baseloco + "01_DataInput.bat");

    Mailsort.Text = "Running Mailsort.";
    await ExecuteProcess(Baseloco + "02_Mailsort.bat");

    SampleandRecon.Text = "Running sample + recon.";
    await ExecuteProcess(Baseloco + "03_SampleandRecon.bat");
}