【问题标题】:Avoid toolstripmenu closed on item selected避免在所选项目上关闭工具条菜单
【发布时间】:2016-02-22 01:06:14
【问题描述】:

我在 vb.net 上有一个系统托盘应用程序。这个应用程序有一个带有多个选项的菜单。有一个选择语言应用程序的选项。此语言选项包含三个子菜单:英语、法语和西班牙语。

以下是三个子菜单的代码片段:

submnuEnglish = New ToolStripMenuItem(rm.GetString("ContextMenusToolStripMenuItemLangEnglish"))
submnuEnglish.Image = My.Resources.en
submnuEnglish.CheckOnClick = True

submnuSpanish = New ToolStripMenuItem(rm.GetString("ContextMenusToolStripMenuItemLangSpanish"))
submnuSpanish.Image = My.Resources.es
submnuSpanish.CheckOnClick = True

submnuFrench = New ToolStripMenuItem(rm.GetString("ContextMenusToolStripMenuItemLangFrench"))
submnuFrench .Image = My.Resources.fr
submnuFrench .CheckOnClick = True

在 rutime 中,每次我从语言选项菜单中选择一种语言时,应用程序主菜单都会在选择后自动关闭,因此我需要右键单击系统托盘应用程序才能再次访问应用程序主菜单。我希望能够选择语言,而不会在每次选择时关闭语言子菜单/主应用程序菜单。

我该怎么做?

解决方案 - 已更新: mngLanguage 下方对应一个 ToolStripMenuItem 对象,其中包含 ToolStripMenuItem 类型的选项 submnuEnglish、submnuSpanish 和 submnuFrench。

MainMenu 是 ContextMenuStrip 类型的应用主菜单。

Private Sub ToolStripMenuItem_Click(ByVal sender As Object, ByVal e As System.EventArgs)

    ' uncheck the old ones
    Dim selectedLanguage As ToolStripMenuItem = CType(sender, ToolStripMenuItem)
    For Each language As ToolStripMenuItem In mnuLanguage.DropDownItems
        If Not Object.Equals(selectedLanguage, language) Then
            language.CheckState = CheckState.Unchecked
        End If
    Next

    ' check the new one
    selectedLanguage.CheckState = CheckState.Checked

    ' Prevents language menu from being hiding
    ' Thanks to Crush Sundae ;) that guide me in the right direction with his comment
    Me.mnuLanguage.DropDown.Show()
End Sub

Private Sub MainMenu_Closing(ByVal sender As Object, _
                             ByVal e As System.Windows.Forms.ToolStripDropDownClosingEventArgs) _
Handles MainMenu.Closing

    ' Avoid main menu for closing on language selection
    If submnuEnglish.Pressed Or _
       submnuSpanish.Pressed Or _
       submnuFrench.Pressed Then

        e.Cancel = True
    End If

End Sub

在单击的语言项目上刷新 UI 需要以下事件。如果未实现,则在选中一项(语言)时,在鼠标移动后不会取消选中前一项。

Private Sub mnuLanguage_DropDownItemClicked( _
    ByVal sender As Object, _
    ByVal e As System.Windows.Forms.ToolStripItemClickedEventArgs) _
Handles mnuLanguage.DropDownItemClicked

    ' Refresh language selection on dropdown menu
    If e.ClickedItem.Equals(submnuEnglish) Then
        ' English language selected
        submnuSpanish.Checked = False
        submnuFrench.Checked = False
    ElseIf e.ClickedItem.Equals(submnuSpanish) Then
        ' Spanish language selected
        submnuEnglish.Checked = False
        submnuFrench.Checked = False
    Else
        ' French language selected
        submnuEnglish.Checked = False
        submnuSpanish.Checked = False
    End If

End Sub

通过上述实现,它就像一个魅力!

在实施上述解决方案之前,我尝试使用以下方法解决它:

mnuLanguage.DropDown.AutoClose = True or False depending on the case

但这样做会导致 UI 行为异常、奇怪的行为,例如,带有子菜单的菜单不会在鼠标悬停时自动下拉。从我的角度来看,不建议使用它。

【问题讨论】:

    标签: vb.net contextmenu contextmenustrip toolstripmenu


    【解决方案1】:

    点击后再次打开。

    由于我无法从您的代码中看到更多信息,因此请使用 this 作为我所说内容的参考。

    Private Sub TestToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TestToolStripMenuItem.Click
         Me.ToolStripDropDownButton1.ShowDropDown()
    EndSub
    

    【讨论】:

    • 我更新了我的帖子。我已经通过实施另一个事件来解决它,其中一个就是你所说的。谢谢!
    • 我很高兴它有帮助。 :)
    猜你喜欢
    • 1970-01-01
    • 2017-12-25
    • 2011-05-11
    • 1970-01-01
    • 1970-01-01
    • 2018-06-04
    • 1970-01-01
    • 2019-08-02
    • 2014-09-25
    相关资源
    最近更新 更多