亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

基于Silverlight打印的使用詳解,是否為微軟的Bug問題

2020-01-24 03:19:58
字體:
來源:轉載
供稿:網友

1:新建Silverlight4 應用程序,名稱為SLStudy。建好后如下:

image

2:在SLStudy下新建Silverlight用戶控件,Print1.xaml作為要打印的控件。

在Print1.xaml里面添加代碼為:

復制代碼 代碼如下:

<Grid x:Name="LayoutRoot" Background="White">
      <Button>這是第一個例子,簡單的按鈕</Button>
</Grid>

3:已經建立好了要打印的內容了,這里打印的是一個按鈕。

4:修改MainPage.xaml代碼如下:

復制代碼 代碼如下:

<Grid x:Name="LayoutRoot" Background="White">
        <StackPanel>
            <Button x:Name="btnPrint1" Click="btnPrint1_Click">Print1</Button>
        </StackPanel>
</Grid>

5:后臺代碼為:
復制代碼 代碼如下:

private void btnPrint1_Click(object sender, RoutedEventArgs e)
        {
            PrintDocument printDocument = new PrintDocument();
            printDocument.PrintPage += new EventHandler<PrintPageEventArgs>(printDocument_PrintPage);
            PrintDocument.Print("要打印的文檔的名稱,這個可以隨便設置");
        }

        void printDocument_PrintPage(object sender, PrintPageEventArgs e)
        {
            e.PageVisual = new Print1();
        }




在SL4 中提供打印功能的是PrintDocument類,所以先實例化一個該類對象。

接著注冊一個PrintPage事件,PrintPage事件在打印的時候會觸發。

然后調用printDocument的Print方法來打印。

在PrintDocument的PrintPage事件中,PrintPageEventArgs,是打印的參數。

里面可以獲取當前打印機的一些信息。

image

在這里設置PageVisual,也就是要打印的對象就可以了。

復制代碼 代碼如下:

void printDocument_PrintPage(object sender, PrintPageEventArgs e)
{
  e.PageVisual = new Print1();
}

全部寫好后,可以運行應用程序,點擊Print1,彈出打印窗口。打印效果如下圖:

image

當然我們的打印需求不可能這么簡單,也許需要設置Print1的內容。假設我們要修改按鈕顯示的字,那么我們可以這樣:

復制代碼 代碼如下:

void printDocument_PrintPage(object sender, PrintPageEventArgs e)
{
    Print1 printVisual = new Print1();
    printVisual.btnSample.Content = "修改后的值,當然也可以從數據庫中獲取";
    e.PageVisual = printVisual;
}

通過設置PrintPageEventArgs 參數的PageVisual對象,我們就可以實現打印那個頁面的功能了。

在這里我總結下:

1:確定要打印的內容,然后新建一個UserControl來顯示打印的內容。

2:新建PrintDocument對象,注冊PrintPage事件,調用Print方法。

3:在PrintPage事件中,構造要打印的對象,然后去數據庫中獲取數據,然后把數據綁定到控件上,接著把綁定好數據的控件賦值給PrintPageEventArgs的PageVisual 對象。
 

多頁打印問題:

如果要打印的只有一張,那么這種方法應該就夠了,但是有時候需要將一份文檔打印多張,

比如將上面的按鈕打印5張,那么又該如何實現了。

還記得我們上面PrintPageEventArgs的HasMorePages參數嗎?


在PrintPage 事件觸發后,默認的HasMorePages 為false。將HasMorePages設置為true,可以讓PrintPage事件不斷被觸發。當 HasMorePages 屬性為 true,PrintPage 事件將多次發生,直到 HasMorePages 為 false。


假設我們要將上面的按鈕打印5張,那么可以設置4次HasMorePages為true,最后設置HasMorePages為false就可以了。

修改后的printDocument_PrintPage 方法如下:

復制代碼 代碼如下:

int count = 5;
int printCount = 0;
void printDocument_PrintPage(object sender, PrintPageEventArgs e)
{
    Print1 printVisual = new Print1();
    printVisual.btnSample.Content = "修改后的值,當然也可以從數據庫中獲取";
    e.PageVisual = printVisual;
    printCount++;

    if (printCount < count) //如果已經打印的頁數小于要打印的頁數,說明還需要打印。
    {
         e.HasMorePages = true;
    }
    else
    {
        e.HasMorePages = false;
    }
}


有時候需要知道當前打印的是第幾頁,這可以通過查詢printDocument.PrintedPageCount 屬性來獲得,

