WinForms Ribbon 库中的上下文弹出菜单

WinFormsRibbon 库现在支持使用上下文弹出菜单。本文将通过一个示例 "15-ContextPopup" 来展示如何实现这一功能。

什么是上下文弹出菜单?

上下文弹出菜单是小工具栏(称为MiniToolbar)和上下文菜单的组合,Ribbon启用的应用程序可以提供。这种弹出菜单通常在右键点击应用程序表面时出现,并且通常提供与点击表面相关的常见操作。基本上,这只是另一种访问Ribbon命令的方式。实际上,由于MiniToolbar(上下文弹出菜单的上半部分)不能通过键盘访问,微软强烈建议每个命令也应该通过标准Ribbon界面可用。

使用 ContextPopup -Ribbon标记

以下是一个定义上下文弹出菜单的示例。只展示了Views部分,因为Commands部分是显而易见的。标记的结果如上图所示。

<Application.Views> <ContextPopup> <ContextPopup.MiniToolbars> <MiniToolbar Name="MiniToolbar"> <MenuGroup> <FontControl CommandName="cmdFontControl" /> </MenuGroup> <MenuGroup> <DropDownColorPicker CommandName="cmdDropDownColorPicker" /> <Button CommandName="cmdButtonNew" /> <Button CommandName="cmdButtonOpen" /> <Button CommandName="cmdButtonSave" /> <ComboBox /> </MenuGroup> </MiniToolbar> </ContextPopup.MiniToolbars> <ContextPopup.ContextMenus> <ContextMenu Name="ContextMenu"> <MenuGroup> <Button CommandName="cmdButtonNew" /> <Button CommandName="cmdButtonOpen" /> <Button CommandName="cmdButtonSave" /> </MenuGroup> <MenuGroup> <DropDownColorPicker CommandName="cmdDropDownColorPicker" /> </MenuGroup> </ContextMenu> </ContextPopup.ContextMenus> <ContextPopup.ContextMaps> <ContextMap CommandName="cmdContextMap" ContextMenu="ContextMenu" MiniToolbar="MiniToolbar" /> </ContextPopup.ContextMaps> </ContextPopup> <Ribbon> </Application.Views>

需要注意的事项:

  • 在ContextPopup.MiniToolbars元素中,可以定义可用的迷工具栏列表(上半部分)。
  • 在ContextPopup.ContextMenus元素中,可以定义可用的上下文菜单列表(下半部分)。
  • 上下文弹出菜单的实际定义位于ContextPopup.ContextMaps元素中,可以定义上下文弹出菜单的列表。对于每个上下文弹出菜单,需要指定它的上半部分和下半部分。

使用 ContextPopup - 代码后端

为了显示预定义的上下文弹出菜单,在这里展示了两种方式:推荐的方式和方便的方式。

使用Ribbon.ShowContextPopup方法显示给定的上下文弹出菜单在某个位置,通常是作为右键点击的响应:

private Ribbon _ribbon; public Form1() { InitializeComponent(); _ribbon = new Ribbon(); // 推荐的方式 panel2.MouseClick += new MouseEventHandler(panel2_MouseClick); } void panel2_MouseClick(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Right) { System.Drawing.Point p = panel2.PointToScreen(e.Location); _ribbon.ShowContextPopup((uint)RibbonMarkupCommands.cmdContextMap, p.X, p.Y); } }

注意ShowContextPopup获取屏幕坐标位置,因此需要使用Control.PointToScreen方法进行转换。

如果习惯于在.NET中编程客户端应用程序,一定熟悉ContextMenuStrip类。每个WinForms控件都有一个ContextMenuStrip属性,可以附加一个预定义的ContextMenuStrip实例,让.NET框架为处理上下文菜单的打开。不幸的是,ContextMenuStrip属性只与ContextMenuStrip实例一起工作(一个IContextMenuStrip接口会很好...),所以不能轻易地用基于Ribbon的实现替换.NET的上下文菜单实现。

以下是一个可以使用的hack来实现这一点。创建了一个RibbonContextMenuStrip类,它继承自ContextMenuStrip,并hack了方式来显示Ribbon上下文菜单而不是.NET上下文菜单。优点是有一个更容易的接口来使用Ribbon上下文菜单:

private Ribbon _ribbon; private RibbonContextMenuStrip _ribbonContextMenuStrip; public Form1() { InitializeComponent(); _ribbon = new Ribbon(); _ribbonContextMenuStrip = new RibbonContextMenuStrip(_ribbon, (uint)RibbonMarkupCommands.cmdContextMap); // 方便的方式 panel1.ContextMenuStrip = _ribbonContextMenuStrip; }

从代码中可以看出,它更短,并且使用了标准的.NET方式来设置控件的上下文菜单。

本节与上下文弹出菜单无关。Ribbon库现在支持三个通用属性用于Ribbon UI:

  • Minimized - 指定Ribbon是否处于折叠或展开状态。属性标识符:UI_PKey_Minimized。
  • Viewable - 指定Ribbon用户界面(UI)是否处于可见或隐藏状态。属性标识符:UI_PKey_Viewable。
  • QuickAccessToolbarDock - 指定快速访问工具栏是否停靠在顶部或底部。属性标识符:UI_PKey_QuickAccessToolbarDock。
private void Form1_Load(object sender, EventArgs e) { _ribbon.InitFramework(this); _ribbon.Viewable = false; }
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485