使自己的WPF控件无效

时间:2011-12-20 12:07:38

标签: c# wpf

我有几天前制作的自定义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方法在没有完成布局传递的情况下被调用的正确方法?

提前致谢

2 个答案:

答案 0 :(得分:2)

不,没有布局传递就无法强制重新渲染。 由于WPF使用保留模式系统,因此OnRender()不像旧的WinAPI日那样工作。 OnRender()只存储一组绘图指令,WPF确定如何以及何时进行实际渲染。

如果您需要更改控件的外观而不依赖于大小调整,我建议您使用类似DrawingVisual的东西,并使用RenderOpen()在您想要更改时添加mapDrawing。

答案 1 :(得分:1)

也许您不是使用自己的控件,而是可以使用地图绘制图像并将此图像设置为标准控件的来源?像绘图这样的操作通常需要一些时间,所以最好在后台准备图像,然后用当前显示的方式切换它。