我有几天前制作的自定义WPF控件:
public class MapContext : FrameworkElement{
//....
protected override void OnRender(DrawingContext dc) {
// Draw the map
if (mapDrawing != null) dc.DrawDrawing(mapDrawing);
}
mapDrawing
绘图在另一个线程中更新,其中计算要显示的所有几何,然后线程通过调用InvalidateVisual()
来更新UI:
Application.Current.Dispatcher.Invoke(DispatcherPriority.Render, new Action(delegate { InvalidateVisual(); }));
在InvalidateVisual
上,MSDN documentation说:
使元素的呈现无效,并强制执行完整的新布局。在布局周期完成后调用OnRender。
这不是我想要的行为,因为MapContext
控件布局没有改变。只有里面的图画发生了变化。
问题
是否有一种强制OnRender
方法在没有完成布局传递的情况下被调用的正确方法?
提前致谢
答案 0 :(得分:2)
不,没有布局传递就无法强制重新渲染。 由于WPF使用保留模式系统,因此OnRender()不像旧的WinAPI日那样工作。 OnRender()只存储一组绘图指令,WPF确定如何以及何时进行实际渲染。
如果您需要更改控件的外观而不依赖于大小调整,我建议您使用类似DrawingVisual的东西,并使用RenderOpen()在您想要更改时添加mapDrawing。
答案 1 :(得分:1)
也许您不是使用自己的控件,而是可以使用地图绘制图像并将此图像设置为标准控件的来源?像绘图这样的操作通常需要一些时间,所以最好在后台准备图像,然后用当前显示的方式切换它。