1

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

我尝试过使用刷新、隐藏/显示 Form1、回忆 form_load 事件以及许多其他事情。我已经在网上寻找一种使用新主题设置重绘或卸载/重新加载 form1 的方法,但我没有找到任何可行的方法,一旦用户将用户设置保存在 form2 上,我就会更改 form1 的颜色设置。

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

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

表格1

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
4

1 回答 1

1

问题是调用RefreshShow不执行您在 Form1 中显示的代码。因此,您的变量selectedTheme仍保留以前的值,并且不会调用您的颜色更改。

幸运的是,该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

如您所见,PropertyChangedEventArgs有一个PropertyName告诉您哪个属性实际更改了。

您现在可以在应用程序的任何位置更改 My.Setting 属性,而无需在执行此操作后调用 Refresh 或 Show。

您在 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
于 2015-07-13T12:17:47.850 回答