Click here to Skip to main content
15,891,136 members
Articles / Programming Languages / C#

How to Compress Several Pages into One Page to Print in Silverlight

Rate me:
Please Sign up or sign in to vote.
4.83/5 (3 votes)
15 Sep 2011CPOL1 min read 17.7K   4   2
This article focuses on how to compress several pages' contents in one page and print in Silverlight.

Introduction

In this article, I will introduce a method to compress several pages' contents into one page and print that page in Silverlight.

Background

Silverlight 4 provides a print function which can be used in enterprise projects more easily. And this means that Silverilght is not just used for demonstrations and create small components for uploading files.

The print function is easy to use but there are some inconveniences, for example, we must calculate how many pages the materials have because it cannot tell us. Therefore, some users create methods to print multiple pages in Silverlight.

But I want to talk about another situation where I want to print my material in one page although it has several pages. So I need to compress the width or height to print.

Let's take an example. The following image is a simple Silverlight program. There is a list on homepage which displays a 100 columns data. It is obvious that it will be over one page if printing.

2.gif

After using the code, the 100 columns data is printed in one page (see following image).

1.gif

It is not very clear after being enlarged. Therefore, if your contents are not suitable for compressing, the result will be as above.

Using the code

Page definition

XML
<UserControl
    xmlns:toolkit="http://schemas.microsoft.com/winfx/2006/xaml/presentation/toolkit"
    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:System="clr-namespace:System;assembly=mscorlib"
    x:Class="SilverlightApplication2.MainPage"
    mc:Ignorable="d"
    d:DesignHeight="300"
    d:DesignWidth="400"
    xmlns:c="clr-namespace:SilverlightApplication2">

   <Grid x:Name="LayoutRoot" Background="White">

   <ScrollViewer>
        <StackPanel>
            <ListBox x:Name="lstData" Padding="50" 
              BorderBrush="Transparent" ItemsSource="{Binding}">
            <!--Define this converter to enable compress 
                      and display based on 100% by default-->
            <ListBox.RenderTransform>
            <ScaleTransform x:Name="st" ScaleX="1" 
              ScaleY="1"></ScaleTransform>
            </ListBox.RenderTransform>

           <ListBox>
            <Button Content="Print" x:Name="btPrint" 
              Width="100" Click="btPrint_Click" 
              HorizontalAlignment="Left"></Button>
        <StackPanel>
   </ScrollViewer>
</Grid>
</UserControl>

Background code

C#
using System.Linq;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Printing;

namespace SilverlightApplication2
{
    public partial class MainPage : UserControl
    {
        public MainPage()
        {
            InitializeComponent();
            Loaded += new RoutedEventHandler(MainPage_Loaded);
        }
        void MainPage_Loaded(object sender, RoutedEventArgs e)
        {
            //Prepare 100 Column Testing Data
            this.DataContext = Enumerable.Range(1, 100).Select(i => new Data()
            {
                ID = i,
                Name = "Steve Paul Jobs"
            });
        }
        private void btPrint_Click(object sender, RoutedEventArgs e)
        {
            //Actual Height of List
            var ah = lstData.ActualHeight;
            //Actual Width of List
            var aw = lstData.ActualWidth;
            //Create a New Print Document
            var doc = new PrintDocument();
            //Do Print Event
            doc.PrintPage += (o, a) =>
            {
                //Select Printer and Provide Print Height
                var h = a.PrintableArea.Height;
                //Select Printer and Provide Print Width
                var w = a.PrintableArea.Width;
                //Compress Width if not Enough
                if(aw > w) st.ScaleX = w / aw;
                //Compress Height if not Enough
                if(ah > h) st.ScaleY = h / ah;
                //Set Print Content
                a.PageVisual = lstData;
            };
            //Do Event after Printing
            doc.EndPrint += (o, a) =>
            {
                //Compress List to 100% again
                st.ScaleX = 1;
                st.ScaleY = 1;
            };
            //Print 
            doc.Print(null);
        }
    }
    class Data
    {
        public int ID { get; set; }
        public string Name { get; set; }
        public override string ToString()
        {
            return string.Format("ID={0:000},Name={1}", ID, Name);
        }
    }
}

Conclusion

The key to this example is that Silverlight and WPF support transformation through different translators when presenting. ScaleTransform is the easiest one which can compress based on scale. Also, there are several other translators in Silverlight.

Addition

In addition, I found a blog which shows many Silverlight skills and I want to recommend this to you: http://janewdaisy.wordpress.com/category/silverligh/.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
New Zealand New Zealand
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.

Comments and Discussions

 
QuestionNice Article Pin
loveyou99915-Sep-11 15:19
loveyou99915-Sep-11 15:19 
AnswerRe: Nice Article Pin
SummiG15-Sep-11 16:48
SummiG15-Sep-11 16:48 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.