C# 如何使用按钮单击切换ContextMenuStrip显示,同时允许其正常关闭(菜单项单击、失去焦点等)
我创建了一个简单的UserControl,它由一个标签和ContextMenuStrip组成。我让它像一个组合框一样工作,但是我没有显示下拉列表,而是显示一个ContextMenuStrip 我有它的工作,但有一些诡计,我不明白 我试图使标签ComboButton的工作方式与ComboBox相同。单击按钮,将显示下拉列表。再按一下按钮,它就会缩回。问题是,只要单击鼠标,ContextMenu就会消失。因此,当我第二次单击按钮收回菜单时,菜单首先消失,然后单击事件触发,再次显示菜单 我仍然希望当用户选择菜单项时,以及当他们像普通上下文菜单一样单击表单上的任意位置时,菜单消失C# 如何使用按钮单击切换ContextMenuStrip显示,同时允许其正常关闭(菜单项单击、失去焦点等),c#,winforms,user-controls,contextmenustrip,C#,Winforms,User Controls,Contextmenustrip,我创建了一个简单的UserControl,它由一个标签和ContextMenuStrip组成。我让它像一个组合框一样工作,但是我没有显示下拉列表,而是显示一个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);
}
}
}
所以,我稍微改写了你的鼠标:
private void lblSelect_MouseUp(object sender, MouseEventArgs e)
{
if (IsDropdownHit(e) && cmsItems.Tag == null)
{
cmsItems.Width = lblSelect.Width;
cmsItems.Show(lblSelect, 0, lblSelect.Height);
cmsItems.Tag = "Shown";
}
else
{
cmsItems.Hide();
cmsItems.Tag = null;
}
}
现在,它将关闭。但是-如果你不使用按钮关闭,你将不得不点击两次打开它,下次
此“错误”的解决方法:
根据表单的设计方式,可能需要调整MouseEventArgs坐标,才能成功确定下拉点击。我刚刚将CMenu控件添加到一个空表单中
对于解决方法,请不要忘记将处理程序添加到CMenu.cs的构造函数中:
cmsItems.Closed += cmsItems_Closed;
cmsItems.Closed += cmsItems_Closed;