CefSharp.Wpf:使用Process.Start打开csv,mailto和pdf(...)

时间:2015-03-06 13:59:18

标签: wpf cefsharp

我需要处理f:///中的不同内容类型。我的应用程序在WPF应用程序中呈现脱机网站。除了指向其他内容文件(csv,mailto和pdf)的链接外,一切正常。

  • 如果我为“mailto”注册CefCustomScheme,那么我将获得ProcessRequestAsync并可以运行Process.Start(...)。 然而另一个空白窗口也会弹出。
  • 如果我为“文件”添加第二个CefCustomScheme,则没有任何反应。没有调用ISchemeHandler ProcessRequestAsync方法。

我必须能够在单独的处理程序中处理除* .html之外的所有请求

基本上我只想复制MS Web浏览器控件的行为。我所做的只是指向入口页面(index.htm),并且所有内容都已加载。然后,如果用户单击任何链接,则控件处理该操作并启动正确的进程(内容处理程序,即Csv的Excel)。

代码:

// Startup
  var settings = new CefSettings();
  settings.LogFile = @"c:\temp\ceflog.txt";
  settings.LogSeverity = LogSeverity.Verbose;
  settings.IgnoreCertificateErrors = true;
  CefCustomScheme mailtoScheme = new CefCustomScheme();
  mailtoScheme.SchemeName = "mailto";
  mailtoScheme.SchemeHandlerFactory = new SchemeHandlerFactory();

  CefCustomScheme filesScheme = new CefCustomScheme();
  mailtoScheme.SchemeName = "file";
  mailtoScheme.SchemeHandlerFactory = new SchemeHandlerFactory();

  settings.RegisterScheme(mailtoScheme);
  settings.RegisterScheme(filesScheme);

  if (!Cef.Initialize(settings))
    throw new InvalidOperationException("Failed to initialize the browser factory");

- SchemeHandlerFactory

public class SchemeHandlerFactory : ISchemeHandlerFactory  {
public ISchemeHandler Create()    {
  return new CustomSchemeHandler();
}

}

- 处理程序

public class CustomSchemeHandler : ISchemeHandler  {
private static readonly ILog _log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
public bool ProcessRequestAsync(IRequest request, ISchemeHandlerResponse response, OnRequestCompletedHandler requestCompletedCallback)    {
  _log.DebugFormat("Processing url: {0}", request.Dump());

  var knownContentTypes = new[] {".csv", ".xsls", ".xlsx", ".pdf", ".txt"};
  var ext=Path.GetExtension(request.Url);
  if(knownContentTypes.Contains(ext))      {
    _log.DebugFormat("Starting process for: {0}",request.Url);
    Process.Start(request.Url);
    return false;
  }
  return true;
}

1 个答案:

答案 0 :(得分:4)

解决方案是实现IRequestHandler并使用OnBeforeResourceLoad事件来检查请求的内容。 ISchemeHandler用于“mailto”操作。

在我的情况下,我必须在加载帧后分配请求处理程序。这允许Web浏览器首先呈现所有内容。

代码示例GitHub example

相关问题