问题描述
我已经按照优秀示例 here 为我的项目的 iOS 版本实现了打印服务:
using ElderlyInfirmRota.iOS;
using UIKit;
using Xamarin.Forms;
using Xamarin.Forms.Platform.iOS;
[assembly: Xamarin.Forms.Dependency(typeof(ApplePrintService))]
namespace ElderlyInfirmRota.iOS
{
public class ApplePrintService : IPrintService
{
public ApplePrintService()
{
}
public void Print(WebView viewToPrint)
{
var appleViewToPrint = Platform.CreateRenderer(viewToPrint).NativeView;
var printInfo = uiprintinfo.PrintInfo;
printInfo.OutputType = uiprintinfoOutputType.General;
printInfo.JobName = "Elderly and Infirm Rota";
printInfo.Orientation = uiprintinfoOrientation.Portrait;
printInfo.Duplex = uiprintinfoDuplex.None;
var printController = UIPrintInteractionController.SharedPrintController;
printController.PrintInfo = printInfo;
printController.ShowsPageRange = true;
printController.PrintFormatter = appleViewToPrint.ViewPrintFormatter;
printController.Present(true,(printInteractionController,completed,error) => { });
}
}
}
效果很好。我现在正在尝试构建我的 macOS 构建打印服务,可以理解的是我不能使用上面的代码。对于 macOS,我想改为显示 WebView
内容的打印对话框。
我尝试过研究:
我在这里看到了一些关于打印到 PDF 的答案,但我只想显示以 WebView
作为源的打印对话框。
我已阅读文章 Printing From Your App,其中有一个标题为在使用 NSView
的应用程序中打印。我注意到它说:
在非基于文档的应用程序中打印最适合主窗口中只有一个可打印视图(即 NSView
对象)的应用程序,该视图可以作为第一响应者。例如,在一个简单的文本编辑器中,只有持有文本文档的视图才有焦点,因此在文本视图中实现打印很简单。您可以在 TextEdit
示例代码项目中看到此架构的示例。
当您的用户界面包含多个具有焦点的视图(例如多个 NSTextField
对象)时,基于视图的打印效果不佳。当用户选择 Print 命令时,接收 print: 消息的视图会打印自己,但不会打印其他内容。例如,如果焦点位于文本字段中,则仅打印该文本字段的内容。这可能不是我们想要的行为。
这是我发现的。如果我只需单击 WebView
使其具有焦点,那么我就可以使用 文件 菜单中的 打印 菜单项。我不想在我的项目中使用 NSDocument 派生的方法,因为它不适合那样。
我尝试使用:
var appleViewToPrint = Platform.CreateRenderer(viewToPrint).NativeView;
appleViewToPrint.Print(null);
但它不喜欢参数为 null
。
我现在尝试:
var appleViewToPrint = Platform.CreateRenderer(viewToPrint).NativeView;
var printOp = nsprintOperation.FromView(appleViewToPrint);
printOp.PrintInfo.Jobdisposition = "Elderly and Infirm Rota";
printOp.PrintInfo.Orientation = nsprintingOrientation.Portrait;
printOp.Runoperation();
简化代码:
var appleViewToPrint = Platform.CreateRenderer(viewToPrint).NativeView;
var printOp = nsprintOperation.FromView(appleViewToPrint,nsprintInfo.SharedPrintInfo);
printOp.JobTitle = "Elderly and Infirm Rota";
printOp.ShowsPrintPanel = true;
printOp.Runoperation();
但是打印面板上的输出仍然是空白的。
看起来 here 似乎不受支持。如果我首先将焦点设置到控件,当我可以从“文件”菜单打印“确定”时没有意义:
经过更多研究,我发现了这个 answer 但它基于 Swift。我不知道如何将它转换为 C#,也不知道它是否真的能解决这个问题。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)