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

 

posted on 2022-07-06 17:01  TanZhiWei  阅读(222)  评论(0编辑  收藏  举报