C++,C# UWP中用ScrollViewer代替WebView的滚动条(可更改样式)

本文介绍了如何在UWP应用中解决WebView滚动条样式问题,通过在WebView外包裹ScrollViewer,并利用JavaScript获取网页实际高度,动态调整WebView高度以隐藏原生滚动条。同时,分享了如何美化ScrollViewer滚动条样式,以及针对触摸设备的适配策略,包括检查设备是否具备触摸功能来决定是否调整WebView高度。
摘要由CSDN通过智能技术生成

    在UWP软件开发过程中,我们可能会用WebView来显示一些信息,但是又遇到一个问题,WebView的自带滚动条在PC中太大太丑,但是在我们更改了ScrollBar的样式后,发现WebView中的滚动条依旧是原来的样子。。。

    我的思路是在WebView外套一个ScrollViewer,然后调用JS返回页面高度,然后将其赋值给webview的Height参数。因为在webview的高度大于等于页面高度时,就不会出现滚动条。

下面则是我的解决方案,推荐写在WebView的NavigationCompleted事件里。

C++

static auto jsArray = ref new Platform::Collections::Vector<Platform::String^>;

jsArray->Append("document.documentElement.scrollHeight.toString();");//添加参数

static Windows::Foundation::Collections::IIterable<Platform::String^>^ myWebScript = jsArrary;

//注意这里的IIterable<T>^不支持lambda,而且得用Vector<T>^来初始化

//还有这些参数是static的原因是因为在下面需要在 线程 中访问它们

concurrency::create_task(webview->InvokeScriptAsync("eval", jsArray)).then([this](Platform::String^ webHeight)

{

    webview->Height = wtoi(webHeight->Data());//将Platform::String转换为int并赋值给webview的Height参数

}, concurrency::task_continuation_context::use_current());//在UI线程执行

C#

webview.Height = Convert.ToInt32(await webview.InvokeScriptAsync("eval", "document.documentElement.scrollHeight.toString();"));

Xaml

<ScrollViewer>

    <WebView Name="webview"/>

</ScrollViewer>

顺便说一下,ScrollBar的美化,可以在模板里把上下两个按钮删除,把中间的Rectangle设置RadiusX、RadiusY,大概5到7左右自己把控。最后上一张效果图(WebView在右边)


目前发现一个问题就是在触摸设备中你的触摸焦点还是会在WebView上,但是在触摸设备中的滚动条是不会挡内容的所以我相出以下解决方案,

在启动时判断通过Windows.System.Profile.AnalyticsInfo.VersionInfo.DeviceFamily来判断你的应用运行在PC或Mobile设备上来决定是否要更改WebView高度,但是一旦我们遇到了可触控的平板、笔记本之类的,这招就不是很管用了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值