在WinForm/WPF中使用CefSharp混合开发时,通常需要自定义滚动条样式,以保证应用的整体风格统一。本文将给出一个简单的示例介绍如何自定义CefSharp中滚动条的样式。

基本思路

在前端开发中,通过CSS来控制滚动条的样式是件寻常的事情。CefSharp也提供了功能强大的API方便开发人员使用c#与JS进行交互。这也给我们提供了一个思路:在CefSharp加载完成后,使用其提供的ExecuteJavaScriptAsync方法注入JS和CSS代码来自定义滚动条样式。

实现细节

为了排除干扰以及方便介绍,本文直接从GitHub上下载CefSharp.MinimalExample的示例代码进行修改。

首先用CSS定义滚动条的样式,介绍滚动条组成部分以及通过CSS控制其样式的文章挺多,这里直接贴代码。

/*定义滚动条高宽及背景 高宽分别对应横竖滚动条的尺寸*/
::-webkit-scrollbar
{
width: 6px;
height: 6px;
background-color: #FFF;
cursor:pointer;
}
/*定义滚动条轨道 内阴影+圆角 */
::-webkit-scrollbar-track
{
box-shadow: inset 0 0 6px rgba(155,155,155,0.3);
border-radius: 5px;
background-color: #FFF;
cursor:pointer;
}
::-webkit-scrollbar-button
{
display: none;
}
/*定义滑块 内阴影+圆角*/
::-webkit-scrollbar-thumb
{
border:1px solid #c6c6c6;
border-radius: 5px;
background: #c6c6c6;
cursor:pointer;
background-repeat: no-repeat;
background-position:center;
}

接下来就是把CSS样式注入到CefSharp中,按照CefSharp的wiki描述,JavaScript脚本只能在V8Context中执行,并且是在Frame级别执行。对于没有上下文的在Frame,一旦在Frame加载,就可以使用IFrame.ExecuteJavaScriptAsync创建V8Context

在CefSharp中,IBrowserIFrame对象用于向浏览器发送命令和在回调方法中获取状态信息,每个IBrowser对象都有一个主IFrame对象表示顶层frame(MainFrame),零个或多个IFrame对象表示子frame。

为了尽早把CSS样式注入到CefSharp中,可以在监听Browser.FrameLoadEnd事件并执行脚本。

public MainWindow()
{
InitializeComponent();
Browser.FrameLoadEnd += Browser_FrameLoadEnd;
} private void Browser_FrameLoadEnd(object sender, FrameLoadEndEventArgs e)
{ if (e.Frame.IsMain)
{
//这里的style就是上一个代码片段中css样式的字符串
AddStyle(style);
}
} /// <summary>
/// 添加CSS样式表
/// </summary>
/// <param name="style">样式内容</param>
public void AddStyle(string style)
{
if (string.IsNullOrEmpty(style)) return; StringBuilder sb = new StringBuilder();
sb.AppendLine("{let script = document.createElement('style');");
sb.Append("let node=document.createTextNode('").Append(style.Replace("\n", string.Empty).Replace("\r", string.Empty)).Append("');");
sb.AppendLine("script.appendChild(node);");
sb.AppendLine("let elements = document.getElementsByTagName('head');");
sb.AppendLine("if(elements.length>0){elements[0].appendChild(script);}");
sb.AppendLine("else if( (elements = document.getElementsByTagName('body')).length>0){elements[0].appendChild(script);}}"); Browser.GetMainFrame().ExecuteJavaScriptAsync(sb.ToString());
}

实现效果如下,滚动条的样式已被修改。在CefSharp的开发者工具中也可以看到注入的CSS样式。