在PrintDocument_PrintPage 方法中,sender對象其實就是PrintDocument對象,所以我們可以將它強制類型轉換。

假設我們要將上面的5個 Button的內容都修改為1,2,3,4,5.那么我們可以修改代碼為:

復制代碼 代碼如下:

       int count = 5;
        int printCount = 0;

        void printDocument_PrintPage(object sender, PrintPageEventArgs e)
        {
            PrintDocument printDocument = sender as PrintDocument;
            Print1 printVisual = new Print1();
            printVisual.btnSample.Content = string.Format("按鈕{0}", printDocument.PrintedPageCount);
            e.PageVisual = printVisual;
            printCount++;

            if (printCount < count)
            {
                e.HasMorePages = true;
            }
            else
            {
                e.HasMorePages = false;
            }
        }


實際上,我們的printCount變量都不需要了,直接使用printDocument.PrintedPageCount 就可以了,具體代碼實現由讀者自己實現吧。

微軟的Bug??

如果你的打印機設置為

image

那么打印的結果就是*.xps的文件,但是在打印的過程中會彈出提示框,詢問保存地址。

如果你在PrintPage事件中打上斷點的話,可以看到在詢問保存地址的時候,PrintPage方法已經執行了,也就是說PringPage方法會被執行兩遍,第一遍并沒有真正的打印。

例如:

image

image 

如果在上圖的界面上點擊取消,則有可能會導致系統失去響應而卡死,

假設用戶點擊保存,那么PrintPage事件會再次的觸發。

但是由于已經打印了一次了,所以有可能導致在多頁打印的時候出現問題。

使用兩個標志變量可以解決這個問題。

例如修改代碼為:

復制代碼 代碼如下:

int count = 5;
        int printCount = 0;

        /// <summary>
        /// 是否是第一次打印,因為只有第二次打印的時候才開始真正的打印。
        /// </summary>
        private bool isInitialized = false;
        private bool realPrint = false;

        void printDocument_PrintPage(object sender, PrintPageEventArgs e)
        {
            PrintDocument printDocument = sender as PrintDocument;
            int currentPage = printDocument.PrintedPageCount;

            #region 因為要經過兩次,第一次是初始化,而第二次才是真正的打印,而兩次PrintedPageCount都是0
            if (currentPage == 0)
            {
                if (isInitialized) //如果已經初始化,則設置realPrint為true
                {
                    realPrint = true;
                }

                isInitialized = true; //運行到這里,說明已經初始化了。
            }
            #endregion

            if (realPrint)
            {
                //PrintDocument printDocument = sender as PrintDocument;

                Print1 printVisual = new Print1();
                printVisual.btnSample.Content = string.Format("按鈕{0}", printDocument.PrintedPageCount);

                e.PageVisual = printVisual;

                printCount++;
                if (printCount < count)
                {
                    e.HasMorePages = true;
                }
                else
                {
                    e.HasMorePages = false;
                }
            }
        }

因為兩次打印,第一次可以被認為是初始化,第二次可以被認為是打印機開始真正的打印,

所以可以使用兩個變量isInitialized 和realPrint 來分別表示是初始化還是真實的打印。

在執行第一遍的時候printDocument.PrintedPageCount ==0,在這時候將isInitialized 設置為true。

在執行第二遍的時候,因為isInitialized ==true,所以可以將realPrint設置為true。

