Я написал нечто очень похожее на это некоторое время назад. Код, который я использовал, вставлен ниже, и вы можете изменить его в соответствии со своими потребностями.
ToolStripCustomiseMenuItem - это, по сути, ваша кнопка «Дополнительно», которая при нажатии заполняет контекстное меню DropDown. Надеюсь, это поможет вам, по крайней мере, это должно быть хорошей отправной точкой ...
public class ToolStripCustomiseMenuItem : ToolStripDropDownButton {
public ToolStripCustomiseMenuItem()
: base("Add Remove Buttons") {
this.Overflow = ToolStripItemOverflow.Always;
DropDown = CreateCheckImageContextMenuStrip();
}
ContextMenuStrip checkImageContextMenuStrip = new ContextMenuStrip();
internal ContextMenuStrip CreateCheckImageContextMenuStrip() {
ContextMenuStrip checkImageContextMenuStrip = new ContextMenuStrip();
checkImageContextMenuStrip.ShowCheckMargin = true;
checkImageContextMenuStrip.ShowImageMargin = true;
checkImageContextMenuStrip.Closing += new ToolStripDropDownClosingEventHandler(checkImageContextMenuStrip_Closing);
checkImageContextMenuStrip.Opening += new CancelEventHandler(checkImageContextMenuStrip_Opening);
DropDownOpening += new EventHandler(ToolStripAddRemoveMenuItem_DropDownOpening);
return checkImageContextMenuStrip;
}
void checkImageContextMenuStrip_Opening(object sender, CancelEventArgs e) {
}
void ToolStripAddRemoveMenuItem_DropDownOpening(object sender, EventArgs e) {
DropDownItems.Clear();
if (this.Owner == null) return;
foreach (ToolStripItem ti in Owner.Items) {
if (ti is ToolStripSeparator) continue;
if (ti == this) continue;
MyToolStripCheckedMenuItem itm = new MyToolStripCheckedMenuItem(ti);
itm.Checked = ti.Visible;
DropDownItems.Add(itm);
}
}
void checkImageContextMenuStrip_Closing(object sender, ToolStripDropDownClosingEventArgs e) {
if (e.CloseReason == ToolStripDropDownCloseReason.ItemClicked) {
e.Cancel = true;
}
}
}
internal class MyToolStripCheckedMenuItem : ToolStripMenuItem {
ToolStripItem tsi;
public MyToolStripCheckedMenuItem(ToolStripItem tsi)
: base(tsi.Text) {
this.tsi = tsi;
this.Image = tsi.Image;
this.CheckOnClick = true;
this.CheckState = CheckState.Checked;
CheckedChanged += new EventHandler(MyToolStripCheckedMenuItem_CheckedChanged);
}
void MyToolStripCheckedMenuItem_CheckedChanged(object sender, EventArgs e) {
tsi.Visible = this.Checked;
}
}