Introduction
This article shows how to implement a basic, chooser-style dropdown toolbar button. It seemed very strange to me that this simple widget was nowhere to be found in Visual Studio .NET, given that it exists in almost every single Windows application.
The closest you can get is a dropdown button that looks like this:
This is fine if the purpose of the button is two-fold (to perform some action in addition to presenting a choice), however sometimes you simply want to present a choice to the user. A good example is implementing a view configuration chooser button, such as can be found in the Windows file explorer. Here, allowing the user to click on the button makes no sense at all.
Using the Code
This widget is implemented as a UserControl
, which can be included in any C# Windows project. To use the widget, simply drag and drop it onto your form, and place it on top of an existing, docked toolbar. You will need both a ContextMenu
, and an ImageList
on your form, which can be associated with the widget in its property sheet:
The code to implement the button is quite simple - although it took a while to get it right... The key is to use the MouseDown
event to bring up the context menu, and to use the Paint
event of the control to set the 'Pushed
' state of the button to 'false
', when the menu goes away. In order to force the Paint
event to fire, you have to call Invalidate()
on the control before bringing up the context menu.
private void On_toolBar_MouseDown(object sender,
System.Windows.Forms.MouseEventArgs e)
{
if (this.m_contextMenu == null)
{
return;
}
if (!this.w_toolBarButton.Rectangle.Contains(new
System.Drawing.Point(e.X,e.Y)))
{
return;
}
if (!this.w_toolBarButton.Pushed)
{
this.w_toolBarButton.Pushed = true;
this.ToolBarContextMenu.Show(this.w_toolBar,
new System.Drawing.Point(0,22));
this.Invalidate();
}
}
private void On_ToolbarDropDownButton_Paint(object sender,
System.Windows.Forms.PaintEventArgs e)
{
this.w_toolBarButton.Pushed = false;
}
License
This article has no explicit license attached to it, but may contain usage terms in the article text or the download files themselves. If in doubt, please contact the author via the discussion board below.
A list of licenses authors might use can be found here.