2016-03-24 9 views
0

У меня есть около 8 записей, которые я хочу напечатать в одной партии, каждая на отдельной странице. Однако для примера UWP для этого используется более 600 строк кода для его выполнения. Мне кажется, что это намного проще, чем это. Я думал, что все, что нам нужно сделать, это добавить каждую страницу в PrintDocument и отправить задание на печать. Очевидно нет. Я использую это:Печать нескольких страниц из UWA

async void Print() 
{ 
    var printDocument = new PrintDocument(); 
    var printDocumentSource = printDocument.DocumentSource; 
    var printMan = PrintManager.GetForCurrentView(); 
    printMan.PrintTaskRequested += PrintTaskRequested; 

    var pages = new List<Page>(); 

    foreach (var item in items) 
    { 
     (//Set up variables) 

     var printPage = new PageToPrint() { //Set properties }; 
     printPage.Set_Up(); //Set up fields 

     pages.Add(printPage); 
    } 

    printDocument.SetPreviewPage(1, page); 
    printDocument.SetPreviewPageCount(pages.Count, PreviewPageCountType.Final); 

    foreach (var page in pages) 
    { 
     printDocument.AddPage(page); 
    } 

    printDocument.AddPagesComplete(); 
    await PrintManager.ShowPrintUIAsync(); 
} 

void PrintTaskRequested(PrintManager sender, PrintTaskRequestedEventArgs e) 
{ 
    PrintTask printTask = null; 
    printTask = e.Request.CreatePrintTask("Kimble Print Job", sourceRequested => 
    { 
     printTask.Completed += PrintTask_Completed; 
     sourceRequested.SetSource(printDocumentSource); 
    }); 
} 

private async void PrintTask_Completed(PrintTask sender, PrintTaskCompletedEventArgs args) 
{ 
    await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal,() => 
    { 
     PrintManager printMan = PrintManager.GetForCurrentView(); 
     printMan.PrintTaskRequested -= PrintTaskRequested; 
    }); 
} 

Однако он не будет генерировать предварительный просмотр печати. Он просто сидит там, вращаясь и вращаясь, и если я нажму «печать», это не удастся (PDF не открывается, работа никогда не попадает на физический принтер.)

Я надеялся, что печать будет не менее разумно легко с PrintDocument, и я все еще думаю, что похоже, что так должно быть. Я просто пропустил его здесь, или действительно ли занимает 600 строк кода для отправки простого задания на печать?

+0

Что такое 'items' в вашем коде? И что такое класс PagetoPrint? Это то же самое с официальным образцом? Если это то же самое, что такое функция 'SetUp'? Поскольку официальный образец работает хорошо, более подробная информация о ваших частях кода может помочь решить вашу проблему. –

+0

Элементы представляют собой массив классов, которые я использую для установки 'TextBlock' и т. Д. ('SetUp') на' PageToPrint', который является 'страницей'. – RareNCool

ответ

1

Однако он не будет генерировать предварительный просмотр печати.

Это происходит потому, что метод setPreview printDocument.SetPreviewPage(1, page); должен быть помещен в printDocument.GetPreviewPage дескриптора события. Поэтому вы должны сначала зарегистрировать дескриптор события. То же самое с printDocument.AddPages обработчиком событий. Вы перепутали регистр дескриптора события и функцию обратного вызова все в одном. Вот я немного изменил ваш код, и я его протестировал.

protected PrintDocument printDocument; 
protected IPrintDocumentSource printDocumentSource; 
List<Page> pages = new List<Page>(); 
Page printPage = new PageToPrint(); 
public MainPage() 
{ 
    this.InitializeComponent(); 
    RegisterForPrinting(); 
} 

private async void BtnPrint_Click(object sender, RoutedEventArgs e) 
{ 
    await PrintManager.ShowPrintUIAsync();  
} 

public void RegisterForPrinting() 
{ 
    printDocument = new PrintDocument(); 
    printDocumentSource = printDocument.DocumentSource; 
    pages.Add(printPage); 
    printDocument.GetPreviewPage += GetPrintPreviewPage; 
    printDocument.AddPages += AddPrintPages; 
    PrintManager printMan = PrintManager.GetForCurrentView(); 
    printMan.PrintTaskRequested += PrintTaskRequested; 
} 
private void AddPrintPages(object sender, AddPagesEventArgs e) 
{ 
    foreach (var page in pages) 
    { 
     printDocument.AddPage(page); 
    } 
    printDocument.AddPagesComplete(); 
} 
private void GetPrintPreviewPage(object sender, GetPreviewPageEventArgs e) 
{ 
    printDocument.SetPreviewPage(1, printPage); 
    printDocument.SetPreviewPageCount(pages.Count, PreviewPageCountType.Final); 
} 

void PrintTaskRequested(PrintManager sender, PrintTaskRequestedEventArgs e) 
{ 
    PrintTask printTask = null; 
    printTask = e.Request.CreatePrintTask("Kimble Print Job", sourceRequested => 
    { 
     printTask.Completed += PrintTask_Completed; 
     sourceRequested.SetSource(printDocumentSource); 
    }); 
} 

private async void PrintTask_Completed(PrintTask sender, PrintTaskCompletedEventArgs args) 
{ 
    await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal,() => 
    { 
     PrintManager printMan = PrintManager.GetForCurrentView(); 
     printMan.PrintTaskRequested -= PrintTaskRequested; 
    }); 
} 

Хотя вы не можете весь код образца, но я рекомендую вам следовать official sample структуру и построить класс PrintHelper.

+0

Это * выглядит * как то, что я хотел, но, к сожалению, он даже не приближается к работе. Это не позволит вам просматривать что-либо, кроме первой страницы, на самом деле не печатает и т. Д. – RareNCool

+0

@RareNCool Да, этот код может просто увидеть первую страницу из-за этого кода 'printDocument.SetPreviewPage (1, printPage);' Я просто изменить код на основе вашего кода, это не все функции. Если вы хотите реализовать все свои функции, пожалуйста, дайте мне весь свой код, и я попытаюсь найти для вас простое решение, иначе я рекомендую вам использовать код образца, который не содержит большого кода. –