CefSharp自定义滚动条样式的更多相关文章

  1. jQuery自定义滚动条样式插件mCustomScrollbar

    如果你构建一个很有特色和创意的网页,那么肯定希望定义网页中的滚动条样式,这方面的 jQuery 插件比较不错的,有两个:jScrollPane 和 mCustomScrollbar. 关于 jScro ...

  2. WPF 自定义滚动条样式

    先看一下效果: 先分析一下滚动条有哪儿几部分组成: 滚动条总共有五部分组成: 两端的箭头按钮,实际类型为RepeatButton Thumb 两端的空白,实际也是RepeatButton 最后就是Th ...

  3. CSS3自定义滚动条样式

    原文地址:→传送门 写在前面 滚动条是个很常见的东东,不过某些浏览器自带的滚动条确实不太好看啊,下面可以作为学习,探讨下自定义滚动条的实现,这样你的滚动条就可以美美的啦.但是,也只能玩玩,因为只针对w ...

  4. 自定义滚动条样式-transition无效

    问题 需求是自定义滚动条样式,然后2秒内无操作隐藏滚动条. 2s内隐藏比较麻烦,不能用css实现,只能监听容器的touch事件,然后给滚动条加个opacity: 0的class. .class::-w ...

  5. CSS自定义滚动条样式

    原文地址:http://www.qianduan.net/css-custom-scroll-bar-style/ 相信很多人都遇到过在设计中自定义滚动条样式的情景,之前我都是努力说服设计师接受浏览器 ...

  6. css中渐变的分割线和自定义滚动条样式

    css中渐变的分隔线: <div style="background:linear-gradient(to left,#efefef,#b6b6b6,#efefef);height:1 ...

  7. CSS3自定义滚动条样式 -webkit-scrollbar(转)

    有没有觉得浏览器自带的原始滚动条很不美观,同时也有看到很多网站的自定义滚动条显得高端,就连chrome32.0开发板都抛弃了原始的滚动条,美观多了.那webkit浏览器是如何自定义滚动条的呢? 前言 ...

  8. CSS3自定义滚动条样式 -webkit-scrollbar

    今天写项目碰上需要改滚动条效果,我的第一反应是,需要用js写滚动条,顿时头大,上网搜了一下,原来css3就可以修改滚动条样式了,非常好啊,下面分享原文地址:http://www.xuanfengge. ...

  9. 使用css实现无滚动条滚动+使用插件自定义滚动条样式

    使用css实现无滚动条滚动,摘抄自:曹小萌博客 使用css实现无滚动条滚动,大体思路是在div外面再套一个div.这个div设置overflow:hidden.而内容div设置 overflow-x: ...

  10. DIV 自定义滚动条样式

    当内容超出容器时,容器会出现滚动条,其自带的滚动条有时无法满足我们审美要求,那么我们可以通过css伪类来实现对滚动条的自定义. 首先我们要了解滚动条.滚动条从外观来看是由两部分组成:1,可以滑动的部分 ...

随机推荐

  1. 深入浅出MySQL事务

    Photo by Lukas Hartmann from Pexels 辞职这段时间以来看见了很多工作之外的东西,我认为这是值得的.同时也有时间和机会来好好整理所学所想,准备开启下一段旅途. 事务的定 ...

  2. K8S | 容器和Pod组件

    对比软件安装和运行: 一.场景 作为研发人员,通常自己电脑的系统环境都是非常复杂,在个人的习惯上,是按照下图的模块管理电脑的系统环境: 对于「基础设施」.「主机操作系统」.「系统软件」来说,通常只做配 ...

  3. Sentieon安装时 jemalloc error 解决办法

    背景 Sentieon建议使用jemalloc来改善Sentieon应用程序中的内存管理和整体性能,尤其是Sentieon bwa-mem.有时在安装运行过程中会出现报错: ERROR: ld.so: ...

  4. CPU性能指标介绍及分析

    CPU是计算机系统中最核心的组件之一,对系统性能起着至关重要的作用.以下是一些常见的CPU性能指标及其分析: 1. %user(用户态)和 %system(内核态) %user:表示CPU花费在用户进 ...

  5. 2023-07-06:RabbitMQ中的AMQP是什么?

    2023-07-06:RabbitMQ中的AMQP是什么? 答案2023-07-06: AMQP AMQP(Advanced Message Queuing Protocol)是一个应用层协议的开放标 ...

  6. 我用numpy实现了VIT,手写vision transformer, 可在树莓派上运行,在hugging face上训练模型保存参数成numpy格式,纯numpy实现

    先复制一点知乎上的内容 按照上面的流程图,一个ViT block可以分为以下几个步骤 (1) patch embedding:例如输入图片大小为224x224,将图片分为固定大小的patch,patc ...

  7. Vue-Element UI 文件上传与下载

    项目结构 后端 前端 效果演示 上传文件 下载文件 Code 后端代码 跨域 /** * 跨域配置 * @author Louis * @date Jan 12, 2019 */ @Configura ...

  8. 即构SDK9月迭代:外部采集、音频频谱、房间附加消息等多个模块功能上新

    即构SDK9月迭代来了,本月SDK在外部采集.音频频谱.房间附加消息等多个功能模块均有新功能上线,并且还针对K歌音乐场景下,优化了变调功能效果.以下是详细的迭代内容: LiveRoom   新增 1. ...

  9. 【游记】NOI 2023省选游记

    Day -N 下午去机房训练,回去的时候邱大大说 "我\(,lj,szy\) 可以去参加 NOI 2023省选".我瞬间就惊了.作为一个 \(CSP-S\) 只有 \(91pts\ ...

  10. Yunfly 一款高效、性能优异的 node.js web 框架

    介绍 Yunfly 一款高性能 Node.js WEB 框架, 使用 Typescript 构建我们的应用. 使用 Koa2 做为 HTTP 底层框架, 使用 routing-controllers ...