【问题标题】:How to disconnect print event handler in uwp printing?如何在 uwp 打印中断开打印事件处理程序?
【发布时间】: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 分配一个有效值吗?我花了好几个小时才走到那一步。因此,如果有人可以提供帮助,我将不胜感激!谢谢!

【问题讨论】:

    标签: c# printing uwp


    【解决方案1】:
    printMan.PrintTaskRequested -= PrintTaskRequested;
    

    printDoc.GetPreviewPage -= GetPreviewPage;
    

    在 OnNavigatedFrom 内。

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

    【讨论】:

    • 谢谢你 Mahmut Yigit,这对我有用!这看起来很简单(这两行是 PrintHelper 类中“取消注册”方法的一部分)所以有人可能想知道为什么一方面 MS 指令如此复杂,以及为什么简化的示例不包含它另一方面...再次感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 2020-08-23
    • 1970-01-01
    • 2014-05-30
    相关资源
    最近更新 更多