WPF C# 功能区控件库






4.91/5 (87投票s)
一个用于实现 Office 2007 风格 Ribbon 界面的 WPF / C# 库
版本 1.0.0.10
源代码和已编译的二进制文件- 下载 ribboncontrol_demo - 1.05 MB
- 下载 ribboncontrol_src - 358.37 KB
- 在线演示:http://www.derek-bartram.co.uk/index.cfm?PageID=ribbonControlDemo
- 大型离线演示:http://www.derek-bartram.co.uk/CIRIP/CIRIP_demo.zip
在下载任何文件之前,请参阅简介以获取重要信息。
引言
重要信息:本文描述的代码和示例目前处于 BETA 阶段,因此可能低于商业或其他质量标准。建议此代码不用于时间紧迫的项目,并且代码修改应保持在最低限度,以减少更新包含的源代码和二进制文件时的工作量。目前请仅将此代码用于小型项目,并留意即将推出的更新。此代码可以运行,但尚未添加所有功能,例如某些事件处理程序和其他“预期”功能。欢迎通过电子邮件或其他方式联系我,报告错误和提出功能请求。谢谢。
本文介绍了一个用于生成 Microsoft Office 2007 风格 Ribbon 界面的库;虽然包含的源代码和二进制文件处于 BETA 版本,但应该可以实现最复杂的 Ribbon 风格界面(尽管需要进行少量修改)。目前,该库不支持通过 WPF XAML 代码创建 Ribbon 控件,而是需要通过 C# 后台代码创建 Ribbon 栏。
重要信息:要使用此代码,您必须同意 Microsoft 制定的许可协议和指导方针。虽然 Office UI 指导方针目前没有法律强制要求,但作为库的所有者和创建者,我正在强制遵守这些指导方针,您必须遵守。这些指导方针的一部分包括您必须拥有当前不属于此库的其他组件的要求;我绝不暗示此库足以获得 Microsoft Office UI 许可。确保您拥有这些其他组件是您的责任。通过下载源代码或使用源代码,您已同意下载并遵守 Microsoft 要求的指导方针。
请注意,许多屏幕截图相当老旧,我将在某个阶段努力更新它们,但请尝试演示,因为它将为您提供最新的外观和感受。请注意,它们将针对库的 1.0.0.11 版本进行更新。
背景
“Ribbon 是一种图形用户界面小部件,由窗口顶部的一条带状区域组成,它将程序可以执行的所有功能集中在一个地方,并根据数据的上下文显示附加的 Ribbon。
使用 Ribbon 的主要驱动思想之一是提高可用性;通过将程序的功能和命令整合到一个易于识别的地方,用户无需在多个层次的层级菜单、工具栏或任务窗格中查找正确的命令。
最近,Ribbon 已在 Microsoft Office 2007 中实现,Microsoft 将其称为 Office Fluent Ribbon[1],并取代了菜单、工具栏和许多任务窗格。Microsoft 声称这将把所有相关功能整合到一个地方,从而提高可用性。
Ribbon 是一个窗格,其中包含组织成一组选项卡(每个选项卡包含一组相关命令)的控件(例如按钮和图标)。每个应用程序都有一组不同的选项卡,用于公开该应用程序提供的功能。
例如,Excel 有一个用于处理公式的选项卡,而 Word 有一个用于创建信封和邮件的选项卡。在每个选项卡中,相关命令被分组在一起。Ribbon 的设计旨在使应用程序的功能更易于发现和访问,与 Office 2007 之前所有版本使用的基于菜单的 UI 相比,所需鼠标点击次数更少。
某些选项卡,称为上下文选项卡,仅在选择对象时出现。上下文选项卡公开仅特定于具有焦点的对象的功能。例如,选择图片会显示图片工具上下文选项卡,其中包含处理图片的命令。类似地,聚焦表格会在特定选项卡中显示与表格相关的选项。当未选择对象时,上下文选项卡保持隐藏。”——维基百科Ribbon(计算)
“ScreenTips 有助于弥合用户界面和帮助系统之间的鸿沟。当鼠标指针悬停在 2007 Microsoft Office UI 中的控件上时,ScreenTips 会出现。ScreenTips 显示控件的名称、控件的键盘快捷方式以及控件的简要说明。
2007 Microsoft Office UI 中的某些 ScreenTips 还提供 F1 支持,该支持会打开 Microsoft Office 帮助并将用户直接带到按下 F1 按钮时显示 ScreenTip 的控件的相关帮助主题。”——Microsoft
使用代码(手动方法,推荐)
本文介绍的 Ribbon 控件目前通过后台代码实现,无法通过 WPF 在 XAML 代码中创建;这将在后续版本中改变。然而,创建 Ribbon 样式控件的代码相对简单,对于一个能力适中的 C# 程序员来说,不应该造成任何真正的困难。如果有疑问,请查看下面的示例代码。
以下代码示例假设 RibbonControl.dll 已链接,并且每个引用 Ribbon 控件的源文件都通过以下方式包含该包;
using DNBSoft.WPF.RibbonControl;
Ribbon 控件链接要求(推荐用于离线使用)
从库的 1.0.0.5 版本开始,引入了 RibbonWindow
,它继承了标准 Window
类,极大地简化了链接过程(实际上使其变得微不足道,因为它现在是自动完成的)。与其将 Office UI 的各个组件链接到新的 Window
,不如将 Office UI 要求实现在一个 Window
中,然后可以根据需要进行自定义。
通过 .RibbonController
属性访问 Ribbon,通过 .QuickAccessToolbar
属性访问快速访问工具栏,通过 .ApplicationButton
属性访问应用程序按钮;所有这三个属性都是引用属性且只读。向 Window 添加内容通过正常的 .Content
属性进行;但请注意,Window 只能添加一个子元素,后续的子元素会覆盖现有的子元素,然而此行为可能会改变,因此预计未来版本会抛出异常。
请参阅下面的有用资源部分,以获取示例应用程序(包括所请求的演示应用程序的源代码)。
在线 Ribbon 控件链接要求(推荐用于在线使用)
从库的 1.0.0.6 版本开始,引入了 RibbonPage
,它继承了标准 Page
类,并且像 RibbonWindow
一样,允许简化 Ribbon 启用应用程序的创建。但是,该库将需要“完全信任”权限,否则在尝试运行应用程序时会收到“不受信任”错误;我将在未来几天内发布一篇关于如何完成这项几乎不可能的任务的代码项目文章!
请注意,由于 Office UI 许可问题,窗口的样式将在未来几个版本中发生变化。在线演示可在以下地址获取:http://www.derek-bartram.co.uk/index.cfm?PageID=ribbonControlDemo。演示代码将很快发布。
链接到 Ribbon 控件
RibbonController
类提供了添加和删除 RibbonBar
对象的方法,并构成了 Ribbon 控件库的中心点。.Ribbons
属性接受一个 RibbonBar
对象添加到窗口(如选择 Ribbon 的按钮所示)和 Ribbon 本身。
RibbonBar b = new RibbonBar();
rc.Children.Add(b);
RibbonControlBase
所有 Ribbon 元素的基础类,实现了 IRibbonControl(推荐作为所有自定义控件的基础类)。包含以下主要属性;
.
NormalImage
- 控件未禁用时显示的图像.
DisabledImage
- 控件禁用时显示的图像.NormalTip
- 控件未禁用时显示的屏幕提示,请参见下文.DisabledTip
- 控件禁用时显示的屏幕提示.SubMenu
- 不适用于许多控件,但对于适用的控件(例如RibbonDoubleButton
和RibbonThirdLabel
),它是在点击展开箭头且控件未禁用时显示的上下文菜单.IsDefaultQuickAccessButton
- 如果为 true,则在应用程序启动时在快速访问工具栏上显示控件(也用于重置快速访问工具栏时).IsDefaultQuickAccessMenuButton
- 如果为 true,则在快速访问工具栏配置菜单上显示.IsEnabled
- 禁用或启用控件,由于在正常/禁用图像和提示之间切换,可能会生成多个事件.IsSelected
- 选择或取消选择控件,选择时控件颜色不同,表示其已选择.ControlID
- 用于快速访问工具栏持久性的唯一GUID
.Text
- 控件上显示的文本标签;对于使用|
字符的多行控件,表示换行符
下图显示了多个处于不同 .IsEnabled
和 .IsSelected
状态的按钮;请注意,Ribbon 选项卡本身是 Ribbon 按钮的特例;
RibbonBar
RibbonBar
表示控件中的一个功能区,可以包含任意数量(包括零个)的 RibbonGroupBox
。RibbonGroupBox
可以通过 .Children.Add(RibbonGroupBox box)
和 .
Children.Remove(RibbonGroupBox
box)
分别添加或删除。RibbonGroupBox
可以通过 .Children
的 Insert 成员以任何顺序添加,如同任何 Microsoft 组件一样。
RibbonGroupBox
RibbonGroupBox
将具有相似功能的 UI 元素分组在一起,类似于 WPF 的 GroupBox
。与 RibbonBar
类似,子元素通过 .Children.Add(IRibbonFullControl element)
和 removeRibbonComponent(IRibbonFullControl element)
添加。
通常可以添加以下包含的元素;
RibbonButton
RibbonDoubleButton
RibbonPreviewBoxes
RibbonThreeRowsLayout
RibbonTwoRowsLayout
RibbonThreeButtonsGroupLayout
RibbonDoubleButton
RibbonDoubleButton
提供一个全高按钮,水平一分为二,上半部分作为普通按钮,下半部分打开一个子菜单(即上下文菜单)。RibbonDoubleButton
由三个组件组成:图像、描述性文本和上下文菜单;下面显示了 Word 粘贴按钮的示例;
#region make context menu
ContextMenu contextMenu = new ContextMenu();
MenuItem m1 = new MenuItem();
m1.Header = "_Paste";
MenuItem m2 = new MenuItem();
m2.Header = "Paste _Special";
MenuItem m3 = new MenuItem();
m3.Header = "Paste as _Hyperlink";
MenuItem m4 = new MenuItem();
m4.Header = "Recent Files";
contextMenu.Items.Add(m1);
contextMenu.Items.Add(m2);
contextMenu.Items.Add(m3);
#endregion
RibbonDoubleButton rdb = new RibbonDoubleButton();
//Set a unique identifier for Quick Access Toolbar persistance
rdb.ControlID = new Guid("{CFEACF92-062B-4a59-822A-3F6F2B1C9210}");
//Set images
rdb.NormalImage = new BitmapImage(new Uri(Environment.CurrentDirectory
+ @"\\Standard Icons\paste_from_clipboard.png", UriKind.RelativeOrAbsolute));
rdb.DisabledImage = new BitmapImage(new Uri(Environment.CurrentDirectory
+ @"\\Standard Icons\paste_from_clipboard_disabled.png", UriKind.RelativeOrAbsolute));
rdb.Text = "Paste";
rdb.IsDefaultQuickAccessButton = true;
rdb.IsDefaultQuickAccessMenuButton = true;
rdb.SubMenu = contextMenu;
rdb.KeyboardAccessCombination = new RibbonKeyboardAccessKeyCombination("V");
请注意,子菜单是标准 System.Windows.Controls.ContextMenu
,并且不会由 Ribbon 控件包自动设置样式。向 .SubMenu
属性提供 null
值会导致默认上下文菜单显示单个条目“无子菜单”。如果无意包含子菜单,则应改用 RibbonButton
。
RibbonPreviewBoxes
RibbonPreviewBoxes
允许实现诸如 Word 中“样式”组之类的功能,即包含代表状态和选择它们的各种图像的框。RibbonPreviewBox
es 可以通过 .Previews
属性添加到 RibbonPreviewBoxes
控件中。RibbonPreviewBox
包含三个重要属性;.Text
设置预览中的标签(例如上面的 NONE),.Image
设置预览的图像源,.Header
在弹出模式下设置组标题。RibbonPreviewBoxes
包含 .setSelected(RibbonPreviewBox)
方法,该方法选择输入的预览并触发其点击事件(请注意,该预览必须已经是 .Previews
的成员)。当子项数量超过可见空间时,可以使用上、下和弹出按钮(所有功能均可用)。RibbonPreviewBoxes
有两个属性,.Text
和 .Image
用于设置内容。下面显示了一个示例 RibbonPreviewBoxes
;
RibbonPreviewBoxes rpb = new RibbonPreviewBoxes();
RibbonPreviewBox prb = new RibbonPreviewBox();
prb.Image = new BitmapImage(new Uri(Environment.CurrentDirectory
+ @"\\Standard Icons\help.png", UriKind.RelativeOrAbsolute));
prb.Text = "Help";
rpb.addRibbonPreviewBox(prb);
prb = new RibbonPreviewBox();
prb.Image = new BitmapImage(new Uri(Environment.CurrentDirectory
+ @"\\Standard Icons\enter_registration_key.png", UriKind.RelativeOrAbsolute));
prb.Text = "Key";
rpb.addRibbonPreviewBox(prb);
prb = new RibbonPreviewBox();
prb.Image = new BitmapImage(new Uri(Environment.CurrentDirectory
+ @"\\Standard Icons\preview.png", UriKind.RelativeOrAbsolute));
prb.Text = "Preview";
rpb.addRibbonPreviewBox(prb);
prb = new RibbonPreviewBox();
prb.Image = new BitmapImage(new Uri(Environment.CurrentDirectory
+ @"\\Standard Icons\print.png", UriKind.RelativeOrAbsolute));
prb.Text = "Print";
rpb.addRibbonPreviewBox(prb);
prb = new RibbonPreviewBox();
prb.Image = new BitmapImage(new Uri(Environment.CurrentDirectory
+ @"\\Standard Icons\redo.png", UriKind.RelativeOrAbsolute));
prb.Text = "Redo";
rpb.addRibbonPreviewBox(prb);
RibbonThreeRowsLayout
RibbonThreeRowsLayout
提供了一个布局管理器,用于以标准 Ribbon 高度和间距提供三行组件。通常,此控件通过 .addRibbonComponent(RibbonThreeRowsLayout.Position position, UIElement element)
方法填充 RibbonThirdLabel
s,其中 position 指的是添加组件的行。请注意,每行可以添加任意数量的组件,但所有行将采用最宽行的宽度。根据使用此控件的经验,建议每行只添加一个子项。
RibbonThirdLabel
是一个复杂的标签,允许添加图像、文本和子菜单(按此顺序),分别通过 .Image
、.Text
和 .SubMenu
属性。请注意,与 RibbonDoubleButton.SubMenu
类似,RibbonThirdLabel.SubMenu
不会自动将子菜单样式应用于 Ribbon,但与 RibbonDoubleButton.SubMenu
不同的是,它不会因 null 值而导致默认菜单,而是从标签中删除下拉图形。下面显示了完整的 RibbonThreeRowsLayout
和三个结构不同的 RibbonThirdLabel
的示例;RibbonThreeRowsLayout trl = new RibbonThreeRowsLayout();
RibbonThirdLabel rtl = new RibbonThirdLabel();
rtl.Image = new BitmapImage(new Uri(Environment.CurrentDirectory
+ @"\\Standard Icons\paste_from_clipboard.png", UriKind.RelativeOrAbsolute));
trl.addRibbonComponent(RibbonThreeRowsLayout.Position.top, rtl);
rtl = new RibbonThirdLabel();
rtl.Image = new BitmapImage(new Uri(Environment.CurrentDirectory
+ @"\\Standard Icons\paste_from_clipboard.png", UriKind.RelativeOrAbsolute));
rtl.Text = "Try this";
trl.addRibbonComponent(RibbonThreeRowsLayout.Position.middle, rtl);
#region context menu label
rtl = new RibbonThirdLabel();
rtl.Image = new BitmapImage(new Uri(Environment.CurrentDirectory
+ @"\\Standard Icons\paste_from_clipboard.png", UriKind.RelativeOrAbsolute));
rtl.Text = "Try this";
contextMenu = new ContextMenu();
m1 = new MenuItem();
m1.Header = "Option _1";
m2 = new MenuItem();
m2.Header = "Option _2";
m3 = new MenuItem();
m3.Header = "Option _3";
m4 = new MenuItem();
m4.Header = "Option _4";
contextMenu.Items.Add(m1);
contextMenu.Items.Add(m2);
contextMenu.Items.Add(m3);
contextMenu.Items.Add(m4);
rtl.DropDownMenu = contextMenu;
trl.addRibbonComponent(RibbonThreeRowsLayout.Position.bottom, rtl);
RibbonTwoRowsLayout
与 RibbonThreeRowsLayout
类似,此组件提供基于行的布局管理器,但它提供两行而不是三行。通常,此控件包含 RibbonHalfButtonGroup
,顾名思义,它用于使用统一的边框(末端带有圆角)将类似项目分组在一起。提供两种子类型:RibbonHalfButton
和功能较少的 RibbonHalfComboBox
。添加到 RibbonHalfButtonGroup
的所有子元素都必须实现 IRibbonHalfControl
,提供允许控件正确设置子元素边框样式的方法。为了便于使用,建议将 RibbonTwoRowsLayout
的所有子元素都包装在 RibbonHalfButtonGroup
中,以允许正确的边框着色,但是,在不遵守此规则的情况下,调用 setFullBorder()
也足够了。这些控件的使用示例如下:
hbg = new RibbonHalfButtonGroup();
//Half combo box
RibbonHalfComboBox hcb = new RibbonHalfComboBox();
ComboBox cb = new ComboBox();
ComboBoxItem cbi1 = new ComboBoxItem();
cbi1.Content = "Combo 1";
ComboBoxItem cbi2 = new ComboBoxItem();
cbi2.Content = "Combo 2";
ComboBoxItem cbi3 = new ComboBoxItem();
cbi3.Content = "Combo 3";
ComboBoxItem cbi4 = new ComboBoxItem();
cbi4.Content = "Combo 4";
cb.Items.Add(cbi1);
cb.Items.Add(cbi2);
cb.Items.Add(cbi3);
cb.Items.Add(cbi4);
hcb.setComboBox(cb);
hbg.addComponent(hcb);
//Half buttons
RibbonHalfButton hb1 = new RibbonHalfButton(new BitmapImage(new Uri(Environment.CurrentDirectory
+ @"\\Standard Icons/enter_registration_key.png", UriKind.RelativeOrAbsolute)));
RibbonHalfButton hb2 = new RibbonHalfButton(new BitmapImage(new Uri(Environment.CurrentDirectory
+ @"\\Standard Icons/help.png", UriKind.RelativeOrAbsolute)));
RibbonHalfButton hb3 = new RibbonHalfButton(new BitmapImage(new Uri(Environment.CurrentDirectory
+ @"\\Standard Icons/preview.png", UriKind.RelativeOrAbsolute)));
hbg.addComponent(hb1);
hbg.addComponent(hb3);
hbg.addComponent(hb5);
RibbonTwoRowsLayout trl2 = new RibbonTwoRowsLayout();
trl2.addRibbonComponent(RibbonTwoRowsLayout.Position.bottom, hbg);
RibbonThreeButtonsGroupLayout
该布局允许插入三个全高控件,并在可用空间减少时将其缩小;通常,此控件仅用于 RibbonButton
和 RibbonDoubleButton
实例。该控件会从 3 个全高按钮缩小到 RibbonThreeRowsLayout
中的 3 个完整 RibbonThirdLabel
,再到仅带有图像和上下文菜单(如果适用)的 3 个 RibbonThirdLabel
,反之亦然。
ScreenTips
从库的 1.0.0.2 版本开始,Ribbon 现在支持 ScreenTips;但请注意,这是一个正在进行中的开发过程,当前的实现不符合所需准则。
屏幕提示简单易用,易于添加,甚至易于创建。自定义屏幕提示应实现 IScreenTip
,这要求在控件中添加多个布局属性。所有 Ribbon 组件都扩展了 RibbonControlBase
,其中包含一个 Tip
属性,用于获取和设置 ScreenTip。现在 ScreenTips.dll
中包含了一个 ScreenTips 库。目前有两种类型的 ScreenTip 可用:TextOnlyTip
(显示标题、内容文本和帮助链接)和 ImageAndTextTip
(显示附加图像);两者都如下所示,但屏幕截图并未传达控件中存在的动画效果。
使用代码(图形设计,不推荐)
自从引入此库功能以来,我编写了一个用户界面,用于自动生成代码来布局控件并将其链接起来,以形成一个完整的 Ribbon 栏。该工具现已在以下文章 ribbonbuilder.aspx《一个图形化的 WPF Ribbon 控件构建器》中提供。
该工具是现有 Ribbon 库项目的补充,它 *不* 提供 Ribbon 控件,而是使用该项目的 Ribbon 控件库通过 UI 生成特定的布局。该软件提供了一种无需编码即可生成完整 Ribbon 控件的快捷方式;但请注意,它不生成事件处理程序钩子,因为这超出了应用程序的范围,该应用程序仅用于生成布局。
有关精确使用细节和应用程序,请参阅另一篇文章,但请注意参阅本文以了解链接 RibbonController
的详细信息。
重要提示:此工具目前已过时,并且不会生成与当前库版本兼容的代码,因此建议使用手动方法。
键盘访问命令
键盘访问是 Office UI 准则的要求,因此 *必须* 实施才能获得合法许可。当用户按下 ALT 或 F10 时,界面会显示弹出窗口,指示 Ribbon 和快速访问工具栏的快捷方式。对于 Ribbon,在初始按键之后,只会显示 Ribbon 选择按钮的提示,在进一步按键之后,才会显示 Ribbon 组件的提示,请参见下文。
按下键“H”后;
在按下有效组合键(例如 HX、Home > Cut)、再次按下 ALT 或 F10、在应用程序中单击鼠标或应用程序失去焦点后,键盘访问提示会隐藏。
提示通过 .KeyboardAccessCombination
属性添加,通过更改返回对象的 KeyCombination
属性,或通过提供新的 RibbonKeyboardAccessKeyCombination
对象。必须创建 RibbonKeyboardAccessController
的新实例,将 Ribbon 和快速访问工具栏链接到父 Window
。请注意,出于测试目的,存在 RibbonKeyboardAccessController
的各种构造函数,但为了符合 UI 准则,必须同时链接 Ribbon 和快速访问工具栏。
如果尝试了无效的键盘组合,上一次按键会自动删除以进行重试,因此按键“H”“R”“T”“L”“8”“V”“3”将匹配 Home > RTL3,而不是 Home > Paste。所有无效按键都会通过“叮”声指示。当输入有效按键组合时,相应的 Ribbon(或其他)的 Click
事件将被触发,因此无需进一步编码即可支持键盘访问。
功能区样式
功能区样式通过 RibbonStyleHandler
自动执行。当通过 reStyle()
或 reStyle(Style style)
更改并应用样式时,会触发 StyleChanged 事件。已包含四种默认样式,如下所示;
RibbonStyleHandler
类包含许多静态方法(特别是 styleButtonBorder(...)
和 styleGroupBorder(...)
的许多重载),用于创建与当前调色板链接的默认样式和动画。
自定义 Ribbon 控件
一言以蔽之,不要这样做。此代码处于 ALPHA 阶段,在 BETA 和 FINAL 版本之前会进行大量更改,因此您很可能最终会编写两次组件。本文和代码旨在展示此控件即将推出的功能,而不是提供一个实际可用的组件。如果您仍然选择编写自定义控件(请务必给我发送一份副本,我可能会将其添加到包中,当然会给予您应有的荣誉),那么我建议查看最接近的现有控件的 XAML,特别是将您的控件设置为正确的高度。我花费了大量精力来确保组件尺寸正确(更不用说这是 Office UI 准则的要求)。控件的样式最好使用 RibbonStyleHandler
中的静态值,如果可能,使用 .styleButtonBorder(...)
和 .styleGroupBorder(...)
,它们将自动为 Border
对象的边框和背景添加动画。所有 Ribbon 控件现在都扩展了 RibbonControlBase
,它将提供控件的基本功能,并提供该类所有必需的存储属性;不要随意修改属性,即使在它们似乎没有意义或用处的控件上,因为它们都是 Microsoft 准则和其他组件(例如快速访问工具栏)所必需的。
其他特性
请参阅“有用资源”部分,由于尺寸限制,许多功能在其他文章中有所展示。
窗口标题
窗口标题样式与 Microsoft Office Word 相同,如下图所示;
关注点
为什么要使用此代码?令人恼火的是,Microsoft 以其无限的智慧未能为 .NET 3.5 创建此控件。谁知道未来他们可能会,但目前他们还没有,也没有计划的消息。然而,为了辩护,他们已授权将 Ribbon UI 元素用于一般用途,但需满足某些要求,这些要求可在此处找到:此处。请注意,“这一点非常重要,因为如果您不实施文档中所有必需的准则,您将不被法律允许使用 Ribbon 用户界面设计!”这句话在获得专利之前不应成立,但我目前正在努力满足所有设计标准。
这项工作有替代方案吗?有,尽管它们大多成本高昂,但开发程度要高得多。Bil Simser 撰写了一篇关于此问题的更好指南,题为 面向开发人员的 Ribbon UI 控件综述。有趣的是,下面的评论显示 Microsoft 已经发布了一个用于 Ribbon 控件的 MFC 库!
弹出类对于预览框等弹出窗口来说出奇地有用;一篇关于如何生成该特定控件的文章即将发布。奇怪的是,扩展 Popup 实际上不一定是生成弹出窗口的最佳方法。
当尝试从 C# 编写 WPF 资源时,WPF 和后台代码之间的交互要复杂得多;特别是从后台代码为 UIElement
创建动画非常困难。一篇文章也即将发布。
10 分和代码荣誉将奖励给找出动画为什么如此卡顿,并且在许多情况下根本不显示的人。请将答案写在明信片上。
已知bug
以下是我目前知道的错误列表;如果您看到任何其他错误,请留言;
- 来自最小化
RibbonGroupBox
的弹出窗口经常过早关闭,例如在滚动RibbonPreviewBoxes
时 - 来自最小化
RibbonGroupBox
的弹出窗口在失去焦点或按下其他非组按钮时不会关闭 - 键盘访问按下的无效键盘组合没有发出叮咚声
- 当窗口不够宽时,键盘提示显示在窗口外部
- 在初始按下 ALT 或 F10 后,键盘提示无法正常工作;第一次按键被忽略,因此 <任意键> <键 2> 被视为仅 <键 2>。
- 当预览 0 不可见时,
RibbonPreviewBoxes
会调整为任意大小 - 当
.Selected = true
时,RibbonPreviewBox
边框显示不正确
未来工作
以下任务仍在进行中或已开始;
- 优化 Ribbon 大小调整
- 重新实现 addComponent / removeComponent 类型方法为属性,允许更好的子元素排序
- 符合 Microsoft Ribbon 要求
- Alt 键盘快捷键弹出窗口
RibbonGroupBox
标签缩放- 代码清理
- 键盘访问错误修复
RibbonPage
样式符合 Office UI 指南标准,包括删除“窗口”标题和边框
历史
1.0.0.0 - 初始构建:实现了大部分控件和基本布局,部分样式与 Microsoft Office Word 2007 一致,部分事件处理程序。
1.0.0.1 - Ribbon 大小调整;RibbonTwoRowLayout
压缩为三行,RibbonPreviewBoxes
展开和收缩预览并压缩为下拉按钮,RibbonGroupBox
压缩为单个下拉按钮,RibbonThridLabels
隐藏文本。每个 RibbonGroupBox
具有多种大小变体。*
1.0.0.1 - 添加了 RibbonGroupBox
标签按钮。*
1.0.0.1 - 样式系统更新;RibbonButton
和 RibbonDoubleButton
都能正确自动重新样式,样式系统更新为允许 RibbonStyleHandler
移除样式,并添加了新样式(绿色)。
1.0.0.1 - 窗口宽度小于 300 像素时 Ribbon 自动隐藏。*
1.0.0.2 - 添加了 Ribbon 设计器,用于 Ribbon 的图形设计。
1.0.0.2 - ScreenTip 支持。
1.0.0.2 - 代码大规模重构;IRibbonComponent
和 IRibbonResizing
被 RibbonControlBase
取代.
1.0.0.2 - 添加了默认上下文菜单,包括在控件添加到快速访问栏时生成事件的功能。
1.0.0.2 - Ribbon 控制栏的重新样式,下拉阴影* 和圆角*。
1.0.0.3 - 将 ScreenTips 和 RibbonControl 合并到同一个包中,即 RibbonControl。
1.0.0.3 - 添加了快速访问工具栏 (QAT) 支持*;包括将 Ribbon 组件链接到 QAT。
1.0.0.3 - 改变了 Ribbon 组件的结构;组件现在继承自 RibbonControlBase。
1.0.0.4 - 添加了键盘访问*;支持 Ribbon、Ribbon 组件和快速访问工具栏。
1.0.0.5 - 添加了 RibbonWindow
以简化链接过程。
1.0.0.6 - RibbonPreviewBox
/ RibbonPreviewBox
的 Selected 属性中的事件处理。
1.0.0.6 - RibbonPreviewBoxes
仅扩展到子项数量 + 1(空白表示控件中没有更多,有助于用户)。
1.0.0.6 - RibbonWindow
不再有背景中的神秘黑框。
1.0.0.6 - RibbonPreviewBoxes.addRibbonPreviewBox(RibbonPreviewBox rpb)
被删除,转而使用 .Children
属性。
1.0.0.6 - RibbonGroupBox
错误修复:LabelButtonPressed
事件现在触发。
1.0.0.6 - RibbonPreviewBoxes
错误修复:当 .Text
或 .Image
为 null 时,Clone()
不再抛出异常。
1.0.0.6 - 添加了 RibbonFileLocations
和 .RibbonBasePath
属性;一个静态成员,指示应用程序的基文件夹位置(在使用 RibbonPage
设置资源的在线地址时很有用)。
1.0.0.6 - 添加了用于 XBAP 样式应用程序的 RibbonPage
。
1.0.0.7 - RibbonController
错误修复:修复了强制放大尺寸的问题。
1.0.0.7 - 删除了 RibbonWindow AllowTransparency="True"
WPF .
Frame
标签现在无需复杂的变通方法即可显示。
1.0.0.7 - 减少了应用程序区域的透明度,使 WPF Frame
标签正常工作;提高了性能(参见 RibbonWindow
中的窗口加载事件处理程序)。
1.0.0.7 - 性能改进:RibbonWindow
窗口样式从用户代码返回到操作系统。
1.0.0.7 - 性能改进:RibbonWindow
使用操作系统代码处理大小调整事件,而不是 WPF 窗口大小调整库。
1.0.0.7 - 性能改进:修改了 RibbonBar
大小调整处理程序。
1.0.0.7 - 添加了 RibbonDisplayTextBox
:用于显示简单文本。
1.0.0.7 - 添加了 RibbonDisplayImage
:用于显示全高图像。
1.0.0.7 - 减少了依赖项数量,缩短了加载时间。
1.0.0.8 - RibbonBar.addGroupBox(RibbonGroupBox)
和 RibbonBar.removeGroupBox(RibbonGroupBox)
已更改为 List<RibbonGroupBox> RibbonBar.Children
。
1.0.0.8 - RibbonButton.Text
经修改后允许多行文本;使用 | 表示换行。
1.0.0.8 - 添加了 RibbonUserControl
,一个可调整大小的全高元素,用于添加自定义内容。
1.0.0.8 - 添加了 RibbonHalfLabel
,一个半高标签元素(必须作为子元素添加到 RibbonHalfButtonGroup
)。
1.0.0.8 - 添加了 RibbonHalfTextBox
,一个半高文本输入框(必须作为子元素添加到 RibbonHalfButtonGroup
);使用 TextBoxText
进行文本输入,还包含 EndPadding
属性,用于在 RibbonHalfButtonGroup
末尾时使用。
1.0.0.8 - 添加了 RibbonHalfPasswordBox
,类似于 RibbonHalfTextBox
,但文本被遮盖;包含 Password
属性。
1.0.0.8 - 添加了 RibbonThreeButtonsGroupLayout
,将三个全尺寸按钮添加到布局中,当空间有限时,它们显示为 RibbonThirdLabels
,并带有链接的事件处理程序和属性(Text
和 Image
)。
1.0.0.8 - 更改了 RibbonControlBase
,以防止布局控件显示在快速访问工具栏和配置对话框中。
1.0.0.8 - 快速访问工具栏按钮现在在未定义 .ScreenTip
(= null) 时显示 .Text
的默认工具提示。
1.0.0.8 - RibbonControlBase
错误修复:Clicked 事件现在仅在鼠标左键按下时调用。
1.0.0.8 - RibbonController
错误修复;当选择新的 RibbonBar
时,RibbonBar
现在会调整为最大尺寸。
1.0.0.8 - RibbonController
错误修复;当父窗口/页面首次创建时自动缩放内容。
1.0.0.8 - RibbonController
错误修复;当添加第一个 RibbonBar
时自动缩放内容。
1.0.0.8 - RibbonBar
错误修复;当添加或删除内容时自动缩放内容。
1.0.0.8 - RibbonBar
错误修复;修复了导致多次调用大小调整以获得正确大小的错误。
1.0.0.9 - RibbonGroupBox
中的 addRibbonComponent(RibbonControlBase)
和 removeRibbonComponent(RibbonControlBase)
已被 .Children
属性取代。
1.0.0.9 - RibbonPreviewBoxes
错误修复:现在,当点击预览框时(即点击弹出预览中的元素会触发与点击非弹出版本中的条目相同的事件),弹出预览会触发点击事件。
1.0.0.9 - 添加了 RibbonPreviewBoxes.setSelected(RibbonPreviewBox)
方法;将输入设置为选定的框(并更新最小化版本的图像)。输入必须在集合中,否则会抛出异常。
1.0.0.9 - 添加了 RibbonPreviewBoxes.ShowPopupGroups
属性,当设置为 true 时,Ribbon 预览的弹出窗口现在会按组显示(由 RibbonPreviewBox.Header
属性设置,也已添加)。
1.0.0.9 - 添加了应用程序菜单*(有关更多信息,请参阅有用参考资料)
1.0.0.9 - 移除了对 ApplicationMenu.dll
的依赖,并将其添加到 DNBSoft.WPF.RibbonControl
命名空间中。
1.0.0.9 - 代码清理 - 无警告。
1.0.0.10 - 修复了快速访问工具栏的键盘快捷键,组合现在是 01 -> 99,而不是 1-9,10-99(因此区分 1 和 1.......... 0 的错误)。
1.0.0.10 - RibbonPreviewBoxes
错误修复:失去焦点时自动关闭弹出窗口。
10.0.0.10 - RibbonSelectionButton
错误修复:选择按钮现在可以正确动画,包括第一个 Ribbon 按钮。
10.0.0.10 - RibbonController
现在支持最小化 Ribbon 栏。
10.0.0.10 - RibbonThreeButtonGroupLayout
错误修复:现在处理某些按钮为 null 的情况。
10.0.0.10 - RibbonWindow
更新标题外观和感觉,与 Office 保持一致。
10.0.0.10 - 添加了 RibbonContextController
用于上下文功能区支持。
10.0.0.10 - RibbonDoubleButton.Text
属性现在支持 |
用于多行文本。
10.0.0.10 - RibbonButton
、RibbonDoubleButton
和 RibbonThirdLabel
字体大小更改为 11pt,以提高线下字母(例如小写 g 和 j)的可读性。
10.0.0.10 - 添加了 RibbonColorPopup
;用于创建主题颜色选择。
10.0.0.10 - 修改所有控件以使用 RibbonBorder
而不是 Border
(选择和启用支持所需)。
10.0.0.10 - 为 RibbonControlBase
添加了 .IsEnabled
和 .IsSelected
属性。
10.0.0.10 - RibbonControlBase
现在实现了 IRibbonControl
;即控件的基本要求。
10.0.0.10 - IRibbonFullControl
指示一个全高控件。
10.0.0.10 - 将 .Image
属性更改为 .NormalImage
并添加了 .DisabledImage
。如果 .DisabledImage
不为 null
,则在启用或禁用控件时触发 ImageChanged
事件。
10.0.0.10 - 将 .Tip
属性更改为 .NormalTip
并添加了 .DisabledTip
。如果 .DisabledTip
不为 null
,则在控件启用或禁用时触发 ScreenTipChanged
事件。如果 .DisabledTip
为 null
,则显示 .NormalTip
,并且不触发 ScreenTipChanged
事件。请注意,在设置 .DisableTip
且 .IsEnabled
为 true 时,ScreenTipChanged
事件不会触发,反之亦然。
10.0.0.10 - RibbonSelectionButton
错误修复:悬停/选中样式现在可以正常工作(通过添加 RibbonStyleHandler.styleTabBorder
和 .styleTabText
),包括双击最小化时。
10.0.0.10 - 修改了 RibbonWindow
,以便在 Ribbon 选项卡上滚动时移动选定的选项卡(仅在非最小化时)。*
10.0.0.10 - 更改了 RibbonWindow
/RibbonPage
,以便当 Ribbon 选项卡宽度大于窗口宽度时,它们会缩小并显示分隔符。
10.0.0.10 - RibbonThreeButtonsGroupLayout
错误修复:不显示上下文菜单,导致按钮无法正确添加到快速访问工具栏。
10.0.0.10 - QuickAccessButton
错误修复:现在显示来自父控件的相关工具提示。
10.0.0.10 - RibbonButton
错误修复:点击控件下半部分现在会触发点击事件。
10.0.0.10 - RibbonControlBase
错误修复:当控件被禁用时,点击控件不再触发点击事件。
10.0.0.10 - 通过 getCurrentButtonControlIDs()
和 loadButtons(List<Guid> ids, RibbonController controller)
向 QuickAccessToolbar
添加了持久性。要求所有可持久性 Ribbon 控件都设置 .ControlID
属性(建议用于所有控件)。
* Microsoft Office UI 指南要求。
有用参考资料
roundbutton.aspx,一个 Microsoft Office 风格的 WPF 应用程序按钮。
WPF_Window_Resizing.aspx,WPF 窗口大小调整;从头开始生成 Window
替换(从而使非客户区访问的复杂性与客户区相当)所需。
qat.aspx,一个 Microsoft Office 2007 风格的 WPF C# 快速访问工具栏;生成快速访问工具栏所需。
ribbonbuilder.aspx,一个图形化的 WPF Ribbon 控件构建器;用于生成复杂 Ribbon 布局的图形工具。
ribbondemo.aspx,演示应用程序的源代码(如上所述)。
其他许可说明
请随意在您的工作中使用此代码,但请注意,正在使用修改后的 Code Project 开放许可证 (CPOL);基本上它与标准许可证相同,但未经事先授权,此代码不得用于商业或非营利性商业用途。请参阅随附源代码和演示文件中的 license.txt 或 license.pdf。