syncfusion-winforms-contextmenustrip について
Windows Forms の ContextMenuStripEx を実装するためのガイドです。階層型コンテキストメニュー、複数の項目タイプ、外観のカスタマイズを扱います。
主な機能
- 01複数階層のサブメニュー作成
- 02メニュー項目、テキストボックス、コンボボックスの混在
- 03チェック状態と有効状態の設定
- 04ショートカットとツールチップの設定
- 05色、フォント、サイズのカスタマイズ
- 06タッチモードへの対応
活用シーン
- 01テキストエディターに切り取り・コピー項目を追加
- 02切り替え可能な項目を含むメニューの作成
- 03階層型のファイル操作メニューの構築
- 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.mdgetting-started.mdkeyboard-and-touch.mdmenu-behavior.mdmenu-item-states.mdmultilevel-menus.mdtoolstrip-item-types.md詳細
ContextMenuStripEx の実装
Windows Forms アプリケーションで、豊富な種類の項目、複数レベルのナビゲーション、多彩なカスタマイズオプションに対応した拡張コンテキストメニューを実装するためのガイドです。
このスキルを使用する場面
次のような場合に、このスキルを使用してください。
- Windows Forms コントロールにコンテキストメニュー(右クリックメニュー)を追加する
- サブメニューを含む複数レベルのメニュー階層を実装する
- 異なる種類の項目(MenuItem、TextBox、ComboBox、Separator)を組み合わせたメニューを作成する
- メニュー項目のチェック状態/未チェック状態を設定する
- メニュー項目にキーボードショートカットを追加する
- メニューの外観(色、フォント、サイズ)をカスタマイズする
- メニュー項目のクリックイベントとトリガーを処理する
- メニュー項目を動的に有効化/無効化する
- メニューの自動クローズ動作を実装する
- メニューインターフェースでタッチモードに対応する
コンポーネントの概要
ContextMenuStripEx は、標準の Windows Forms ContextMenuStrip を拡張したもので、次の機能を提供します。
- 1 つのメニュー内で複数の 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
- 背景色と前景色
- フォントのカスタマイズ
- サイズと 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:メニュー内の ToolStripItems のコレクション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
実装ワークフロー
- メニュー構成を計画する: 必要なメニュー項目、階層、項目の種類を特定します
- ContextMenuStripEx を追加する: デザイナーまたはコードを使用します
- メニュー項目を作成する: ToolStripMenuItems、TextBoxes、ComboBoxes、区切り線を追加します
- プロパティを設定する: テキスト、ショートカット、状態、外観を設定します
- 階層を構築する: 必要に応じて DropDownItems を使用してサブメニューを追加します
- イベントを関連付ける: 操作可能な各項目の Click イベントを登録します
- コントロールに関連付ける: コントロールの ContextMenuStrip プロパティを設定します
- 操作をテストする: 右クリックして、メニューが表示され、正しく機能することを確認します
- 外観をカスタマイズする: 必要に応じて色、フォント、サイズを設定します
- 動的な状態を処理する: コンテキストに応じて有効状態やチェック状態を更新します
トラブルシューティング
メニューが表示されない場合:
- 対象のコントロールに ContextMenuStrip プロパティが設定されていることを確認します
- メニューに少なくとも 1 つの項目があることを確認します
- コントロールで右クリックイベントが許可されていることを確認します
ショートカットが機能しない場合:
- ショートカットを表示するには、ShowShortcutKeys = true を設定します
- ShortcutKeys プロパティが正しく設定されていることを確認します
- 他のコントロールとのキーボードショートカットの競合を確認します
項目が有効にならない場合:
- メニュー項目の Enabled プロパティを確認します
- イベントハンドラーが状態を正しく更新していることを確認します
- メニューが表示される前に状態を更新するには、Opening イベントを使用します
サブメニューが表示されない場合:
- 親項目に DropDownItems が設定されていることを確認します
- サブメニュー項目が正しく初期化されていることを確認します
- 親項目が無効になっていないことを確認します
特定の機能の詳細については、ドキュメントとナビゲーションガイド セクションに記載されている該当するリファレンスファイルを参照してください。