mcpField
S
syncfusion-winforms-popup-menu

syncfusion-winforms-popup-menu

github.com/syncfusion开发279 次安装1 周前更新
代码仓库

关于 syncfusion-winforms-popup-menu

为 WinForms 开发者提供 Syncfusion PopupMenu 控件的实现指导,适用于构建桌面应用上下文菜单。内容涵盖多层级结构、丰富的菜单项类型及键盘和触控交互。

主要功能

  1. 01支持七种 BarItem 类型
  2. 02构建多层级子菜单
  3. 03分隔符与菜单项状态设置
  4. 04图像、工具提示与快捷键
  5. 05触控交互和部分菜单
  6. 06集成 Bar Manager 与 CommandBar

适用场景

  1. 01为 RichTextBox 添加编辑上下文菜单
  2. 02为 DataGridView 配置行与单元格操作菜单
  3. 03构建含嵌套子菜单的文件操作菜单
  4. 04根据应用状态动态调整菜单项

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/syncfusion/winforms-ui-components-skills --skill syncfusion-winforms-popup-menu

安装后在 Claude Code 中输入/syncfusion-winforms-popup-menu确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

references/
advanced-features.md
baritem-states.md
baritem-types.md
getting-started.md
grouping-baritems.md
images-and-tooltips.md
keyboard-interaction.md
multilevel-menus.md
troubleshooting.md

详细介绍

在 Windows Forms 中实现 PopupMenu

本技能提供在 Windows Forms 应用程序中实现 Syncfusion PopupMenu 控件的全面指南。PopupMenu 是一种上下文菜单,会在用户交互时显示,支持多种 BarItem 类型、多级层级结构、键盘导航,以及与 Bar Manager 集成。

何时使用此技能

在以下情况下使用此技能:

  • 需要在 WinForms 中实现上下文菜单或右键菜单
  • 想要创建包含各种项目类型(按钮、下拉框、组合框、列表)的弹出菜单
  • 需要包含嵌套子菜单的多级菜单结构
  • 想要为菜单添加键盘快捷键、助记符或触控支持
  • 需要使用分隔符对菜单项分组
  • 想要在菜单中设置已选中/未选中状态,或禁用菜单项
  • 需要在菜单项中显示图像和工具提示
  • 想要将弹出菜单与 Bar Manager 或 CommandBar 集成
  • 需要优先显示常用项目的部分菜单
  • 正在为桌面应用程序构建上下文相关的菜单系统

组件概述

PopupMenu 是一种上下文菜单控件,默认处于隐藏状态,在触发时(通常通过右键单击)显示在任何控件上方。它支持丰富的菜单结构,包含 7 种 BarItem 类型、多级嵌套、视觉自定义,以及全面的键盘/触控交互。

主要功能:

  • 7 种 BarItem 类型: BarItem、ParentBarItem、DropDownBarItem、ComboBoxBarItem、ListBarItem、StaticBarItem、TextBoxBarItem
  • 多级菜单: 可无限嵌套的子菜单结构
  • 分组: 在相关菜单项之间添加分隔符
  • 状态: 支持已选中/未选中、启用/禁用状态
  • 视觉自定义: 图像(普通、禁用、高亮)、工具提示
  • 键盘支持: 快捷键、助记符、键盘导航
  • 触控支持: 默认启用触控,适用于现代设备
  • 部分菜单: 优先显示常用项目,隐藏其他项目
  • 集成: Bar Manager、CommandBar、PopupMenusManager
  • 事件: BeforePopup、Popup、Collapse、ParentBarItemChanged

核心组件:

  • PopupMenu: 承载菜单结构的主控件
  • ParentBarItem: 容纳所有菜单项的根容器
  • PopupMenusManager: 将弹出菜单与控件关联
  • BarItems: 单个菜单项(提供 7 种类型)

文档与导航指南

入门

📄 阅读: references/getting-started.md

  • 程序集引用和依赖项
  • 通过设计器添加 PopupMenu(从工具箱拖放)
  • 通过代码添加 PopupMenu(初始化和设置)
  • 配置 PopupMenusManager
  • 将弹出菜单与控件关联(RichTextBox、Button 等)
  • 添加默认 ParentBarItem
  • 创建带有文本和图像的基本 BarItems
  • 安装 NuGet 包
