zoukankan      html  css  js  c++  java
  • 浅谈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="ImagesRed.png" LargeIcon="ImagesRedLarge.png" SizeDefinition="Large" Click="buttonRed_Click_1">
              <Fluent:MenuItem Header="Pink" Icon="ImagesPink.png"> </Fluent:MenuItem>
              <Fluent:MenuItem Header="Orange" Icon="ImagesOrange.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 = 0;//默认为第一个
                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 (0 == this.Items.Count) return;
    
                //设置当前未选中的子
                if (SelectedIndex > -1 && 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 (0 == 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="ImagesRed.png" LargeIcon="ImagesRedLarge.png" SizeDefinition="Large">
        <My:MenuItemEx Header="Pink" Icon="ImagesPink.png" Click="MenuItemEx_Click">
        </My:MenuItemEx>
        <My:MenuItemEx Header="Orange" Icon="ImagesOrange.png" ToolTip="Regular Tooltip"  Click="MenuItemEx_Click_1"/>
    </My:SplitButtonEx>

     备注:最后再提一点,SplitButton有个属性"SizeDefinition",这个比较有用,不过该属性值不是枚举类型,而是字符串类型。可以为”Large、Middle、Small"三个中的任一个,为Small时和上面的效果B差不多,即不带任何文字,只有图标。Word中的“粘贴”,设置的是“Large"。

  • 相关阅读:
    hdu 4614 线段树 二分
    cf 1066d 思维 二分
    lca 最大生成树 逆向思维 2018 徐州赛区网络预赛j
    rmq学习
    hdu 5692 dfs序 线段树
    dfs序介绍
    poj 3321 dfs序 树状数组 前向星
    cf 1060d 思维贪心
    【PAT甲级】1126 Eulerian Path (25分)
    【PAT甲级】1125 Chain the Ropes (25分)
  • 原文地址:https://www.cnblogs.com/xiaojian1987/p/4533317.html
Copyright © 2011-2022 走看看