咱们都知道在WPF里面用多线程打开一个窗口很简单.以下多线程
public void ClickMe(object sender)
{
Thread newWindowThread = new Thread(new ThreadStart(A));
newWindowThread.SetApartmentState(ApartmentState.STA);
newWindowThread.IsBackground = true;
newWindowThread.Start();
}框架
public void A()
{
Window w=new Window();//这个你想打开哪一个就实例化哪一个
w.Show();
System.Windows.Threading.Dispatcher.Run();
}异步
可是在使用Caliburn.Micro它的时候,咱们知道在WPF里面开辟其余的线程是由Dispatcher他来搞定的.可是在ViewModel里面没办法实例化你想要的页面,只有VIewModel.而CMspa
这个框架有3个打开窗口的方法好比ShowDialog等等.他原理是更具ViewModel生成View.源码以下线程
咱们能够看到他最后返回一个View,但咱们直接调用他会报这个错3d
其实想一想也能明白,咱们在ViewModel里面调用这个ShowDialog,他的全部者确定是本页面,咱们用Dispatcher开辟一个新线程,用新线程去调用父线程(这个说法可能不对)的方法确定是不行的.因此说这个对象已经被另外一个对象拥有了. 我觉的到这个时候你们都知道该怎么作了,那就是看源码,找到哪一个地方给全部者赋值了.找源码对象
咱们能够看到红框里面的就是给全部者赋值的,把他注释了,在试试就能够了.blog
缘由就是上面的了.把这个类单独拿出来,提出一个方法专门打开异步的窗口挺好,哈哈,开源就是好.源码