WebView2 (WPF) - 从本地文件夹加载网站并调用 C# 函数和调用 JS 函数
WebView2 (WPF) - Load website from local folder and call C# Function and call JS Function
我正在使用 WebView2 制作 WPF 应用程序。
将有一个安装程序将 WPF 应用程序安装到文件夹中,还将下载网站并将其写入安装目录的子文件夹中。比如这样:
Installation Directory
├───Website
│ ├───index.css
│ └───index.html
└───WPF Self Contained EXE
WebView2 将使用此加载网站(我认为):webView.CoreWebView2.Navigate(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Website");
这应该加载 index.html
及其引用的所有文件,例如 index.css
。
现在我主要关心的是如何从 C# 调用 JavaScript 函数。到目前为止,谷歌搜索后我只找到了 WebView1 的方法。而且我找不到任何有关从 JavaScript.
调用 C# 方法的信息
所以三件事:
- 这
webView.CoreWebView2.Navigate(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Website");
从本地文件夹加载网站是否正确?
- 我如何调用 JavaScript 函数并将 C# 对象从 C# 方法传递给它。
- 如何从 JavaScript 脚本中调用 C# 函数?
这可能吗?
谢谢。
使用文件 URI
我不确定 AppDomain.CurrentDomain.BaseDirectory 是否总能为您提供正确的路径。您可以使用如下内容:
string exePath = System.Reflection.Assembly.GetExecutingAssembly().Location;
string exeFolder = System.IO.Path.GetDirectoryName(exePath);
string websiteFolder = Path.Combine(exeFolder, "website");
string htmlPath = Path.Combine(websiteFolder, "index.html");
webView.CoreWebView2.Navigate(htmlPath);
您必须包括 index.html 本身的路径,而不仅仅是包含 index.html 的文件夹。
通常 Navigate 应该采用 URI,但如果您提供 Windows 文件路径,它会为您将其转换为文件 URI,并且应该可以工作。
在尝试合并 http(s) URI 和其他需要 https 的 Web 平台功能时,文件 URI 有一些限制。
使用虚拟 HTTPS URI
如果您在使用文件 URI 时遇到问题,您可以使用 CoreWebView2.SetVirtualHostNameToFolderMapping 将 Windows 文件路径映射到假的 HTTPS 主机名:
string exePath = System.Reflection.Assembly.GetExecutingAssembly().Location;
string exeFolder = System.IO.Path.GetDirectoryName(exePath);
string websiteFolder = Path.Combine(exeFolder, "website");
webView.CoreWebView2.SetVirtualHostNameToFolderMapping("appassets.example", websiteFolder, CoreWebView2HostResourceAccessKind.DenyCors);
webView.CoreWebView2.Navigate("https://appassets.example/index.html");
这将创建一个假的主机名 'appassets.example',它将映射到您的 Windows 文件路径。由于其 HTTPS URI,您不会遇到与文件 URI 相同的问题。
脚本中的宿主对象
对于您的问题 2 和 3,您可以使用 CoreWebView2.AddHostObjectToScript。当前的 AddHostObjectToScript 实现需要您的 C# 类 进行特殊标记。您可以在 AddHostObjectToScript 文档中看到它。
我正在使用 WebView2 制作 WPF 应用程序。
将有一个安装程序将 WPF 应用程序安装到文件夹中,还将下载网站并将其写入安装目录的子文件夹中。比如这样:
Installation Directory
├───Website
│ ├───index.css
│ └───index.html
└───WPF Self Contained EXE
WebView2 将使用此加载网站(我认为):webView.CoreWebView2.Navigate(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Website");
这应该加载 index.html
及其引用的所有文件,例如 index.css
。
现在我主要关心的是如何从 C# 调用 JavaScript 函数。到目前为止,谷歌搜索后我只找到了 WebView1 的方法。而且我找不到任何有关从 JavaScript.
调用 C# 方法的信息所以三件事:
- 这
webView.CoreWebView2.Navigate(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Website");
从本地文件夹加载网站是否正确? - 我如何调用 JavaScript 函数并将 C# 对象从 C# 方法传递给它。
- 如何从 JavaScript 脚本中调用 C# 函数?
这可能吗?
谢谢。
使用文件 URI
我不确定 AppDomain.CurrentDomain.BaseDirectory 是否总能为您提供正确的路径。您可以使用如下内容:
string exePath = System.Reflection.Assembly.GetExecutingAssembly().Location;
string exeFolder = System.IO.Path.GetDirectoryName(exePath);
string websiteFolder = Path.Combine(exeFolder, "website");
string htmlPath = Path.Combine(websiteFolder, "index.html");
webView.CoreWebView2.Navigate(htmlPath);
您必须包括 index.html 本身的路径,而不仅仅是包含 index.html 的文件夹。
通常 Navigate 应该采用 URI,但如果您提供 Windows 文件路径,它会为您将其转换为文件 URI,并且应该可以工作。
在尝试合并 http(s) URI 和其他需要 https 的 Web 平台功能时,文件 URI 有一些限制。
使用虚拟 HTTPS URI
如果您在使用文件 URI 时遇到问题,您可以使用 CoreWebView2.SetVirtualHostNameToFolderMapping 将 Windows 文件路径映射到假的 HTTPS 主机名:
string exePath = System.Reflection.Assembly.GetExecutingAssembly().Location;
string exeFolder = System.IO.Path.GetDirectoryName(exePath);
string websiteFolder = Path.Combine(exeFolder, "website");
webView.CoreWebView2.SetVirtualHostNameToFolderMapping("appassets.example", websiteFolder, CoreWebView2HostResourceAccessKind.DenyCors);
webView.CoreWebView2.Navigate("https://appassets.example/index.html");
这将创建一个假的主机名 'appassets.example',它将映射到您的 Windows 文件路径。由于其 HTTPS URI,您不会遇到与文件 URI 相同的问题。
脚本中的宿主对象
对于您的问题 2 和 3,您可以使用 CoreWebView2.AddHostObjectToScript。当前的 AddHostObjectToScript 实现需要您的 C# 类 进行特殊标记。您可以在 AddHostObjectToScript 文档中看到它。