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的更多相关文章

  1. 转: 浅谈C/C++中的指针和数组(二)

    转自:http://www.cnblogs.com/dolphin0520/archive/2011/11/09/2242419.html 浅谈C/C++中的指针和数组(二) 前面已经讨论了指针和数组 ...

  2. 转:浅谈C/C++中的指针和数组(一)

    再次读的时候实践了一下代码,结果和原文不一致 error C2372: 'p' : redefinition; different types of indirection 不同类型的间接寻址 /// ...

  3. 转载 浅谈C/C++中的static和extern关键字

    浅谈C/C++中的static和extern关键字 2011-04-21 16:57 海子 博客园 字号:T | T   static是C++中常用的修饰符,它被用来控制变量的存贮方式和可见性.ext ...

  4. 浅谈C语言中的强符号、弱符号、强引用和弱引用

    摘自http://www.jb51.net/article/56924.htm 浅谈C语言中的强符号.弱符号.强引用和弱引用 投稿:hebedich 字体:[增加 减小] 类型:转载 时间:2014- ...

  5. 【sql注入】浅谈sql注入中的Post注入

    [sql注入]浅谈sql注入中的Post注入 本文来源:i春秋学院 00x01在许多交流群中,我看见很多朋友对于post注入很是迷茫,曾几何,我也是这样,因为我们都被复杂化了,想的太辅助了所以导致现在 ...

  6. 浅谈关于QT中Webkit内核浏览器

    关于QT中Webkit内核浏览器是本文要介绍的内容,主要是来学习QT中webkit中浏览器的使用.提起WebKit,大家自然而然地想到浏览器.作为浏览器内部的主要构件,WebKit的主要工作是渲染.给 ...

  7. 浅谈JAVA GUI中,AWT与Swing的区别、联系及优缺点

    浅谈JAVA GUI中,AWT与Swing的区别.联系及优缺点 A.区别 1.发布的时间 AWT是在JDK 1.0版本时提出的 Swing是在AWT之后提出的(JAVA 2) 2. ”重量” AWT是 ...

  8. 浅谈 Swift 2 中的 Objective-C 指针

    浅谈 Swift 2 中的 Objective-C 指针 2015-09-07  499 文章目录 1. 在 Swift 中读 C 指针 2. 在 Swift 中创建 C 指针 3. 总结 作者:Ja ...

  9. c#Winform程序调用app.config文件配置数据库连接字符串 SQL Server文章目录 浅谈SQL Server中统计对于查询的影响 有关索引的DMV SQL Server中的执行引擎入门 【译】表变量和临时表的比较 对于表列数据类型选择的一点思考 SQL Server复制入门(一)----复制简介 操作系统中的进程与线程

    c#Winform程序调用app.config文件配置数据库连接字符串 你新建winform项目的时候,会有一个app.config的配置文件,写在里面的<connectionStrings n ...

随机推荐

  1. kinect 深度图像去噪算法

    算法设计思路 (1)读取16位深度图像到待处理图像帧组: (2)ROI区域计算 由于kinect 彩色摄像头和红外深度摄像头是存在视角偏差的,经过视角对齐后,得到的深度图像是有黑边的.此处通过取帧组第 ...

  2. 撩课-Web大前端每天5道面试题-Day10

    1. px和em的区别? px和em都是长度单位; 区别是: px的值是固定的,指定是多少就是多少, 计算比较容易. em得值不是固定的,并且em会继承父级元素的字体大小. 浏览器的默认字体高都是16 ...

  3. OpenStack IceHouse 部署 - 3 - 控制节点部署

    Mysql部署配置  安装 安装mysql,mysql的python绑定 apt-get install mysql-server 安装过程中会要求设定mysql的root账户的密码,这里假定设为my ...

  4. [翻译]Review——How JavaScript works:The building blocks of Web Workers

    原文地址:https://blog.sessionstack.com/how-javascript-works-the-building-blocks-of-web-workers-5-cases-w ...

  5. luogu P3065 first——trie树相关

    题目描述 Bessie has been playing with strings again. She found that by changing the order of the alphabe ...

  6. (C#) 多线程访问int, bool 等值类型变量

    参考: https://stackoverflow.com/questions/154551/volatile-vs-interlocked-vs-lock/154803

  7. Python Basics

    廖雪峰老师博客 1. 可变参数(例如 *nums),允许传入一个list 或 tuple,但是 关键字参数(例如 **kv),允许传入一个dict,具体可参考此页: 2. set与dict类似,但只是 ...

  8. Android Weekly Notes Issue #244

    Android Weekly Issue #244 February 12th, 2017 Android Weekly Issue #244 本期内容包括: Android Fragments使用教 ...

  9. android端的ormlite框架

    安卓端有很多优秀的数据库框架来操作sqlite,如ormlite框架,这个框架可以用来实现表到对象的解析和转化. 使用: 首先去官网下载两个jar包,core和android(如果在安卓端开发的话), ...

  10. CPU硬件辅助虚拟化技术

    目前主要有Intel的VT-x和AMD的AMD-V这两种技术.其核心思想都是通过引入新的指令和运行模式,使VMM和Guest OS分别运行在不同模式(ROOT模式和非ROOT模式)下,且Guest O ...