Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 禁用控件(如按钮)上的上下文菜单_C#_Winforms - Fatal编程技术网

C# 禁用控件(如按钮)上的上下文菜单

C# 禁用控件(如按钮)上的上下文菜单,c#,winforms,C#,Winforms,我正在寻找一种使用按钮的ContextMenu启用/禁用按钮的方法。但我的问题是,当我点击EnableMenuItem来禁用按钮时,ContextMenu将不再显示 有没有办法在禁用的控件上保持上下文菜单或其他行为 ContextMenu cm = new ContextMenu(); cm.MenuItems.Add("Enable", new EventHandler(enableButton)); this.button1.ContextMenu = cm; private voi

我正在寻找一种使用按钮的
ContextMenu
启用/禁用按钮的方法。但我的问题是,当我点击Enable
MenuItem来禁用按钮时,
ContextMenu
将不再显示

有没有办法在禁用的控件上保持
上下文菜单
或其他行为

ContextMenu cm = new ContextMenu();
cm.MenuItems.Add("Enable", new EventHandler(enableButton));

this.button1.ContextMenu = cm;



private void enableButton(object sender, EventArgs e)
{
    MenuItem menuItem = sender as MenuItem;
    if (menuItem != null)
    {
        ContextMenu menu = menuItem.GetContextMenu();
        Control sourceControl = menu.SourceControl;
        sourceControl.Enabled = !sourceControl.Enabled;
    }
}

有一种解决方法可以检测窗体的鼠标右键单击事件并显示上下文菜单。使用
this.GetChildAtPoint(e.Location)
可以找到右键单击的控件

private void Form1_MouseUp(object sender, MouseEventArgs e)
{
     if (e.Button == MouseButtons.Right
          && this.GetChildAtPoint(e.Location)?.Name == "enableButton")
     {
        ContextMenu.Show();
     }
 }

使用Enabled属性,可以在运行时启用或禁用控件 时间例如,可以禁用不应用于的控件 应用程序的当前状态。您还可以禁用控件以 限制其使用。例如,可以禁用按钮以防止 禁止用户单击它。如果控件被禁用,则无法对其进行修改 选中

当容器控件的enabled属性设置为false时,所有 其包含的控件也被禁用。例如,如果用户 单击禁用的GroupBox中包含的任何控件 控件,则不会引发任何事件

因此,禁用的控件无法引发任何事件

您可以创建自己的禁用方法,该方法使按钮变大并禁用单击事件,以及反向启用方法

基于@ESIComplayer sugestion,您可以执行以下操作:

private void Form1_MouseUp(object sender, MouseEventArgs e)
{
    if (e.Button == MouseButtons.Right)
    {
        Point pt = e.Location;

        Control ctrl = this.GetChildAtPoint(pt);

        if (ctrl != null)
        {
            ContextMenu menu = ctrl.ContextMenu;              

            menu.Show(ctrl, new Point(10,10));
        }                    
    }
}

创建您自己的禁用功能,将按钮设置为灰色,截取它们的事件,这样按钮将显示为禁用,但可以接收ContextMenu事件。这种行为是“故意的”

你可以很容易地将btn.Font设置为禁用。对于事件,一种方法是在禁用时取消订阅它们,并在启用时连接它们,下面是一个获取控件事件的示例

dynamic controltype = btn;
var events = Type.ReflectionOnlyGetType(controltype.AssemblyQualifiedName, false, true).GetEvents();
foreach (var item in events)
{
  //EventHandler<T> use a generic Event Handler to Subscribe and Unsubscribe
}
动态控制类型=btn;
var events=Type.ReflectionOnlyGetType(controltype.AssemblyQualifiedName,false,true);
foreach(事件中的变量项)
{
//EventHandler使用通用事件处理程序来订阅和取消订阅
}

创建您自己的禁用功能,将按钮设置为灰色,截取它们的事件,这样按钮将显示为禁用,但可以接收ContextMenu事件。这种行为是“按设计”的,即使有可能,也将是一种糟糕的设计,因为没有人会尝试右键单击禁用控件。唯一有意义的情况是UI设计器。但是如果你点击表单,它不会指定你点击的控件?因此,如果有多个ContextMenu,这将不起作用。可以使用
GetChildAtPoint
找到控件。但我同意这不是一个干净的解决方案嗨,我试过这样做
dynamic controltype=new Button()并在下一行中出错:附加信息:“System.Windows.Forms.Button”不包含“AssemblyQualifiedName”的定义