一、菜单分析

上图为Edge浏览器现有的菜单内容,菜单中即有子菜单也有组合菜单。

本章节将开发浏览器菜单样式,菜单部分功能将后期进行处理。

二、创建菜单用户控件

新建用户控件命名为WebMenuUc,Grid添加如下代码

 <controls:MMenu>
<controls:MMenuItem Header=". . ." Width="40" Height="30">
<controls:MMenuItem Header="新建标签页" Icon=""/>
<controls:MMenuItem Header="新建窗口" Icon=""/>
<controls:MMenuItem Header="新建InPrivate窗口" Icon=""/>
// to do
<controls:MMenuItem Header="收藏夹" Icon=""/>
<controls:MMenuItem Header="历史记录" Icon=""/>
<controls:MMenuItem Header="下载" Icon=""/>
<controls:MMenuItem Header="应用" Icon="" PopupWidth="160">
<controls:MMenuItem Header="管理应用" Icon=""/>
</controls:MMenuItem>
<controls:MMenuItem Header="扩展" Icon=""/>
<controls:MMenuItem Header="集锦" Icon=""/>
<controls:MMenuItem Header="打印" Icon=""/>
<controls:MMenuItem Header="共享" Icon=""/>
<controls:MMenuItem Header="在页面上查找" Icon=""/>
<controls:MMenuItem Header="大声朗读" Icon=""/>
<controls:MMenuItem Header="更多工具" >
<controls:MMenuItem Header="更多工具1" />
<controls:MMenuItem Header="更多工具2" />
<controls:MMenuItem Header="更多工具3" />
</controls:MMenuItem>
<controls:MMenuItem Header="设置" Icon=""/>
<controls:MMenuItem Header="帮助和反馈" Icon=""/>
<controls:MMenuItem Header="关闭 浏览器"/>
</controls:MMenuItem>
</controls:MMenu>

其中MMenu及MMenuItem均为CustomControl,分别重写了Menu和MenuItem,

关于Menu CustomControl 基本样式可参考 Cys_Control(五) MMenu

对Cys_Control 中MMenu 部分样式及配色进行了调整,使其接近于Edge Menu。如下

其中图标使用阿里Iconfont,此时还缺少缩放部分

三、增加缩放子菜单

在新建InPrivate窗口 菜单下增加缩放部分

<controls:MMenuItem Header="新建InPrivate窗口" Icon=""/>
<Grid Height="30">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<Border Grid.Column="0" >
<TextBlock Text="缩放" HorizontalAlignment="Center" VerticalAlignment="Center"/>
</Border>
<Border Grid.Column="1" BorderThickness="1,0" BorderBrush="{DynamicResource WebBrowserBrushes.WebMenuDivisionBorderBrush}">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<Button Grid.Column="0" Content="" Style="{DynamicResource Button.FontButton}" />
<TextBlock Grid.Column="1" Text="100%" Margin="9,0" VerticalAlignment="Center"/>
<Button Grid.Column="2" Content="" Style="{DynamicResource Button.FontButton}"/>
</Grid>
</Border>
<Button Grid.Column="2" Content="" Style="{DynamicResource Button.FontButton}"/>
</Grid>
<controls:MMenuItem Header="收藏夹" Icon=""/>

此时虽然菜单已添加,但鼠标停留时的蓝色背景无法去掉

暂未找到合适处理方式,故考虑扩展Role属性

四、扩展Role属性创建模板

Role有四个枚举值即 TopLevelHeader、TopLevelItem、SubmenuHeader、SubmenuItem 分别对应四种样式

可以将缩放部分视为第五种样式,增加枚举 MenuItemRoleEx 这里为了方便使枚举值与 MenuItemRole 枚举值命名相近,结尾增加Ex,并多加一个None作为默认属性值

public enum MenuItemRoleEx
{
//
// Summary:
// Top-level menu item that can invoke commands.
TopLevelItemEx = 0,
//
// Summary:
// Header for top-level menus.
TopLevelHeaderEx = 1,
//
// Summary:
// Menu item in a submenu that can invoke commands.
SubmenuItemEx = 2,
//
// Summary:
// Header for a submenu.
SubmenuHeaderEx = 3,

  None = 4,
}

