将此 iOS 代码移植到 Xamarin IPrintService (WebView) 的 macOS 代码

问题描述

我已经按照优秀示例 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 构建打印服务,可以理解的是我不能使用上面的代码。对于 ma​​cOS,我想改为显示 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();

显示打印面板,但不显示我的 WebView 内容

enter image description here


简化代码

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 似乎不受支持。如果我首先将焦点设置到控件,当我可以从“文件菜单打印“确定”时没有意义:

enter image description here

经过更多研究,我发现了这个 answer 但它基于 Swift。我不知道如何将它转换为 C#,也不知道它是否真的能解决这个问题。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...