我需要从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的限制。 有人知道要实现我需要做什么吗?
答案 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中编写该组件。