从主应用程序中的另一个线程访问WPF应用程序的属性

时间:2015-05-25 17:44:45

标签: c# wpf multithreading

我在主应用程序的一个主题上启动了一个WPF应用程序。

现在我想从主线程访问此WPF应用程序中的文本框。

我试图使用调度员,但我找不到办法。

这是我的代码

  class program
{
    public static event MyEventHandler event1;
    static Application a;
    static void fun()
    {
        a = new Application();
        a.StartupUri = new Uri("MainWindow.xaml", System.UriKind.Relative);
        //a.initializeComponent();
        a.Run();

    }

     //[STAThread]
    static void Main(string[] args)
    {
        Thread newThread = new Thread(new ThreadStart(fun));
        newThread.SetApartmentState(ApartmentState.STA);
        newThread.Start();
        Trace.WriteLine("rest");
        //I WANT TO ACCESS THE TEXT BOX FROM HERE 


    }
}

2 个答案:

答案 0 :(得分:3)

  1. 主线程需要对窗口和/或文本框的引用

    • 让创建窗口/文本框的线程在静态变量中引用窗口/文本框
  2. 当主线程想要访问文本框时,它必须切换到创建文本框的线程并从该线程获取结果。

  3. 从该问题的答案:

    string x;
    TheTextBox.Dispatcher.BeginInvoke((Action)(() => x = TheTextBox.Text));
    

答案 1 :(得分:0)

您可能需要执行类似的操作来循环应用程序的活动窗口以找到所需的窗口,然后在该窗口上调用方法以获取所需的实际文本框元素。

    public void AccessTextBox(string windowName, string textBoxName)
    {
        foreach (Window windowToCheck in a.Windows)
        {
            if (!windowToCheck.Name.Equals(windowName, textBoxName))
                continue;
            windowToCheck.Dispatcher.Invoke(((WindowTypeName)windowToCheck).AccessTextBox(textBoxName));
        }
    }

Dispatcher.Invoke调用是一个调用,它将您置于UI线程,执行对指定方法的调用,并返回到当前线程。

这是伪代码(非常丑陋:)),但应该让你走上正确的道路。