SoftCircuits.MenuStatus 1.0.2

The ID prefix of this package has been reserved for one of the owners of this package by NuGet.org. Prefix Reserved
dotnet add package SoftCircuits.MenuStatus --version 1.0.2
NuGet\Install-Package SoftCircuits.MenuStatus -Version 1.0.2
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="SoftCircuits.MenuStatus" Version="1.0.2" />
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add SoftCircuits.MenuStatus --version 1.0.2
#r "nuget: SoftCircuits.MenuStatus, 1.0.2"
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
// Install SoftCircuits.MenuStatus as a Cake Addin
#addin nuget:?package=SoftCircuits.MenuStatus&version=1.0.2

// Install SoftCircuits.MenuStatus as a Cake Tool
#tool nuget:?package=SoftCircuits.MenuStatus&version=1.0.2

SoftCircuits MenuStatus Component

NuGet version (SoftCircuits.MenuStatus)

Install-Package SoftCircuits.MenuStatus

Overview

For some reason, WinForms never had an event for when a menu item is selected. There is an event for when menu items are clicked. But not as the user highlights them. At first, you might think you could work around this using WndProc to intercept the WM_MENUSELECT message. But this message is never sent. Apparently, WinForms don't use standard Windows menus. And they don't send standard Windows menu messages.

MenuStatus addresses this shortcoming. It is a simple component for WinForms that provides an event for whenever the current menu selection changes. It works whether menu items are selected using the mouse or keyboard.

Usage

The component is simple to use. Just add it to a form by dragging it onto that form.

You will need to manually attach your menu by calling the AttachMenuStrip() method, passing your main MenuStrip control. You can do this in your form's Load event handler, or in your form's constructor after calling InitializeComponent().

menuStatus1.AttachMenuStrip(menuStrip1);

To have your code detect when the selected menu item changes, add a handler for the SelectedMenuItemChanged event.

private void menuStatus1_SelectedMenuItemChanged(object sender, MenuStatusControl.SelectedMenuItemChangedArgs e)
{
    // null means no menu item is selected
    ToolStripItem? selectedMenuItem = e.SelectedMenuItem
}

Displaying a Description for Highlighted Menu Items

If you want to display a description (for example, in the status bar) for each menu item as they are highlighted, the first question is: where will you store that description?

You could store it in the menu items' Tag property. For our example, we will store it in the menu items' ToolTipText property. This is slightly more straight forward because ToolTipText is already of type string, while Tag is of type object. So now our handler looks like this.

private void menuStatus1_SelectedMenuItemChanged(object sender, MenuStatusControl.SelectedMenuItemChangedArgs e)
{
    lblStatus.Text = e.SelectedMenuItem?.ToolTipText;
}

Disabling Menu Tool Tips

The code above works. However, because we used the ToolTipText property, menu tool tips now pop up as we hover over menu items. Chances are, you don't want to display both a description in the status bar and also a description in a tool tip.

This is easily remedied by setting the DisableMenuToolTips property to true. This must be done before you call AttachMenuStrip(). You can also set this property in the designer. (You could also go through and manually set the ShowItemToolTips property of all ToolStrip controls and the AutoToolTip property of all the ToolStripItem controls. We don't recommend that.)

Now, those tool tips no longer appear.

Calling AttachMenuStrip() More than Once

MenuStatus tracks the MenuStrips that are attached so you can safely call AttachMenuStrip() or DetachMenuStrip() multiple times.

Calling AttachMenuStrip() more than once (without calling DetachMenuStrip()) causes the MenuStrip to be detached and then reattached. This is useful if you have added new menu items to the menu. You will need to call AttachMenuStrip() again to have it recognize those new menu items.

Calling DetachMenuStrip() more than once (without calling AttachMenuStrip()) has no effect. Attempts to detach a MenuStrip that is not attached are ignored.

Product Compatible and additional computed target framework versions.
.NET net6.0-windows7.0 is compatible.  net7.0-windows was computed.  net8.0-windows was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.
  • net6.0-windows7.0

    • No dependencies.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last updated
1.0.2 453 1/17/2022
1.0.1 413 1/17/2022
1.0.0 412 1/16/2022

DetachMenuStrip no longer enables menu item tool tips when DisableMenuToolTips is false; Added SelectedMenuItem property; Miscellaneous tweaks.