BarItem 类型和配置

📄 阅读: references/baritem-types.md

  • BarItem: 包含文本、图像和事件的标准菜单项
  • ParentBarItem: 子菜单项的容器(层级菜单)
  • DropDownBarItem: 带有自定义 PopupControlContainer 的下拉项(ColorPicker 等)
  • ComboBoxBarItem: 菜单中的可编辑组合框
  • ListBarItem: 菜单中的子项列表
  • StaticBarItem: 相邻项目的标签/静态文本
  • TextBoxBarItem: 菜单中的文本输入框
  • 每种类型的设计器和代码示例
  • 每种 BarItem 类型的适用场景
多级菜单和分组

📄 阅读: references/multilevel-menus.md

  • 创建嵌套菜单结构
  • 添加 ParentBarItem 作为子菜单容器
  • 构建分层菜单(File → New → New Project)
  • 菜单层级深度不限
  • 包含多级结构的复杂菜单示例

📄 阅读: references/grouping-baritems.md

  • 在菜单项之间添加分隔符
  • 用于分组的 SeparatorIndices 属性
  • 通过 BeginGroupAt() 方法以编程方式分组
  • 使用 RemoveGroupAt() 方法移除分隔符
  • 使用 IsGroupBeginning() 检查分组状态
  • 视觉组织模式
视觉自定义

📄 阅读: references/baritem-states.md

  • 选中/未选中状态(Checked 属性)
  • 通过 Click 事件切换状态
  • 启用/禁用状态(Enabled 属性)
  • 状态管理模式
  • OverlapCheckBoxImageBounds(控制复选框与图像的重叠)
  • 何时使用选中状态而非其他指示方式

📄 阅读: references/images-and-tooltips.md

  • 为 BarItems 添加图像(Image 属性)
  • 用于加载图像的 ImageExt 类
  • 禁用状态的 DisabledImage
  • 悬停/选中状态的 HighlightedImage
  • 工具提示配置(Tooltip 属性)
  • 使用 ShowToolTipInPopUp 启用工具提示
  • 图标指南和最佳实践
键盘和交互

📄 阅读: references/keyboard-interaction.md

  • 触控支持(默认启用)
  • 键盘快捷键(Shortcut 属性,例如 Ctrl+F)
  • 自定义快捷键文本(ShortcutText 属性)
  • 键盘助记键(&Text,例如 "&File")
  • 使用 ShowMnemonicUnderlinesAlways 显示助记键下划线
  • 处理菜单项选择的 Click 事件
  • 通过键盘或鼠标触发操作
高级集成

📄 阅读: references/advanced-features.md

  • 部分菜单(UsePartialMenus 属性)
  • 使用 IsRecentlyUsedItem 优先显示常用项
  • 集成 Bar Manager 以创建应用程序级菜单
  • 关联 CommandBar(将 PopupMenu 作为下拉菜单)
  • 设置 CommandBarController
  • 事件:BeforePopup、Popup、Collapse、ParentBarItemChanged
  • 事件驱动的菜单自定义

📄 阅读: references/troubleshooting.md

  • 常见设置问题
  • 设计器与代码之间的差异
  • 程序集引用问题
  • PopupMenusManager 配置问题
  • BarItem 可见性问题
  • 事件处理故障排除

快速入门示例

使用 BarItems 的基本 PopupMenu
using Syncfusion.Windows.Forms.Tools.XPMenus;
using System.Windows.Forms;

public partial class Form1 : Form
{
    private PopupMenu popupMenu1;
    private ParentBarItem parentBarItem1;
    private BarItem barItem1;
    private BarItem barItem2;
    private BarItem barItem3;
    private PopupMenusManager popupMenusManager1;
    private RichTextBox richTextBox1;

