一次选择一个刀具带菜单项



我有一个带4个选项的工具栏菜单。选项是屏幕旋转的度数。(0、90、180、270(我试图只选择其中的一个并保持选中状态。当我选择一个然后选择另一个时,两者都会被勾选。我已经搜索并找到了一些解决方案,但只有这一点对我有效。我对每个选项都使用了点击事件来清除未选中的选项,如下所示。

Private Sub DegreesToolStripMenuItem6_Click(sender As Object, e As EventArgs) Handles DegreesToolStripMenuItem6.Click
DegreesToolStripMenuItem6.Checked = True
DegreesToolStripMenuItem7.Checked = False
DegreesToolStripMenuItem8.Checked = False
DegreesToolStripMenuItem9.Checked = False
End Sub

这个sub在我的代码中出现了4次,以使其工作,但我相信必须有一种更干净、更简单的方法来做到这一点。

我在网上找到了一些其他的解决方案,但我似乎无法让它发挥作用,这有点道理,好像它应该发挥作用,但我无法找出

Private Sub DegreesToolStripMenuItem6_CheckedChanged(sender As Object, e As EventArgs) Handles DegreesToolStripMenuItem6.CheckedChanged, _
DegreesToolStripMenuItem7.CheckedChanged, _
DegreesToolStripMenuItem8.CheckedChanged, _
DegreesToolStripMenuItem9.CheckedChanged
Dim currentItem As ToolStripMenuItem = TryCast(sender, ToolStripMenuItem)
If currentItem IsNot Nothing AndAlso currentItem.Checked Then
Dim menu As ContextMenuStrip = TryCast(currentItem.Owner, ContextMenuStrip)
If menu IsNot Nothing Then
'The current item has just been checked so uncheck all other items on the same context menu strip.
For Each item As ToolStripMenuItem In menu.Items
If item IsNot currentItem Then
item.Checked = False
End If
Next item
End If
End If
End Sub

工具行程菜单读起来像这个

-PreferedRotationToolStripMenuItem-DegreesToolStripMenuItem6
DegreesToolStripMenuItem7
DegreesToolStripMenuItem8
DegreesToolStripMenuItem9

感谢你们抽出时间,期待你们能提供的任何帮助。

为每个菜单项设置CheckOnClickTrue,我猜您已经有了。这个代码对我有效:

Private Sub ToolStripMenuItems_CheckedChanged(sender As Object, e As EventArgs) Handles DegreesToolStripMenuItem9.CheckedChanged,
                  DegreesToolStripMenuItem8.CheckedChanged,
                  DegreesToolStripMenuItem7.CheckedChanged,
                  DegreesToolStripMenuItem6.CheckedChanged
Dim currentMenuItem = DirectCast(sender, ToolStripMenuItem)
If currentMenuItem.Checked Then
Dim menu = DirectCast(currentMenuItem.Owner, ContextMenuStrip)
For Each menuItem In menu.items.Cast(Of ToolStripMenuItem)
menuItem.Checked = menuItem Is currentMenuItem
Next
End If
End Sub

这里有一个细微的变化,可以避免检查已经检查过的当前项目:

Private Sub ToolStripMenuItems_CheckedChanged(sender As Object, e As EventArgs) Handles DegreesToolStripMenuItem9.CheckedChanged,
                  DegreesToolStripMenuItem8.CheckedChanged,
                  DegreesToolStripMenuItem7.CheckedChanged,
                  DegreesToolStripMenuItem6.CheckedChanged
Dim currentMenuItem = DirectCast(sender, ToolStripMenuItem)
If currentMenuItem.Checked Then
Dim menu = DirectCast(currentMenuItem.Owner, ContextMenuStrip)
For Each menuItem In menu.Items.Cast(Of ToolStripMenuItem).Except({currentMenuItem})
menuItem.Checked = False
Next
End If
End Sub

如果您已将项目添加到ContextMenuStrip中,则上面的代码有效。如果您已将它们直接添加到MenuStrip上的项目中,则更改此项:

Dim menu = DirectCast(currentMenuItem.Owner, ContextMenuStrip)

到此:

Dim menu = DirectCast(currentMenuItem.Owner, ToolStripDropDownMenu)

最新更新