mcpField
S
syncfusion-winforms-contextmenustrip

syncfusion-winforms-contextmenustrip

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

关于 syncfusion-winforms-contextmenustrip

面向 Windows Forms 开发者的 ContextMenuStripEx 实施指南,介绍多层级上下文菜单、混合控件类型和外观定制。

主要功能

  1. 01创建多层级子菜单
  2. 02混合菜单项、文本框和组合框
  3. 03配置勾选与启用状态
  4. 04设置快捷键和提示文本
  5. 05定制颜色、字体与尺寸
  6. 06支持触摸模式

适用场景

  1. 01为文本编辑器添加剪切和复制菜单
  2. 02创建可切换选项的上下文菜单
  3. 03构建分层文件操作菜单
  4. 04在菜单内组合搜索输入与筛选项

安装

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

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

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

包含的文件

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

references/
appearance-customization.md
getting-started.md
keyboard-and-touch.md
menu-behavior.md
menu-item-states.md
multilevel-menus.md
toolstrip-item-types.md

详细介绍

实现 ContextMenuStripEx

在 Windows Forms 应用程序中实现增强型上下文菜单的指南,涵盖丰富的项类型、多级导航和多种自定义选项。

何时使用此技能

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

  • 为 Windows Forms 控件添加上下文菜单(右键菜单)
  • 实现带子菜单的多级菜单层次结构
  • 创建包含混合项类型(MenuItem、TextBox、ComboBox、Separator)的菜单
  • 配置菜单项的选中/未选中状态
  • 为菜单项添加键盘快捷键
  • 自定义菜单外观(颜色、字体、大小)
  • 处理菜单项的单击事件和触发器
  • 动态启用/禁用菜单项
  • 实现菜单的自动关闭行为
  • 在菜单界面中启用触控模式

组件概述

ContextMenuStripEx 是标准 Windows Forms ContextMenuStrip 的增强版本,提供:

  • 支持在一个菜单中使用多种 ToolStripItem 类型
  • 丰富的外观自定义选项
  • 多级菜单层次结构
  • 键盘快捷键的显示和处理
  • 触控模式支持
  • 灵活的项状态管理(选中、禁用等)

主要功能:

  • 混合项类型:MenuItem、TextBox、ComboBox、Separator
  • 通过 DropDownItems 支持多级子菜单
  • 选中/未选中/不确定状态
  • 动态启用/禁用项
  • 自动关闭配置
  • 丰富的外观自定义选项
  • 键盘快捷键支持
  • 菜单项工具提示支持
  • 适合触控操作的尺寸

文档与导航指南

入门

📄 阅读: references/getting-started.md

  • 安装和所需程序集
  • 通过设计器添加 ContextMenuStripEx
  • 通过代码添加 ContextMenuStripEx
  • 将上下文菜单关联到控件
  • 创建基本菜单项
  • 初始配置
ToolStripItem 类型

📄 阅读: references/toolstrip-item-types.md

  • MenuItem 属性和配置
  • 上下文菜单中的 TextBox 项
  • 上下文菜单中的 ComboBox 项
  • 用于视觉分组的 Separator
  • 通过设计器和代码添加各类项
  • 特定于项的属性和行为
菜单项状态

📄 阅读: references/menu-item-states.md

  • 选中和未选中状态
  • CheckedState 属性(Checked、Unchecked、Indeterminate)
  • 启用和禁用菜单项
  • 动态状态管理
  • 状态的视觉指示器
多级菜单

📄 阅读: references/multilevel-menus.md

  • 创建子菜单层次结构
  • 使用 DropDownItems 属性
  • 嵌套菜单结构
  • 多级导航模式
  • 深层菜单层次结构
菜单行为

📄 阅读: references/menu-behavior.md

  • 自动关闭功能
  • 单击事件处理
  • 触发机制
  • 打开和关闭行为
  • 运行时行为控制
  • 事件生命周期
键盘快捷键与触控支持

📄 阅读: references/keyboard-and-touch.md

  • 键盘快捷键配置
  • ShowShortcutKeys 属性
  • ShortcutKeys 赋值
  • ShortcutKeyDisplayString 自定义
  • 触控模式支持
  • 无障碍功能
外观自定义

📄 阅读: references/appearance-customization.md

  • 背景色和前景色
  • 字体自定义
  • Size 和 AutoSize 配置
  • 边距和阴影
  • 工具提示配置
  • 渲染模式
  • 视觉样式选项

快速入门示例

基本上下文菜单实现

通过设计器:

1. Drag ContextMenuStripEx from toolbox to form
   (appears in component tray)
2. Click "Type Here" to add menu items
3. Select item type (MenuItem, TextBox, ComboBox, Separator)
4. Configure item properties in Properties panel
5. Right-click target control → Properties → ContextMenuStrip
6. Select the ContextMenuStripEx instance

