首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Xamarin forms UWP静默打印

Xamarin forms UWP静默打印
EN

Stack Overflow用户
提问于 2018-10-13 00:39:54
回答 1查看 258关注 0票数 0

我需要从UWP Xamarin forms应用程序打印一个html文档,而打印确认对话框不显示给用户。我已经研究过使用完全信任,但这似乎已被删除。设置

代码语言:javascript
复制
<Capabilities>
    <rescap:Capability Name="runFullTrust"/>
</Capabilities>

报告rescap无效。

我也尝试过使用一种服务来打印,但没有成功。在windows窗体应用程序中使用InternetExplorer或WebBrowser格式化和打印效果很好,但是在服务中运行时,将永远不会从导航到文档或从要打印的命令返回。

代码语言:javascript
复制
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");
    }
}

代码语言:javascript
复制
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年)似乎不再起作用,所以我假设这已经受到微软的限制。有谁知道如何实现我需要做的事情吗?

EN

回答 1

Stack Overflow用户

发布于 2018-10-13 10:43:32

有了完全信任的组件,您就走上了正确的道路。静默打印是UWP上下文中的一个已知差距,目前它需要完全信任组件。有一个正在探索的UserVoice entry to allow direct printing

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

若要声明受限功能,请修改应用程序包清单表源文件(Package.appxmanifest)。添加xmlns:rescap XML名称空间声明,并在声明受限能力时使用rescap前缀。例如,下面介绍如何声明appCaptureSettings功能。

代码语言:javascript
复制
<?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上下文中也不起作用。我不知道从服务打印时会遇到什么:这样做要比听起来复杂得多,无论是在正确设置服务以能够打印方面,还是在确保您使用为在服务中使用而设计的打印API方面(我最好的猜测是,您正在使用的IE控件不是)。从应用程序中的完全信任组件进行打印将更加容易和直接。如果WinForms是您最熟悉的框架,那么您可以用它编写该组件。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52783729

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档