为MMenuItem类文件中增加依赖属性 RoleEx

public static readonly DependencyProperty RoleExProperty = DependencyProperty.Register("RoleEx", typeof(MenuItemRoleEx), typeof(MMenuItem),
new PropertyMetadata(MenuItemRoleEx.None)); /// <summary>
/// RoleEx
/// </summary>
public MenuItemRoleEx RoleEx
{
get => (MenuItemRoleEx)GetValue(RoleExProperty);
set => SetValue(RoleExProperty, value);
}

在MMenuItem样式文件中增加 扩展模板如下

<ControlTemplate xmlns:markup="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:Cys_CustomControls.Controls"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
x:Key="MSubmenuItemExpandTemplate" TargetType="{markup:Type local:MMenuItem}">
<Border x:Name="templateRoot" Background="{TemplateBinding Background}" BorderThickness="{TemplateBinding BorderThickness}" BorderBrush="{TemplateBinding BorderBrush}" Height="35" SnapsToDevicePixels="true">
<Grid Height="30">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<Border Grid.Column="0" >
<TextBlock Text="缩放" HorizontalAlignment="Center" VerticalAlignment="Center"/>
</Border>
<Border Grid.Column="1" BorderThickness="1,0" BorderBrush="{TemplateBinding BorderBrush}">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<Button Grid.Column="0" Content="" Style="{DynamicResource Button.FontButton}" />
<TextBlock Grid.Column="1" Text="100%" Margin="9,0" VerticalAlignment="Center"/>
<Button Grid.Column="2" Content="" Style="{DynamicResource Button.FontButton}"/>
</Grid>
</Border>
<Button Grid.Column="2" Content="" Style="{DynamicResource Button.FontButton}"/>
</Grid>
</Border>
</ControlTemplate>

并为MMenuItem默认样式增加多条件触发器,即当Role为 SubmenuItem并RoleEx为 SubmenuItemEx时使用扩展模板

<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="Role" Value="SubmenuItem"/>
<Condition Property="RoleEx" Value="SubmenuItemEx"/>
</MultiTrigger.Conditions>
<Setter Property="Template" Value="{StaticResource MSubmenuItemExpandTemplate}"/>
<Setter Property="BorderThickness" Value="0,1,0,1"/>
<Setter Property="BorderBrush" Value="{DynamicResource WebBrowserBrushes.WebMenuDivisionBorderBrush}"/>
</MultiTrigger>

此时运行看菜单效果,鼠标滑过时无蓝色背景

一、CefSharp文件下载分析

七、源码地址

gitee地址:https://gitee.com/sirius_machao/mweb-browser

基于CefSharp开发(五)浏览器菜单样式的更多相关文章

  1. 基于CefSharp开发浏览器(八)浏览器收藏夹栏

    一.前言 上一篇文章 基于CefSharp开发(七)浏览器收藏夹菜单 简单实现了部分收藏夹功能 如(添加文件夹.添加收藏.删除.右键菜单部分功能) 后续代码中对MTreeViewItem进行了扩展,增 ...

  2. mac 下基于firebreath 开发多浏览器支持的浏览器插件

    mac 下基于firebreath 开发多浏览器支持的浏览器插件 首先要区分什么是浏览器扩展和浏览器插件;插件可以像本地程序一样做的更多 一. 关于 firebreath http://www.fir ...

  3. 基于CefSharp开发(二)自定义浏览器窗体

    上一篇 https://www.cnblogs.com/mchao/p/13914726.html 简单了解了CefSharp引用配置但页面光秃秃的,这一篇着手开发简单浏览器窗体 一.Edge浏览器窗 ...

  4. 基于CefSharp开发(七)浏览器收藏夹菜单

    一.Edge收藏夹菜单分析 如下图所示为Edge收藏夹菜单, 点击收藏夹菜单按钮(红框部分)弹出收藏夹菜单窗体,窗体中包含工具栏(绿框部分)和树型菜单(黄框部分) 工具栏按钮功能分别为添加当前网页到根 ...

  5. 基于CefSharp开发(四)浏览器文件下载

    一.CefSharp文件下载分析 查看ChromiumWebBrowser类发现cef数据下载处理在IDownloadHandler中进行,但并未找到相应的实现类,故我们需要自己实现DownloadH ...

  6. 基于CefSharp开发浏览器(九)浏览器历史记录弹窗面板

    一.前言 前两篇文章写的是关于浏览器收藏夹的内容,因为收藏夹的内容不会太多,故采用json格式的文本文件作为收藏夹的存储方式. 关于浏览器历史记录,我个人每天大概会打开百来次网页甚至更多,时间越长历史 ...

  7. 基于CefSharp开发(三)浏览器头部优化

    一.上文回顾 上编实现了简单的网页加载功能包括URL输入.打开空标签页.网页链接中新页面处理等 本编将对网页的Title绑定.前进.后退.刷新等事件处理 二.Title绑定处理 当打开网页时Title ...

  8. 基于CefSharp开发(六)浏览器网页缩放

    一.网页缩放分析 缩放入口 1.Ctrl + 鼠标滑轮缩放 2.菜单中缩放子菜单缩放 3.搜索框中网页缩放按钮缩放 缩放属性及命令 ChromiumWebBrowser 提供了缩放量值.缩放级别.放大 ...

  9. 基于cefsharp的用户浏览器

    技术:vc++2015   概述 用于需要制作一个浏览器 winfrom 中浏览器的插件有很多种 如:WebBrowser , Web.kit等 但用于比较稳定 功能齐全的还是cefsharp 详细 ...

