UWP開發入門(二十四)—— Win10風格的打印對話框


雖然經常看到阿迪王發“看那個開發UWP的又上吊了”的圖……還是忍不住重啟一下這個系列。最近有用到UWP的print API,特地來寫一篇給某軟的這個偉大構想續一秒。

之前的打印對話框差不多長成這樣:

而新的Win10風格打印對話框是下圖的樣子,包括預覽圖非常的直觀。

 首先讓我們構建一個極簡的UWP程序,太久沒寫的話說不定手都生了……

    <Grid>
        <Button Width="160" Height="80" Click="Button_Click" Background="Red">Print</Button>
    </Grid>

我們試圖在點擊這個button時,通過PrintHelper類來顯示打印對話框。

        private async void Button_Click(object sender, RoutedEventArgs e)
        {
            var printHelper = new PrintHelper();
            printHelper.PreparePrintContent(this);
            await printHelper.ShowPrintUIAsync();
        }

 

到這里就是MainPage的所有內容了。然后讓我們去看PrintHelper的實現。

在構造函數中,我們需要創建Printdocument和PrintManger的實例,用來注冊打印相關的事件。

        public PrintHelper()
        {
            printDocument = new PrintDocument();
            printDocumentSource = printDocument.DocumentSource;
            //printDocument.Paginate += PrintDocument_Paginate;
            printDocument.GetPreviewPage += PrintDocument_GetPreviewPage;
            printDocument.AddPages += PrintDocument_AddPages;
  
            PrintManager printMan = PrintManager.GetForCurrentView();
            printMan.PrintTaskRequested += PrintMan_PrintTaskRequested;
        }

 

PrintDocument是對即將打印文檔的映射,我們接下來會通過它來構建預覽試圖等相關信息。

printDocument.Paginate事件主要用於准備所有的預覽頁,該事件會在打印對話框顯示時,被執行一次。如果是單頁的打印該事件不處理也可以。

printDocument.GetPreviewPage事件會在顯示具體的預覽頁時,被執行。例如供兩頁內容,用戶前后翻頁預覽時,每個預覽頁就是由這里設置。

Sample代碼里因為只有一頁,所以就直接將PrintContent賦值過去了。

        private void PrintDocument_GetPreviewPage(object sender, GetPreviewPageEventArgs e)
        {
            PrintDocument printDoc = (PrintDocument)sender;
            printDoc.SetPreviewPage(e.PageNumber, PrintContent);
        }

printDocument.AddPages事件在實際打印操作發生時被觸發,printDocument會通過AddPage和AddPageComplete方法來通完成文檔的准備,然后進行打印操作。

        private void PrintDocument_AddPages(object sender, AddPagesEventArgs e)
        {
            PrintDocument printDoc = (PrintDocument)sender;
            printDoc.AddPage(PrintContent);
            printDoc.AddPagesComplete();
        }

完成以上事件注冊以后,我們來看PrintManger,這個可以理解為之前WPF中PrintDialog的UWP版本。我們最終通過它來啟動UI打印對話框。根據文檔,首先我們必須調用PrintManager.GetForCurrentView()方法,該方法將返回當前活動UWP Window關聯的PrintManager,然后我們需要注冊事件printMan.PrintTaskRequested,這個事件會在打印操作發生時被觸發。

        private void PrintMan_PrintTaskRequested(PrintManager sender, PrintTaskRequestedEventArgs args)
        {
            PrintTask printTask = null;
            printTask = args.Request.CreatePrintTask("1", sourceRequested =>
            {
                sourceRequested.SetSource(printDocumentSource);
            });
        }

 

在這個事件里,一般會CreatePrintTask,然后做一些打印的配置,最后指定printDocumentSource。

PrintHelper里其余部分的代碼,僅僅時簡單的封裝和參數傳遞:

        public async Task ShowPrintUIAsync()
        {
            if (PrintManager.IsSupported())
            {
                await PrintManager.ShowPrintUIAsync();
            }
        }
  
        public virtual void PreparePrintContent(UIElement printContent)
        {
            PrintContent = printContent;
        }

 

具體大家可以參考Github上的Sample code:

https://github.com/manupstairs/UWPSamples/tree/master/UWPSamples/PrintingSample

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM