Silverlight 打印
摘自:http://www.cnblogs.com/jiajiayuan/archive/2012/04/13/2444246.html
Silverlight中的打印只有一個(gè)類,那就是PrintDocment這個(gè)對(duì)象來實(shí)現(xiàn)。
下面我用兩種方法來實(shí)現(xiàn)Silverlight的打印:
第一種:
第二種:
實(shí)現(xiàn)方式也很簡單,其實(shí)只需兩個(gè)步驟即可完成,即綁定PrintDocument的PrintPage事件和調(diào)用Print方法。
這個(gè)就完成了一個(gè)打印,其中PrintPage事件是最為重要的,因?yàn)檎麄€(gè)打印的工作都是在這個(gè)事件中完成的,另外該事件的參數(shù) PrintPageEventArgs構(gòu)成了整個(gè)打印過程中的屬性的設(shè)置;Print方法需要傳遞一個(gè)參數(shù),參數(shù)為打印的文件的名稱,在調(diào)用該方法的時(shí)候 開始觸發(fā)一系列的打印事件。
PrintPageEventArgs類型的屬性:
PrintableArea:獲取一個(gè)Size類型的值,表示打印的范圍,分別表示Height和Width,如果打印的部分超出了區(qū)域,則被截取。
PageMargins:獲取打印頁的Margin值。
PageVisual:設(shè)置要打印的對(duì)象,可以是一個(gè)TextBlock、Image,也可以是一個(gè)復(fù)雜的元素(Grid或者Canvas)。
HasMorePages:一個(gè)bool值,標(biāo)識(shí)是否多頁。
一個(gè)簡單的例子:
分頁打印的例子:
//當(dāng)前打印的行的索引,用于遍歷ListBox.Itemsprivate int listPrintIndex;private void btnPrintList_Click(object sender, RoutedEventArgs e){//初始值為0listPrintIndex = 0;PrintDocument document = new PrintDocument();document.PrintPage += new EventHandler<PrintPageEventArgs>(document_PrintPage);document.Print("Print List");}//設(shè)置每一項(xiàng)之間的間距private int extraMargin = 50;void document_PrintPage(object sender, PrintPageEventArgs e){//定義一個(gè)打印的元素Canvas printSurface = new Canvas();e.PageVisual = printSurface;//得到最頂端位置double topPosition = e.PageMargins.Top + extraMargin;//遍歷當(dāng)前的ListBox.Itemswhile (listPrintIndex<lstPrint.Items.Count){//實(shí)例化TextBlock用來存放ListItem的值TextBlock txt = new TextBlock();txt.FontSize = 30;//得到ListBox每一項(xiàng)的值txt.Text = lstPrint.Items[listPrintIndex].ToString();double measuredHeight = txt.ActualHeight;//如果打印的當(dāng)前行高度不合適的話,則進(jìn)行分頁if (measuredHeight>(e.PrintableArea.Height- topPosition- extraMargin)){e.HasMorePages = true;return ;}//設(shè)置TextBlock在Canvas中的位置txt.SetValue(Canvas.TopProperty, topPosition);txt.SetValue(Canvas.LeftProperty, e.PageMargins.Left + extraMargin);//將TextBlock添加到打印的元素中去printSurface.Children.Add(txt);listPrintIndex++;//追加高度topPosition = topPosition + measuredHeight;}e.HasMorePages = false;}有時(shí)我們會(huì)發(fā)現(xiàn)打印的圖片并不完整,這樣就需要一個(gè)類:
public static class Extensions{public static void Print(this FrameworkElement element,string Document, HorizontalAlignment HorizontalAlignment,VerticalAlignment VerticalAlignment, Thickness PageMargin,bool PrintLandscape, bool ShrinkToFit, Action OnPrintComplete){Print(new List<FrameworkElement>() { element }, Document,HorizontalAlignment, VerticalAlignment, PageMargin,PrintLandscape, ShrinkToFit, OnPrintComplete);}public static void Print<T>(this List<T> elements,string Document, HorizontalAlignment HorizontalAlignment,VerticalAlignment VerticalAlignment, Thickness PageMargin,bool PrintLandscape, bool ShrinkToFit, Action OnPrintComplete){PrintDocument printDocument = new PrintDocument();PageMargin = PageMargin == null ? new Thickness(10) : PageMargin;Document = (string.IsNullOrEmpty(Document)) ? "Print Document" : Document;int currentItemIndex = 0;printDocument.PrintPage += (s, e) =>{if (!typeof(FrameworkElement).IsAssignableFrom(elements[currentItemIndex].GetType())){throw new Exception("Element must be an " +"object inheriting from FrameworkElement");}FrameworkElement element = elements[currentItemIndex] as FrameworkElement;if (element.Parent == null || element.ActualWidth == double.NaN ||element.ActualHeight == double.NaN){throw new Exception("Element must be rendered, " +"and must have a parent in order to print.");}TransformGroup transformGroup = new TransformGroup();//First move to middle of page... 首先移動(dòng)到頁面的中間transformGroup.Children.Add(new TranslateTransform() //TranslateTransform偏移動(dòng)畫{X = (e.PrintableArea.Width - element.ActualWidth) / 2,Y = (e.PrintableArea.Height - element.ActualHeight) / 8});double scale = 1;if (PrintLandscape) //如果打印空白 需要旋轉(zhuǎn){//Then, rotate around the center 然后旋轉(zhuǎn)到中心transformGroup.Children.Add(new RotateTransform(){Angle = 90,CenterX = e.PrintableArea.Width / 2,CenterY = e.PrintableArea.Height / 2});if (ShrinkToFit) //如果自適應(yīng)大小{if ((element.ActualWidth + PageMargin.Left +PageMargin.Right) > e.PrintableArea.Height) //如果寬度大于紙張的高度{//Math.Round 方法 將值舍入到最接近的整數(shù)或指定的小數(shù)位數(shù)。 scale = Math.Round(e.PrintableArea.Height /(element.ActualWidth + PageMargin.Left + PageMargin.Right), 2);}if ((element.ActualHeight + PageMargin.Top + PageMargin.Bottom) > e.PrintableArea.Width) //如果高度大于紙張的寬度{double scale2 = Math.Round(e.PrintableArea.Width /(element.ActualHeight + PageMargin.Top + PageMargin.Bottom), 2);scale = (scale2 < scale) ? scale2 : scale;}}}else if (ShrinkToFit) //如果不打印空白并自適應(yīng)大小 不需要旋轉(zhuǎn){//Scale down to fit the page + marginif ((element.ActualWidth + PageMargin.Left + PageMargin.Right) > e.PrintableArea.Width) //如果寬度大于紙張的寬度{scale = Math.Round(e.PrintableArea.Width /(element.ActualWidth + PageMargin.Left + PageMargin.Right), 2);}if ((element.ActualHeight + PageMargin.Top + PageMargin.Bottom) > e.PrintableArea.Height) //如果高度大于紙張的高度{double scale2 = Math.Round(e.PrintableArea.Height /(element.ActualHeight + PageMargin.Top + PageMargin.Bottom), 2);scale = (scale2 < scale) ? scale2 : scale;}}//Scale down to fit the page + marginif (scale != 1){transformGroup.Children.Add(new ScaleTransform() //ScaleTransform縮放動(dòng)畫{ScaleX = scale,ScaleY = scale,CenterX = e.PrintableArea.Width / 2,CenterY = e.PrintableArea.Height / 2});}if (VerticalAlignment == VerticalAlignment.Top){//Now move to Topif (PrintLandscape){transformGroup.Children.Add(new TranslateTransform(){X = 0,Y = PageMargin.Top - (e.PrintableArea.Height -(element.ActualWidth * scale)) / 2});}else{transformGroup.Children.Add(new TranslateTransform(){X = 0,Y = PageMargin.Top - (e.PrintableArea.Height -(element.ActualHeight * scale)) / 2});}}else if (VerticalAlignment == VerticalAlignment.Bottom){//Now move to Bottomif (PrintLandscape){transformGroup.Children.Add(new TranslateTransform(){X = 0,Y = ((e.PrintableArea.Height -(element.ActualWidth * scale)) / 2) - PageMargin.Bottom});}else{transformGroup.Children.Add(new TranslateTransform(){X = 0,Y = ((e.PrintableArea.Height -(element.ActualHeight * scale)) / 2) - PageMargin.Bottom});}}if (HorizontalAlignment == HorizontalAlignment.Left){//Now move to Leftif (PrintLandscape){transformGroup.Children.Add(new TranslateTransform(){X = PageMargin.Left - (e.PrintableArea.Width -(element.ActualHeight * scale)) / 2,Y = 0});}else{transformGroup.Children.Add(new TranslateTransform(){X = PageMargin.Left - (e.PrintableArea.Width -(element.ActualWidth * scale)) / 2,Y = 0});}}else if (HorizontalAlignment == HorizontalAlignment.Right){//Now move to Rightif (PrintLandscape){transformGroup.Children.Add(new TranslateTransform(){X = ((e.PrintableArea.Width -(element.ActualHeight * scale)) / 2) - PageMargin.Right,Y = 0});}else{transformGroup.Children.Add(new TranslateTransform(){X = ((e.PrintableArea.Width -(element.ActualWidth * scale)) / 2) - PageMargin.Right,Y = 0});}}e.PageVisual = element;e.PageVisual.RenderTransform = transformGroup;//Increment to next item,currentItemIndex++;//If the currentItemIndex is less than the number of elements, keep printinge.HasMorePages = currentItemIndex < elements.Count;};printDocument.EndPrint += delegate(object sender, EndPrintEventArgs e){foreach (var item in elements){FrameworkElement element = item as FrameworkElement;//Reset everything...TransformGroup transformGroup = new TransformGroup();transformGroup.Children.Add(new ScaleTransform() { ScaleX = 1, ScaleY = 1 }); //縮放動(dòng)畫transformGroup.Children.Add(new RotateTransform() { Angle = 0 }); //旋轉(zhuǎn)動(dòng)畫transformGroup.Children.Add(new TranslateTransform() { X = 0, Y = 0 }); //偏移動(dòng)畫element.RenderTransform = transformGroup;}//Callback to completeif (OnPrintComplete != null){OnPrintComplete();}};printDocument.Print(Document);}}調(diào)用這個(gè)類:
private void btnPrint_Click(object sender, RoutedEventArgs e){Extensions.Print(GPrint, "MyPrint",HorizontalAlignment.Center, VerticalAlignment.Top,new Thickness(10, 0, 10, 0), true, true, null);}這樣就能完整的打印了,不過打印出來的效果可能是橫向的。
?
轉(zhuǎn)載于:https://www.cnblogs.com/a-mumu/p/5692651.html
總結(jié)
以上是生活随笔為你收集整理的Silverlight 打印的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JS两个字符串日期相减得出天数
- 下一篇: RPG角色生成器