WPF C#中WebBrowser控件滚动页面至底部的实现方法
解决WPF WebBrowser滚动到Facebook群成员页面底部的问题
我知道你在WPF里用WebBrowser控件滚动Facebook群成员页面时碰了壁——WinForms的ScrollTo方法用不了,之前尝试操作script元素的思路也走偏了,其实有更直接省心的方案!
核心方案:用WebBrowser的InvokeScript执行JavaScript
WPF的WebBrowser控件自带了InvokeScript方法,可以直接执行JavaScript代码,完全没必要去遍历页面里的script标签。我们可以用JS获取页面总高度,然后一键滚动到最底部。
基础单次滚动代码
先写一个简单的方法,调用一次就能滚动到当前页面的底部:
private void ScrollToBottom() { // 执行JS:直接滚动到页面最底部 browser1.InvokeScript("eval", new object[] { "window.scrollTo(0, document.body.scrollHeight);" }); }
适配Facebook的动态加载
Facebook的群成员页面是动态加载的——滚动到底部后会加载更多成员,只滚动一次肯定看不到全部内容。我们可以加个定时器,重复滚动直到页面高度不再变化:
private double _lastPageHeight = 0; private DispatcherTimer _autoScrollTimer; private void StartAutoScrollToBottom() { _autoScrollTimer = new DispatcherTimer(); _autoScrollTimer.Interval = TimeSpan.FromSeconds(2); // 给页面留2秒加载新内容的时间 _autoScrollTimer.Tick += AutoScrollTimer_Tick; _autoScrollTimer.Start(); } private void AutoScrollTimer_Tick(object sender, EventArgs e) { // 获取当前页面的总高度 double currentHeight = (double)browser1.InvokeScript("eval", new object[] { "document.body.scrollHeight" }); if (currentHeight == _lastPageHeight) { // 高度不再变化,说明已经加载完所有内容,停止滚动 _autoScrollTimer.Stop(); return; } // 滚动到最新的底部位置 browser1.InvokeScript("eval", new object[] { "window.scrollTo(0, document.body.scrollHeight);" }); _lastPageHeight = currentHeight; }
触发时机:页面加载完成后再滚动
记得把滚动逻辑绑定到WebBrowser的LoadCompleted事件里,确保页面已经加载完毕再执行:
private void browser1_LoadCompleted(object sender, NavigationEventArgs e) { // 页面加载完成后启动自动滚动 StartAutoScrollToBottom(); }
为什么之前的思路不对?
你之前尝试遍历页面的script元素是完全没必要的——WPF WebBrowser的InvokeScript方法就是专门用来和页面JS交互的入口,直接执行任意JS代码就行,根本不需要手动操作页面里的脚本标签,这个方法比操作DOM元素简单太多啦。
内容的提问来源于stack exchange,提问作者Waseem Ahmad Naeem
相关产品推荐
相关产品推荐

