【问题标题】:ContextMenuStrip not showing on the first time of being right clicked第一次右键单击时未显示 ContextMenuStrip
【发布时间】:2017-10-08 17:57:02
【问题描述】:

我已经通过扩展面板和其他一些东西以编程方式添加了一个上下文菜单条, 它正在通过面板的构造函数设置到面板的上下文菜单中。

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

我还尝试将 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);
        }
    }

【问题讨论】:

  • 给我们看一些代码。
  • 点击事件等在哪里?我们需要更好地了解您的问题。代码为我们提供了价值千言万语的图片。尽你所能。

标签: c# forms winforms


【解决方案1】:

我发现(好吧,在 DotPeek 的帮助下)当使用空白 ContextMenuStripControlContextMenuStrip 属性时,您可以动态添加项目 System.Windows.Forms 中的代码实际上设置CancelEventArgsCancel 属性被传递给Opening 处理程序到true,因为上下文菜单起初是空的并且不包含任何项目。

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

所以我确保上下文菜单始终显示(包括第一个)的解决方法是始终将CancelEventArgs'Cancel 属性设置为truefalse,而不是(错误地)依赖无论如何都要初始化为false...

【讨论】:

    【解决方案2】:

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

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

    show 方法使菜单有点偏离,我选择了“new Point(eX,e.Y+45)”来正确放置它,但我仍然不喜欢这样我'我这样做看起来真的很不专业..

    我猜还是谢谢..

    【讨论】:

      【解决方案3】:

      就我而言,我需要通过单击 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);
          }
      

      【讨论】:

        【解决方案4】:

        向 notifyicon 添加一个 MouseClick 事件。 如下处理事件:

        private void NotifyIconClicked(object sender, MouseEventArgs e)
        {
            _dashboard.ShowHiddenWindow();
            if (e.Button == MouseButtons.Right)
            {
                MethodInfo ShowContextMenu = typeof(NotifyIcon).GetMethod("ShowContextMenu", BindingFlags.Instance | BindingFlags.NonPublic);
                if (ShowContextMenu != null)
                {
                    ShowContextMenu.Invoke(_notifyIcon, null);
                }
            }
        }
        

        我相信必须为此激活主窗口,但我还没有确定是否测试过这个条件。无论如何,这是我必须实施的事情。

            internal static void ShowHiddenWindow(this Window window)
            {
                try
                {
                    if (!window.IsVisible)
                    {
                        window.Show();
                    }
        
                    if (!window.IsFocused)
                    {
                        window.Activate();
                    }
                    window.WindowState = WindowState.Normal;
                }
                catch
                {
                    // Avoids "Cannot set visibility while window is closing".
                }
            }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-04-04
          • 1970-01-01
          • 2012-09-02
          • 2020-01-13
          • 1970-01-01
          • 2013-02-27
          • 1970-01-01
          相关资源
          最近更新 更多