2008-11-14 2 views
17

У меня есть простое приложение WPF с меню. Мне нужно добавлять элементы меню динамически во время выполнения. Когда я просто создаю новый пункт меню и добавляю его в свой родительский MenuItem, он не отображается в меню, независимо от того, вызван ли UpdateLayout.WPF: Как вы можете добавить новое меню в меню во время выполнения?

Что должно случиться, чтобы меню включало дополнительные элементы, динамически добавляемые во время выполнения?

Примечание: следующий код не работает.

  MenuItem mi = new MenuItem(); 
      mi.Header = "Item to add"; 
      mi.Visibility = Visibility.Visible; 
      //addTest is a menuitem that exists in the forms defined menu 
      addTest.Items.Add(mi); 
      addTest.UpdateLayout(); 

В настоящее время элементы меню по умолчанию определены в файле xaml. Я хочу добавить дополнительные пункты меню в это меню и его существующие пункты меню. Однако, как указано, вышеуказанный код ничего не делает.

ответ

20
//Add to main menu 
MenuItem newMenuItem1 = new MenuItem(); 
newMenuItem1.Header = "Test 123"; 
this.MainMenu.Items.Add(newMenuItem1); 

//Add to a sub item 
MenuItem newMenuItem2 = new MenuItem(); 
MenuItem newExistMenuItem = (MenuItem)this.MainMenu.Items[0]; 
newMenuItem2.Header = "Test 456"; 
newExistMenuItem.Items.Add(newMenuItem2); 
+0

Это не работает для меня и отражает то, что я пробовал. Что мне не хватает? См. Пример текста, который не работает. – 2008-11-14 22:05:57

+0

Я просто добавил новое меню и запустил код со свойствами управления по умолчанию, и он работал, как ожидалось. Я пробовал ваш код, и он работал на моей машине.Создайте новый проект, добавьте базовое меню и не корректируйте его свойства и повторите попытку. – Whytespot 2008-11-14 22:14:16

6

Я успешно добавил пункты меню в предварительно определенный пункт меню. В следующем коде LanguageMenu определен в представлении дизайна в th xaml, а затем добавлен подпункты на C#.

XAML:

<MenuItem Name="LanguageMenu" Header="_Language"> 
    <MenuItem Header="English" IsCheckable="True" Click="File_Language_Click"/> 
</MenuItem> 

C#:

// Clear the existing item(s) (this will actually remove the "English" element defined in XAML) 
LanguageMenu.Items.Clear(); 

// Dynamically get flag images from a specified folder to use for definingthe menu items 
string[] files = Directory.GetFiles(Settings.LanguagePath, "*.png"); 
foreach (string imagePath in files) 
{ 
    // Create the new menu item 
    MenuItem item = new MenuItem(); 

    // Set the text of the menu item to the name of the file (removing the path and extention) 
    item.Header = imagePath.Replace(Settings.LanguagePath, "").Replace(".png", "").Trim("\\".ToCharArray()); 
    if (File.Exists(imagePath)) 
    { 
    // Create image element to set as icon on the menu element 
    Image icon = new Image(); 
    BitmapImage bmImage = new BitmapImage(); 
    bmImage.BeginInit(); 
    bmImage.UriSource = new Uri(imagePath, UriKind.Absolute); 
    bmImage.EndInit(); 
    icon.Source = bmImage; 
    icon.MaxWidth = 25; 
    item.Icon = icon; 
    } 

    // Hook up the event handler (in this case the method File_Language_Click handles all these menu items) 
    item.Click += new RoutedEventHandler(File_Language_Click); 

    // Add menu item as child to pre-defined menu item 
    LanguageMenu.Items.Add(item); // Add menu item as child to pre-defined menu item 
} 
4

Я знаю, что это старый пост, но я столкнулся с той же проблемой. В моем случае проблема заключалась в том, что в XAML <menuitem> был непосредственно включен в <toolbar>. Как только я положил <menuitem> в <menu>, он начал работать. Итак:

<toolbar> 
    <menuitem> 
    </menuitem> 
</toolbar> 

плохо

<toolbar> 
    <menu> 
     <menuitem> 
     </menuitem> 
    </menu> 
</toolbar> 

хорошо

-1

ASP.NET -> Web Forms -> Создать меню