通过代码:

using Syncfusion.Windows.Forms.Tools;
using System.Windows.Forms;

// Declarations
private ContextMenuStripEx contextMenuStripEx;
private ToolStripMenuItem menuItemCut;
private ToolStripMenuItem menuItemCopy;
private ToolStripMenuItem menuItemPaste;
private RichTextBox richTextBox1;

// Initialization
private void InitializeContextMenu()
{
    // Create context menu
    this.contextMenuStripEx = new ContextMenuStripEx();
    
    // Create menu items
    this.menuItemCut = new ToolStripMenuItem();
    this.menuItemCopy = new ToolStripMenuItem();
    this.menuItemPaste = new ToolStripMenuItem();
    
    // Configure menu items
    this.menuItemCut.Text = "Cut";
    this.menuItemCut.ShortcutKeys = Keys.Control | Keys.X;
    this.menuItemCut.Click += MenuItemCut_Click;
    
    this.menuItemCopy.Text = "Copy";
    this.menuItemCopy.ShortcutKeys = Keys.Control | Keys.C;
    this.menuItemCopy.Click += MenuItemCopy_Click;
    
    this.menuItemPaste.Text = "Paste";
    this.menuItemPaste.ShortcutKeys = Keys.Control | Keys.V;
    this.menuItemPaste.Click += MenuItemPaste_Click;
    
    // Add items to context menu
    this.contextMenuStripEx.Items.AddRange(new ToolStripItem[] {
        this.menuItemCut,
        this.menuItemCopy,
        this.menuItemPaste
    });
    
    // Associate with control
    this.richTextBox1 = new RichTextBox();
    this.richTextBox1.ContextMenuStrip = this.contextMenuStripEx;
    this.Controls.Add(this.richTextBox1);
}

// Event handlers
private void MenuItemCut_Click(object sender, EventArgs e)
{
    richTextBox1.Cut();
}

private void MenuItemCopy_Click(object sender, EventArgs e)
{
    richTextBox1.Copy();
}

private void MenuItemPaste_Click(object sender, EventArgs e)
{
    richTextBox1.Paste();
}

常见模式

模式 1:编辑上下文菜单(剪切/复制/粘贴)
private void CreateEditContextMenu()
{
    var contextMenu = new ContextMenuStripEx();
    
    var cutItem = new ToolStripMenuItem("Cut", null, (s, e) => textBox.Cut());
    cutItem.ShortcutKeys = Keys.Control | Keys.X;
    
    var copyItem = new ToolStripMenuItem("Copy", null, (s, e) => textBox.Copy());
    copyItem.ShortcutKeys = Keys.Control | Keys.C;
    
    var pasteItem = new ToolStripMenuItem("Paste", null, (s, e) => textBox.Paste());
    pasteItem.ShortcutKeys = Keys.Control | Keys.V;
    
    contextMenu.Items.AddRange(new ToolStripItem[] {
        cutItem, copyItem, pasteItem
    });
    
    textBox.ContextMenuStrip = contextMenu;
}
模式 2:带子菜单的多级菜单
private void CreateMultiLevelMenu()
{
    var contextMenu = new ContextMenuStripEx();
    
    // Parent menu item with submenus
    var newMenuItem = new ToolStripMenuItem("New");
    
    // Submenu items
    var newDocItem = new ToolStripMenuItem("New Document");
    var newProjectItem = new ToolStripMenuItem("New Project");
    var newFileItem = new ToolStripMenuItem("New File");
    
    // Add submenus to parent
    newMenuItem.DropDownItems.AddRange(new ToolStripItem[] {
        newDocItem, newProjectItem, newFileItem
    });
    
    // Add to context menu
    contextMenu.Items.Add(newMenuItem);
    
    control.ContextMenuStrip = contextMenu;
}
模式 3:带选中状态的动态菜单
private void CreateDynamicCheckedMenu()
{
    var contextMenu = new ContextMenuStripEx();
    
    var boldItem = new ToolStripMenuItem("Bold");
    boldItem.CheckOnClick = true;
    boldItem.Checked = false;
    boldItem.Click += (s, e) => {
        var item = s as ToolStripMenuItem;
        // Apply bold formatting based on checked state
        ApplyBoldFormatting(item.Checked);
    };
    
    var italicItem = new ToolStripMenuItem("Italic");
    italicItem.CheckOnClick = true;
    italicItem.Checked = false;
    
    var underlineItem = new ToolStripMenuItem("Underline");
    underlineItem.CheckOnClick = true;
    underlineItem.Checked = false;
    
    contextMenu.Items.AddRange(new ToolStripItem[] {
        boldItem, italicItem, underlineItem
    });
    
    richTextBox.ContextMenuStrip = contextMenu;
}
模式 4:混合项类型菜单
private void CreateMixedItemMenu()
{
    var contextMenu = new ContextMenuStripEx();
    
    // Menu item
    var searchItem = new ToolStripMenuItem("Search");
    
    // TextBox for input
    var searchBox = new ToolStripTextBox();
    searchBox.Text = "Enter search term...";
    
    // Separator
    var separator = new ToolStripSeparator();
    
    // ComboBox for options
    var filterCombo = new ToolStripComboBox();
    filterCombo.Items.AddRange(new object[] { "All", "Documents", "Images" });
    filterCombo.SelectedIndex = 0;
    
    // Add all items
    contextMenu.Items.AddRange(new ToolStripItem[] {
        searchItem, searchBox, separator, filterCombo
    });
    
    control.ContextMenuStrip = contextMenu;
}
模式 5:动态启用/禁用项
private void UpdateMenuItemStates()
{
    // Enable/disable based on application state
    menuItemCut.Enabled = textBox.SelectionLength > 0;
    menuItemCopy.Enabled = textBox.SelectionLength > 0;
    menuItemPaste.Enabled = Clipboard.ContainsText();
}

