基于CefSharp开发(五)浏览器菜单样式
一、菜单分析

上图为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开发(五)浏览器菜单样式的更多相关文章
- 基于CefSharp开发浏览器(八)浏览器收藏夹栏
一.前言 上一篇文章 基于CefSharp开发(七)浏览器收藏夹菜单 简单实现了部分收藏夹功能 如(添加文件夹.添加收藏.删除.右键菜单部分功能) 后续代码中对MTreeViewItem进行了扩展,增 ...
- mac 下基于firebreath 开发多浏览器支持的浏览器插件
mac 下基于firebreath 开发多浏览器支持的浏览器插件 首先要区分什么是浏览器扩展和浏览器插件;插件可以像本地程序一样做的更多 一. 关于 firebreath http://www.fir ...
- 基于CefSharp开发(二)自定义浏览器窗体
上一篇 https://www.cnblogs.com/mchao/p/13914726.html 简单了解了CefSharp引用配置但页面光秃秃的,这一篇着手开发简单浏览器窗体 一.Edge浏览器窗 ...
- 基于CefSharp开发(七)浏览器收藏夹菜单
一.Edge收藏夹菜单分析 如下图所示为Edge收藏夹菜单, 点击收藏夹菜单按钮(红框部分)弹出收藏夹菜单窗体,窗体中包含工具栏(绿框部分)和树型菜单(黄框部分) 工具栏按钮功能分别为添加当前网页到根 ...
- 基于CefSharp开发(四)浏览器文件下载
一.CefSharp文件下载分析 查看ChromiumWebBrowser类发现cef数据下载处理在IDownloadHandler中进行,但并未找到相应的实现类,故我们需要自己实现DownloadH ...
- 基于CefSharp开发浏览器(九)浏览器历史记录弹窗面板
一.前言 前两篇文章写的是关于浏览器收藏夹的内容,因为收藏夹的内容不会太多,故采用json格式的文本文件作为收藏夹的存储方式. 关于浏览器历史记录,我个人每天大概会打开百来次网页甚至更多,时间越长历史 ...
- 基于CefSharp开发(三)浏览器头部优化
一.上文回顾 上编实现了简单的网页加载功能包括URL输入.打开空标签页.网页链接中新页面处理等 本编将对网页的Title绑定.前进.后退.刷新等事件处理 二.Title绑定处理 当打开网页时Title ...
- 基于CefSharp开发(六)浏览器网页缩放
一.网页缩放分析 缩放入口 1.Ctrl + 鼠标滑轮缩放 2.菜单中缩放子菜单缩放 3.搜索框中网页缩放按钮缩放 缩放属性及命令 ChromiumWebBrowser 提供了缩放量值.缩放级别.放大 ...
- 基于cefsharp的用户浏览器
技术:vc++2015 概述 用于需要制作一个浏览器 winfrom 中浏览器的插件有很多种 如:WebBrowser , Web.kit等 但用于比较稳定 功能齐全的还是cefsharp 详细 ...
随机推荐
- Java_基础(一)
注释 单行注释: // 多行注释: /*开头, */结尾, 可跨行, 可嵌入 public static void main(String[] args/* 哈哈 */) 文档注释: /** 开头, ...
- python 关键字yield
问题 Python 关键字 yield 的作用是什么?用来干什么的? 比如,我正在试图理解下面的代码: def node._get_child_candidates(self, distance, m ...
- Electron入门指北
最近几年最火的桌面化技术,无疑是Qt+和Electron. 两者都有跨平台桌面化技术,并不局限于Windows系统.前者因嵌入式而诞生,在演变过程中,逐步完善了生态以及工具链.后者则是依托于Node. ...
- Git操作:远程仓库(git remote)的添加、管理和删除
这是你的git仓库,他已经添加了一个远程仓库,可以用git remote -v查看绑定的仓库列表,他会以<仓库名> <仓库地址>的形式展示出来(一个仓库会显示两遍): $ g ...
- 为什么使用MongoDB
MongoDB vs MySQL Nosql vs RDBMS(关系型数据库) MongoDB采用类似Json的形式存储数据而不是结构性的表 MongoDB的分片机制支持海量数据的存储和扩展,并有完整 ...
- TODO_LIST
H5 blog: http://html5doctor.com/designing-a-blog-with-html5/ 绝尘单词本----H5+Web NIO+netty+RPC
- ixgbe 驱动 为xxx驱动做准备1
网卡都是pci设备,因此这里每个网卡驱动其实就是一个pci驱动.并且intel这里是把好几个万兆网卡(82599/82598/x540)的驱动做在一起的.V4L2 一样几个类型摄像头合并在一起 先说一 ...
- Mysql分区、分表、分库
1.MySQL分区 一般情况下我们创建的表对应一组存储文件,使用MyISAM存储引擎时是一个.MYI和.MYD文件,使用Innodb存储引擎时是一个.ibd和.frm(表结构)文件. 当数据量较大时( ...
- binary hacks读数笔记(ld 链接讲解 一)
首先我们先看两段代码: a.c extern int shared; int main(){ int a=100; swap(&a,&shared); } b.c int shared ...
- java 关于 a==null 和 null==a, a.equals("123") 和“123”.equals(a)
一: a==null 和 null==a 实验 所以 a==null 和 null==a 没区别 二: a.equals("123") 和"123".equal ...