首页 > 解决方案 > 如何在 uwp 打印中断开打印事件处理程序?

问题描述

我需要在多页 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 分配一个有效值吗?我花了好几个小时才走到那一步。因此,如果有人可以提供帮助,我将不胜感激!谢谢!

标签: c#printinguwp

解决方案


printMan.PrintTaskRequested -= PrintTaskRequested;

printDoc.GetPreviewPage -= GetPreviewPage;

在 OnNavigatedFrom 中。

每次进入该页面时都会重新注册上述功能。但是,离开页面时它不会取消注册。所以你进入的页面越多,你注册的功能就越多。


推荐阅读