浅谈Fluent Ribbon 中的SplitButton
Fluent Ribbon Control Suite 就不做介绍了,网上的例子比较多,类似Office2007及以后版本的图形界面(菜单栏)。官网地址:https://github.com/fluentribbon/Fluent.Ribbon,这里主要分享一下其中一个控件的用法。
最终实现效果:
A、类似Office的粘贴,可点击粘贴下面的小箭头图标,进行“选择性粘贴”等等;

B、类似Office的边框工具条,可进行不同工具条的切换。

由于网上大部分介绍Fluent Ribbon的主要为各种界面层次的关系,具体的控件介绍较少。后来,官网上下了相关例子,学习了下。实现A的效果直接用自带的控件SplitButton即可;而实现B的效果,一直没找到合适的。其实在SplitButton基础上稍微进行扩展即可。
SplitButton顾名思义就是分割按钮,我理解为“按钮+其子按钮”。本身是个父控件,可以包含子(MenuItem)。下面分两块介绍A和B的实现,重点是B。
一、A效果的实现
直接贴官方的例子代码:SplitButton和MenuItem都有Click事件,这里不再一一说明。
WPF界面代码:
<Fluent:SplitButton Name="buttonRed" Header="Red" Icon="Images\Red.png" LargeIcon="Images\RedLarge.png" SizeDefinition="Large" Click="buttonRed_Click_1">
<Fluent:MenuItem Header="Pink" Icon="Images\Pink.png"> </Fluent:MenuItem>
<Fluent:MenuItem Header="Orange" Icon="Images\Orange.png" ToolTip="Regular Tooltip" />
</Fluent:SplitButton>
二、B效果的实现
由于在实际运用中,我参与的项目直接采用配置文件配置功能菜单,所以相关代码写在框架中了。这里又单独抽离出来,进行了控件的扩展,相关代码入下:
C# 扩展控件代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Fluent; namespace Fluent.Sample.Control
{
/// <summary>
/// 分割按钮--扩展
/// 效果:实现不同工具条的切换
/// </summary>
public class SplitButtonEx : SplitButton
{
private object m_SelectedObject = null;//选择的对象 /// <summary>
/// 构造
/// </summary>
public SplitButtonEx()
{
SelectedIndex = ;//默认为第一个
m_SelectedObject = null;
this.Click -= new System.Windows.RoutedEventHandler(SplitButtonEx_Click);
this.Click += new System.Windows.RoutedEventHandler(SplitButtonEx_Click);
} /// <summary>
/// 初始化时选择的子索引
/// </summary>
public int SelectedIndex
{
set;
get;
} /// <summary>
/// 重载初始化完成
/// </summary>
public override void EndInit()
{
base.EndInit(); if ( == this.Items.Count) return; //设置当前未选中的子
if (SelectedIndex > - && this.Items.Count > SelectedIndex)
{
MenuItemEx item = this.Items[SelectedIndex] as MenuItemEx;
SetObject(item);
}
} /// <summary>
/// 设置对象
/// </summary>
/// <param name="item"></param>
public void SetObject(MenuItemEx item)
{
if (null != item.ToolTip)
this.ToolTip = item.ToolTip.ToString();
if (null != item.Header)
this.Header = item.Header.ToString();
if (null != item.Icon)
{
this.LargeIcon = item.Icon.ToString();
this.Icon = item.Icon.ToString();
}
m_SelectedObject = item;
} /// <summary>
/// 单击事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void SplitButtonEx_Click(object sender, System.Windows.RoutedEventArgs e)
{
if ( == this.Items.Count) return;
if (null == m_SelectedObject) return; (m_SelectedObject as MenuItemEx).TriggerClickEvent();
}
} /// <summary>
/// MenuItem--扩展
/// 用途:用于支持分割按钮的扩展
/// </summary>
public class MenuItemEx : MenuItem
{
/// <summary>
/// 构造
/// </summary>
public MenuItemEx()
{ } /// <summary>
/// 触发Click事件
/// </summary>
public void TriggerClickEvent()
{
base.OnClick();
} /// <summary>
/// 单击事件
/// </summary>
protected override void OnClick()
{
base.OnClick();
if (null != Parent && Parent is SplitButtonEx)//修改父
{
(Parent as SplitButtonEx).SetObject(this);
}
}
}
}
WPF界面代码:
<My:SplitButtonEx x:Name="buttonRed" SelectedIndex="1" Header="Red" Icon="Images\Red.png" LargeIcon="Images\RedLarge.png" SizeDefinition="Large">
<My:MenuItemEx Header="Pink" Icon="Images\Pink.png" Click="MenuItemEx_Click">
</My:MenuItemEx>
<My:MenuItemEx Header="Orange" Icon="Images\Orange.png" ToolTip="Regular Tooltip" Click="MenuItemEx_Click_1"/>
</My:SplitButtonEx>
备注:最后再提一点,SplitButton有个属性"SizeDefinition",这个比较有用,不过该属性值不是枚举类型,而是字符串类型。可以为”Large、Middle、Small"三个中的任一个,为Small时和上面的效果B差不多,即不带任何文字,只有图标。Word中的“粘贴”,设置的是“Large"。
浅谈Fluent Ribbon 中的SplitButton的更多相关文章
- 转: 浅谈C/C++中的指针和数组(二)
转自:http://www.cnblogs.com/dolphin0520/archive/2011/11/09/2242419.html 浅谈C/C++中的指针和数组(二) 前面已经讨论了指针和数组 ...
- 转:浅谈C/C++中的指针和数组(一)
再次读的时候实践了一下代码,结果和原文不一致 error C2372: 'p' : redefinition; different types of indirection 不同类型的间接寻址 /// ...
- 转载 浅谈C/C++中的static和extern关键字
浅谈C/C++中的static和extern关键字 2011-04-21 16:57 海子 博客园 字号:T | T static是C++中常用的修饰符,它被用来控制变量的存贮方式和可见性.ext ...
- 浅谈C语言中的强符号、弱符号、强引用和弱引用
摘自http://www.jb51.net/article/56924.htm 浅谈C语言中的强符号.弱符号.强引用和弱引用 投稿:hebedich 字体:[增加 减小] 类型:转载 时间:2014- ...
- 【sql注入】浅谈sql注入中的Post注入
[sql注入]浅谈sql注入中的Post注入 本文来源:i春秋学院 00x01在许多交流群中,我看见很多朋友对于post注入很是迷茫,曾几何,我也是这样,因为我们都被复杂化了,想的太辅助了所以导致现在 ...
- 浅谈关于QT中Webkit内核浏览器
关于QT中Webkit内核浏览器是本文要介绍的内容,主要是来学习QT中webkit中浏览器的使用.提起WebKit,大家自然而然地想到浏览器.作为浏览器内部的主要构件,WebKit的主要工作是渲染.给 ...
- 浅谈JAVA GUI中,AWT与Swing的区别、联系及优缺点
浅谈JAVA GUI中,AWT与Swing的区别.联系及优缺点 A.区别 1.发布的时间 AWT是在JDK 1.0版本时提出的 Swing是在AWT之后提出的(JAVA 2) 2. ”重量” AWT是 ...
- 浅谈 Swift 2 中的 Objective-C 指针
浅谈 Swift 2 中的 Objective-C 指针 2015-09-07 499 文章目录 1. 在 Swift 中读 C 指针 2. 在 Swift 中创建 C 指针 3. 总结 作者:Ja ...
- c#Winform程序调用app.config文件配置数据库连接字符串 SQL Server文章目录 浅谈SQL Server中统计对于查询的影响 有关索引的DMV SQL Server中的执行引擎入门 【译】表变量和临时表的比较 对于表列数据类型选择的一点思考 SQL Server复制入门(一)----复制简介 操作系统中的进程与线程
c#Winform程序调用app.config文件配置数据库连接字符串 你新建winform项目的时候,会有一个app.config的配置文件,写在里面的<connectionStrings n ...
随机推荐
- SSM实现图片上传管理操作
Spring MVC 实现文件上传 时序图 利用 Spring MVC 实现文件上传功能,离不开对 MultipartResolver 的设置.MultipartResolver 这个类,你可以将其视 ...
- Microsoft ReportViewer 控件类型版本兼容问题及解决方法
错误 Parser Error Message: The base class includes the field 'rvEquipment', but its type (Microsoft.Re ...
- BZOJ4513: [Sdoi2016]储能表(数位dp)
题意 题目链接 Sol 一点思路都没有,只会暴力,没想到标算是数位dp??Orz 首先答案可以分成两部分来统计 设 \[ f_{i,j}= \begin{aligned} i\oplus j & ...
- 【python基础】之str类字符串
str类字符串是不可变对象 1.创建字符串 s1 = str() #创建一个空字符串 s2 = str("hello") #创建字符串"hello" 2.处理字 ...
- Lambda多表联合
var query = database.Posts // your starting point - table in the "from" statement .Join(da ...
- 浏览器缓存(Web Cache/ Http Cache)
浏览器缓存(Web Cache/ Http Cache)是前端性能优化中很重要的组成部分. 缓存策略 浏览器的缓存策略是: 1.如果本地没有缓存,则发送非条件性请求. 2.如果本地有缓存,则判断本地缓 ...
- Week2——XML
一.什么是XML? XML是可扩展标记性语言,类似于HTML,被设计为传输和存储数据,其焦点是数据的内容.XML的标签没有被预定义,用户就需要自行定义标签,也可随意定义标签.XML 允许创作者定义自己 ...
- CentOS6.5 SSH无法连接
1.确认连接交机机端口的正常,如查更换多几个端口试 2.确认网络不存在问题. 3.把selinux iptables服务全部关闭 4.查看本机是否侦听22端口和是否开启ssh服务 命令:netstat ...
- spring boot(5)-properties参数配置
application.properties application.properties是spring boot默认的配置文件,spring boot默认会在以下两个路径搜索并加载这个文件 s ...
- springboot监控
springboot版本 <parent> <groupId>org.springframework.boot</groupId> <artifactId&g ...