在后面的代碼中只需要判斷realPrint為true就可以了。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲欧美激情另类校园| 国产精品自拍偷拍视频| 欧美乱大交做爰xxxⅹ性3| 最近2019年手机中文字幕| 国产精品偷伦免费视频观看的| 日韩精品免费综合视频在线播放| 国产自产女人91一区在线观看| 国产日韩欧美在线播放| 日韩一区二区三区xxxx| 久99久在线视频| 日韩精品在线第一页| 亚洲最新av在线网站| 黄网站色欧美视频| 精品国内自产拍在线观看| 亚洲精品视频中文字幕| 国产日韩av在线播放| 亚洲欧美自拍一区| 成人国产在线激情| 欧美精品一区二区三区国产精品| 欧美极品少妇xxxxⅹ裸体艺术| 亚洲午夜未满十八勿入免费观看全集| 欧美性xxxx18| 91伊人影院在线播放| 国产精品免费福利| 日韩av在线资源| 亚洲男人的天堂在线| 国产午夜精品视频免费不卡69堂| 国产日韩欧美在线| 伊人男人综合视频网| 在线精品视频视频中文字幕| 不卡中文字幕av| 亚洲人成电影网站色xx| 亚洲一区二区三区成人在线视频精品| 国产伦精品免费视频| 欧美最猛性xxxx| 欧美夫妻性视频| 亚洲天堂男人的天堂| 亚洲视频网站在线观看| 日韩精品福利在线| 久久久久久久香蕉网| 亚洲xxxx3d| 亚洲天天在线日亚洲洲精| 国产精品爽爽ⅴa在线观看| 国产丝袜一区二区三区| 欧美成人黑人xx视频免费观看| 国产精品久久久久久久久久三级| 成人久久18免费网站图片| 亚洲国产精品资源| 欧美激情日韩图片| 久久久综合av| 欧美高清在线视频观看不卡| 青青草国产精品一区二区| 精品中文字幕久久久久久| 亚洲精品福利在线观看| 国产综合香蕉五月婷在线| 精品日本美女福利在线观看| 久久视频这里只有精品| 亚洲电影免费观看高清完整版在线观看| 国产精品视频久久久久| 黄色一区二区在线| 亚洲男人天堂古典| 97国产精品免费视频| 久久av红桃一区二区小说| 欧美大肥婆大肥bbbbb| 国产视频丨精品|在线观看| 777午夜精品福利在线观看| 社区色欧美激情 | 亚洲精品在线91| 国产精品一区二区三区久久| 亚洲精品久久久久久久久久久| 成人日韩在线电影| 欧美最猛性xxxxx免费| 精品久久久久久国产91| 欧美在线视频观看| 久久免费观看视频| 欧美电影免费观看高清| 亚洲成人av在线播放| 日韩在线视频导航| 国产成人精品视频| 在线精品视频视频中文字幕| 欧美激情精品久久久久久大尺度| 国产精品综合久久久| 青青草国产精品一区二区| 亚洲欧洲在线观看| 欧美高清视频免费观看| 日韩精品在线免费观看视频| 91av免费观看91av精品在线| 激情av一区二区| 自拍偷拍亚洲区| 欧美精品18videosex性欧美| 久久久久成人网| 国产精品久久精品| 国产欧美一区二区白浆黑人| 九九热精品视频在线播放| 国产精品日韩电影| 欧洲亚洲妇女av| 91网站在线免费观看| 亚洲欧美日韩国产成人| 欧美日韩免费在线观看| 亚洲国产高清高潮精品美女| 亚洲色图校园春色| 国产精品久久999| 国产精品久久久久久久久久久不卡| 欧美视频在线看| 久久亚洲成人精品| 26uuu国产精品视频| 日本午夜在线亚洲.国产| 日韩专区中文字幕| 欧美—级高清免费播放| 中文字幕不卡在线视频极品| 欧美性视频在线| 国产69精品久久久| 久久亚洲私人国产精品va| 欧美肥臀大乳一区二区免费视频| 97高清免费视频| 色悠悠国产精品| 久久久久久久一区二区| 亚洲自拍偷拍福利| 日韩av在线高清| 久久久av网站| 日韩av电影中文字幕| 亚洲高清不卡av| 久久久久国产精品www| 欧美伊久线香蕉线新在线| 亚洲国产成人久久综合一区| 国产精品大陆在线观看| 久久久久99精品久久久久| 亚洲国产精品久久91精品| 国语自产偷拍精品视频偷| 草民午夜欧美限制a级福利片| 91影视免费在线观看| 伊人青青综合网站| 久久99久国产精品黄毛片入口| 国产精品视频在线播放| 高跟丝袜欧美一区| 亚洲一区二区三区乱码aⅴ蜜桃女| 欧美午夜精品久久久久久人妖| 国产精品久久久久久久电影| 亚洲国产中文字幕久久网| 亚洲女同性videos| 蜜臀久久99精品久久久久久宅男| 欧美洲成人男女午夜视频| 久久久这里只有精品视频| 一区二区三区视频观看| 亚洲色图18p| 日韩成人av在线播放| 国产综合色香蕉精品| 久久人人爽人人爽人人片av高清| 国产精品爱啪在线线免费观看| 日韩中文字幕视频| 亚洲精品视频中文字幕| 午夜精品三级视频福利| 成人午夜在线影院| 欧美性色xo影院| 久久久久久国产三级电影| 亚洲精品中文字幕有码专区| 欧美电影免费看| 亚洲va欧美va国产综合剧情| 好吊成人免视频| 国产精品免费看久久久香蕉| 久久99精品久久久久久噜噜| 欧美丰满片xxx777| 日韩av手机在线| 久久久久这里只有精品|