C# 使自己的WPF控件无效

C# 使自己的WPF控件无效,c#,wpf,C#,Wpf,我有一个定制的WPF控件,是我几天前制作的: public class MapContext : FrameworkElement{ //.... protected override void OnRender(DrawingContext dc) { // Draw the map if (mapDrawing != null) dc.DrawDrawing(mapDrawing); } mapDrawing绘图在另一个线程中更

我有一个定制的WPF控件,是我几天前制作的:

 public class MapContext : FrameworkElement{
     //....
      protected override void OnRender(DrawingContext dc) {
         // Draw the map
         if (mapDrawing != null) dc.DrawDrawing(mapDrawing);
 }
mapDrawing
绘图在另一个线程中更新,该线程将计算要显示的所有几何图形,然后通过调用
InvalidateVisual()
更新UI:

InvalidateVisual
上,显示:

使图元的渲染无效,并强制执行完整的新布局过程。布局循环完成后调用OnRender

这不是我想要的行为,因为
MapContext
控件布局没有更改。只有内部的图形已更改

问题 是否有一种正确的方法可以在不进行完整布局传递的情况下强制调用
OnRender
方法


提前感谢

您可以使用地图绘制图像,而不是使用自己的控件,并将此图像设置为标准控件的源?像绘图这样的操作通常需要一些时间,因此最好在背景中准备图像,然后将其切换到当前显示的图像。

不,没有布局过程,无法强制重新渲染。 由于WPF使用保留模式系统,OnRender()的工作方式与以前的WinAPI不同。OnRender()只存储一组绘图指令,WPF确定如何以及何时进行实际渲染


如果您需要独立于大小调整来更改控件的外观,我建议您使用DrawingVisual之类的工具,并在需要更改时使用RenderOpen()添加mapDrawing。

感谢您的快速回复。这是我最初做的,但表现非常糟糕。请看我在这里的帖子,这正是我解决问题的方法,但在某个时候,我需要将这些绘图图像放到UI中。请看我的帖子,不知道为什么要转换成位图?DrawingVisual是可见元素的最低级别。所有可见的内容都源于它,所以要在屏幕上显示,只需将其设置为窗口、面板或其他ContentPresenter的Content属性即可。我的地图不是静态的,图形每秒更改5次,因此我认为在处理下一个视图时准备一个位图以供显示是很好的。我不是专家,但我会让WPF担心这一点,除非它成为性能问题。我只需要以5Hz的频率调用RenderOpen(),这就是问题所在。当绘制大量几何图形时,应用程序速度会减慢很多
Application.Current.Dispatcher.Invoke(DispatcherPriority.Render, new Action(delegate { InvalidateVisual(); }));