ContextMenuStrip在第一次被右键单击时未显示

时间:2017-10-08 17:57:02

标签: c# forms winforms

我已经通过面板的扩展以及其他一些东西以编程方式添加了一个contextmenustrip, 它通过面板的构造函数设置到面板的contextmenu中。

我第一次右键单击不起作用,然后它会在第一次之后总是。

我还尝试将contextmenustrip的构造函数和其分配给面板的上下文菜单,例如 Load 和表单的构造函数,甚至是带有标志的计时器,所有产生了相同的结果..

编辑:(根据要求提供一些代码(原样并切入重点))

class FiniteAutomationController : System.Windows.Forms.Panel
{
    public FiniteAutomationController()
        : base()
    {
    this.ContextMenuStrip = (cms = new ContextMenuStrip());
    }
    public ContextMenuStrip cms;
}

编辑:(每个blaze_125的请求,更多代码)

//at form designer initializecomponents after Controller(FiniteAutomationController)'s initialization

this.Controller.cms.Opening += new System.ComponentModel.CancelEventHandler(this.cms_Load);

//at form code class
    static State contextS = null;
    static Action contextA = null;
    private void cms_Load(object sender, CancelEventArgs e)
    {
        Controller.cms.Items.Clear();

        if ((contextS = FiniteAutomationData.GetStateFrom(mouseX, mouseY)) != null) // Rclick States
        {
            Controller.cms.Items.Add("Delete"); Controller.cms.Items[0].Click += new EventHandler(cms_DeleteState);
            Controller.cms.Items.Add("Rename"); Controller.cms.Items[1].Click += new EventHandler(cms_RenameState);
            Controller.cms.Items.Add((contextS.final ? '\u2714' : ' ') + " Final"); Controller.cms.Items[2].Click += new EventHandler(cms_Final);
            Controller.cms.Items.Add((contextS.initial ? '\u2714' : ' ') + " Initial"); Controller.cms.Items[3].Click += new EventHandler(cms_Initial);
            Controller.cms.Items.Add("Trap"); Controller.cms.Items[4].Click += new EventHandler(cms_Trap);
            if (!contextS.error.Equals(""))
            {
                Controller.cms.Items.Add("Error: " + contextS.error); 
                Controller.cms.Items[5].Enabled = false;
            }
        }
        else if((contextA = FiniteAutomationData.GetActionFrom(mouseX,mouseY)) != null) // Rclick Action
        {
            Controller.cms.Items.Add("Delete"); Controller.cms.Items[0].Click += new EventHandler(cms_DeleteAction);
        }
        else // Rclick null
        {
            Controller.cms.Items.Add("Add State"); Controller.cms.Items[0].Click += new EventHandler(cms_AddState);
        }
    }

3 个答案:

答案 0 :(得分:0)

在过去的3天里,我设法找到了一个我认为非常糟糕的解决方案,但仍然是一个解决方案..

我所做的是使用Controller的MouseDown事件并使用标志, 首次使用它的 Show(Point)方法显示上下文菜单。

show方法放下了菜单,我选择了" new Point(e.X,e.Y + 45)"正确地放置它仍然我不喜欢我做的,因为它似乎真的不专业..

非常感谢,我猜..

答案 1 :(得分:0)

对于我来说,我需要通过单击ToolStripButton显示上下文菜单。第一次单击时未显示。我以这种方式解决了这个问题

    void _TsiMenu_Click(object sender, EventArgs e)
    {
        AdjustableMenu.Show(this, this.PointToClient(Cursor.Position), ToolStripDropDownDirection.Default);
        Application.DoEvents();
        if (AdjustableMenu.Visible == false)
            AdjustableMenu.Show(this, this.PointToClient(Cursor.Position), ToolStripDropDownDirection.Default);
    }

答案 2 :(得分:0)

我发现(在DotPeek的帮助下)当对ContextMenuStrip的{​​{1}}属性使用空白的Control时,您可以在其中动态添加代码实际上,ContextMenuStrip会将传递给System.Windows.Forms处理程序的Cancel的{​​{1}}属性设置为CancelEventArgs,因为首先上下文菜单为空并且不包含任何项目

在后续调用中,即使您在Opening处理程序中所做的第一件事是清除所有项目,true属性也将设置为Opening

因此,确保始终显示上下文菜单(包括第一个菜单)的方法是始终将Cancel'false属性设置为CancelEventArgs或{{1 }},而不是(错误地)始终依靠它初始化为Cancel ...