我有以下问题: 我的应用程序进行了屏幕更新,之后应该制作新视图的屏幕截图 代码如下:
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”的setter的方法遵循所有相同的方案:
//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后更新。所以我建议编译器进行一些隐式线程,我不知道如何修复/阻止它。
感谢您的帮助。
答案 0 :(得分: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();
}
这样你就很有可能消息循环将完成所有事情,屏幕更新将在计时器触发之前完成。