我需要在多页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分配有效值吗?我花了很多时间才能达到目标。因此,如果有人可以帮助,我将不胜感激!谢谢!
答案 0 :(得分:1)
printMan.PrintTaskRequested -= PrintTaskRequested;
和
printDoc.GetPreviewPage -= GetPreviewPage;
在OnNavigatedFrom中。
每次进入页面时,以上功能都会重新注册。 但是,离开页面时不会取消注册。 因此,您输入的页面越多,您注册的功能就越多。