Меню WPF исчезает, если вложено слишком глубоко - PullRequest
0 голосов
/ 27 ноября 2009

Я пытаюсь создать вложенную иерархию меню из строки главного меню. Например, строка главного меню будет содержать элемент меню «Перейти к», который можно перемещать как «Перейти» -> «Глава» -> «Имя главы» -> «Имя подглавы».

Иерархия под «Главой» должна добавляться динамически. Когда я это делаю, меню исчезает при попытке отобразить подпункты названия главы.

Если вы запустите приведенный ниже пример кода, вы можете нажать «Перейти» и «Глава», но как только вы наведете указатель мыши или на одно из названий глав, меню исчезнут, и одно из подразделов не будет быть нажатым.

Может кто-нибудь сказать мне, почему?

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

1 Ответ

1 голос
/ 27 ноября 2009

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

В первой строке OnSubMenuOpen проверьте источник вызова:

 void OnSubMenuOpen(object Sender, RoutedEventArgs e)
 {
    if (e.Source != GotoMenu) return;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...