You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在WPF中不使用WebBrowser控件调用HTML及脚本?

在WPF中不使用WebBrowser控件调用HTML脚本的方案

嘿,我懂你现在的需求——之前你用WPF的WebBrowser控件调用HTML里的GetData脚本,现在想绕开这个控件实现同样的交互,对吧?这里给你两个实用的方案,看看哪个适合你的场景:

方案一:用CefSharp替代WebBrowser(需要渲染HTML)

如果还是需要展示HTML页面,CefSharp是个比原生WebBrowser靠谱得多的选择,它基于Chromium,支持现代JS特性,交互也更稳定。

步骤:

  1. 先通过NuGet安装CefSharp.Wpf
  2. 在窗口的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>
  1. 在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引擎的组合,完全脱离浏览器控件。

步骤:

  1. 通过NuGet安装HtmlAgilityPack(解析HTML)和Jint(执行JS)
  2. 编写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代码依赖windowdocument这些浏览器对象,需要手动模拟或者使用带DOM支持的JS引擎扩展,否则会报错。

内容的提问来源于stack exchange,提问作者sugar kavi

火山引擎 最新活动