不要在选择某些项目时关闭ContextMenuStrip

时间:2009-05-15 01:48:55

标签: c# .net user-interface contextmenustrip

在选择/检查某些项目后是否可以打开ContextMenuStrip?

我计划使用简单的ContextMenuStrip来设置过滤器(这样我可以在菜单中使用相同的过滤器或作为右键单击选项)。

菜单列出了许多项目,我希望用户能够使用基本检查功能选择项目。完成选择后,用户可以单击“激活”过滤器选项,也可以单击菜单外部以激活或取消过滤器。

在选择/点击事件中,菜单通常会关闭。 是否可以在点击事件中保持菜单打开?

9 个答案:

答案 0 :(得分:24)

如果未来的程序员想知道如何做到这一点,这就是我想到的。如果单击任何项​​目,则不会关闭上下文菜单。创建上下文菜单条关闭事件并设置if语句以取消关闭事件,如果关闭原因是itemclicked。

private void contextMenuStrip_Closing(object sender, ToolStripDropDownClosingEventArgs e)
{
    if (e.CloseReason == ToolStripDropDownCloseReason.ItemClicked)
        e.Cancel = true;
}

答案 1 :(得分:4)

结束活动

设置e.Cancel = true以使菜单保持打开状态

唯一的问题是事件没有告诉你点击了什么,所以你必须自己跟踪这个。在要保持菜单打开的项目的Click事件中设置某种标志。然后在Closing事件中检查标志并适当地设置e.Cancel。

答案 2 :(得分:3)

要防止在单击项目时关闭上下文菜单,请执行以下操作。

在ContextMenuItems的mousedown事件中将flag设置为false,然后在contextmenu的结束事件处将其设置回true。

示例:

Private blnClose As Boolean = True

Private Sub MoveUpToolStripMenuItem_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles MoveUpToolStripMenuItem.MouseDown

     blnClose = False

End Sub

Private Sub ContextMenuStrip1_Closing(ByVal sender As Object, ByVal e As System.Windows.Forms.ToolStripDropDownClosingEventArgs) Handles ContextMenuStrip1.Closing

     e.Cancel = Not blnClose
     blnClose = True

End Sub

答案 3 :(得分:1)

我认为在ContextMenuStrip中没有这个属性。

我们在应用程序中使用的变通方法是,在ContextMenuStrip的clicked事件中,我们进行一些处理,然后如果我们希望上下文菜单保持打开,我们只需再次调用ContextMenuStrip.Show。

如果ContextMenuStrip只有一个级别,这将很有效。如果有子菜单和子子菜单,那么你必须重新选择点击之前打开的菜单,我不知道如何做到这一点......

答案 4 :(得分:1)

OnClosing,执行:e.Cancel = e.CloseReason!= ToolStripDropDownCloseReason.CloseCalled; 然后当你决定关闭时,调用Close()。

答案 5 :(得分:1)

这是我的方法;它没有闪烁 - 我认为 - 更灵活一点。

如果你有一套ToolStripMenuItems你想用作切换按钮(选项开/关),试试这个:

ctxWildCards只是我的ContextMenuStrip,用于根据文件类型选择过滤器 - 用于搜索或FileDialogs)

这是在Visual Basic中(显然!;),因此您可以通过编程方式或使用“Handles ...”子句添加处理程序。

  Private Sub OnOffToolStripMenuItem_MouseDown(sender As System.Object, e As System.Windows.Forms.MouseEventArgs) 

    Dim t = TryCast(sender, ToolStripMenuItem)
    If Not t Is Nothing Then
        'Since you may have more On/off-Items, check to see if the Owner is the ContextMenuStrip 
        If t.Owner Is ctxWildCards Then
           ' The ContextMenuStrip will stay open on Right-click, i.e. the user can check and close by clicking 'normally'
            ctxWildCards.AutoClose = (e.Button = Windows.Forms.MouseButtons.Left)
        End If
        'Just me using a custom image for checked items.
        t.Checked = Not t.Checked
        t.Image = If(t.Checked, rdoImage, Nothing)
    End If
  End Sub

 ' On leaving ToolStripMenuItems of the ContextMenuStrip, allow it to AutoClose
  Private Sub OnOffToolStripMenuItem_MouseLeave(sender As System.Object, e As System.EventArgs)
  ctxWildCards.AutoClose = True
End Sub

答案 6 :(得分:1)

我发现奇怪的是ContextMenuStrip.Closing事件在ToolStripMenuItem.Click事件之前触发。解决方案是在ContextMenuStrip.ItemClicked处使用e.ClickedItem事件,然后检查它是否是单击之一时不会关闭ContextMenuStrip并设置相应标志的项目之一。然后在ContextMenuStrip.Closing中,如果还设置了标记,则可以设置e.Cancel = true;。不要忘记重置旗帜。

bool isRunAtStartupClicked;
private void ContextMenuStrip_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
{   
    if (e.ClickedItem == trayIcon.ContextMenuStrip.Items["miRunAtStartup"])
    {   
        isRunAtStartupClicked = true;
    }
}

private void ContextMenuStrip_Closing(object sender, ToolStripDropDownClosingEventArgs e)
{   
    if (e.CloseReason == ToolStripDropDownCloseReason.ItemClicked)
    {   
        if (isRunAtStartupClicked)
        {   
            isRunAtStartupClicked = false;
            e.Cancel = true;
        }
    }
}

答案 7 :(得分:0)

我发现没有闪烁的最佳方法是在DropDown菜单中为每个按钮使用MouseDown和MouseLeave事件。

示例:

Private Sub ToolStripMenuItem2_Mousedown(sender As Object, e As EventArgs) Handles ToolStripMenuItem2.MouseDown
        ΥπηρεσίεςToolStripMenuItem.DropDown.AutoClose = False
End Sub

Private Sub ToolStripMenuItem2_MouseLeave(sender As Object, e As EventArgs) Handles ToolStripMenuItem2.MouseLeave
        ΥπηρεσίεςToolStripMenuItem.DropDown.AutoClose = True
End Sub

答案 8 :(得分:0)

我发现这对我的目的很有用。

Private Sub CM_Closing(sender As Object, e As ToolStripDropDownClosingEventArgs) Handles CM.Closing
    If e.CloseReason = ToolStripDropDownCloseReason.ItemClicked Then
        Dim ItemClicked As String = CM.GetItemAt(New Point(Cursor.Position.X - CM.Left, Cursor.Position.Y - CM.Top)).Name
        If ItemClicked = "CMHeader" Then
            e.Cancel = True
        End If
    End If
End Sub

您可以使用ItemClicked来阅读标记或其他属性。

我只想要一个简单的项目,让用户明白上下文菜单将要生效的项目。