-1

我正在开发一个 WPF 应用程序并遵循 MVVM 方法。当用户单击“Enter”按钮时,我必须在登录屏幕上显示忙碌指示符。在“Enter”按钮上,我有一个名为“EnterCommand”的 ICommand,它会检查身份验证,然后加载 MainWindow。

private ICommand _EnterCommand;
public ICommand EnterCommand
{
    get
    {
        return _EnterCommand ?? (_EnterCommand = new DelegateCommand(() =>
        {
            Thread objThread = new Thread(LoadApplication);
            objThread.SetApartmentState(ApartmentState.STA);
            objThread.Start();

        }));
    }
}

IsBusy 属性绑定到这个 showprogress

private bool _ShowProgress = false;
public bool ShowProgress
{
    get { return _ShowProgress; }
    set
    {
        if (_ShowProgress != value)
        {
            _ShowProgress = value;
            FirePropertyChanged("ShowProgress");
        }
    }
}

我在这个命令上创建了一个线程,然后从 (bool Property name : ShowProgress) MVVM 设置 IsBusy 属性。

在加载应用程序中:

public void LoadApplication()
{
    ShowProgress= true;
    if (AuthenticateUser)
    {
        MainWindow objMainWindow = new MainWindow();
        objMainWindow.Show();
        Application.Current.MainWindow.Close();
    }
    ShowProgress= false;
}

objMainWindow.Show() 抛出错误 - 调用线程无法访问此对象,因为不同的线程拥有它。

同样在 App.xaml 中,我将 StartupUri 设置为我的“登录”窗口。

只要用户单击“Enter”按钮,就可以显示忙碌指示器,但是在显示主窗口时失败。

错误消息是“调用线程无法访问此对象,因为不同的线程拥有它。”

只要我的 MainWindow(即主屏幕)未启动,我就必须显示 busyindicator。

有什么帮助可以纠正这个问题吗?

4

2 回答 2

0

抛出异常是因为您无法从后台线程访问 UI 元素。

您必须调用objMainWindow.Show()主/UI 线程或要求调度程序为您调用它

如果你必须从 backgorund 线程调用它,你可以这样做:

Action act = () =>
{
   MainWindow objMainWindow = new MainWindow();
   objMainWindow.Show();
  Application.Current.MainWindow.Close();
};

 System.Windows.Application.Current.Dispatcher.Invoke(act);

我建议阅读以下 MSDN 文章

于 2013-06-25T13:24:31.940 回答
-1

试试这个代码:

private void AsyncCallback(IAsyncResult result){
    var dispatcher = Dispatcher.CurrentDispatcher;
    dispatcher.Invoke(new Action(() =>
    {
        MainWindow objMainWindow = new MainWindow();
        objMainWindow.Show();
        Application.Current.MainWindow.Close();
    }
}

编辑

public void LoadApplication()
    {
        ShowProgress= true;
        if (AuthenticateUser)
        {
            var dispatcher = Dispatcher.CurrentDispatcher;
            dispatcher.Invoke(new Action(() =>
            {
                MainWindow objMainWindow = new MainWindow();
                objMainWindow.Show();
                Application.Current.MainWindow.Close();
            }
        }
        ShowProgress= false;
    }
于 2013-06-25T13:28:50.457 回答