我创建了一个由标签和 ContextMenuStrip 组成的简单用户控件。我使它的功能类似于 ComboBox,但我显示的是 ContextMenuStrip,而不是下拉菜单。
我有它的工作,但有一些我无法弄清楚的棘手问题。
我正在尝试使标签 ComboButton 的工作方式与 ComboBox 相同。点击按钮,出现下拉菜单。再次单击该按钮,它将收回。问题是,ContextMenu 在任何鼠标单击时都会消失。因此,当我第二次单击按钮以收回菜单时,菜单首先消失,然后单击事件触发,再次显示菜单。
我仍然希望菜单在用户选择菜单项时消失,并且当他们像普通上下文菜单一样单击表单上的任意位置时。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Drawing.Drawing2D;
using System.Windows.Forms.VisualStyles;
using System.Diagnostics;
namespace Controls
{
public partial class CMenu : UserControl
{
ButtonState _buttonState = ButtonState.Normal;
public CMenu()
{
InitializeComponent();
}
private void lblSelect_Paint(object sender, PaintEventArgs e)
{
base.OnPaint(e);
ControlPaint.DrawComboButton(e.Graphics, getLabelRect(), _buttonState);
}
private bool IsDropdownHit(MouseEventArgs e)
{
Rectangle cursor = new Rectangle(e.X, e.Y, 1, 1);
if (e.Button == MouseButtons.Left && cursor.IntersectsWith(getLabelRect()))
{
return true;
}
return false;
}
private void lblSelect_MouseUp(object sender, MouseEventArgs e)
{
if (!IsDropdownHit(e))
return;
if (!cmsItems.Visible)
lblSelect.ContextMenuStrip = cmsItems;
cmsItems.Width = lblSelect.Width;
cmsItems.Show(lblSelect, 0, lblSelect.Height);
}
private Rectangle getLabelRect()
{
return new Rectangle(lblSelect.Width - 20, 0, 20, lblSelect.Height);
}
}
}