2009-11-26 9 views
0

J'essaie de créer une hiérarchie de menus imbriqués à partir de la barre de menus principale. Par exemple, la barre de menu principale contiendrait un menuitem "Goto" qui pourrait être navigué comme "Aller à" -> "Chapitre" -> "Nom du chapitre" -> "Nom du sous-chapitre".Le menu WPF disparaît lorsqu'il est imbriqué trop profondément

La hiérarchie sous "Chapitre" doit être ajoutée dynamiquement. Lorsque je fais cela, le menu disparaît lorsqu'il essaie d'afficher les sous-éléments d'un nom de chapitre. Si vous exécutez l'exemple de code ci-dessous, vous pouvez cliquer sur "Aller à" et "Chapitre", mais dès que vous survolez ou cliquez sur l'un des noms de chapitre, les menus disparaissent sans autoriser l'un des noms de sous-section être cliqué.

Quelqu'un peut-il me dire pourquoi?

using System; 
using System.Windows; 
using System.Windows.Controls; 

namespace MenuTest 
{ 
    public class MenuTest : Window 
    { 
     // Main method 
     [STAThread] 
     public static void Main() 
     { 
      Application App = new Application(); 
      App.Run(new MenuTest()); 
     } 

     // Properties: 
     Menu MainMenu; 
     MenuItem GotoMenu; 
     MenuItem ChapterMenu; 

     // Constructor 
     public MenuTest() 
     { 
      // Add a menu with a "Goto" submenu that opens up a pop-up with a "Chapter" selection: 
      // ---------------------------------------------------------------------------------- 
      MainMenu = new Menu(); 
      DockPanel.SetDock(MainMenu, Dock.Top); 
      this.Content = MainMenu; 

      GotoMenu = new MenuItem(); 
      GotoMenu.Header = "Goto"; 
      GotoMenu.SubmenuOpened += OnSubMenuOpen; 
      MainMenu.Items.Add(GotoMenu); 

      ChapterMenu = new MenuItem(); 
      ChapterMenu.Header = "Chapter"; 
      GotoMenu.Items.Add(ChapterMenu); 
     } 

     // Add a chapter and subchapter hiearachy to the Chapter menu: 
     void OnSubMenuOpen(object Sender, RoutedEventArgs e) 
     { 
      ChapterMenu.Items.Clear(); 
      string[] ChapterNames = { "Chapter 1", "Chapter 2", "Chapter 3" }; 
      foreach (string ChapterName in ChapterNames) 
      { 
       MenuItem ThisChapterMenu = new MenuItem(); 
       ThisChapterMenu.Header = ChapterName; 
       ChapterMenu.Items.Add(ThisChapterMenu); 

       string[] SubChapterNames = { "SubSection 1", "SubSection 2", "SubSection 3" }; 
       foreach (string SubChapterName in SubChapterNames) 
       { 
        MenuItem SectionMenu = new MenuItem(); 
        SectionMenu.Header = String.Format("{0} - {1}", ChapterName, SubChapterName); 
        ThisChapterMenu.Items.Add(SectionMenu); 
       } 
      } 
     } 
    } 
} 

Répondre

1

OnSubMenuOpen est appelé à chaque niveau de menu ci-dessous GotoMenu, ouvrant ainsi ChapterMenu chaque expansion.

Sur la première ligne de OnSubMenuOpen, vérifier où l'appel provient de:

void OnSubMenuOpen(object Sender, RoutedEventArgs e) 
{ 
    if (e.Source != GotoMenu) return; 
+0

Excellent, fonctionne comme un charme maintenant! Merci beaucoup! –

Questions connexes