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


Автор: U237 25.11.2008, 01:44
Как правильно дополнять динамически меню на C#?
скажем есть такой код в xaml

Код

<Menu Height="22" Name="menu1" VerticalAlignment="Top" />


В коде:

Код

menu1.Items.Add("_File");
menu1.Items.Add("_Edit");


Это работает, а как создать подменю? 
Как обращаться к новым пунктам? 
Как повесить обработчик на созданный пункт меню? 

Автор: Idsa 25.11.2008, 06:25
U237, не проверял, но думаю, что метод Add возвращает ссылку на объект нового элемента меню. А если у Вас есть ссылка на объект, то все вышеперечисленные действия
Цитата(U237 @  25.11.2008,  05:44 Найти цитируемый пост)
как создать подменю? 
Как обращаться к новым пунктам? 
Как повесить обработчик на созданный пункт меню? 

становятся тривиальными.

Автор: U237 25.11.2008, 11:06
Метод Add возвращает значение типа int. Судя по всему это номер элемента в массиве. Но получить доступ к этому элементу у меня не получается, код компилируется, а при выполнении происходит исключение.
Код

MenuItem temp = (MenuItem)menu1.Items[0];

Странно и то что изменили конструктор теперь он не принимает ни одного параметра.
Код

MenuItem myMenu = new MenuItem();

Автор: Partizan 25.11.2008, 11:40
Цитата

Странно и то что изменили конструктор теперь он не принимает ни одного параметра.


Это сделано для того, чтобы в дизайнере всё нормально отображалось.


MenuItem myMenu = new MenuItem();


U237, какое исключение кидается?

Автор: rooks 25.11.2008, 19:47
Цитата
Это работает, а как создать подменю? 
Как обращаться к новым пунктам? 
Как повесить обработчик на созданный пункт меню?

Лучше явно создавать объекты, которые нужно добавлять в меню, тогда потом проще кодить будет. Вот так, например:
Код
    menu1.Items.Add(new MenuItem() { Name = "_File" });
    menu1.Items.Add(new MenuItem() { Name = "_Edit" });

Кстати из примера, думаю, понятно зачем убрали параметры у конструкторов smile. Если хочется почитать по-подробнее гуглим на тему object initializers. Так как MenuItem это ItemsControl, то добавлять подменю можно аналогично предыдущему примеру:
Код
    ((MenuItem)menu1.Items[0]).Items.Add(new MenuItem() { Name = "subItem1" });
    ((MenuItem)menu1.Items[0]).Items.Add(new MenuItem() { Name = "subItem2" });


Автор: U237 26.11.2008, 00:19
Код и идея понятен и вроде работает но названия самого меню не отображается не в основном меню не в подменю.

Автор: U237 26.11.2008, 11:18
Все разобрался всем спасибо!
Поле называется по другому.
Код

menu1.Items.Add(new MenuItem() { Head = "_File" });

Хотя все равно есть странности этот код работает.
Код

MenuItem myExit = new MenuItem();
myExit.Header = "_test3";
myExit.Click += myClic;
menu1.Items.Add(myExit);


а вот этот код
Код

menu1.Items.Add(new MenuItem() { Head = "_File",  Click += myClic;});

Утверждает что поля Click не существует.

Автор: rooks 26.11.2008, 13:34
C помощью object initializers можно устанавливать значения полей и свойств, а Click - это событие, так что придется использовать первый вариант. Или такой:
Код
    MenuItem myExit = new MenuItem { Header = "_test3" };
    myExit.Click += myClic;
    menu1.Items.Add(myExit);

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