Xamarin形成UWP静音打印

时间:2018-10-12 16:39:54

标签: c# xamarin service printing uwp

我需要从UWP Xamarin表单应用程序打印html文档,而不会向用户显示打印确认对话框。 我研究了“使用完全信任”,但似乎已删除。 设置

<Capabilities>
    <rescap:Capability Name="runFullTrust"/>
</Capabilities>

报告摘要无效。

我也曾尝试使用一项服务来运气不好。 在Windows窗体应用程序中使用InternetExplorer或WebBrowser格式化和打印可以正常工作,但在服务中运行将永远不会从导航到文档或从打印命令返回。

void PrintOnStaThread(string htmlPath)
{
    const short PRINT_WAITFORCOMPLETION = 2;
    const int OLECMDID_PRINT = 6;
    const int OLECMDEXECOPT_DONTPROMPTUSER = 2;
    using (var browser = new WebBrowser())
    {
        DebugLog.WriteLog("Control WebBrowser created");
        browser.Navigate(htmlPath);
        while (browser.ReadyState != WebBrowserReadyState.Complete)
        {
            DebugLog.WriteLog("DoEvents loop");
            Application.DoEvents();
        }
        DebugLog.WriteLog("DoEvents loop finished");
        dynamic ie = browser.ActiveXInstance;
        ie.ExecWB(OLECMDID_PRINT, OLECMDEXECOPT_DONTPROMPTUSER, PRINT_WAITFORCOMPLETION);
        DebugLog.WriteLog("DoEvents loop finished end of method");
    }
}

public void Print(string htmlFilename)
{
    documentLoaded = false;
    documentPrinted = false;
    DebugLog.WriteLog("Pre new InternetExplorer()");
    InternetExplorer ie = new  InternetExplorerClass();
    ie.DocumentComplete += new DWebBrowserEvents2_DocumentCompleteEventHandler(ie_DocumentComplete);
    ie.PrintTemplateTeardown += new DWebBrowserEvents2_PrintTemplateTeardownEventHandler(ie_PrintTemplateTeardown);

    object missing = Missing.Value;
    DebugLog.WriteLog("Pre navigate");
    ie.Navigate(htmlFilename, ref missing, ref missing, ref missing, ref missing);
    while (!documentLoaded && ie.QueryStatusWB(OLECMDID.OLECMDID_PRINT) != OLECMDF.OLECMDF_ENABLED)
    {
        Thread.Sleep(100);
    }
    DebugLog.WriteLog("Doc loaded");
    ie.ExecWB(OLECMDID.OLECMDID_PRINT, OLECMDEXECOPT.OLECMDEXECOPT_DONTPROMPTUSER, ref missing, ref missing);
    DebugLog.WriteLog("Printing");
    while (!documentPrinted)
    {
        Thread.Sleep(100);
        DebugLog.WriteLog("Printing loop");
    }
    DebugLog.WriteLog("Printed");
    ie.DocumentComplete -= ie_DocumentComplete;
    ie.PrintTemplateTeardown -= ie_PrintTemplateTeardown;
    ie.Quit();
}

我尝试了这些方法的许多不同变体,所有这些都具有相同的结果。

人们过去使用的代码(2016年左右)似乎不再起作用,因此我假设这已受到Microsoft的限制。 有人知道要实现我需要做什么吗?

1 个答案:

答案 0 :(得分:0)

您在拥有完整信任组件的正确轨道上。无声打印是UWP上下文中的一个已知缺陷,当前需要完全信任组件。正在探索UserVoice entry to allow direct printing

完全信任功能的问题在于,您需要在清单中定义rescap前缀,如Restricted Capabilities section of the App capability declarations document所示。

  

要声明受限功能,请修改应用程序包清单源文件(Package.appxmanifest)。添加xmlns:rescap XML名称空间声明,并在声明受限功能时使用rescap前缀。例如,以下是声明appCaptureSettings功能的方法。

<?xml version="1.0" encoding="utf-8"?>
<Package
    ...
    xmlns:rescap="http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities"
    IgnorableNamespaces="... rescap">
...
<Capabilities>
    <rescap:Capability Name="appCaptureSettings"/>
</Capabilities>
</Package>

我不怀疑您从2016年开始查看的代码在UWP上下文中也不起作用。我不特别知道从服务进行打印时会遇到什么:这样做比听起来要复杂得多,既要正确设置服务以进行打印,又要确保您使用的是设计用于服务(我的最佳猜测是您使用的IE控件不是)。从应用程序中的完全信任组件进行打印将更加容易和直接。如果这是您最熟悉的框架,则可以在WinForms中编写该组件。