CefSharp игнорирует настройки, установленные с помощью RequestContext (проверка орфографии) - PullRequest
0 голосов
/ 11 февраля 2019

Я пытаюсь включить проверку орфографии для встроенного браузера CefSharp Chromium (v3.3396.1786, установленного с NuGet) и компонента CefSharp.WPF (v67).Я могу настроить проверку орфографии на одном языке, но не могу изменить словарь для проверки орфографии во время выполнения.Я попробовал показанные примеры и связал на странице github CefSharps , но безуспешно.

Мой браузер CefSharp всегда использует языковой стандарт для определения языка, используемого для проверки орфографии, независимо от того, что я установил сRequestContext.SetPreference()

Это мой код, который инициализирует Cef:

public static void Initialize()
{
    var settings = new CefSettings
    {
        BrowserSubprocessPath = Path.Combine(AppDomain.CurrentDomain.SetupInformation.ApplicationBase,
            Environment.Is64BitProcess ? "x64" : "x86",
            "CefSharp.BrowserSubprocess.exe"),
        Locale = "de-DE",
        RemoteDebuggingPort = 8088,
    };

    // Set BrowserSubProcessPath based on app bitness at runtime

    // Make sure you set performDependencyCheck false
    Cef.Initialize
    (
        settings,
        performDependencyCheck: false,
        browserProcessHandler: null
    );
    CefSharpSettings.LegacyJavascriptBindingEnabled = true;
}

Фактический браузер настроен и создан другим методом:

private void create_web_browser()
{
    current_web_browser = new ChromiumWebBrowser
    {
        Visibility = Visibility.Hidden,
        BrowserSettings = new BrowserSettings
        {
            FileAccessFromFileUrls = CefState.Enabled,
            UniversalAccessFromFileUrls = CefState.Enabled,
            Javascript = CefState.Enabled,
            ImageLoading = CefState.Enabled,
            JavascriptAccessClipboard = CefState.Enabled,
            JavascriptCloseWindows = CefState.Enabled,
            JavascriptDomPaste = CefState.Enabled
        }           
    };

    current_helper = new ChromiumObjectForScriptingHelper(web_browser_ready_async, current_web_browser);
    if (ToolbarConfig != null)
    {
        current_helper.SetToolbarConfig(ToolbarConfig);
    }
    current_web_browser.RegisterJsObject("callbackObj", current_helper);
    var cur_dir = Directory.GetCurrentDirectory();
    var url = $"file://{cur_dir}/ckeditor/editor.html";
    current_web_browser.Address = url;
    current_web_browser.RequestContext = new RequestContext();
    current_web_browser.RequestContext.SetPreference("browser.enable_spellchecking", true, out _);
    current_web_browser.RequestContext.SetPreference("spellcheck.dictionaries", new List<string> { "en-US" }, out _);
    grid.Children.Add(current_web_browser);
}

Дополнительный методиспользуется, чтобы позволить пользователю позже сменить язык:

public void SetSpellcheck(Spellcheck language)
{
    if (language == Spellcheck.None) return;
    current_web_browser.RequestContext.SetPreference("spellcheck.dictionaries", new List<string> { get_locale_for_language(language) }, out _);
}

Как вы можете видеть, я пытаюсь установить параметры проверки правописания, но независимо от того, что я там установил, это не имеет никакого эффекта.Я мог установить enable_spellcheck в false, и он все еще проверяет орфографию, и словари, которые я установил, также игнорируются.Вместо того, что я вставил в словари, будет использоваться язык, ранее установленный в Locale.(Я проверил переменную out, но ошибок не было) Я также попытался использовать глобальный RequestContext, но безуспешно.

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

Другое дело, что, если я использую GetAllPreferences(true), чтобы получить список всех настроек со значениями по умолчанию, я просто получаю null.

1 Ответ

0 голосов
/ 14 февраля 2019

Благодаря комментариям @ amaitlands теперь я знаю, что проблема заключалась в том, что я устанавливал настройки в неправильной ветке.У меня было неправильное представление о том, что CefSharp работал в UI-Thread моих приложений, когда он на самом деле работал в своем собственном.

Решение состоит в том, чтобы использовать Cef.UIThreadTaskFactory.StartNew() для запуска кода внутри CefSharp UI-Thread

Cef.UIThreadTaskFactory.StartNew(delegate
{
    current_web_browser.RequestContext.SetPreference("browser.enable_spellchecking", true, out _);
    current_web_browser.RequestContext.SetPreference("spellcheck.dictionaries", new List<object> { "en-US" }, out _);
});

Мне также пришлось изменить тип List<> на object, поскольку я использую более старую версию CefSharp.WPF, в противном случае я получу ошибку Trying to set a preference of type LIST to value of type NULL.

...