画布打印 - wpf
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了画布打印 - wpf相关的知识,希望对你有一定的参考价值。
我使用这些代码来打印出UI。打印输出正在运行,但如果纸张大小结束,则UI会在画布中间切断。
有没有可能的方法不被中间切断?
< - cs code - >
PrintDialog dialog = new PrintDialog();
dialog.PrintVisual(lst , "print");
< - Xaml - >
<ListView Name="lst">
<Grid Name="grdPrint">
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition />
</Grid.RowDefinitions>
<Canvas Grid.Row="0" >
.......
</Canvas>
<HListBox x:Name="lstImage" ItemsSource="{Binding IMG, Mode=TwoWay}" Grid.Row="1" IsHitTestVisible="True">
<HListBox.ItemTemplate>
<DataTemplate>
<HImage Margin="0" Width="590" Height="590" Stretch="Fill" Source="{Binding IMG_PATH_NM, Converter={StaticResource StrUriConverter}}" Tag="{Binding IMG_PATH_NM}">
</HImage>
</DataTemplate>
</HListBox.ItemTemplate>
<HListBox.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Vertical" HorizontalAlignment="Center" IsHitTestVisible="True"/>
</ItemsPanelTemplate>
</HListBox.ItemsPanel>
</HListBox>
</Grid>
</ListView>
答案
此方法将画布打印到PNG文件。
public void ExportToPNG(string imgpath, Canvas surface)
{
Uri path = new Uri(imgpath);
if (path == null)
return;
Transform transform = surface.LayoutTransform;
surface.LayoutTransform = null;
Size size = new Size(surface.Width, surface.Height);
surface.Measure(size);
surface.Arrange(new Rect(size));
RenderTargetBitmap renderBitmap =
new RenderTargetBitmap(
(int)size.Width,
(int)size.Height,
96d,
96d,
PixelFormats.Pbgra32);
renderBitmap.Render(surface);
using (FileStream outStream = new FileStream(path.LocalPath, FileMode.Create))
{
PngBitmapEncoder encoder = new PngBitmapEncoder();
encoder.Frames.Add(BitmapFrame.Create(renderBitmap));
encoder.Save(outStream);
}
surface.LayoutTransform = transform;
}
另一答案
您可以创建一个BitmapImage(请参阅RenderTargetBitmap以从元素创建位图)。然后可以将此位图保存为JPEG文件并使用GDI +(System.Image)进行操作。
以上是关于画布打印 - wpf的主要内容,如果未能解决你的问题,请参考以下文章