Загрузка WPF ContentControl через ресурсы, так как битмап не работает - PullRequest
0 голосов
/ 27 сентября 2018

Для стороннего продукта мне нужно преобразовать ContentControl в растровое изображение.То, что я думал, не является проблемой, потому что ContentControl - это UIElement, который может быть визуализирован в растровом изображении.

Но если я строю это растровое изображение, тогда изображение не отображается.

Кажется, что он не работает, потому что у меня есть contentControl в моих ресурсах приложения, и если я пытаюсь загрузить его, он найден, но все свойства имеют значение null или находятся в состоянии исключения.Что здесь не так?

Это мой контентControl

<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 может быть неправильного типа?Является ли способ получить его с помощью ресурсов неправильно?

вот как это выглядит в отладчике: debugger screenshot

Каждый совет ценится!

1 Ответ

0 голосов
/ 29 сентября 2018

Это работает для меня, обратите внимание, что к вашему исходному коду добавлены вызовы 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);
    }
}

Код принят от этого ответа .

...