在新任务WPF caliburn.micro c#中打开另一个视图

时间:2013-04-03 08:55:49

标签: c# wpf view caliburn.micro

我在第一个(MainView)中有2个视图我选择一个文件并导入它,在第二个视图(BView)中显示数据网格中该文件的详细信息。

这是第一个视图(MainView):

enter image description here

这是第二个视图(BView): enter image description here

当我点击"导入"出现在进度条和文本上,而第二个视图加载。我想在另一个TASK中打开另一个视图,但是我收到此错误消息:

"调用线程无法访问此对象,因为其他线程拥有该对象。"

这是MainViewModel的代码:

[Export(typeof(IShell))]
    public class MainViewModel : Screen
    {
        public string Path{ get; set; }
        public bool IsBusy { get; set; }
        public string Text { get; set; }
        [Import]
        IWindowManager WindowManager { get; set; }

        public MainViewModel()
        {
            IsBusy = false;
            Text = "";
        }


        public void Open()
        {
            OpenFileDialog fd = new OpenFileDialog();
            fd.Filter = "Text|*.txt|All|*.*";
            fd.FilterIndex = 1;

            fd.ShowDialog();

            Path= fd.FileName;
            NotifyOfPropertyChange("Path");
        }


        public void Import()
        {
            if (Percorso != null)
            {
                IsBusy = true;
                Text = "Generate..";
                NotifyOfPropertyChange("IsBusy");
                NotifyOfPropertyChange("Text");
                Task.Factory.StartNew(() => GoNew());

            }
            else
            {
                MessageBox.Show("Select file!", "Error", 
                    MessageBoxButton.OK, MessageBoxImage.Error);
            }
        }

        public void GoNew()
        {
            WindowManager.ShowWindow(new BViewModel(Path), null, null);
            Execute.OnUIThread(() =>
            {
                IsBusy = false;
                NotifyOfPropertyChange("IsBusy");
                Text = "";
                NotifyOfPropertyChange("Text");
            });
        }         

    }

我能做什么?

1 个答案:

答案 0 :(得分:6)

您需要在UI线程上执行WindowManager.ShowWindow,因为Task.Start()将位于不同的线程上。应始终将任何UI操作编组到UI线程,或者获得您提到的跨线程异常。

尝试:

    public void GoNew()
    {
        Execute.OnUIThread(() =>
        {
            WindowManager.ShowWindow(new BViewModel(Path), null, null);
            IsBusy = false;
            NotifyOfPropertyChange("IsBusy");
            Text = "";
            NotifyOfPropertyChange("Text");
        });
    }         

编辑:试试这个

   public void GoNew()
    {
        var vm = new BViewModel(Path);

        Execute.OnUIThread(() =>
        {
            WindowManager.ShowWindow(vm, null, null);
            IsBusy = false;
            NotifyOfPropertyChange("IsBusy");
            Text = "";
            NotifyOfPropertyChange("Text");
        });
    }