1

次の問題があります: 私のアプリケーションは画面更新を行い、その後新しいビューのスクリーンショットを作成する必要があります。
コードは次のとおりです。

    public ViewModelBase Screen {
        get {
            if (_screen == null) {
                Screen = new DataSourceChooserScreenViewModel(this);
                History.ChangeHistory(ADD_ITEM);
            }
            return _screen;
        }
        set {
            _screen = value;
            OnPropertyChanged("Screen");

            System.Windows.Forms.Application.DoEvents();
        }
    }

画面更新は「OnPropertyChanged("Screen")」で行い、スクリーンショットは「History.ChangeHistory(ADD_ITEM)」で取得します。
「Screen」のセッターを呼び出すメソッドは、すべて同じスキームに従います。

//Do something
Screen = otherScreen;
History.ChangeHistory(ADD_ITEM);
//Do something else

そしてここに問題があります: スクリーンショットは画面が更新される前に作成されますが、実行順序は別のことを示しています。

自分で問題を解決するために、いくつかのことを 試し
まし
た 。

すべての試行で同じ結果が得られました。スクリーンショットは、画面が更新される前に行われました。思いついたタイマーの使い方を試してみると、 ADD_ITEMを実行したに画面が更新されてしまいます。したがって、コンパイラーが暗黙的なスレッド化を行うことをお勧めしますが、それを修正/防止する方法がわかりません。

ご協力いただきありがとうございます。

4

1 に答える 1

1

そのようなことをしなければならないときは、すべてが処理された後に発生するタイマーイベントを常に使用します。これはワンショット タイマー イベントであり、使用法は次のようになります。

それを発射するには:

Timer t=new Timer();
t.Tick+=DoAfter;
t.Interval=100;
t.Start();

行う必要があるのは次のとおりです。

void DoAfter(object Sender, SomeArgs a)
{
    Timer t=(Timer)Sender;
    t.Stop();
    t.Dispose();
    //  perform your stuff here
    DoStuff();
}

そうすれば、メッセージループがすべてを実行し、タイマーが起動する前に画面の更新が完了する可能性が高くなります。

于 2011-02-09T12:12:20.787 に答える