画布打印 - 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的主要内容,如果未能解决你的问题,请参考以下文章

将 WPF 画布另存为图像

WPF - 将 ContentControl 添加到自定义画布

保存 WPF 装饰器

在 WPF 中使用 MVVM 将 n 个矩形添加到画布

在画布上绘制片段视图

WPF - 如何将边框停靠在画布上?