亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

 更新時(shí)間:2013年05月14日 12:16:36   作者:  
本篇文章對(duì)Silverlight打印的使用進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下

1:新建Silverlight4 應(yīng)用程序,名稱為SLStudy。建好后如下:

image

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

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

復(fù)制代碼 代碼如下:

<Grid x:Name="LayoutRoot" Background="White">
      <Button>這是第一個(gè)例子,簡(jiǎn)單的按鈕</Button>
</Grid>

3:已經(jīng)建立好了要打印的內(nèi)容了,這里打印的是一個(gè)按鈕。

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

復(fù)制代碼 代碼如下:

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

5:后臺(tái)代碼為:
復(fù)制代碼 代碼如下:

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

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




在SL4 中提供打印功能的是PrintDocument類,所以先實(shí)例化一個(gè)該類對(duì)象。

接著注冊(cè)一個(gè)PrintPage事件,PrintPage事件在打印的時(shí)候會(huì)觸發(fā)。

然后調(diào)用printDocument的Print方法來打印。

在PrintDocument的PrintPage事件中,PrintPageEventArgs,是打印的參數(shù)。

里面可以獲取當(dāng)前打印機(jī)的一些信息。

image

在這里設(shè)置PageVisual,也就是要打印的對(duì)象就可以了。

復(fù)制代碼 代碼如下:

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

全部寫好后,可以運(yùn)行應(yīng)用程序,點(diǎn)擊Print1,彈出打印窗口。打印效果如下圖:

image

當(dāng)然我們的打印需求不可能這么簡(jiǎn)單,也許需要設(shè)置Print1的內(nèi)容。假設(shè)我們要修改按鈕顯示的字,那么我們可以這樣:

復(fù)制代碼 代碼如下:

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

通過設(shè)置PrintPageEventArgs 參數(shù)的PageVisual對(duì)象,我們就可以實(shí)現(xiàn)打印那個(gè)頁(yè)面的功能了。

在這里我總結(jié)下:

1:確定要打印的內(nèi)容,然后新建一個(gè)UserControl來顯示打印的內(nèi)容。

2:新建PrintDocument對(duì)象,注冊(cè)PrintPage事件,調(diào)用Print方法。

3:在PrintPage事件中,構(gòu)造要打印的對(duì)象,然后去數(shù)據(jù)庫(kù)中獲取數(shù)據(jù),然后把數(shù)據(jù)綁定到控件上,接著把綁定好數(shù)據(jù)的控件賦值給PrintPageEventArgs的PageVisual 對(duì)象。
 

多頁(yè)打印問題:

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

比如將上面的按鈕打印5張,那么又該如何實(shí)現(xiàn)了。

還記得我們上面PrintPageEventArgs的HasMorePages參數(shù)嗎?


在PrintPage 事件觸發(fā)后,默認(rèn)的HasMorePages 為false。將HasMorePages設(shè)置為true,可以讓PrintPage事件不斷被觸發(fā)。當(dāng) HasMorePages 屬性為 true,PrintPage 事件將多次發(fā)生,直到 HasMorePages 為 false。


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

修改后的printDocument_PrintPage 方法如下:

復(fù)制代碼 代碼如下:

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

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


有時(shí)候需要知道當(dāng)前打印的是第幾頁(yè),這可以通過查詢printDocument.PrintedPageCount 屬性來獲得,

在PrintDocument_PrintPage 方法中,sender對(duì)象其實(shí)就是PrintDocument對(duì)象,所以我們可以將它強(qiáng)制類型轉(zhuǎn)換。

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

復(fù)制代碼 代碼如下:

       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;
            }
        }


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

微軟的Bug??

如果你的打印機(jī)設(shè)置為

image

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

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

例如:

image

image 

如果在上圖的界面上點(diǎn)擊取消,則有可能會(huì)導(dǎo)致系統(tǒng)失去響應(yīng)而卡死,

假設(shè)用戶點(diǎn)擊保存,那么PrintPage事件會(huì)再次的觸發(fā)。

但是由于已經(jīng)打印了一次了,所以有可能導(dǎo)致在多頁(yè)打印的時(shí)候出現(xiàn)問題。