CREATE TABLE `webmenu` (
    `idmenu` smallint(5) NOT NULL, 
    `submenu` smallint(5) DEFAULT NULL, 
    `menu_title` varchar(45) DEFAULT NULL, 
    `menu_url` varchar(45) DEFAULT NULL, 
    `status` enum('1','0') DEFAULT '1', 
    PRIMARY KEY (`idmenu`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

SELECT 
idmenu, 
(select menu_title from webmenu where idmenu=wm.submenu and status='1') as childmenu, 
menu_title, 
menu_url 
FROM tartyp.webmenu as wm 
where 
status='1' 
order by idmenu, submenu; 

 cmd = new MySql.Data.MySqlClient.MySqlCommand(queryStr, conn); 

     reader = cmd.ExecuteReader(); 
     MainMenu.Items.Clear(); 
     while (reader.Read()) 
     { 

      if (reader["childmenu"] == DBNull.Value) 
      { 
       MenuItem homeMenuItem = new MenuItem(reader["menu_title"].ToString(), reader["menu_url"].ToString()); 
       MainMenu.Items.Add(homeMenuItem); 
      } 
      else 
      { 
       String childmenu = reader["childmenu"].ToString();      

       for (int i = 0; i < MainMenu.Items.Count; i++) 
       { 
        if (MainMenu.Items[i].Text == childmenu) 
        {              
         MenuItem childMenuItem = new MenuItem(reader["menu_title"].ToString(), reader["menu_url"].ToString()); 
         MenuItem findMenuItem = MainMenu.Items[i]; 
         findMenuItem.ChildItems.Add(childMenuItem); 
         break;  
        } 
       } 
      } 

     } 
     reader.Close(); 
     conn.Close(); 
0

I d id должны содержать имена для существующих элементов, которые я планировал динамически создавать подпозиции для. Кроме того, я столкнулся с проблемой, где я врезка в случае Window_Loaded и прыгал из события после запуска этого:

row.MoveFocus(new TraversalRequest(FocusNavigationDirection.First)); 

я должен был гарантировать, что я загрузил пункты меню перед запуском линии выше.

Причина, по которой этот вопрос, скорее всего, распространен, заключается в том, что intellisense сообщает, что коллекция предметов «Только для чтения». Этот ответ является частично дополнительным, потому что вышеприведенные ответы указывают на то, что если у вас есть уже существовавшие элементы, вам нужно либо удалить их в коде, либо не иметь их вообще. Это неверно. Мне удалось получить эту работу с существующими элементами и добавить дополнительные динамические пункты меню в код:

<DataGrid AutoGenerateColumns="False" HorizontalAlignment="Stretch" Margin="12,29,12,12" Name="grid" VerticalAlignment="Stretch" Background="#FF3A81A0" AlternatingRowBackground="#FFD9EEF2" FontSize="15" RowHeaderWidth="0" KeyDown="grid_KeyDown"> 
     <DataGrid.ContextMenu> 
      <ContextMenu> 
       <MenuItem Header="_Encrypt Row Values" Click="MenuItem_ContextMenu_Click_EncryptRowValues" Name="MenuItem_EncryptRowValues" /> 
       <MenuItem Header="De_crypt Row Values" Click="MenuItem_ContextMenu_Click_DecryptRowValues" Name="MenuItem_DecryptRowValues" /> 
       <MenuItem Header="Copy Row_s" Click="MenuItem_ContextMenu_Click_CopyRows" /> 
      </ContextMenu> 
     </DataGrid.ContextMenu> 
     <DataGrid.Resources> 


      //Add Encryption Menu Items 
      for (int i=0; i< encryptionKeys.Count; i++) 
      { 
       MenuItem keyOption = new MenuItem(); 
       keyOption.Header = "_" + i.ToString() + " " + encryptionKeys[i]; 
       MenuItem_EncryptRowValues.Items.Add(keyOption); 
      } 

      //Add Decryption Menu Items 
      for (int i = 0; i < encryptionKeys.Count; i++) 
      { 
       MenuItem keyOption = new MenuItem(); 
       keyOption.Header = "_" + i.ToString() + " " + encryptionKeys[i]; 
       MenuItem_DecryptRowValues.Items.Add(keyOption); 
      } 
Смежные вопросы