记录一个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