【问题标题】:How to get Window from handle in WPF如何从 WPF 中的句柄获取窗口
【发布时间】:2010-11-19 05:57:28
【问题描述】:

我有一个 WPF UI,点击一个按钮我开始线程。 我想从线程中读取 UI 上的几个 txtbox 值,并想用线程的状态更新 UI 上的文本框

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

我可以将句柄设为“IntPtr ParentHandle = new WindowInteropHelper(this).Handle;”

但不知道如何从句柄中获取窗口。

有没有其他方法可以从线程更新和检索 WPF UI 上的值。

【问题讨论】:

    标签: wpf window


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

    【讨论】:

    • 感谢您的回答,只有一个问题,在 else 情况下,delgate 的实施方式是什么
    • 委托(也可以是匿名方法)只会更新相应的控件。我想您也可以检查窗口本身的调度程序,然后将所有代码更新控件放入委托中。可以在此处找到示例:ascendedguard.com/2007/08/…
    猜你喜欢
    • 1970-01-01
    • 2011-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-25
    • 2012-11-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多