C# 嵌套太深时,WPF菜单将消失

C# 嵌套太深时,WPF菜单将消失,c#,wpf,menu,nested,menuitem,C#,Wpf,Menu,Nested,Menuitem,我正在尝试从主菜单栏创建嵌套菜单层次结构。例如,主菜单栏将包含一个“转到”菜单项,可导航为“转到”->“章节”->“章节名称”->“子章节名称” 需要动态添加“章节”下面的层次结构。当我这样做时,当它试图显示章节名称的子项时,菜单将消失 如果您运行下面的代码示例,您可以单击“转到”和“章节”,但只要您将鼠标悬停在或单击其中一个章节名称,菜单就会消失,而不允许单击其中一个小节名称 谁能告诉我为什么 using System; using System.Windows; using System.W

我正在尝试从主菜单栏创建嵌套菜单层次结构。例如,主菜单栏将包含一个“转到”菜单项,可导航为“转到”->“章节”->“章节名称”->“子章节名称”

需要动态添加“章节”下面的层次结构。当我这样做时,当它试图显示章节名称的子项时,菜单将消失

如果您运行下面的代码示例,您可以单击“转到”和“章节”,但只要您将鼠标悬停在或单击其中一个章节名称,菜单就会消失,而不允许单击其中一个小节名称

谁能告诉我为什么

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);
                }
            }
        }
    }
}

对于GotoMenu下面的每一级菜单,都会调用OnSubMenuOpen,因此每次展开时都会清除ChapterMenu

在OnSubMenuOpen的第一行,检查呼叫的来源:

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