我有一个WPF自定义控件,有时需要一段时间来渲染一些复杂的场景。我希望能够告诉我的自定义控件显示占位符图像(例如“请等待 - 渲染!”),然后实际在空闲时间(处理输入后)渲染控件。
我正在考虑修改我的自定义控件来保存父网格和两个子节点:A)占位符图像和B)实际内容。默认情况下,A)是可见的,当自定义控件的可见性发生变化时,我可以BeginInvoke一个委托,而该委托将反过来显示B)而不是A)。
如果屏幕上有很多/几个这样的控件实例,他们希望在同时渲染所有控件的同时不会阻塞主线程。由于委托排队的优先级低于输入优先级,因此理论上UI应该保持高响应性。
有没有人遇到过类似的问题?
答案 0 :(得分:1)
是的,这种方法可以正常使用,我已经多次使用它了。
通常,如果控件需要在呈现之前检索和/或处理数据,我会使用此方法。我建议在后台线程上完成所有这些工作,然后使用元素的Dispatcher调用实际的渲染更新。
提示:我经常会声明一个名为类似int的修订版的内部DP,并将其注册到AffectsRender。然后,一旦后台线程完成了繁重的处理,它就可以通过BeginInvoke()调用来增加Revision属性,从而使render无效并导致新的渲染过程。然后,您可以像往常一样在OnRender覆盖中执行适当的渲染逻辑。