    public Form1()
    {
        InitializeComponent();
        
        // Initialize components
        this.popupMenu1 = new PopupMenu(this.components);
        this.parentBarItem1 = new ParentBarItem();
        this.barItem1 = new BarItem();
        this.barItem2 = new BarItem();
        this.barItem3 = new BarItem();
        this.richTextBox1 = new RichTextBox();
        this.popupMenusManager1 = new PopupMenusManager(this.components);
        
        // Configure popup menu
        this.popupMenu1.ParentBarItem = this.parentBarItem1;
        
        // Configure BarItems
        this.barItem1.Text = "Cut";
        this.barItem1.Shortcut = Shortcut.CtrlX;
        this.barItem1.Click += BarItem1_Click;
        
        this.barItem2.Text = "Copy";
        this.barItem2.Shortcut = Shortcut.CtrlC;
        this.barItem2.Click += BarItem2_Click;
        
        this.barItem3.Text = "Paste";
        this.barItem3.Shortcut = Shortcut.CtrlV;
        this.barItem3.Click += BarItem3_Click;
        
        // Add items to parent
        this.parentBarItem1.Items.AddRange(new BarItem[] { 
            this.barItem1, this.barItem2, this.barItem3 
        });
        this.parentBarItem1.SizeToFit = true;
        
        // Associate with control
        this.richTextBox1.Size = new System.Drawing.Size(300, 200);
        this.popupMenusManager1.SetXPContextMenu(this.richTextBox1, this.popupMenu1);
        
        // Add to form
        this.Controls.Add(this.richTextBox1);
    }
    
    private void BarItem1_Click(object sender, EventArgs e)
    {
        if (richTextBox1.SelectionLength > 0)
        {
            richTextBox1.Cut();
        }
    }
    
    private void BarItem2_Click(object sender, EventArgs e)
    {
        if (richTextBox1.SelectionLength > 0)
        {
            richTextBox1.Copy();
        }
    }
    
    private void BarItem3_Click(object sender, EventArgs e)
    {
        richTextBox1.Paste();
    }
}

常见模式

模式 1:多级菜单结构
// Create hierarchy: File → New → New Project, New Website
ParentBarItem fileMenu = new ParentBarItem();
fileMenu.Text = "File";

ParentBarItem newSubmenu = new ParentBarItem();
newSubmenu.Text = "New";

BarItem newProject = new BarItem();
newProject.Text = "New Project...";
newProject.Click += NewProject_Click;

BarItem newWebsite = new BarItem();
newWebsite.Text = "New Website...";
newWebsite.Click += NewWebsite_Click;

// Build hierarchy
newSubmenu.Items.AddRange(new BarItem[] { newProject, newWebsite });
fileMenu.Items.Add(newSubmenu);
parentBarItem1.Items.Add(fileMenu);
模式 2:使用分隔符分组
// Create menu items
BarItem cut = new BarItem { Text = "Cut" };
BarItem copy = new BarItem { Text = "Copy" };
BarItem paste = new BarItem { Text = "Paste" };
BarItem selectAll = new BarItem { Text = "Select All" };

// Add items
parentBarItem1.Items.AddRange(new BarItem[] { cut, copy, paste, selectAll });

// Add separator after index 2 (after Paste)
parentBarItem1.SeparatorIndices.Add(2);

// Alternative: Use method
parentBarItem1.BeginGroupAt(selectAll);
模式 3:选中状态的菜单项
BarItem wordWrap = new BarItem();
wordWrap.Text = "Word Wrap";
wordWrap.Checked = true;  // Initial state
wordWrap.Click += (s, e) => 
{
    wordWrap.Checked = !wordWrap.Checked;  // Toggle
    richTextBox1.WordWrap = wordWrap.Checked;  // Apply setting
};
模式 4:带图像的菜单项
BarItem saveItem = new BarItem();
saveItem.Text = "Save";
saveItem.Image = new ImageExt(Image.FromFile(@"icons\save.png"));
saveItem.DisabledImage = new ImageExt(Image.FromFile(@"icons\save_disabled.png"));
saveItem.HighlightedImage = new ImageExt(Image.FromFile(@"icons\save_highlight.png"));
saveItem.Shortcut = Shortcut.CtrlS;
saveItem.Tooltip = "Save the current document";
saveItem.ShowToolTipInPopUp = true;
模式 5:部分菜单(常用项)
// Enable partial menus
parentBarItem1.UsePartialMenus = true;

// Mark items as frequently used (visible by default)
cutItem.IsRecentlyUsedItem = true;
copyItem.IsRecentlyUsedItem = true;
pasteItem.IsRecentlyUsedItem = true;

// Mark items as less frequently used (hidden initially)
advancedItem.IsRecentlyUsedItem = false;
optionsItem.IsRecentlyUsedItem = false;

关键属性和事件

PopupMenu 属性
  • ParentBarItem: 包含所有菜单项的根容器(必需)
