首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> C# >> 關於C#

WinForms 動態建立 ContextMenu (右鍵選單) 完整教學

     編輯:關於C#

情境

多個控制項 (CheckBox, RadioButton) 共用一個 ContextMenu,根據觸發控制項動態顯示不同選單項目。

設計步驟

  1. 工具箱拖入 ContextMenu 元件 (命名 ctxShared)。
  2. 設定各控制項 ContextMenu = ctxShared。
  3. 訂閱 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項目點擊處理

進階:ContextMenuStrip (取代 ContextMenu)

.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;

最佳實踐

  • 共用選單:相似功能控制項共用一個 ContextMenu/ContextMenuStrip,Popup/Opening 事件中依 SourceControl 動態調整。
  • 避免記憶體洩漏:動態建立 MenuItem 時,若附加事件處理器,確保選單銷毀時移除 (或使用 Lambda 捕獲弱參考)。
  • 鍵盤無障礙:ContextMenuStrip 內建支援方向鍵導航、Enter 執行、Esc 關閉。
  • 圖示與快速鍵:ToolStripMenuItem.Image, ShortcutKeys 提升專業度。

從 ContextMenu 遷移至 ContextMenuStrip

  1. 移除舊 ContextMenu 元件。
  2. 加入 ContextMenuStrip,設計項目。
  3. 將控制項 ContextMenu 屬性設為 null,ContextMenuStrip 設為新元件。
  4. Popup → Opening 事件 (取消屬性 Cancel 可阻止顯示)。

動態選單讓 UI 更精簡、邏輯集中,配合 ContextMenuStrip 即可打造現代化右鍵選單體驗。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved