我尝试为CefSharp Chromium嵌入式浏览器(安装了NuGet的v3.3396.1786)和CefSharp.WPF组件(v67)启用拼写检查。我可以使用一种语言进行拼写检查,但是无法在运行时更改字典以进行拼写检查。我尝试了显示的示例并链接了on CefSharps github page,但没有成功。
我的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
。
答案 0 :(得分:1)
由于@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
错误。