private void ContextMenu_Opening(object sender, CancelEventArgs e)
{
    // Update states before menu opens
    UpdateMenuItemStates();
}

// Subscribe to Opening event
contextMenuStripEx.Opening += ContextMenu_Opening;

关键属性

ContextMenuStripEx 属性
  • Items:菜单中 ToolStripItem 的集合
  • AutoClose:菜单是否在用户执行操作后关闭
  • BackColor:菜单的背景色
  • Font:应用于所有菜单项的字体
  • Size:菜单的高度和宽度
  • RenderMode:绘制样式(Professional、System、Custom)
ToolStripMenuItem 属性
  • Text:菜单项的显示文本
  • Checked:是否显示复选标记
  • CheckedState:状态(Checked、Unchecked、Indeterminate)
  • Enabled:菜单项是否启用
  • ShortcutKeys:键盘快捷键
  • ShowShortcutKeys:是否在菜单中显示快捷键
  • DropDownItems:子菜单项集合
  • ToolTipText:鼠标悬停时显示的工具提示
事件属性
  • Click:单击菜单项时触发
  • CheckedChanged:选中状态发生变化时触发
  • Opening:上下文菜单打开前触发
  • Closed:上下文菜单关闭时触发

常见用例

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

实现标准编辑操作(剪切、复制、粘贴、全选),并显示键盘快捷键。

参考: getting-started.md、keyboard-and-touch.md

用例 2:应用程序选项菜单

创建包含可勾选菜单项的菜单,用于切换功能(显示工具栏、显示状态栏、自动换行)。

参考: menu-item-states.md、menu-behavior.md

用例 3:文件操作菜单

构建用于文件操作的分层菜单(新建 → 文档/项目/文件、打开、保存、关闭)。

参考: multilevel-menus.md、toolstrip-item-types.md

用例 4:搜索和筛选菜单

在上下文菜单中组合使用 TextBox 进行输入,并使用 ComboBox 选择筛选条件。

参考: toolstrip-item-types.md、appearance-customization.md

用例 5:上下文感知菜单

根据当前选择或应用程序状态启用或禁用菜单项。

参考: menu-item-states.md、menu-behavior.md

实现工作流

  1. 规划菜单结构: 确定所需的菜单项、层级和项类型
  2. 添加 ContextMenuStripEx: 通过设计器或代码添加
  3. 创建菜单项: 添加 ToolStripMenuItems、TextBoxes、ComboBoxes 和分隔符
  4. 配置属性: 设置文本、快捷键、状态和外观
  5. 构建层级: 如有需要,使用 DropDownItems 添加子菜单
  6. 绑定事件: 为每个可操作的菜单项订阅 Click 事件
  7. 关联控件: 设置控件的 ContextMenuStrip 属性
  8. 测试交互: 右键单击以确认菜单显示且功能正常
  9. 自定义外观: 根据需要设置颜色、字体和尺寸
  10. 处理动态状态: 根据上下文更新启用和选中状态

故障排除

菜单未显示:

  • 确认目标控件已设置 ContextMenuStrip 属性
  • 检查菜单是否至少包含一个菜单项
  • 确保控件允许右键事件

快捷键不起作用:

  • 设置 ShowShortcutKeys = true 以显示快捷键
  • 确认 ShortcutKeys 属性配置正确
  • 检查是否与其他控件的键盘快捷键冲突

菜单项未启用:

  • 检查菜单项的 Enabled 属性
  • 确认事件处理程序是否正确更新状态
  • 使用 Opening 事件在菜单显示前更新状态

子菜单未显示:

  • 确保父菜单项已填充 DropDownItems
  • 确认子菜单项已正确初始化
  • 检查父菜单项是否已禁用

如需了解特定功能的详细信息,请前往文档与导航指南部分中列出的相应参考文件。

评论

支持 Markdown