Home   Subscribe   Linkedin
  Archive Contact  

Printing in Silverlight

This is a simple example to print UI Element in Silverlight.Main idea in this approach is to pass the existing gridview itemsSource to another grid which is created at run time.Below is the Code where I have called my Utiltiy Class containing the methods to print .In my case I have used RadGridView

private void btnPrint_Click(object sender, RoutedEventArgs e)
        {
           
            var uf = new Utilities.Print.PrintCustomGrid();
            var grid = uf.CreateGridToPrint(RadGridViewBankBranch);
            if (grid.ItemsSource != null)
                uf.PrintAuditGrid(grid);
            else
            {
                MessageBox.Show("Empty Grid Cannot be Printed");
            }
           
        }

     public  RadGridView CreateGridToPrint(RadGridView uiGrid)
        {
            var gridToPrint = new RadGridView();
            gridToPrint.DataContext = uiGrid.DataContext;
            gridToPrint.ItemsSource = uiGrid.ItemsSource;
            gridToPrint.RowIndicatorVisibility = Visibility.Collapsed;
            gridToPrint.ShowGroupPanel = false;
            gridToPrint.IsFilteringAllowed = false;
            gridToPrint.AutoGenerateColumns = false;
            foreach (GridViewColumn column in       uiGrid.Columns.OfType<GridViewColumn>())
            {
                GridViewColumn newColumn = (GridViewColumn)Activator.CreateInstance(column.GetType());
                //gridToPrint.RowLoaded += GridViewReport_RowLoaded;
                newColumn.CopyPropertiesFrom(column);
                gridToPrint.Columns.Add(newColumn);
            }
            StyleManager.SetTheme(gridToPrint, StyleManager.GetTheme(uiGrid));
            gridToPrint.SortDescriptors.AddRange(uiGrid.SortDescriptors);
            gridToPrint.GroupDescriptors.AddRange(uiGrid.GroupDescriptors);
            gridToPrint.FilterDescriptors.AddRange(uiGrid.FilterDescriptors);
            return gridToPrint;
        }

        public void PrintAuditGrid(UIElement source)
        {
            var doc = new PrintDocument();
            //doc.DocumentName = documentName;

            var offsetY = 0d;
            var totalHeight = 0d;

            var canvas = new Canvas();
            canvas.Children.Add(source);

            doc.PrintPage += (s, e) =>
            {
                e.PageVisual = canvas;

                if (totalHeight == 0)
                {
                    totalHeight = source.DesiredSize.Height;
                }

                Canvas.SetTop(source, -offsetY);

                offsetY += e.PrintableArea.Height;

                e.HasMorePages = offsetY <= totalHeight;
            };
            doc.Print("Paywings" + Guid.NewGuid().ToString().Substring(1, 5));
        }
Posted by: Rishabh Toshniwal

Categories: C#, Silverlight, Telerik

Tags: ,