使用VB .NET 4+从另一个表单重新加载Windows窗体

时间:2013-05-18 00:51:47

标签: vb.net winforms visual-studio-2010

使用Visual Studio 2010,WinForms和VB.Net,我试图将一个表单用作“用户设置”页面(Form2),其中包含Form1的“主题”变量。基本上,当用户在用户设置中输入不同的主题名称(最终将是下拉列表)并单击保存按钮后,我希望使用新的主题设置重新绘制或重新加载Form1。

我曾尝试使用刷新,隐藏/显示Form1,回忆form_load事件以及许多其他事情。我已经在线查看了使用新主题设置重绘或卸载/重新加载form1的方法,但是我找不到任何有效的方法,并且一旦用户在form2上保存用户设置,就会更改form1的颜色设置。

根据我阅读的逻辑和文档,其中一个选项应该可以工作,但它们都不会改变form1的背景颜色。我尝试在加载事件上调用ColorChange,显示事件等等。

我不想使用颜色对话框,因为我不希望用户选择单独的颜色。我希望他们从用户设置中保存的一系列预先设计的主题中进行选择。这只是一个测试项目,所以你可以让我知道这样做的好与坏,同时建议其他方法,但我更愿意理解这些选项都不起作用的原因,并找出一种方法来制作如果可能的话,它会起作用。

Form1中

Dim selectedTheme As String = My.Settings.Theme

Sub ColorChange()
    Select Case selectedTheme
        Case "Desert"
            Me.BackColor = Color.Brown
        Case "Default"
            Me.BackColor = Color.Black
            lblErrorMsgs.ForeColor = Color.Red
    End Select

End Sub

窗体2

Private Sub btnSaveSettings_Click(sender As Object, e As EventArgs) Handles btnSaveSettings.Click
    My.Settings.Theme = txtTheme.Text
    My.Settings.Save()

    Form1.Refresh()
    Form1.Show()

    Me.Hide()

End Sub

1 个答案:

答案 0 :(得分:1)

问题在于,调用RefreshShow时,您在Form1中显示的代码都不会被执行。因此,您的变量selectedTheme仍保留以前的值,并且不会调用colorchange。

幸运的是,My.Settings实例派生自提供ApplicationBaseSettings事件的PropertyChanged

通过向表单加载事件添加事件处理程序,您可以使用该功能:

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    AddHandler My.Settings.PropertyChanged, AddressOf HandlePropChanged
End Sub

现在我们需要一个处理该事件的方法:

'Imports System.ComponentModel
Private Sub HandlePropChanged(sender As Object, e As PropertyChangedEventArgs)
    If e.PropertyName = "Theme" Then
        selectedTheme = My.Settings.Theme
        ColorChange()
    End If
End Sub

正如您所看到的,PropertyChangedEventArgsPropertyName,告诉您哪个属性实际发生了变化。

您现在可以在应用中的任何位置更改My.Setting属性,而无需在执行此操作后调用“刷新”或“显示”。

您在Form2中的代码减少为:

Private Sub btnSaveSettings_Click(sender As Object, e As EventArgs) Handles btnSaveSettings.Click
    My.Settings.Theme = txtTheme.Text
    My.Settings.Save()

    Me.Hide()

End Sub