WinFormsRibbon 库现在支持使用上下文弹出菜单。本文将通过一个示例 "15-ContextPopup" 来展示如何实现这一功能。
上下文弹出菜单是小工具栏(称为MiniToolbar)和上下文菜单的组合,Ribbon启用的应用程序可以提供。这种弹出菜单通常在右键点击应用程序表面时出现,并且通常提供与点击表面相关的常见操作。基本上,这只是另一种访问Ribbon命令的方式。实际上,由于MiniToolbar(上下文弹出菜单的上半部分)不能通过键盘访问,微软强烈建议每个命令也应该通过标准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>
需要注意的事项:
为了显示预定义的上下文弹出菜单,在这里展示了两种方式:推荐的方式和方便的方式。
使用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:
private void Form1_Load(object sender, EventArgs e)
{
_ribbon.InitFramework(this);
_ribbon.Viewable = false;
}