Wpf VisualBrush显示不刷新
记录一个VisualBrush显示不刷新问题,使用VisualBrush 显示另一个控件的外观,只会在其显示效果有改变的时候刷新,而不会在目标布局改变的时候刷新布局。
场景:使用集合SlidePages装载控件,每一页显示对应SlidePages集合中子项。例如两页SlidePage1、SlidePage2。显示SlidePage1时,则SlidePage1挂载在可视化书上。当显示SlidePage2时,SlidePage2挂载在可视化书上。
需求:SlidePage1 、SlidePage2 显示缩列图转图片,
方案:采用RenderTargetBitmap 控件转图片,
1 获取SlidePages集合中每一项SlidePage1、SlidePage2 VisualBrush。
2 通过RenderTargetBitmap.Render ,将VisualBrush 转RenderTargetBitmap
3 通过 PngBitmapEncoder 将 RenderTargetBitmap写入文件流
/// <summary>
/// 将控件转RenderTargetBitmap /// </summary> /// <param name="SlidePage1"></param> public RenderTargetBitmap GetSlideRenderTargetBitmap(Visual SlidePage1) { var width = SlidePage1.Width ; var height = SlidePage1.Height ; var renderBitmap = new RenderTargetBitmap( (int)width, (int)height, 96d , 96d , PixelFormats.Pbgra32); var rectangle = new System.Windows.Shapes.Rectangle { Width = width, Height = height, Fill = new VisualBrush(SlidePage1) { Viewbox = contentBound, ViewboxUnits = BrushMappingMode.Absolute, } }; rectangle.Measure(new Size(width, height)); rectangle.Arrange(new Rect(new Size(width, height))); renderBitmap.Render(rectangle); return renderBitmap;
}
/// <summary> /// 保存位图 /// </summary> /// <param name="savePath"></param>
/// <param name="getSource"></param> public void SaveBitmap(string savePath, RenderTargetBitmap getSource) { PngBitmapEncoder encoder = new PngBitmapEncoder(); encoder.Frames.Add(BitmapFrame.Create(getSource)); using (FileStream fs = new FileStream(savePath, FileMode.Create, FileAccess.ReadWrite)) { encoder.Save(fs); } }
问题:当对SS1 修改之后,跳动SS2 显示,保存图片。生成的缩列图第一页SS1不同 SS2相同,也就是SS1的VisualBrush显示不刷新问题。
问题原因:这个是 VisualBrush的问题 。 VisualBrush 绑定的是在元素加入到视觉树前,那么在元素加入到视觉树之后移除视觉树,VisualBrush 就不会自动刷新
解决方案
1
var visual = visualBrush.Visual;
visualBrush.Visual = null;
visualBrush.Visual = visual;
2
将 SlidePageVisibility = Visibility.Collapsed; 改成 SlidePageVisibility = Visibility.Hidden;
参见:
1 https://blog.csdn.net/WPwalter/article/details/101511445 walter lv
2 https://blog.lindexi.com/post/wpf-VisualBrush-%E5%B7%B2%E7%9F%A5%E9%97%AE%E9%A2%98.html
3 https://huchengv5.gitee.io/post/WPF-%E5%A6%82%E4%BD%95%E5%A4%84%E7%90%86VisualBrush%E5%81%9C%E6%AD%A2%E6%9B%B4%E6%96%B0%E9%97%AE%E9%A2%98.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