动态上下文菜单
本文关键字:菜单 上下文 动态 | 更新日期: 2023-09-27 18:04:00
我正试图想出一个解决方案来创建动态上下文菜单,可以在运行时生成。我已经实现了一个IGuiCommand
接口,它实现了类似于普通Command模式的东西。
interface IGuiCommand
{
Execute();
Undo();
bool CanUndo {get;set;}
Redo();
string CommandName {get;set;}
string CommandDescription {get;set;}
}
这个想法是允许右键单击控件提交它自己的命令列表,以显示在给定的上下文菜单中。
虽然我可以让每个控件构建上下文菜单,但我更喜欢使用单个上下文菜单并动态生成菜单,以便在运行时更容易管理。当控件状态或应用程序状态发生更改时,我希望上下文菜单能够反映更改。例如,如果我右键单击一个复选框,那么该复选框将提交给上下文菜单一个启用或禁用命令,以显示根据复选框的当前Checked值。
我想我可以很容易地实现这一点,如果我有一些方法知道哪个控件是"右键单击",以便为该特定控件调出上下文菜单。
似乎令人惊讶的是,ContextMenu
事件没有提供一个EventArg
,表明右键单击控件(或任何命令,将导致上下文菜单弹出)
您只需要重写ContextMenuStrip_Opening事件。发送方对象是一个ContextMenuStrip,它包含一个SourceControl元素。当你使用正确的强制转换时,你就可以访问你需要的一切。
private void contextMenuStrip1_Opening(object sender, System.ComponentModel.CancelEventArgs e) {
var contextMenu = (sender as ContextMenuStrip);
if (contextMenu != null) {
var sourceControl = contextMenu.SourceControl;
contextMenuStrip1.Items.Clear();
//contextMenuStrip1.Items.Add(...);
}
}