-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 プロパティを設定しています。

LoadApplication で:

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 の表示中に失敗しました。

エラー メッセージは、「別のスレッドが所有しているため、呼び出し元のスレッドはこのオブジェクトにアクセスできません。」

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 に答える