一、菜单分析

上图为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. P2868 [USACO07DEC]Sightseeing Cows G

    题意描述 Sightseeing Cows G 给定一张有向图,图中每个点都有点权 \(a_i\),每条边都有边权 \(e_i\). 求图中一个环,使 "环上个点权之和" 除以 & ...

  2. 漫谈:从APP崩溃率标准,到Monkey介绍拓展Maxim,及Jenkins自动化配置,持续集成获取崩溃monkey日志

    漫谈:从APP崩溃率标准,到Monkey介绍拓展Maxim,及Jenkins自动化配置,持续集成获取崩溃日志 1.APP崩溃率标准 开发或测试app的同学,对于app崩溃肯定非常熟悉,频繁的线上崩溃属 ...

  3. Grafana+Prometheus+node_exporter监控,Grafana无法显示数据的问题

    环境搭建: 被测linux机器上部署了Grafana,Prometheus,node_exporter,并成功启动了它们. Grafana中已经创建了Prometheus数据源,并测试通过,并且导入了 ...

  4. Spring中基于XML的声明式事务控制配置步骤

    1.配置事务管理器 2.配置事务的通知 此时,我们就需要导入事务的约束 tx名称空间和约束,同时也需要aop的 使用tx:advice标签配置事务通知 属性: id:给事务通知起一个唯一标识 tran ...

  5. java实现KFC点餐系统

    这篇文章主要为大家详细介绍了java实现KFC点餐系统,模拟肯德基快餐店的收银系统,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 同学们应该都去麦当劳或肯德基吃过快餐吧?请同学们参考肯德基官网的信 ...

  6. 手撸ORM浅谈ORM框架之Query篇

    快速传送 手撸ORM浅谈ORM框架之基础篇 手撸ORM浅谈ORM框架之Add篇 手撸ORM浅谈ORM框架之Update篇 手撸ORM浅谈ORM框架之Delete篇 手撸ORM浅谈ORM框架之Query ...

  7. 【笔记】nrf52832广播使用--厂商自定义数据应用

    需求: 1)使用蓝牙不停发送ble广播,发送自定义的数据,并每一秒更新自定义数据. 2)设置不同的发射功率.广播间隔.广播名称 1.初始化 使用nordic官方sdk17版本,打开一个ble串口用例. ...

  8. 类似阿里双十一的可视化看板是怎么做的?无人机三维GIS看板也来了!

    天猫双十一数据可视化看板 每年的双十一,天猫都会在整点时刻直播战绩,惊叹于可怕战绩的同时,也会被背后展示的数据大屏吸引,这样让人眼前一亮的可视化数据看板是怎么做出来的? 所谓可视化数据看板,就是挂在墙 ...

  9. !!vue-style-loader!css-loader?

    摘自:https://blog.csdn.net/qq_27721169/article/details/88666340 问题描述*!!vue-style-loader!css-loader?{&q ...

  10. 写博客真的很枯燥,更麻烦的是我还不会MD,排版太不友好了啊。

    学习MD 第一标题 #一号标题 ##二号标题 神马啊,博客园居然不支持MD语法