使自己的WPF控件无效

本文关键字:无效 控件 WPF 自己的 | 更新日期: 2023-09-27 18:18:36

我有一个几天前制作的自定义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文档说:

使元素的呈现无效,并强制通过一个完整的新布局。OnRender在布局周期完成后被调用。

这不是我想要的行为,因为MapContext控件布局没有改变。只有里面的图纸变了。

是否有一个适当的方式强迫OnRender方法被调用,而不做一个完整的布局传递?

Thanks in advance

使自己的WPF控件无效

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

如果你需要改变你的控件的外观独立的大小,我建议你使用像DrawingVisual的东西,并使用RenderOpen()添加你的mapDrawing当你想要它改变。

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