如何断开UWP打印中的打印事件处理程序?

时间:2019-09-07 13:45:38

标签: c# printing uwp

我需要在多页UWP应用程序中打印一个xaml页。我只能打印此页面,但是当离开该页面并尝试导航回该页面时,将引发以下异常:

  

对于PrintTaskRequested事件,一次只能注册(翻译)一个处理程序。

MS指令说,离开打印页面时必须断开打印事件处理程序。奇怪的是,我在Stackoverflow上发现了两个简短且易于理解的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”方法。在代码中没有分配值的地方,我找不到在Print Sample中为printHelper分配值的地方。

当我在PrintSample中设置断点时,该值为“(PrintSample.PrintHelper)”。

那是什么意思?我可以通过某种方式为printHelper分配有效值吗?我花了很多时间才能达到目标。因此,如果有人可以帮助,我将不胜感激!谢谢!

1 个答案:

答案 0 :(得分:1)

printMan.PrintTaskRequested -= PrintTaskRequested;

printDoc.GetPreviewPage -= GetPreviewPage;

在OnNavigatedFrom中。

每次进入页面时,以上功能都会重新注册。 但是,离开页面时不会取消注册。 因此,您输入的页面越多,您注册的功能就越多。