我在做WPF程序的时候遇到了这个问题,在运行程序的时候弹出这个错误!
程序中有两个线程分别为监听线程和界面线程,我要在监听线程中更新界面,
首先我遍历界面代码如下:
 foreach (Window f in Application.Current.Windows)
{
     if(f  is MainWindow)
          ............
}但是程序运行到这里就会弹出窗口:“调用线程无法访问此对象,因为另一个线程拥有该对象”,这个问题如何解决,请高手帮帮忙,谢谢了!!!

解决方案 »

  1.   

    你不是用的 Dispatcher.Invoke 更新的吗?
      

  2.   

    WPF跟WinForm在这一点上是相同的:简单点来讲就是——刷新界面的活只能在UI线程里跑。你的问题是:你试图在另一个线成里刷新UI,这时候错误就会抛出,因为非UI线程是不能亲自刷新UI的,它们需要告诉UI线程:“我们需要你帮助把UI刷新一下”。如果你是在.xaml.cs文件中,你可以直接调用Dispatcher.Invoke((Action)delegate { /* Your
    code is put here */ });如果你在ViewModel里,你可以Application.Current.Dispatcher.Invoke((Action)delegate { /* Your code is put here */ });
      

  3.   

    可是foreach (Window f in Application.Current.Windows)
    这句代码放在哪里,我想在当前所有的窗口中查找特定的窗口。这句也会弹出上面的错误。public delegate void PassParametersEventHandler(List<string> parameters);
    public delegate void BindPositionEventHandler();
    public override void Execute(List<string> parameters)
    {
                
          foreach (Window f in Application.Current.Windows)
          {
               if (f is MainWindow2)
               {                    
                   MainWindow2 mainwindow = (MainWindow2)f;
                   mainwindow.Dispatcher.Invoke(new PassParametersEventHandler  (mainwindow.ExcuteResultFirst), parameters);
                   mainwindow.Dispatcher.Invoke(new BindPositionEventHandler(mainwindow.BindFirstFloorPosition));
                   break;
               }
          } 
              
    }上面的这段代码是放在监听线程中的,我想要更新MainWindow2界面中的东西,可是出错。
    我注释掉foreach内的东西,只留下
    foreach (Window f in Application.Current.Windows)
    也会出现标题所示的错误,希望高手帮帮忙,急需解决!