如何在VB.NET中将类似的工具条按钮程序降级为单个

如何在VB.NET中将类似的工具条按钮程序降级为单个,vb.net,winforms,Vb.net,Winforms,我正在使用ToolStrip及其按钮来更改GUI结构,并给出了一个示例代码,说明如何使用ToolStrip按钮更改GUI。有没有更简单的方法来使用它们,比如当点击ToolStripButton的事件时,它可以调用单个过程等。?在目前的情况下,似乎我的编码方式不好 例如,如果用户单击“主页”按钮,它将高亮显示选定的按钮,并隐藏其他面板元素,并使主页的面板可见 Private Sub tsbHome_Click(sender As Object, e As EventArgs) Handles t

我正在使用ToolStrip及其按钮来更改GUI结构,并给出了一个示例代码,说明如何使用ToolStrip按钮更改GUI。有没有更简单的方法来使用它们,比如当点击ToolStripButton的事件时,它可以调用单个过程等。?在目前的情况下,似乎我的编码方式不好

例如,如果用户单击“主页”按钮,它将高亮显示选定的按钮,并隐藏其他面板元素,并使主页的面板可见

 Private Sub tsbHome_Click(sender As Object, e As EventArgs) Handles tsbHome.Click
        tsbHome.Checked = True
        tsbTools.Checked = False
        tsbReport.Checked = False
        tsbAnalyze.Checked = False
'... Tool Strip Button lists continues...
        pnlHome.Visible = True
        pnlTools.Visible = False
        pnlReport.Visible = False
        pnlAnalyze.Visible = False
' ... Panel lists continues...
    End Sub
 Private Sub tsbTools_Click(sender As Object, e As EventArgs) Handles tsbTools.Click
        tsbHome.Checked = False
        tsbTools.Checked = True
        tsbReport.Checked = False
        tsbAnalyze.Checked = False
'... Tool Strip Button lists continues...
        pnlHome.Visible = False
        pnlTools.Visible = True
        pnlReport.Visible = False
        pnlAnalyze.Visible = False
' ... Panel lists continues...
    End Sub
如果用户单击“工具”按钮,则会高亮显示选定的按钮,隐藏其他面板元素,并使工具的面板可见

 Private Sub tsbHome_Click(sender As Object, e As EventArgs) Handles tsbHome.Click
        tsbHome.Checked = True
        tsbTools.Checked = False
        tsbReport.Checked = False
        tsbAnalyze.Checked = False
'... Tool Strip Button lists continues...
        pnlHome.Visible = True
        pnlTools.Visible = False
        pnlReport.Visible = False
        pnlAnalyze.Visible = False
' ... Panel lists continues...
    End Sub
 Private Sub tsbTools_Click(sender As Object, e As EventArgs) Handles tsbTools.Click
        tsbHome.Checked = False
        tsbTools.Checked = True
        tsbReport.Checked = False
        tsbAnalyze.Checked = False
'... Tool Strip Button lists continues...
        pnlHome.Visible = False
        pnlTools.Visible = True
        pnlReport.Visible = False
        pnlAnalyze.Visible = False
' ... Panel lists continues...
    End Sub

有两个技巧可以使代码更简单。第一个是知道在事件方法声明的
Handles
子句中可以有多个项。(您也可以省略该子句,并使用
AddHandler
为一个方法的许多控件设置事件处理程序。)另一个技巧是知道如何使用
sender
参数来确定使用了连接到此方法的多个控件中的哪一个

把这些放在一起,你就会得到一种方法,可以改变你的任何观点

Private Sub NavigationMenuItem_Click(sender As Object, e As EventArgs) Handles tsbHome.Click, tsbTools.Click, tsbReport.Click, tsbAnalyzer.Click
    'First Suspend Layout, to avoid extra screen re-draws
     Me.SuspendLayout()

     'Set your checkboxes
     tsbHome.Checked = sender Is tsbHome
     tsbTools.Checked = sender Is tsbTools
     tsbReport.Checked = sender Is tsbReport
     tsbAnalyze.Checked = sender Is tsbAnalyze

     'Then De-select EVERYTHING
     pnlHome.Visible = sender Is tsbHome
     pnlTools.Visible = sender Is tsbTools
     pnlReport.Visible = sender Is tsbReport
     pnlAnalyze.Visible = sender Is tsbAnalyze
      ' ... lists continues...

    'Finally, resume layout so all changes draw to the screen at once
    Me.ResumeLayout()
End Sub
如果向Form Load或InitializeComponent()方法添加代码以将面板和toolstrip按钮放入列表中,则可以简化此过程:

Private ViewButtons As List(Of ToolStripButton)
Private ViewPanels As List(Of Panel)

 Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    ViewButtons = New List(Of ToolStripButton) From {tsbHome, tsbTools, tsbReport, tsbAnalyze}
    ViewPanels = New List(Of Panel) From {pnlHome, pnlTools, pnlReport, pnlAnalyze}

    For Each b In ViewButtons
       AddHandler b.Click, AddressOf NavigationMenuItem_Click
    Next

End Sub

Private Sub NavigationMenuItem_Click(sender As Object, e As EventArgs) 
     Me.SuspendLayout()

     For i As Integer = 0 To ViewButtons.Length - 1
         Dim selected As Boolean = ViewButtons(i) Is sender
         ViewButtons(i).Checked = selected
         ViewPanels(i).Visible = selected
    Next

    Me.ResumeLayout()
End Sub

稍后我们将讨论所有问题,但首先,什么是
**正确的**
?@zackraiyan感谢您提供我更新的反馈。我试着把它加粗。那么,你想做什么?你的代码有什么问题?我正在使用工具栏按钮用Visual Studio的“panel”元素将我工具的GUI区域更改为hide/unhide。那么问题是什么?tsbHome.Checked=发送者是tsbHome@HansPassant我想我一开始误解了他是如何使用pnlXXX控件的。他基本上已经通过自定义控件完成了我建议的大部分工作,所以我正在编写其中的大部分。而且,作为记录。。。我认为自定义控件比使用面板更好,因为它让每个视图都有自己的类。但是这些面板是一个好的开始。@JoelCoehoorn我想你是对的。但是首先我需要了解更多关于自定义控件的使用。事实上,我在这方面没有太多经验。在自定义控件中,您的意思是我是否将每个gui创建为不同的表单?@Hakan自定义控件有效地为您提供了一个面板,就像您现在为每个不同视图提供的一样。区别在于,它允许您将每个视图的控件和代码隔离到它自己的类中。