【发布时间】:2011-02-09 11:37:29
【问题描述】:
我有以下问题:
我的应用程序进行了屏幕更新,之后应该制作新视图的屏幕截图。
代码如下:
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 执行后更新。所以我建议编译器做一些隐式线程,我不知道如何修复/防止它。
感谢您的帮助。
【问题讨论】:
-
对不起,愚蠢的假设......你有没有在截图前尝试使用 System.Windows.Forms.Application.DoEvents() 几次?
-
另外,尝试在另一个线程中制作屏幕截图。先调用 DoEvents 再通过 ThreadPool.QueUserWorkItem 启动新线程
标签: c# winforms view synchronisation