diff --git a/Terminal.Gui/Views/Menu.cs b/Terminal.Gui/Views/Menu.cs index 3260efc5d..cb85f366b 100644 --- a/Terminal.Gui/Views/Menu.cs +++ b/Terminal.Gui/Views/Menu.cs @@ -943,6 +943,17 @@ namespace Terminal.Gui { /// public Key Key { get; set; } = Key.F9; + /// + public override bool Visible { + get => base.Visible; + set { + base.Visible = value; + if (!value) { + CloseAllMenus (); + } + } + } + /// /// Initializes a new instance of the . /// @@ -1745,10 +1756,11 @@ namespace Terminal.Gui { public override bool ProcessHotKey (KeyEvent kb) { if (kb.Key == Key) { - if (!IsMenuOpen) + if (Visible && !IsMenuOpen) { OpenMenu (); - else + } else { CloseAllMenus (); + } return true; } diff --git a/UnitTests/Menus/MenuTests.cs b/UnitTests/Menus/MenuTests.cs index 1d28899f6..6d615947d 100644 --- a/UnitTests/Menus/MenuTests.cs +++ b/UnitTests/Menus/MenuTests.cs @@ -1787,5 +1787,27 @@ Edit Assert.False (CanExecuteNew ()); Assert.True (CanExecuteClose ()); } + + [Fact, AutoInitShutdown] + public void Visible_False_Key_Does_Not_Open_And_Close_All_Opened_Menus () + { + var menu = new MenuBar (new MenuBarItem [] { + new MenuBarItem ("File", new MenuItem [] { + new MenuItem ("New", "", null) + }) + }); + Application.Top.Add (menu); + Application.Begin (Application.Top); + + Assert.True (menu.Visible); + Assert.True (menu.ProcessHotKey (new KeyEvent (menu.Key, new KeyModifiers ()))); + Assert.True (menu.IsMenuOpen); + + menu.Visible = false; + Assert.False (menu.IsMenuOpen); + + Assert.True (menu.ProcessHotKey (new KeyEvent (menu.Key, new KeyModifiers ()))); + Assert.False (menu.IsMenuOpen); + } } }