如何在WPF中不使用WebBrowser控件调用HTML及脚本?
在WPF中不使用WebBrowser控件调用HTML脚本的方案
嘿,我懂你现在的需求——之前你用WPF的WebBrowser控件调用HTML里的GetData脚本,现在想绕开这个控件实现同样的交互,对吧?这里给你两个实用的方案,看看哪个适合你的场景:
方案一:用CefSharp替代WebBrowser(需要渲染HTML)
如果还是需要展示HTML页面,CefSharp是个比原生WebBrowser靠谱得多的选择,它基于Chromium,支持现代JS特性,交互也更稳定。
步骤:
- 先通过NuGet安装
CefSharp.Wpf包 - 在窗口的XAML里添加CefSharp的浏览器控件:
<Window x:Class="WpfApp.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:cef="clr-namespace:CefSharp.Wpf;assembly=CefSharp.Wpf" Title="MainWindow" Height="450" Width="800"> <Grid> <cef:ChromiumWebBrowser x:Name="chromiumBrowser" /> <Button x:Name="btnGetData" Content="获取HTML数据" HorizontalAlignment="Right" VerticalAlignment="Bottom" Margin="0,0,20,20" Click="btnGetData_Click"/> </Grid> </Window>
- 在C#代码里加载本地HTML并调用JS方法:
using CefSharp; using System.IO; using System.Windows; namespace WpfApp { public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); Loaded += Window_Loaded; } private void Window_Loaded(object sender, RoutedEventArgs e) { string curdir = Directory.GetCurrentDirectory(); string htmlPath = Path.Combine(curdir, "sample.html"); chromiumBrowser.Load(htmlPath); } private async void btnGetData_Click(object sender, RoutedEventArgs e) { try { // 异步调用HTML里的GetData函数 var scriptResult = await chromiumBrowser.EvaluateScriptAsync("GetData()"); if (scriptResult.Success && scriptResult.Result != null) { MessageBox.Show(scriptResult.Result.ToString()); } else { MessageBox.Show("未获取到数据或调用失败"); } } catch (Exception ex) { MessageBox.Show($"调用出错:{ex.Message}"); } } } }
这个方案能完美替代WebBrowser的功能,还能避免原生控件的兼容性问题,比如对现代JS的支持不足。
方案二:无渲染执行JS脚本(仅处理逻辑)
如果你根本不需要显示HTML页面,只是想执行里面的JS逻辑,那可以用HTML解析库加JS引擎的组合,完全脱离浏览器控件。
步骤:
- 通过NuGet安装
HtmlAgilityPack(解析HTML)和Jint(执行JS) - 编写C#代码提取并执行JS:
using HtmlAgilityPack; using Jint; using System.IO; using System.Windows; namespace WpfApp { public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); } private void btnExecuteScript_Click(object sender, RoutedEventArgs e) { try { string curdir = Directory.GetCurrentDirectory(); string htmlPath = Path.Combine(curdir, "sample.html"); // 解析HTML,提取所有script标签里的代码 var htmlDoc = new HtmlDocument(); htmlDoc.Load(htmlPath); var scriptNodes = htmlDoc.DocumentNode.SelectNodes("//script"); if (scriptNodes != null) { foreach (var scriptNode in scriptNodes) { string jsCode = scriptNode.InnerHtml; if (!string.IsNullOrWhiteSpace(jsCode)) { // 初始化Jint引擎,执行JS代码 var jsEngine = new Engine(); jsEngine.Execute(jsCode); // 调用GetData函数并获取结果 var result = jsEngine.Invoke("GetData"); if (result != null) { MessageBox.Show(result.ToString()); } } } } } catch (Exception ex) { MessageBox.Show($"执行出错:{ex.Message}"); } } } }
⚠️ 注意:这个方案没有浏览器的DOM环境,如果你的JS代码依赖window、document这些浏览器对象,需要手动模拟或者使用带DOM支持的JS引擎扩展,否则会报错。
内容的提问来源于stack exchange,提问作者sugar kavi