使用兩個(gè)標(biāo)志變量可以解決這個(gè)問題。

例如修改代碼為:

復(fù)制代碼 代碼如下:

int count = 5;
        int printCount = 0;

        /// <summary>
        /// 是否是第一次打印,因?yàn)橹挥械诙未蛴〉臅r(shí)候才開始真正的打印。
        /// </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 因?yàn)橐?jīng)過兩次,第一次是初始化,而第二次才是真正的打印,而兩次PrintedPageCount都是0
            if (currentPage == 0)
            {
                if (isInitialized) //如果已經(jīng)初始化,則設(shè)置realPrint為true
                {
                    realPrint = true;
                }

                isInitialized = true; //運(yùn)行到這里,說明已經(jīng)初始化了。
            }
            #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;
                }
            }
        }

因?yàn)閮纱未蛴?,第一次可以被認(rèn)為是初始化,第二次可以被認(rèn)為是打印機(jī)開始真正的打印,

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

在執(zhí)行第一遍的時(shí)候printDocument.PrintedPageCount ==0,在這時(shí)候?qū)sInitialized 設(shè)置為true。

在執(zhí)行第二遍的時(shí)候,因?yàn)?FONT style="COLOR: #ff0000">isInitialized ==true,所以可以將realPrint設(shè)置為true。

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

相關(guān)文章

  • 基于c#實(shí)現(xiàn)的九九乘法表(簡(jiǎn)單實(shí)例)

    基于c#實(shí)現(xiàn)的九九乘法表(簡(jiǎn)單實(shí)例)

    本文主要分享了基于c#實(shí)現(xiàn)的九九乘法表,代碼簡(jiǎn)潔,需要的朋友可以參考下,希望對(duì)大家有所幫助
    2016-12-12
  • Winform控件優(yōu)化之圓角按鈕1

    Winform控件優(yōu)化之圓角按鈕1

    這篇文章主要介紹了Winform控件優(yōu)化之圓角按鈕,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,感興趣的小伙伴可以參考一下
    2022-08-08
  • C#中括號(hào)強(qiáng)轉(zhuǎn)、as、is區(qū)別詳解

    C#中括號(hào)強(qiáng)轉(zhuǎn)、as、is區(qū)別詳解

    本文主要介紹了C#中括號(hào)強(qiáng)轉(zhuǎn)、as、is區(qū)別詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • C# Partial:分部方法和分部類代碼實(shí)例

    C# Partial:分部方法和分部類代碼實(shí)例

    這篇文章主要介紹了C# Partial:分部方法和分部類代碼實(shí)例,本文直接給出代碼實(shí)現(xiàn),需要的朋友可以參考下
    2015-03-03
  • C#導(dǎo)航器Xpath與XPathNavigator類

    C#導(dǎo)航器Xpath與XPathNavigator類

    這篇文章介紹了C#導(dǎo)航器Xpath與XPathNavigator類,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-06-06
  • 基于C#的socket編程的TCP異步的實(shí)現(xiàn)代碼

    基于C#的socket編程的TCP異步的實(shí)現(xiàn)代碼

    本篇文章主要介紹了基于C#的socket編程的TCP異步的實(shí)現(xiàn)代碼,詳解的講訴了TCP通信異步的實(shí)現(xiàn),有興趣的可以了解一下。
    2016-11-11
  • C#三種方法獲取文件的Content-Type(MIME Type)

    C#三種方法獲取文件的Content-Type(MIME Type)

    這篇文章介紹了C#獲取文件Content-Type(MIME Type)的三種方法,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-01-01
  • c# 獲得本地ip地址的三種方法

    c# 獲得本地ip地址的三種方法

    這篇文章主要介紹了c# 獲得本地ip地址的三種方法,幫助大家更好的理解和實(shí)用c#,感興趣的朋友可以了解下
    2020-12-12
  • c# 刪除所有的空文件夾的小例子

    c# 刪除所有的空文件夾的小例子

    c# 刪除所有的空文件夾的小例子,需要的朋友可以參考一下
    2013-03-03
  • C# 預(yù)處理器指令的用法

    C# 預(yù)處理器指令的用法

    本文主要介紹了C# 預(yù)處理器指令的用法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04

最新評(píng)論