ParentBarItem 属性
  • Items: 菜单中的 BarItems 集合
  • SizeToFit: 自动调整菜单项大小以适应内容
  • SeparatorIndices: 显示分隔符的索引集合
  • UsePartialMenus: 启用优先级菜单显示
  • OverlapCheckBoxImageBounds: 控制复选框与图像的重叠行为
BarItem 属性
  • Text: 菜单项的显示文本
  • Image: 与菜单项一同显示的图标
  • DisabledImage: 菜单项禁用时显示的图标
  • HighlightedImage: 菜单项高亮或悬停时显示的图标
  • Tooltip: 悬停时显示的工具提示文本
  • ShowToolTipInPopUp: 启用工具提示显示
  • Shortcut: 键盘快捷键(Ctrl+C、Alt+F 等)
  • ShortcutText: 快捷键显示的自定义文本
  • Checked: 在文本前显示勾选标记
  • Enabled: 启用或禁用菜单项
  • IsRecentlyUsedItem: 将菜单项标记为常用项(用于部分菜单)
  • ShowMnemonicUnderlinesAlways: 始终显示助记键下划线
  • SizeToFit: 自动调整菜单项大小以适应内容
PopupMenusManager 方法
  • SetXPContextMenu(Control, PopupMenu): 将弹出菜单关联到控件
ParentBarItem 方法
  • BeginGroupAt(BarItem): 在指定菜单项前添加分隔符
  • RemoveGroupAt(BarItem): 移除指定菜单项前的分隔符
  • IsGroupBeginning(BarItem): 检查菜单项是否为组的起始项
事件
  • BeforePopup: 菜单显示前触发(获取鼠标位置、自定义菜单)
  • Popup: 菜单显示后触发
  • Collapse: 菜单关闭时触发
  • ParentBarItemChanged: ParentBarItem 属性发生更改时触发
  • Click (BarItem): 单击菜单项时触发

常见用例

用例 1:文本编辑器上下文菜单

为 RichTextBox 创建包含剪切、复制、粘贴、全选和格式设置选项的上下文菜单。

用例 2:Grid/DataGridView 上下文菜单

为网格添加上下文菜单,其中包含添加行、删除行、编辑单元格、导出数据等选项。

用例 3:文件/文件夹上下文菜单

实现 Windows 资源管理器风格的上下文菜单,包含打开、复制、删除、属性和嵌套子菜单。

用例 4:窗体控件上下文菜单

为按钮、标签或面板添加具有控件专属操作的上下文菜单。

用例 5:应用程序级菜单系统

将 PopupMenu 与 Bar Manager 集成,在整个应用程序中提供一致的菜单体验。

用例 6:动态上下文菜单

使用 BeforePopup 事件,根据应用程序状态自定义菜单项(启用或禁用菜单项、显示或隐藏选项)。

用例 7:支持触控的菜单

利用内置触控支持,适用于平板电脑和触摸屏应用程序。

提示和最佳实践

BarItem 类型选择:

  • 标准菜单命令使用 BarItem
  • 子菜单使用 ParentBarItem
  • 需要自定义控件(ColorPicker、自定义面板)时使用 DropDownBarItem
  • 需要支持编辑的选择功能使用 ComboBoxBarItem
  • 固定选项列表使用 ListBarItem
  • 标签或标题使用 StaticBarItem
  • 在菜单中输入文本时使用 TextBoxBarItem

性能:

  • 尽可能在多个控件间重复使用 PopupMenu 实例
  • 使用 BeforePopup 事件进行动态自定义,而不是重新创建菜单
  • 避免为菜单项加载大尺寸图像;使用 16x16 或 24x24 图标

无障碍:

  • 始终为常用命令提供键盘快捷键
  • 使用助记键(&Text)进行键盘导航
  • 为仅包含图标的菜单项设置描述性工具提示文本
  • 确保禁用的菜单项在视觉上易于区分

设计器与代码:

  • 对于静态菜单结构,使用设计器更快捷
  • 对于动态菜单,使用代码可以更好地控制
  • 使用设计器中的智能标记快速进行设置
  • 测试设计器和代码两种方式,确保一致性

如需详细的实现指南,请参阅“文档和导航指南”部分中列出的参考文件。

评论

支持 Markdown