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)”中进行。
调用“屏幕”设置器的方法遵循所有相同的方案:

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

这就是问题所在:屏幕截图是在屏幕更新之前制作的,尽管执行顺序说明了其他内容。

为了自己解决问题,我尝试了几件事:
在 ADD_ITEM 中忙等待 在 ADD_ITEM 中
按计时器
等待 通过 BeginInvoke() 和 EndInvoke() 等待 PropertyChangedEvent 的异步线程的
使用 System.Windows.Forms.Application.DoEvents() 的使用

所有尝试都有相同的结果:屏幕截图是在屏幕更新之前完成的。在尝试使用计时器时,我发现在执行 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 回答