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;