.NET 2.0+ 推薦使用 ContextMenuStrip(替代舊版 ContextMenu),支持圖標、快捷鍵、分隔符、圖片、透明度、動畫等現代特性。
contextMenuStrip1,設計面板顯示菜單編輯區。Image 屬性)、設置快捷鍵(ShortcutKeys)、勾選框(CheckOnClick)、子菜單(展開右側箭頭)。dataGridView1),屬性面板找到 ContextMenuStrip 屬性,下拉選擇 contextMenuStrip1。public partial class MainForm : Form {
private ContextMenuStrip _gridMenu;
private ContextMenuStrip _treeMenu;
public MainForm() {
InitializeComponent();
CreateContextMenus();
BindContextMenus();
}
private void CreateContextMenus() {
// DataGridView 專用菜單
_gridMenu = new ContextMenuStrip();
_gridMenu.Items.Add("複製", null, (s, e) => CopyGridSelection());
_gridMenu.Items.Add("貼上", null, (s, e) => PasteToGrid());
_gridMenu.Items.Add(new ToolStripSeparator());
var deleteItem = _gridMenu.Items.Add("刪除行", null, (s, e) => DeleteGridRows());
deleteItem.ShortcutKeys = Keys.Delete;
deleteItem.Image = Properties.Resources.DeleteIcon;
// TreeView 專用菜單
_treeMenu = new ContextMenuStrip();
_treeMenu.Items.Add("新增子節點", null, (s, e) => AddTreeChild());
_treeMenu.Items.Add("重命名", null, (s, e) => RenameTreeNode());
_treeMenu.Items.Add("展開所有", null, (s, e) => treeView1.ExpandAll());
}
private void BindContextMenus() {
dataGridView1.ContextMenuStrip = _gridMenu;
treeView1.ContextMenuStrip = _treeMenu;
// 也可設置窗體級:this.ContextMenuStrip = _gridMenu;
}
// 菜單事件處理示例
private void CopyGridSelection() {
if (dataGridView1.GetClipboardContent() is DataObject data) {
Clipboard.SetDataObject(data);
}
}
}
private void contextMenuStrip1_Opening(object sender, CancelEventArgs e) {
var cms = (ContextMenuStrip)sender;
var dgv = cms.SourceControl as DataGridView;
if (dgv == null) return;
// 獲取點擊位置的單元格
var hit = dgv.HitTest(dgv.PointToClient(Cursor.Position));
bool hasSelection = dgv.SelectedCells.Count > 0;
bool onRow = hit.RowIndex >= 0;
cms.Items["複製"].Enabled = hasSelection;
cms.Items["貼上"].Enabled = Clipboard.ContainsText();
cms.Items["刪除行"].Enabled = onRow && !dgv.Rows[hit.RowIndex].IsNewRow;
}
// 在特定位置彈出(如按鈕點擊下方)
contextMenuStrip1.Show(button1, new Point(0, button1.Height));
// 或屏幕坐標
contextMenuStrip1.Show(Cursor.Position);
ImageScaling = ToolStripItemImageScaling.SizeToFit 自動縮放。| 問題 | 原因/解決 |
|---|---|
| 右鍵無反應 | 未設置控件 ContextMenuStrip 屬性;控件 Enabled=false;被父容器攔截 |
| 菜單項事件不觸發 | 未綁定 Click 事件;Lambda 捕獲變量問題 |
| 圖標不顯示 | Image 為 null;ImageTransparentColor 未設置(舊版圖標需指定透明色) |
| 快捷鍵不生效 | 菜單未顯示時快捷鍵不工作;衝突與主菜單/其他控件 |
| 動態添加項目不顯示 | 在 Opening 事件中修改 Items 集合需注意線程安全 |
WPF 使用 ContextMenu,支持 XAML 聲明:
<TextBox>
<TextBox.ContextMenu>
<ContextMenu>
<MenuItem Header="複製" Command="Copy" />
<MenuItem Header="貼上" Command="Paste" />
</ContextMenu>
</TextBox.ContextMenu>
</TextBox>