通过资源加载 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的获取方式是不是错了?

这就是它在调试器中的样子:

不胜感激!

这对我有用,请注意添加到原始代码中的 MeasureArrange 调用。

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