我可以通过以下代码在新线程中打开一个新窗口。如何更新由新线程打开的新窗口中的文本框?
下面的代码是从MainWindow.xaml.cs
private void buttonStartStop_Click(object sender, RoutedEventArgs e)
{
Test test = new Test();
Thread newWindowThread = new Thread(new ThreadStart(test.start));
newWindowThread.SetApartmentState(ApartmentState.STA);
newWindowThread.IsBackground = true;
newWindowThread.Start();
}
和从test.start()
public void start()
{
OutputWindow outputwindow = new OutputWindow();
outputwindow.Show();
Output.print("Begin");
System.Windows.Threading.Dispatcher.Run();
Output.print("FINAL");
System.Windows.Threading.Dispatcher.Run();
}
以下而下面是从输出类
public static void print(String str)
{
Dispatcher uiDispatcher = OutputWindow.myOutputWindow.Dispatcher;
uiDispatcher.BeginInvoke(new Action(delegate() { OutputWindow.myOutputWindow.textBoxOutput.AppendText(str + "\n"); }));
uiDispatcher.BeginInvoke(new Action(delegate() { OutputWindow.myOutputWindow.textBoxOutput.ScrollToLine(OutputWindow.myOutputWindow.textBoxOutput.LineCount - 1); }));
}
public static void printOnSameLine(String str)
{
Dispatcher uiDispatcher = OutputWindow.myOutputWindow.Dispatcher;
uiDispatcher.BeginInvoke(new Action(delegate() { OutputWindow.myOutputWindow.textBoxOutput.AppendText(str); }));
uiDispatcher.BeginInvoke(new Action(delegate() { OutputWindow.myOutputWindow.textBoxOutput.ScrollToLine(OutputWindow.myOutputWindow.textBoxOutput.LineCount - 1); }));
}
“开始”不会在文本框中打印,但“FINAL”不会,我想要Test类中的启动方法更新输出窗口中的文本框通过程序。做这个的最好方式是什么?
谢谢你提前
感谢您的回复和代码。 这就是我想要做的: 1.当buttonStartStop被点击时,我想要另一个类中的方法在另一个线程中启动并运行。 2.“开始”方法将打开一个新的窗口,其中包含一个文本框,因为它正在工作,它将更新文本框以提供用户反馈。 – Arya
为什么不先创建文本框,然后新的表单就可以创建线程并启动它。至少,这摆脱了一个sleep()循环。 –
在这种情况下,我会在当前GUI线程中正常打开窗口,并在后台线程中执行所有其他工作。打开的窗口上的更新可以直接通过GUI调度程序进行。如何组织这一点并不重要。请注意:1.如果窗口是在后台线程中创建的,则必须将线程设置为STA并在Show()后调用Dispatcher.Run()。 2。所有对打开的窗口的调用都应该通过它的调度程序对象。 3.“进度信息”窗口不应该在执行处理的同一个线程中,否则它将被阻止。如果你需要一些代码...评论我。 – user1018735