c# - 如何在 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 分配一个有效值吗?我花了好几个小时才走到那一步。因此,如果有人可以提供帮助,我将不胜感激!谢谢!
解决方案
printMan.PrintTaskRequested -= PrintTaskRequested;
和
printDoc.GetPreviewPage -= GetPreviewPage;
在 OnNavigatedFrom 中。
每次进入该页面时都会重新注册上述功能。但是,离开页面时它不会取消注册。所以你进入的页面越多,你注册的功能就越多。
推荐阅读
- javascript - 如何在画布上重复绘制?
- go - 来自天蓝色管道工件的自定义处理程序 defaultExecutablePath
- java - 查找两个特殊符号之间的字符数
- r - 是否有一个函数可以根据另一列的条件替换列中的特定值?
- sed - 如何使用 sed 在文件中的特定行附加数据,其中数据来自另一个文件
- xaml - UWP-CPP/Winrt 使 ListViewItem 数据模板的 Line Control 仅在选中时可见
- javascript - Vue JS - 在数组中显示 1 项
- highcharts - 我们可以在 highchart 中合并时间线栏吗?
- python - 如何在 Python 中嵌套方法
- javascript - 我如何在 React.js 中处理页面刷新事件