So, you may have found yourself building a nice user-friendly, somewhat complicated Windows Forms application, that had lots of drop-down menus and right click context menus, and what not.. You may have naively assumed that you could share your menu items, so that you have a consistent set of options, icons, and more importantly event handlers for a particular menu item or set of menu items.
Well, I did… I had a Tools
drop-down menu with some basic functions that I wanted to also be accessible from a right-click content menu on a TreeView
. Redundant? Sure… Convenient? Definitely.
There's a little annoying detail that says that a ToolStripMenuItem
can't be "owned" by more than one ToolStrip
. In other words, it can only be in one place at a time. So, when you do something like this:
toolsToolStripMenuItem.DropDownItems.Add(myMenuItem);
treeNodeContextToolStrip.Items.Add(myMenuItem);
The menu item in question suddenly disappears from the tools menu, and appears in the content menu… Hmm…
So, in order to share the menu item, I came up with this hackish solution….I handled the Opening
event for the two menu strips and in each one, "took ownership" of the menu item. So, through sleight-of-hand it seems to exist in one place at a time. We can only get away with this because, ToolStrips, being modal, only show one at a time.
So, here's a simple sample:
private void treeNodeContextMenuStrip_Opening(object sender, CancelEventArgs e) {
treeNodeContextMenuStrip.Items.Insert(3, myToolStripMenuItem);
}
private void toolsToolStripMenuItem_DropDownOpening(object sender, EventArgs e) {
this.toolsToolStripMenuItem.DropDownItems.Insert(5, this.myToolStripMenuItem);
}