通过资源加载 WPF ContentControl 作为位图不起作用
Loading WPF ContentControl via Resources as Bitmap does not work
对于第三方产品,我需要将 ContentControl 转换为位图。我认为这没问题,因为 ContentControl 是可以在位图中呈现的 UIElement。
但是,如果我绘制此位图,则看不到任何图像。
它似乎不起作用,因为我的应用程序资源中有 contentControl,如果我尝试加载它,它会被发现,但所有属性都为 null 或处于异常状态。这里出了什么问题?
这是我的内容控件
<ContentControl x:Key="LocationMarker" Width="356" Height="524">
<Canvas Width="356" Height="524">
<Path Width="355.912" Height="524.355" Canvas.Left="0" Canvas.Top="-0.354675" Stretch="Fill" Fill="{DynamicResource HeaderColorBrush}" Data="...."/>
<Path Width="150" Height="200" Canvas.Left="100" Canvas.Top="50" Stretch="Fill" Fill="{DynamicResource HeaderColorBrush}" Data="..."/>
<Path Width="200" Height="170" Canvas.Left="78" Canvas.Top="300" Stretch="Fill" Fill="{DynamicResource HeaderColorBrush}" Data="..."/>
</Canvas>
这就是我尝试得到它的方式:
var contentControl = Application.Current.Resources.MergedDictionaries.SelectMany(x => x.MergedDictionaries).FirstOrDefault(x => x.Source.OriginalString.Contains("ContentControls.xaml"))?["LocationMarker"] as ContentControl;
if (contentControl != null)
{
var renderTargetBitmap = new RenderTargetBitmap(41, 74, 96, 96, PixelFormats.Pbgra32);
renderTargetBitmap.Render(contentControl);
var encoder = new PngBitmapEncoder();
encoder.Frames.Add(BitmapFrame.Create(renderTargetBitmap));
var stream = new MemoryStream();
encoder.Save(stream);}
contentControl 的类型可能有误吗? Resources的获取方式是不是错了?
这就是它在调试器中的样子:
不胜感激!
这对我有用,请注意添加到原始代码中的 Measure
和 Arrange
调用。
var contentControl = Resources["LocationMarker"] as ContentControl;
if (contentControl != null)
{
contentControl.Measure(new Size(356, 524));
contentControl.Arrange(new Rect(new Size(356, 524)));
var target = new RenderTargetBitmap(
(int)contentControl.RenderSize.Width, (int)contentControl.RenderSize.Height,
96, 96, PixelFormats.Pbgra32);
target.Render(contentControl);
var encoder = new PngBitmapEncoder();
var outputFrame = BitmapFrame.Create(target);
encoder.Frames.Add(outputFrame);
using (var file = File.OpenWrite("TestImage.png"))
{
encoder.Save(file);
}
}
代码取自this answer。
对于第三方产品,我需要将 ContentControl 转换为位图。我认为这没问题,因为 ContentControl 是可以在位图中呈现的 UIElement。
但是,如果我绘制此位图,则看不到任何图像。
它似乎不起作用,因为我的应用程序资源中有 contentControl,如果我尝试加载它,它会被发现,但所有属性都为 null 或处于异常状态。这里出了什么问题?
这是我的内容控件
<ContentControl x:Key="LocationMarker" Width="356" Height="524">
<Canvas Width="356" Height="524">
<Path Width="355.912" Height="524.355" Canvas.Left="0" Canvas.Top="-0.354675" Stretch="Fill" Fill="{DynamicResource HeaderColorBrush}" Data="...."/>
<Path Width="150" Height="200" Canvas.Left="100" Canvas.Top="50" Stretch="Fill" Fill="{DynamicResource HeaderColorBrush}" Data="..."/>
<Path Width="200" Height="170" Canvas.Left="78" Canvas.Top="300" Stretch="Fill" Fill="{DynamicResource HeaderColorBrush}" Data="..."/>
</Canvas>
这就是我尝试得到它的方式:
var contentControl = Application.Current.Resources.MergedDictionaries.SelectMany(x => x.MergedDictionaries).FirstOrDefault(x => x.Source.OriginalString.Contains("ContentControls.xaml"))?["LocationMarker"] as ContentControl;
if (contentControl != null)
{
var renderTargetBitmap = new RenderTargetBitmap(41, 74, 96, 96, PixelFormats.Pbgra32);
renderTargetBitmap.Render(contentControl);
var encoder = new PngBitmapEncoder();
encoder.Frames.Add(BitmapFrame.Create(renderTargetBitmap));
var stream = new MemoryStream();
encoder.Save(stream);}
contentControl 的类型可能有误吗? Resources的获取方式是不是错了?
这就是它在调试器中的样子:
不胜感激!
这对我有用,请注意添加到原始代码中的 Measure
和 Arrange
调用。
var contentControl = Resources["LocationMarker"] as ContentControl;
if (contentControl != null)
{
contentControl.Measure(new Size(356, 524));
contentControl.Arrange(new Rect(new Size(356, 524)));
var target = new RenderTargetBitmap(
(int)contentControl.RenderSize.Width, (int)contentControl.RenderSize.Height,
96, 96, PixelFormats.Pbgra32);
target.Render(contentControl);
var encoder = new PngBitmapEncoder();
var outputFrame = BitmapFrame.Create(target);
encoder.Frames.Add(outputFrame);
using (var file = File.OpenWrite("TestImage.png"))
{
encoder.Save(file);
}
}
代码取自this answer。