2011-03-17 131 views
1

有没有延迟绘制WindowsFormsHost的方法?它在WPF中托管。延迟绘制WindowsFormsHost?

它拥有一个COM对象,它是一个ESRI ArcEngine AxTocControl。在外观上,它看起来像一个目录表标签。

我从目录中删除了一些对象,并在一个函数中添加了不同的对象。

当我删除一个对象时,TOC控件闪烁并删除对象,然后添加一个对象,并闪烁并添加一个对象。由于我添加和删除了20个对象,所以它闪烁了20次。我想延迟绘图 - 完成我所有的操作 - 然后恢复绘制 - 希望我只会有1或2次闪烁/闪烁。因此,总结一下,是否有一个函数或技术(我不在乎它是多么的不可靠)延迟绘制一个WindowsFormHost - 让一些事情执行 - 然后恢复绘制?

+0

如果您觉得我的回答是令人满意的,请记得在赏金到期前给予赏金。谢谢! :) – Jon 2011-03-26 16:23:40

+0

@Jon对不起,我以为我已经做了那个星期五 – 0x4f3759df 2011-03-28 13:35:58

+0

谢谢!这实际上是我得到的第一个完整的赏金 - 被挫折了几次:) – Jon 2011-03-28 13:40:29

回答

5

那么,您可以为此特定场景创建自己的WindowsFormsHost子类,并覆盖WndProc。从那里,只要“抑制更新”条件成立,您就可以决定默默地忽略(通过不打电话base.WndProc)所有drawing-related messages

您可以使用任何您喜欢的方式执行条件,例如在你的类中设置一个公共的PausePainting()/ResumePainting()方法来设置一个布尔型字段。

您还必须记得在被称为ResumePainting(),因为你不希望你的控制权从来没有更新。

最后它不会像A-B-C那么简单,但是这个概念是完美的,所以它应该可以实现。

0

您可以使用Thread.Sleep(0)来引入延迟。

0

您可以尝试处理所有内容,将它们逐个添加到列表中,然后一次添加整个列表。

myWpfControl.Clear(); 
List<EsriModel> items = new List<EsriModel>(); 
// Code to populate your items 
myWpfControl.AddRange(items.ToArray()); 

难道是这么简单吗?这应该防止你的WPF控件闪烁,因为你一个接一个地添加它们。