多個控制項 (CheckBox, RadioButton) 共用一個 ContextMenu,根據觸發控制項動態顯示不同選單項目。
ContextMenu 元件 (命名 ctxShared)。ContextMenu = ctxShared。ctxShared.Popup 事件,動態建構選單。
public partial class DynamicMenuForm : Form
{
public DynamicMenuForm()
{
InitializeComponent();
// 設計器已設定 checkBox1.ContextMenu = radioButton1.ContextMenu = ctxShared
ctxShared.Popup += CtxShared_Popup;
chkThreeState.CheckState = CheckState.Unchecked; // 示範 ThreeState
}
private void CtxShared_Popup(object sender, EventArgs e)
{
ctxShared.MenuItems.Clear(); // 每次彈出重建
// 共用項目:Checked / Unchecked
ctxShared.MenuItems.Add("Checked", (s, e) => SetCheckState(CheckState.Checked));
ctxShared.MenuItems.Add("Unchecked", (s, e) => SetCheckState(CheckState.Unchecked));
// 僅 CheckBox 顯示 Indeterminate (利用 SourceControl 判斷)
if (ctxShared.SourceControl == chkThreeState)
{
ctxShared.MenuItems.Add("Indeterminate", (s, e) => SetCheckState(CheckState.Indeterminate));
}
}
private void SetCheckState(CheckState state)
{
// 根據 SourceControl 設定對應控制項
switch (ctxShared.SourceControl)
{
case CheckBox cb: cb.CheckState = state; break;
case RadioButton rb: rb.Checked = state == CheckState.Checked; break;
}
}
}
| 成員 | 用途 |
|---|---|
| ContextMenu.SourceControl | 觸發右鍵選單的控制項 |
| ContextMenu.Popup | 選單顯示前觸發,適合動態增減項目 |
| MenuItems.Clear/Add | 動態重建選單項目集合 |
| MenuItem.Click / Lambda | 項目點擊處理 |
.NET 2.0+ 推薦使用 ContextMenuStrip (支援圖示、動畫、鍵盤快速鍵、右對齊等)。
var cms = new ContextMenuStrip();
cms.Items.Add("複製", null, (s,e) => Clipboard.SetText(txtInput.Text));
cms.Items.Add("貼上", null, (s,e) => txtInput.Text = Clipboard.GetText());
cms.Opening += (s,e) =>
{
cms.Items[1].Enabled = Clipboard.ContainsText(); // 動態啟用/停用
};
txtInput.ContextMenuStrip = cms;
Popup/Opening 事件中依 SourceControl 動態調整。ContextMenuStrip 內建支援方向鍵導航、Enter 執行、Esc 關閉。ToolStripMenuItem.Image, ShortcutKeys 提升專業度。ContextMenu 元件。ContextMenuStrip,設計項目。ContextMenu 屬性設為 null,ContextMenuStrip 設為新元件。Popup → Opening 事件 (取消屬性 Cancel 可阻止顯示)。動態選單讓 UI 更精簡、邏輯集中,配合 ContextMenuStrip 即可打造現代化右鍵選單體驗。