Home > DeveloperSection > Forums > How can I print a canvas in wpf?
Takeshi Okada
Takeshi Okada

Total Post:89

Points:629
Posted on    August-16-2013 6:14 AM

 WPF WPF 
Ratings:


 1 Reply(s)
 1792  View(s)
Rate this:
Hi mindstick!

I used these code in order to print out the UI. Printing out is working, but if the size of paper is over, the UI cuts off in the middle of a canvas.

Is there any possible way not to be cut off in the middle?

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

Thanks kin advance




shreesh chandra shukla
shreesh chandra shukla

Total Post:105

Points:735
Posted on    August-17-2013 6:57 AM

Hi!

This method will print the canvas to PNG file.

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;

}

thanks


Don't want to miss updates? Please click the below button!

Follow MindStick