随机推荐

  1. Azure Data Factory(三)集成 Azure Devops 实现CI/CD

    一,引言 由于上一节文章内容过长,无法分享Azure Data Factory 的持续集成,持续发布.今天将着重介绍一下在使用 Azure DevOps Pipeline 发布,自动进行持续集成,并且 ...

  2. P2346 四子连棋

    P2346 四子连棋 迭代加深++ 题意描述 在一个4*4的棋盘上摆放了14颗棋子,其中有7颗白色棋子,7颗黑色棋子,有两个空白地带,任何一颗黑白棋子都可以向上下左右四个方向移动到相邻的空格,这叫行棋 ...

  3. Dapr实现分布式有状态服务的细节

    Dapr是为云上环境设计的跨语言, 事件驱动, 可以便捷的构建微服务的系统. balabala一堆, 有兴趣的小伙伴可以去了解一下. Dapr提供有状态和无状态的微服务. 大部分人都是做无状态服务(微 ...

  4. iptables从入门到掌握

    防火墙简述 防火墙(firewall)一词本是建筑用于,本意是为了保护建筑物不受火灾侵害的.被借鉴到了在网络通信领域中,表示保护局域网或主机不受网络攻击的侵害. 防火墙: 工作在主机或者网络边缘,对于 ...

  5. Spring 自调用事务失效,你是怎么解决的?

    前言 相信大家都遇到一种事务失效场景,那就是 Spring 自调用,就是在 Service 方法内,调用另一个加 @Transactional 注解的方法,发现事务失效,这时候你是怎么解决的呢? 公众 ...

  6. .Net5,C#9 新语法(逻辑和属性模式,记录)

    代码: namespace ConsoleApp1{ class Program { static void Main(string[] args) { //创建list数组,=号右边可省略 List ...

  7. JavaScript全局变量与局部变量

    JavaScript中存储数据值的容器称为变量.根据变量作用域可将变量分为全局变量和局部变量. 全局变量(Global Variable) 拥有全局作用域,在JavaScript代码中任何地方都有定义 ...

  8. MFC的大致讲解

    现在使用MFC框架的人越来越少了,现在大家都在用QT框架来写,对应初学者就我感觉来说,MFC真的是一个很好的框架,现在在工业方面使用的几乎都是MFC,所以以后就业想要往工业方面找C++工作,可以好好看 ...

  9. tp6.0.x 反序列化漏洞

    tp6 反序列化漏洞复现 环境 tp6.0 apache php7.3 漏洞分析 反序列化漏洞需要存在 unserialize() 作为触发条件,修改入口文件 app/controller/Index ...

  10. Linux 笔记2

    1.linux的usr目录相当于windows下Program Files目录,存放的应用程序2.在centos 6.4按ctrl+alt+F2切换到命令行,ctr+alt+F8切换到图像界面,ctr ...