PrintPreview是在主页面重新添加usercontrol后生成的

PrintPreview is generated after re-adding the usercontrol into the main page

今天,我在打印uwp 应用程序时遇到了一个新问题,如果我删除然后再将我的用户控件添加到主页,则无法生成打印预览。

我的场景:我有一个用户控件,其中有一个列表框,其项目水平对齐,但我想以垂直方式打印这些项目(每页 2 个项目)。

因此,我创建了另一个具有垂直对齐项目的相同列表框,最初这个列表框是隐藏的,然后在创建预览时这个列表框会显示一段时间。

现在,这个问题是第一次,当我 运行 我的应用程序然后它像一个魅力一样工作然后在删除相同的用户控件并再次添加它之后给我和打印预览带来了问题无法生成。

我创建了一个复制此问题的精简示例。

重现步骤:

  1. 运行 应用程序。

  2. 单击 "Load contacts" 按钮

  3. 单击 "Print" 按钮

观察:打开打印对话框并创建打印预览 -- 正确

  1. 现在,取消打印进程以隐藏打印对话框

  2. 单击 "Clear" 按钮删除用户控件

  3. 现在,重复步骤1到3

观察:这次没有创建打印预览----不正确

演示示例 link:https://1drv.ms/u/s!AiCx3o82H3zN9XD8iNCnaUmHUpzI

在 Unloaded 事件中,当您将 null 设置为 PrintManager 时,您无法从中删除 PrintManager.PrintTaskRequested 事件。它会抛出 "Delegate to an instance method cannot have null 'this'."

您应该能够在 PrintManager 设置为 null 之前删除 PrintManager.PrintTaskRequested 事件。

例如:

private void ContactsUserControl_Unloaded(object sender, RoutedEventArgs e)
{
    try
    {
        printMan.PrintTaskRequested -= PrintTaskRequested;
        printMan = null;
        printDocSource = null;
        printDoc.Paginate -= Paginate;
        printDoc.GetPreviewPage -= GetPreviewPage;
        printDoc.AddPages -= PrintDoc_AddPages;
        printDoc = null;
        GC.Collect();
    }
    catch (Exception ex)
    {
        Debug.WriteLine(ex.Message);
    }
}