I am trying to print a WPF visual (a Canvas to be exact) containing multiple images. The image sources are loaded from base64 strings that are converted to BitmapSources. When the canvas is shown in a Window the 2 images are displayed correctly, however when its printed using PrintVisual method of PrintDialog, the images both appear the same. I have created a scaled down example that exhibits the behavior that I am seeing.
Here is the XAML I'm using:
<Window x:Class="ImagePrintTest.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:ImagePrintTest"
mc:Ignorable="d"
Title="MainWindow" Height="800" Width="600">
<StackPanel>
<Button Content="Print" Click="Button_Click" />
<Canvas x:Name="ImageCanvas">
<Image x:Name="ImageA" Canvas.Left="50" Canvas.Top="50" Width="380" Height="56" />
<Image x:Name="ImageB" Canvas.Left="50" Canvas.Top="150" Width="380" Height="56" />
</Canvas>
</StackPanel>
And this is the code behind:
public partial class MainWindow : Window
{
string ABC_DATA = @"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";
string DEF_DATA = @"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";
public MainWindow()
{
InitializeComponent();
ImageA.Source = Convert(ABC_DATA);
ImageB.Source = Convert(DEF_DATA);
}
private void Button_Click(object sender, RoutedEventArgs e)
{
PrintDialog printDialog = new PrintDialog();
if (printDialog.ShowDialog() == true)
{
printDialog.PrintVisual(ImageCanvas, "image print test");
}
}
public static BitmapSource Convert(string s)
{
byte[] bytes;
bytes = System.Convert.FromBase64String(s);
BitmapSource source;
using (System.IO.MemoryStream ms = new System.IO.MemoryStream(bytes))
{
source = PngBitmapDecoder.Create(ms, BitmapCreateOptions.None, BitmapCacheOption.OnLoad).Frames[0];
}
return source;
}
}
I am assuming that the image sources are being cached somehow somewhere but I really cant explain this behavior. Can anyone explain what is happening here?
It works for me when I create a second BitmapFrame like this:
public static BitmapSource Convert(string s)
{
using (var ms = new MemoryStream(System.Convert.FromBase64String(s)))
{
return BitmapFrame.Create(
BitmapFrame.Create(ms, BitmapCreateOptions.None, BitmapCacheOption.OnLoad));
}
}
However, I don't have an explanation for this behaviour.
I also noticed that printing seems to spoil the layout. After printing, the ImageCanvas moves to position (0,0) in its StackPanel parent.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With