Dynamically Clone ToolStripMenuItem для ContexMenuStrip С# Winforms

-4

У меня есть рабочее меню ToolStripMeniItem.

Я также создал ContextMenuStrip и назначил его PictureBox

Я хочу клонировать/копировать элементы, которые у меня есть в ToolStripMeniItem, в ContextMenuStrip

Для этого у меня есть следующий код:

    this.components = new System.ComponentModel.Container();
this.pbxPhoto = new System.Windows.Forms.PictureBox();
this.menuView = new System.Windows.Forms.ToolStripMenuItem();
this.ctxMenuView = new System.Windows.Forms.ContextMenuStrip(this.components);

this.menuView.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.menuImage});
this.menuView.Name = "menuView";
this.menuView.Size = new System.Drawing.Size(53, 24);
this.menuView.Text = "&View";

this.menuImage.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.menuStretch,
this.menuActual});
this.menuImage.Name = "menuImage";
this.menuImage.Size = new System.Drawing.Size(126, 26);
this.menuImage.Text = "&Image";
this.menuImage.DropDownOpening += new System.EventHandler(this.menuImage_DropDownOpening);

private PictureBoxSizeMode[] modeMenuArray =
{
PictureBoxSizeMode.StretchImage,
PictureBoxSizeMode.Normal
};
private int _selectedImageMode = 0;

private void menuImage_DropDownOpening(object sender, EventArgs e)
{
if(sender is ToolStripMenuItem)
{
bool bImageLoaded = (pbxPhoto.Image != null);

foreach (ToolStripMenuItem mi in ((ToolStripMenuItem)sender).DropDownItems)
{
mi.Enabled = bImageLoaded;
mi.Checked = (this._selectedImageMode == mi.MergeIndex);
}
}
}

private void menuImage_ChildClick(object sender, EventArgs e)
{
if (sender is ToolStripMenuItem)
{
ToolStripMenuItem mi = (ToolStripMenuItem)sender;

_selectedImageMode = mi.MergeIndex;
pbxPhoto.SizeMode = modeMenuArray[mi.MergeIndex];

pbxPhoto.Invalidate();
}
}

private void DefineContextMenu()
{
foreach(ToolStripMenuItem mi in menuView.DropDownItems)
{
//ctxMenuView.Items.Add(mi.Name); // Debug 1
ctxMenuView.Items.Add(mi);
}
}

Для целей отладки, если я использую строку комментариев Debug 1, код работает нормально: enter image description here

Если я использую код выше, я получил ошибку: enter image description here

Которая после ":" означает: коллекция была изменена; операция перечисления может не выполняться.

Что я могу сделать в своем коде (функция DefineContextMenu()), чтобы он передавал содержимое ToolStripMenuItems в мой ContextMenuStrip??

спросил(а) 2017-08-29T23:53:00+03:00 2 года, 10 месяцев назад
0
108

Я только нашел решение. Дело в том, чтобы сначала создать ContextMenuStrip, а затем присвоить его свойству DropDown объекта ToolStripMenuItem.

Код ключа следующий:

menuView.DropDown = ctxMenuView;

Это связано с тем, что класс ContextMenuStrip основан на классе ToolStripDropDown и определяет свойство Items для хранения коллекции экземпляров ToolStripItem; Объект ToolsStripMenuItem основан на классе ToolStripDropDownItem, который определяет свойство DropDown, которое содержит экземпляр ToolsStripDropDown.

ответил(а) 2017-08-30T01:11:00+03:00 2 года, 10 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема