我有一个WPF UI,点击一个按钮,我正在启动线程。 我想从线程中读取UI上的几个txtbox值,并希望使用线程的状态更新UI上的文本框
我正在尝试将UI的句柄传递给线程并从句柄中获取窗口(就像我们在MFC中那样)并更新UI。
我能够将句柄作为“IntPtr ParentHandle = new WindowInteropHelper(this).Handle;”
但是不知道如何从手柄上取下窗户。
OR
我是否可以通过其他方式在线程上更新和检索WPF UI上的值。
答案 0 :(得分:1)
无需使用任何手柄。只需传递对象引用。您可以使用ParameterizedThreadStart
类创建线程,该类采用object
参数。因此,您可以定义一个对象,该对象包含要传递给线程的所有值的成员,而不是让线程从UI中检索它们。此外,您可以传递对窗口类的引用,因此当线程完成(或更新状态)时,您可以使用该引用(请记住使用Dispatcher更新控件(在WinForms中您已经完成) this.Invoke
)。
这可能如下所示:
public class WPFWindow ...
{
private class ThreadData
{
public int Value1;
public string Value2;
public WPFWindow Window;
}
....
private void StartThread()
{
ThreadData tdata = new ThreadData();
tdata.Value1 = 42;
tdata.Value2 = "Hello World!";
tdata.Window = this;
Thread t = new Thread(new ParameterizedThreadStart(ThreadMethod));
t.Start(tdata);
}
private void ThreadMethod(object data)
{
ThreadData tdata = (ThreadData)data;
// ... process values here
// Update controls
if(tdata.Window.textbox.Dispatcher.CheckAccess())
{
// The calling thread owns the dispatcher, and hence the UI element
tdata.Window.textbox.AppendText(...);
}
else
{
// Invokation required
tdata.Window.textbox.Dispatcher.Invoke(DispatcherPriority.Normal, delegate);
}
}
}
请注意,我是盲目地写这篇文章而没有在WPF中测试过。但是,这是我在WinForms中一直这样做的方式。