WinForms 的 Windows Ribbon,第 18 部分 – ContextPopup





5.00/5 (13投票s)
在本文中,我将介绍如何使用 Ribbon 的上下文弹出窗口。
这系列 CodeProject 文章基于我首先在我的 博客上发表的一系列帖子。
WinForms 的 Windows Ribbon 库现在支持使用上下文弹出窗口。 本帖的结果是另一个示例 "15-ContextPopup",可以在项目站点上找到。
什么是上下文弹出窗口?
上下文弹出窗口是小型工具栏(称为 MiniToolbar)和上下文菜单的组合,功能是 Ribbon 应用程序可以提供的。 此弹出窗口通常出现在右键单击应用程序界面时,并且它通常提供与单击界面相关的常用操作。 基本上,它只是另一种获取 Ribbon 命令的方式。 事实上,由于 MiniToolbar(上下文弹出窗口的上半部分)无法使用键盘访问,Microsoft 强烈建议每个命令也应通过标准 Ribbon 界面提供。
更多详细信息,请参阅 MSDN 上的 Context Popup。
使用 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>
</Ribbon>
</Application.Views>
注意事项
- 在
ContextPopup.MiniToolbars
元素中,可以定义可用 mini 工具栏(上半部分)的列表。 - 在
ContextPopup.ContextMenus
元素中,可以定义可用上下文菜单(下半部分)的列表。 - 上下文弹出窗口的实际定义位于
ContextPopup.ContextMaps
元素中,您可以在其中定义上下文弹出窗口的列表。 对于每个上下文弹出窗口,您需要指定其上半部分和下半部分。
使用 ContextPopup - 代码隐藏
为了显示预定义的上下文弹出窗口,我在这里介绍了两种方法:推荐方法和方便方法。
推荐的方法:使用方法 Ribbon.ShowContextPopup
在特定位置(通常响应右键单击)显示给定的上下文弹出窗口
private Ribbon _ribbon;
public Form1()
{
InitializeComponent();
_ribbon = new Ribbon();
// recommended way
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 的上下文菜单实现。
以下是您可以用来实现此目的的黑客手段。 我创建了一个从 ContextMenuStrip
继承的 RibbonContextMenuStrip
类,并使用黑客手段显示 Ribbon 上下文菜单而不是 .NET 上下文菜单。 优点是您拥有一个更简单的界面来使用 Ribbon 上下文菜单
private Ribbon _ribbon;
private RibbonContextMenuStrip _ribbonContextMenuStrip;
public Form1()
{
InitializeComponent();
_ribbon = new Ribbon();
_ribbonContextMenuStrip = new RibbonContextMenuStrip(_ribbon,
(uint)RibbonMarkupCommands.cmdContextMap);
// convenient way
panel1.ContextMenuStrip = _ribbonContextMenuStrip;
}
正如您从代码中看到的,它更短,并使用标准 .NET 方法在控件上设置上下文菜单。
让我们看看“魔术”是如何运作的
public class RibbonContextMenuStrip : ContextMenuStrip
{
private uint _contextPopupID;
private Ribbon _ribbon;
public RibbonContextMenuStrip(Ribbon ribbon, uint contextPopupID)
: base()
{
_contextPopupID = contextPopupID;
_ribbon = ribbon;
}
protected override void OnOpening(CancelEventArgs e)
{
_ribbon.ShowContextPopup(_contextPopupID,
Cursor.Position.X,
Cursor.Position.Y);
e.Cancel = true;
}
}
注意:RibbonContextMenuStrip
不是 WinForms 的 Windows Ribbon 库的一部分。 该代码作为示例 "15-ContextPopup" 的一部分提供。 它有效,但我不喜欢它。
Ribbon 属性
本节与上下文弹出窗口无关。
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;
}
目前就到这里为止。