【发布时间】:2020-01-10 01:19:35
【问题描述】:
我需要在多页 UWP 应用中打印单个 xaml 页面。我只打印了这个页面,但是当离开那个页面并试图导航回它时,会抛出以下异常:
对于 PrintTaskRequested 事件,一次只能注册(翻译)一个处理程序。
MS 指令说,当您离开打印页面时,您必须断开打印事件处理程序的连接。奇怪的是,我在 Stackoverflow 上找到了 2 个简短且易于理解的 uwp 打印示例,这些示例被标记为答案,但缺少断开连接的方法,因此在添加第二页时,它们都像我的一样坏了。
对于初学者来说,MS Print Sample 太复杂了。我尝试使用示例代码中的片段构建我的代码,但我迷失在错误中。
这是我目前的测试代码。我删除了所有不需要的部分 - 只是为了预览和打印页面:
using Microsoft.Toolkit.Uwp.Helpers;
namespace Print_190905
{
public sealed partial class MainPage : Page
{
private PrintManager printMan;
private PrintDocument printDoc;
private IPrintDocumentSource printDocSource;
private PrintHelper printHelper;
public MainPage()
{
this.InitializeComponent();
}
protected override void OnNavigatedTo(NavigationEventArgs e)
{
printMan = PrintManager.GetForCurrentView();
printMan.PrintTaskRequested += PrintTaskRequested;
printDoc = new PrintDocument();
printDocSource = printDoc.DocumentSource;
printDoc.GetPreviewPage += GetPreviewPage;
}
private async void PrintButton_Click(object sender, RoutedEventArgs e)
{
await PrintManager.ShowPrintUIAsync();
}
private void PrintTaskRequested(PrintManager sender, PrintTaskRequestedEventArgs args)
{
var printTask = args.Request.CreatePrintTask("Print", PrintTaskSourceRequrested);
}
private void PrintTaskSourceRequrested(PrintTaskSourceRequestedArgs args)
{
args.SetSource(printDocSource);
}
private void GetPreviewPage(object sender, GetPreviewPageEventArgs e)
{
printDoc.SetPreviewPage(e.PageNumber, this.Print_Area);
}
private void CmdZurueck_Click(object sender, RoutedEventArgs e)
{
this.Frame.Navigate(typeof(Seite_2));
}
}
为避免返回打印页面时出现错误,我从打印示例中添加了此片段:
protected override void OnNavigatedFrom(NavigationEventArgs e)
{
if (printHelper != null)
{
printHelper.Dispose();
}
}
但是:printHelper 始终为 Null,因此永远不会调用“Dispose”方法。代码中没有分配值的位置,并且我找不到在打印示例中分配 printHelper 的值的位置。
当我在 PrintSample 中设置断点时,其值为“(PrintSample.PrintHelper)”。
这是什么意思?我可以以某种方式为 printHelper 分配一个有效值吗?我花了好几个小时才走到那一步。因此,如果有人可以提供帮助,我将不胜感激!谢谢!
【问题讨论】: