Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Разработка Windows Forms > ContextMenuStrip


Автор: lioness 25.8.2006, 13:38
Я дублирую из основного меню MenuStrip одну веточку в контекстное меню.

После того, как пишу 
Код

ctxtMenuView.Items.Add(menuView);


это самое "View" из основного меню исчезает и начинает работать только в контекстном.  smile 

Что-то типа, как стоит у меня в примере, "menu.Clone()" я в VS 2005 не нашла  smile 

Как мне правильно задублировать менюшку: и на главное и на контекстное. На МДСН бестолковый пример какой-то на контестное меню

Автор: mr.DUDA 25.8.2006, 15:39
Было и у меня такое, пришлось руками копировать меню поэлементно.

Автор: lioness 25.8.2006, 16:09
Копировала... Компилятор не проходит вот эта строка 
Код

 ctxtMenuView.Items.Add(cms);

Цитата

The best overloaded method match for 'System.Windows.Forms.ToolStripItemCollection.Add(string)' has some invalid arguments

Какой стринг, если cms и menuImage - одного класса ...   С   menuImage значитьЦа никаких проблем, а с другим вдруг "Стринг" !
А если убрать строку и запустить, то вылетает на ошибку в foreach
Код

private void DefineContextMenu()
        {
            ContextMenuStrip cms = new ContextMenuStrip();
            foreach (ToolStripMenuItem mi in menuImage.DropDownItems)
                  cms.Items.Add (mi);
             //ctxtMenuView.Items.Add(menuImage);
             ctxtMenuView.Items.Add(cms);
        }

Цитата

Collection was modified; enumeration operation may not execute


Я неправильно копирую? smile 

Автор: reloni 25.8.2006, 17:25
Цитата(lioness @  25.8.2006,  16:09 Найти цитируемый пост)
Я неправильно копирую?  

Неправильноsmile
Используй for вместо foreach, если нужно что-то модифицировать.

Автор: lioness 25.8.2006, 18:28
А, да и правда... Что-то припоминаю про foreach. Но я спИсывала вот тут с учебника:
Код

private void DefineContextMenu()
{
// Copy the View menu into ctxtMenuView
foreach (MenuItem mi in menuView.MenuItems)
{
ctxtMenuView.MenuItems.Add (mi.Index, mi.CloneMenu());
}
}


Только у меня КлонаМеню что-то нет. Отменили наверное.

А отчего тогда вот эту строку компилятор не жрёть:
Код

ctxtMenuView.Items.Add(cms);
 
У меня стоит двумя строками объявление 
Код

ContextMenuStrip cms = new ContextMenuStrip();

а он мне "Стриииииииииинг". 

Автор: ivashkanet 28.8.2006, 08:56
lioness, если уж даешь код, то давай весь нужный. 
Например что за объекты menuImage, ctxtMenuView, menuView?

Автор: lioness 28.8.2006, 11:06
Сделано незамысловатое "выпадающее" меню (по-новому, которое "StripMenu")

        
Код

private void InitializeComponent()
        {
            this.components = new System.ComponentModel.Container();
            //   . . . . . . . . . . . .             
             this.menuFile = new System.Windows.Forms.MenuStrip();
            this.menuExit = new System.Windows.Forms.ToolStripMenuItem();
            this.menuLoad = new System.Windows.Forms.ToolStripMenuItem();
            this.exitToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
            this.menuView = new System.Windows.Forms.ToolStripMenuItem();
            this.menuImage = new System.Windows.Forms.ToolStripMenuItem();
            this.menuStretch = new System.Windows.Forms.ToolStripMenuItem();
            this.menuActual = new System.Windows.Forms.ToolStripMenuItem();
            // . . . . . . . . . . . . . 

           // 
            // menuFile
            // 
            this.menuFile.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
            this.menuExit,
            this.menuView});
            this.menuFile.Location = new System.Drawing.Point(0, 0);
            this.menuFile.Name = "menuFile";
            this.menuFile.Size = new System.Drawing.Size(627, 24);
            this.menuFile.TabIndex = 1;
            this.menuFile.Text = "menuStrip1";
            // 
            // menuExit
            // 
            this.menuExit.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
            this.menuLoad,
            this.exitToolStripMenuItem});
            this.menuExit.Name = "menuExit";
            this.menuExit.Size = new System.Drawing.Size(35, 20);
            this.menuExit.Text = "&File";
            // 
            // menuLoad
            // 
            this.menuLoad.Name = "menuLoad";
            this.menuLoad.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.L)));
            this.menuLoad.Size = new System.Drawing.Size(145, 22);
            this.menuLoad.Text = "&Load";
            this.menuLoad.Click += new System.EventHandler(this.menuLoad_Click);
            // 
            // exitToolStripMenuItem
            // 
            this.exitToolStripMenuItem.Name = "exitToolStripMenuItem";
            this.exitToolStripMenuItem.Size = new System.Drawing.Size(145, 22);
            this.exitToolStripMenuItem.Text = "E&xit";
            this.exitToolStripMenuItem.Click += new System.EventHandler(this.exitToolStripMenuItem_Click);
            // 
            // menuView
            // 
            this.menuView.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
            this.menuImage});
            this.menuView.Name = "menuView";
            this.menuView.Size = new System.Drawing.Size(41, 20);
            this.menuView.Text = "&View";
            // 
            // menuImage
            // 
            this.menuImage.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
            this.menuStretch,
            this.menuActual});
            this.menuImage.Name = "menuImage";
            this.menuImage.Size = new System.Drawing.Size(115, 22);
            this.menuImage.Text = "&Image";
            // 
            // menuStretch
            // 
            this.menuStretch.Enabled = false;
            this.menuStretch.Name = "menuStretch";
            this.menuStretch.Size = new System.Drawing.Size(148, 22);
            this.menuStretch.Text = "S&tretch to Fit";
            this.menuStretch.Click += new System.EventHandler(this.menuImage_ChildClick);
            // 
            // menuActual
            // 
            this.menuActual.Enabled = false;
            this.menuActual.Name = "menuActual";
            this.menuActual.Size = new System.Drawing.Size(148, 22);
            this.menuActual.Text = "&Actual Size";
            this.menuActual.Click += new System.EventHandler(this.menuImage_ChildClick);
            // . . . . . . . . . . . .
        private System.Windows.Forms.MenuStrip menuFile;
        private System.Windows.Forms.ToolStripMenuItem menuExit;
        private System.Windows.Forms.ToolStripMenuItem menuLoad;
        private System.Windows.Forms.ToolStripMenuItem exitToolStripMenuItem;
        private System.Windows.Forms.ToolStripMenuItem menuView;
        private System.Windows.Forms.ToolStripMenuItem menuImage;
        private System.Windows.Forms.ToolStripMenuItem menuStretch;
        private System.Windows.Forms.ToolStripMenuItem menuActual;

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



Открыть файл-фото, закрыть все, показать в натуральную величину или "тянуть" размер следом за формой.  "Sub - меню", которые  "StrechImage" и "Normal" стоят с "галочкой", т.е. один из двух режимов. Я уж не буду расписывать все events. Работает менюшка. 
Потом добавлен ContentxMenuStrip в положенных местах дизайнейра, чтобы продублировать веточку менюшки View в контект-меню:

          
Код

this.ctxtMenuView = new System.Windows.Forms.ContextMenuStrip(this.components);
  
          // привязывается в фото-боксу, куда файл-фотка вызывается
            this.pbxPhoto.ContextMenuStrip = this.ctxtMenuView;
 
            // ctxtMenuView
            // 
            this.ctxtMenuView.Name = "ctxtMenuView";
            this.ctxtMenuView.Size = new System.Drawing.Size(61, 4);
            // . . . . . . . . . . . 
            private System.Windows.Forms.ContextMenuStrip ctxtMenuView;
  

Согласно книжке добавлен в конструктор Define для контекста

 
Код

            InitializeComponent();
            DefineContextMenu();


И вот сразу после этого дифайна веточка View  в меню сверху стоит "голая". Она начинает работать только в контекстном меню.

В книжке процедура предложена так:
Код

private void DefineContextMenu()
{// Copy the View menu into ctxtMenuView
foreach (MenuItem mi in menuView.MenuItems)
{
ctxtMenuView.MenuItems.Add
(mi.Index, mi.CloneMenu());
}
}


Т.е. КЛОН   Наверное, так было правильно в той версии. Здесь этот конструктор вообще через компилятор не проходит и подсказки ".Clone" нет. Я написАла так:
Код


        private void DefineContextMenu()
        {
            ContextMenuStrip cms = new ContextMenuStrip();
            foreach (ToolStripMenuItem mi in menuImage.DropDownItems)
                  cms.Items.Add (mi);
  
            ctxtMenuView.Items.Add(cms);
        }

     }


Компилятор лается, что под 'System.Windows.Forms.ToolStripItemCollection.Add(string)'  аргумент-инвалид. Я ему предложила так:

Код

            foreach (ToolStripMenuItem mi in menuImage.DropDownItems)
                  cms.Items.Add (mi.ToString());


Та же самая ошибка в компиляторе.

А если поставить просто одну строку 
Код

        private void DefineContextMenu()
        {
           ctxtMenuView.Items.Add(menuImage);
        }


то ветка их верхнего меню исчезает, как я уже сказала. Стоит одна "голая" View", а "Image" перемещается в контекст. Меню нормально работает, но только в новом контекстном месте. Как-то элементарно нужно склонировать, продублировать. В МДСН всё вообще по-другому в контекстном стоит.  Может быть, можно мой DefineContextMenu парами строчек исправить?
     

Автор: VisualProgrammerNET 1.9.2006, 13:51
Сразу вопрос (даже не просматривая код):
Если компилятор чётко просит в параметрах функции menu.Add передать стринг, почему бы не дать ему этот стринг? Насколько я понимаю, этот метод просто добавит одну строку меню с заданным названием. А потом обработчики этой строки нужно будет программить отдельно. 
Можно хоть до посинения передавать вместо стринга другое меню, но компилятор тебе обмануть или переубедить не удастся. Сколько я ни пробовал - не вышло до сих пор  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)