使自己的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使用保留模式系统,OnRender()不像旧的WinAPI那样工作。OnRender()只是存储一组绘图指令,WPF决定如何以及何时进行实际渲染。
如果你需要改变你的控件的外观独立的大小,我建议你使用像DrawingVisual的东西,并使用RenderOpen()添加你的mapDrawing当你想要它改变。
也许不是使用您自己的控件,您可以用您的地图绘制图像并将此图像设置为标准控件的源?像绘图这样的操作通常需要一些时间,所以最好在背景中准备图像,然后将其与当前显示的图像切换。