【问题标题】:Canvas print - wpf帆布打印 - wpf
【发布时间】:2013-01-04 06:34:56
【问题描述】:

我使用这些代码来打印 UI。打印出来是可行的,但如果纸张大小超过了,UI 会在画布中间切断。

有没有什么办法可以不被中途截断?

PrintDialog dialog = new PrintDialog();
dialog.PrintVisual(lst , "print");

<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>

【问题讨论】:

    标签: wpf printing


    【解决方案1】:

    此方法会将画布打印为 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;
    }
    

    【讨论】:

    • 我相信surface 可以是FrameworkElement 类型,这会让它更加有用。
    • 是的,WPF中的大部分元素都是继承自FrameworkElement
    • 我相信它是继承树中具有WidthHeightLayoutTransform的第一个位置。
    【解决方案2】:

    您可以创建一个 BitmapImage(请参阅 RenderTargetBitmap 从元素创建位图)。然后可以将此位图保存为 JPEG 文件并使用 GDI+ (System.Image) 进行操作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-25
      • 1970-01-01
      • 1970-01-01
      • 2019-11-08
      • 1970-01-01
      相关资源
      最近更新 更多