silverlight4.0 打印功能总结

与打印相关类与属性的介绍:

PrintDocument - 用于提供打印功能的类
     *     PrintDocument.PrintedPageCount - 已经被打印的页数
     *     PrintDocument.Print(string documentName) - 弹出打印对话框。需要指定的参数为“在打印队列中需要显示的文档名称”
     *     PrintDocument.BeginPrint - 调用 Print() 方法并且按了打印对话框中的打印按钮之后所触发的事件,在 PrintPage 事件之前发生
     *     PrintDocument.EndPrint - 打印结束(包括打印被取消)后所触发的事件
     *     PrintDocument.PrintPage - 每打印一页之前所触发的事件
PrintPageEventArgs - PrintPage 事件的事件参数
     *     PrintPageEventArgs.PageVisual - 需要被打印的 UIElement
     *     PrintPageEventArgs.PrintableArea - 可打印的区域大小(Size 类型,其包括 Width 属性和 Height 属性和 IsEmpty 属性)
     *     PrintPageEventArgs.PageMargins - 获取当前打印页的页边距(Thickness 类型,其包括 Left 属性和 Top 属性和 Right 属性和 Bottom 属性)
     *     PrintPageEventArgs.HasMorePages - 设置是否还有更多页需要打印(如果设置为 true,则会继续出触发 PrintPage 事件)

 

点击按钮,调用print()方法:

private PrintDocument pd;

private Canvas printCanvas;

public void Print()
        {
            pd = new PrintDocument();
            pd.BeginPrint += new EventHandler<BeginPrintEventArgs>(pd_BeginPrint);
            pd.PrintPage += new EventHandler<PrintPageEventArgs>(pd_PrintPage);
            pd.Print("test");
        }

void pd_BeginPrint(object sender, BeginPrintEventArgs e)
        {
            if (this.printCanvas == null)
            {
                //在这里初始化canvas

            }
        }

 void pd_PrintPage(object sender, PrintPageEventArgs e)
        {

            //double ratex = e.PrintableArea.Width / this.ActualHeight;
            double ratey = e.PrintableArea.Width / (this.busPanel.ActualHeight + this.spliter2.ActualHeight + this.senkuBdr.ActualHeight);

            //在x,y二维空间内缩放UIElement
            ScaleTransform st = new ScaleTransform();
            //st.ScaleX = ratex;
            st.ScaleY = ratey;

            //在x,y二维空间内旋转UIElement    旋转点为(0,0),也可以自己设计旋转的点

            RotateTransform rt = new RotateTransform();
            rt.Angle = 90;

            //在x,y二维空间内移动UIElement

            TranslateTransform tt = new TranslateTransform();
            //tt.X = printCanvas.ActualHeight * rate;
            tt.X = e.PrintableArea.Width;

            TransformGroup tc = new TransformGroup();
            tc.Children.Add(st);
            tc.Children.Add(rt);
            tc.Children.Add(tt);

            this.printCanvas.RenderTransform = tc;
           
            //e.PageVisual = this.RotateTo90(e.PrintableArea);
            //MessageBox.Show(this.printShow.ActualWidth.ToString() + "," +this.printShow.ActualHeight.ToString());

            //设置要打印的UIElement
            e.PageVisual = this.printCanvas;
        }

 

缩放中遇到的问题:Width,Height,ActualWidth, ActualHeight

Width,Height就是我们指定的TextBox的宽度和高度,其实使我们预期的TextBox的宽度和高度。这两个属性值是可读写的,可以在XAML中指定,也可以在程序中动态设置。

ActualWidth, ActualHeight从名字上来看就能基本就能猜到了。它们分别代表了TextBox实际的宽度和高度。这意味着我们在控件生成之前是不可能知道这两个属性的值。这两个属性都只是只读的,它是根据TextBox中的文字数量、格式计算出来的。所以这两个属性在XAML中是不可用的,只可以在程序中动态获取。
posted on 2012-04-19 15:33  zzjjian333  阅读(840)  评论(0编辑  收藏  举报