设计器.vb文件中的自定义代码在设计模式下进行编辑时消失
本文关键字:设计模式 编辑 消失 代码 vb 文件 自定义 | 更新日期: 2023-09-27 18:30:57
我在 vb.net 中有一个名为"form1"的表单。此窗体具有许多控件。我打开了form1.designer.vb文件并输入了一个ifelse表达式,例如:
如果 getLanguage() = "en" 则 label1.text = "早安" 否则 label1。文本 = "Bonjour"
这在运行时工作得很好。
如果我在设计中打开 Form1.vb [设计] 页面并进行任何更改,上面的代码就会消失。
有没有办法保留我放在设计器页面中的任何代码?我不想将它们放在 form1.vb 文件的加载事件中。
找到此代码:
Public Sub New()
Me.InitializeComponent()
End Sub
然后添加一行:
Public Sub New()
Me.InitializeComponent()
Me.MakeComponentsChanges()
End Sub
然后在 form1 中创建该方法.vb或您创建的另一个分部类副本:
Private Sub MakeComponentsChanges()
If getLanguage() = "en" then
label1.text = "Good Morning"
Else
label1.Text = "Bonjour"
End If
End Sub
不要触摸form1.designer.vb (.cs)
正如其他答案中所述,最好在 IDE 中使用 .Localizable
属性并将其从 False
更改为 True
.然后,您将可以访问几种默认语言。您不必费心编写代码。
- 例如,选择一种语言以 :
English
开头。
然后编辑每个控件文本:在按钮中写"你好",在标签中写" - 早上好",在菜单项中写"因为我很开心"等。
- 然后再次更改语言,选择"
French
"。 - 然后再次编辑每个控件并写下"Bonjour","Je vous souhaite un bon matin","Parceque je suis de bonne humeur"....是的,你已经失去了以前的文本,但有信心!
- 编译项目而不启动它,您将看到 IDE 创建了两个新文件:
Form1.en.resx
和Form1.fr.resx
(左右)以及Form1.vb
和Form1.Designer.vb
。不要编辑它们!
如果您打开 en.resx 或 fr.resx,您将看到您所做的编辑就在那里。这些文件用于存储表单的内置 Lang 相关资源。这就是所谓的全球化。
然后再次找到窗体的构造函数。
Public Sub New()
Me.InitializeComponent()
'Me.MakeComponentsChanges()
' Now you know about some Globalization,
' you may get rid of that Method.
' Add two variables :
Dim OriginalCulture As CultureInfo
Dim CurrentOSCulture As CultureInfo
' Initialize them
OriginalCulture = Thread.CurrentThread.CurrentCulture
CurrentOSCulture = CultureInfo.CurrentCulture
' Do this test :
Try
Thread.CurrentThread.CurrentCulture = CurrentOSCulture ' may fail
Thread.CurrentThread.CurrentUICulture = CurrentOSCulture ' may fail
' Attempt to match the current Thread culture to the Operating System one.
Catch CurrentException As Exception
Thread.CurrentThread.CurrentCulture = OriginalCulture
Thread.CurrentThread.CurrentUICulture = OriginalCulture
' If it fails, revert back to default as defined in your IDE
End Try
End Sub
不要忘记在类声明之上添加这两个命名空间:
Imports System.Globalization
Imports System.Threading
瞧!我知道我说过你不必费心编写代码,但是构造函数中的上述位足以处理语言的选择。Plus besoin de taper du code superflu après ça.
对于您的示例,也许更好的是使用表单的属性
.Localizable = true
.Language = Default(French)/English/or others
Visual Studio创建一个类的两个文件(这是你的表单) - 分部类
因此,在哪个文件中编写代码并不重要。
只有Visual Studio使用designer.vb
文件来生成设计器所做的表单更改
来自designer.vb
的代码包含在构造函数中执行的方法InitializeComponent
。
创建自己的方法,并在构造函数中InitializeComponent
后立即调用它。
或者,如果您不想放入yourform.vb
,请为您的代码创建第三个文件
文件yourForm.MyDesigner.vb
'Using Keyword Partial not necessary anymore,
'because it is used in the `yourForm.Designer.vb`
Public Class yourForm
Public Sub Changelabel()
If getLanguage() = "en" Then
label1.text = "Good Morning"
Else
label1.Text = "Bonjour"
End If
End Sub
End Class
设计器.vb文件由Visual Studio自动创建。每次编辑表单的设计时,都会重写文件。现在,为什么你不想在 Load 上拥有该代码?load 事件或构造函数(如前所述)是放置所需初始化的正确位置。