首页 > 其他分享 >CefSharp自定义滚动条样式

CefSharp自定义滚动条样式

时间:2023-10-07 20:26:31浏览次数:39  
标签:CefSharp 自定义 样式 style 滚动条 sb CSS

在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样式。
image

标签:CefSharp,自定义,样式,style,滚动条,sb,CSS
From: https://www.cnblogs.com/czwy/p/17747351.html

相关文章

  • Go 复合数据类型之结构体与自定义类型
    Go复合数据类型之结构体与自定义类型目录Go复合数据类型之结构体与自定义类型一、类型别名和自定义类型1.1类型定义(TypeDefinition)简单示例1.2类型别名简单示例1.3类型定义和类型别名的区别二、结构体2.1结构体介绍2.2结构体的定义2.3定义一个空结构体2.3.1空结构体介......
  • HTML一键打包工具1.9.92更新发布, 支持串口通信,获取mac地址,自定义header等新功能
    HTML一键打包EXE工具(HTML封装EXE,桌件)是一款神奇的工具,它可以让您把任何HTML项目(网址)变成一个独立的EXE文件,无需安装浏览器和服务器,只要双击就能运行。无论您是想制作KRPano全景VR项目,还是想开发WebGL游戏项目(Egret游戏打包,Cocos游戏打包,RPGMVMaker游戏打包),或者是想创建......
  • vue2自定义指令实现el-dropdown下拉菜单项最小宽度等于内容宽度
    //在main.js添加Vue.directive('siem-dropdown',function(el,binding,vNode){letul=el.querySelector("ul")letuid=vNode.componentInstance._uid;//获取下拉菜单实例的uidletsiemDropdownClass=`siem-dropdown-${uid}`;ul.cla......
  • openstack自定义ubuntu、centos镜像
     #镜像制作官网参考文档https://docs.openstack.org/image-guide/#这里仅演示centos镜像制作,ubuntu配置一样。也可以参考官方文档制作。#cloud-init:#cloud-init是linux的一个工具,需要在制作镜像时安装。当系统启动时,cloud-init可从novametadata服务或......
  • Vue3 Div 与 v-for 的配合应用,超出自动带滚动条
    效果图 代码<li><ahref="javascript:;"class="IndReaflexCHuans"><i></i><p>当前会议[0]</p></a><divstyle="height:80%;overflow:auto;"><divv-for="......
  • Css实现浏览滚动条效果
    Css实现浏览滚动条效果前言也是有大半个月没有更新文章了,大部分时间都在玩,然后就是入职的事。今天就更新一个小知识,刷抖音的时候看到的,感觉还不错。属性介绍关键属性animation-timeline:动画名称;用于控制动画的时间轴。它可以让你在一个元素上同时播放多个动画,控制它们的开......
  • idea自定义设置背景图片
      这样就设置完成了......
  • Minecraft个人服务器搭建自己的皮肤站并实现外置登录更换自定义皮肤组件
    Minecraft个人服务器搭建自己的皮肤站并实现外置登录更换自定义皮肤组件大家好,我是艾西有不少小伙伴非常喜欢我的世界Minecraft游戏,今天小编跟大家分享下Minecraft个人服务器怎么设置皮肤站。Minecraft皮肤站是什么?其实官网就有皮肤站,在正版用户选择正版的登录后,MC客户端就会到官方......
  • 自定义注解实现AOP
    自定义注解AOPpackagecom.log;importorg.aspectj.lang.JoinPoint;importorg.aspectj.lang.annotation.Aspect;importorg.aspectj.lang.annotation.Before;importorg.aspectj.lang.annotation.Pointcut;importorg.aspectj.lang.reflect.MethodSignature;importorg.s......
  • 自定义表单设计之六-行字段计算配置
    AddFormRowCal.aspx<htmlxmlns="http://www.w3.org/1999/xhtml"><headrunat="server"><title>行字段规则</title><scriptlanguage="javascript">functionsaveRole(){rowcalfrm......