最近项目需要一个功能,就是能够在CEFSharp中获取浏览器中的文件路径,查阅了不少资料,这里记录一下,以便后续有需要可以回顾。
由于浏览器并不能直接获取文件路径,所以就打算通过调用C#的获取文件路径的方式解决这个问题,就涉及到了C#与js互相调用的问题。
首先在C#中,声明这样一个类:
然后在Form的代码中,添加 chromiumWebbrowser.JavascriptObjectRepository.Settings.LegacyBindingEnabled = true;
CefSharpSettings.WcfEnabled = true;
CustomObject customObject = new CustomObject(form);
chromiumWebbrowser.JavascriptObjectRepository.Register("customObject", customObject, false, BindingOptions.DefaultBinder);
此处的form就是当前的form组件
然后在js中:
const openFile = ()=>{
window.customObject.openFile(getFile);
}
const getFile = (filePath)=>{
console.log("filePath:",filePath);
}
在按钮点击地方调用一下openFile();
此时运行程序,会发现能够成功唤起winform选择文件的窗口
随便点击一个文件之后,会发现在前端的控制台已经打印出选中的文件路径:
踩了几个坑,包括唤起打开文件窗口失败,是因为不在form的UI线程上;C#通过browser.ExecuteScriptAsync($"getFile('{filePath}')");一直失败;在js代码中调用C#的方法时,方法名首字母小写等问题