如何从WPF中的句柄获取Window

时间:2009-08-13 09:22:18

标签: wpf window

我有一个WPF UI,点击一个按钮,我正在启动线程。 我想从线程中读取UI上的几个txtbox值,并希望使用线程的状态更新UI上的文本框

我正在尝试将UI的句柄传递给线程并从句柄中获取窗口(就像我们在MFC中那样)并更新UI。

我能够将句柄作为“IntPtr ParentHandle = new WindowInteropHelper(this).Handle;”

但是不知道如何从手柄上取下窗户。

OR

我是否可以通过其他方式在线程上更新和检索WPF UI上的值。

1 个答案:

答案 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中一直这样做的方式。