2015-03-06 2 views
2

Мне нужно обрабатывать различные типы контента из f: ///. Мое приложение отображает автономные веб-сайты в приложении WPF. Все работает, за исключением ссылок на другие файлы контента (csv, mailto и pdf).CefSharp.Wpf: Открыть csv, mailto и pdf с помощью Process.Start (...)

  • Если я зарегистрировать CefCustomScheme для "MAILTO", то я получаю ProcessRequestAsync и может запустить Process.Start (...). Однако другое пустое окно также всплывает.
  • Если я затем добавлю второй CefCustomScheme для «файла», то ничего не произойдет. Ни один из методов ISchemeHandler ProcessRequestAsync не вызывается.

я должен быть в состоянии обрабатывать все запросы, за исключением * .html, в отдельном обработчике

По сути я просто хочу, чтобы воспроизвести поведение Web-браузера Control MS. Там все, что я сделал, это указать на страницу входа (index.htm), и все загружено. Затем, если пользователь нажимает на любую ссылку, элемент управления обрабатывает действие и запускает правильный процесс (обработчик контента, то есть Excel для Csv).

Код:

// 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; 
} 
+0

Не могли бы вы изменить свой вопрос, включив в него 'ISchemeHandler's и как вы их регистрации? –

+0

Привет @ SzabolcsDézsi, я обновил вопрос и добавил как можно больше деталей, чем возможно. – JDeVil

+0

Когда вы создаете 'filesScheme', вы все равно ссылаетесь на' mailtoScheme' после этого. Мне не удалось заставить ссылки на файл работать с подходом схемы. Если вы установили 'RequestHandler' вашего элемента управления браузера и поместили код, в котором вы запустили процесс, в метод OnBeforeBrowse, вы можете добиться желаемого эффекта. Я пробовал его с помощью CefSharp.Wpf 37.0.0 –

ответ

3

Решение было реализовать IRequestHandler и использовать ONB eforeResourceLoad, чтобы проверить, какой контент был запрошен. ISchemeHandler используется для действий «mailto».

В моем случае мне пришлось назначить обработчик запроса после загрузки кадра. Это позволило веб-браузеру сначала отображать все содержимое.

Пример кода GitHub example

Смежные вопросы