使用Visual Studio 2010,WinForms和VB.Net,我试图将一个表单用作“用户设置”页面(Form2),其中包含Form1的“主题”变量。基本上,当用户在用户设置中输入不同的主题名称(最终将是下拉列表)并单击保存按钮后,我希望使用新的主题设置重新绘制或重新加载Form1。
我曾尝试使用刷新,隐藏/显示Form1,回忆form_load事件以及许多其他事情。我已经在线查看了使用新主题设置重绘或卸载/重新加载form1的方法,但是我找不到任何有效的方法,并且一旦用户在form2上保存用户设置,就会更改form1的颜色设置。
根据我阅读的逻辑和文档,其中一个选项应该可以工作,但它们都不会改变form1的背景颜色。我尝试在加载事件上调用ColorChange,显示事件等等。
我不想使用颜色对话框,因为我不希望用户选择单独的颜色。我希望他们从用户设置中保存的一系列预先设计的主题中进行选择。这只是一个测试项目,所以你可以让我知道这样做的好与坏,同时建议其他方法,但我更愿意理解这些选项都不起作用的原因,并找出一种方法来制作如果可能的话,它会起作用。
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
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
答案 0 :(得分:1)
问题在于,调用Refresh
或Show
时,您在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
正如您所看到的,PropertyChangedEventArgs有PropertyName
,告诉您哪个属性实际发生了变化。
您现在可以在应用中的任何位置更改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