我可以通過以下代碼在新線程中打開一個新窗口。如何更新由新線程打開的新窗口中的文本框?
下面的代碼是從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