C# 如何在设计时将资源文件中的文本设置为控件?
我想知道是否有一种方法可以在设计时从资源文件中设置控件的C# 如何在设计时将资源文件中的文本设置为控件?,c#,.net,winforms,localization,windows-forms-designer,C#,.net,Winforms,Localization,Windows Forms Designer,我想知道是否有一种方法可以在设计时从资源文件中设置控件的Text属性: 或者此过程只能通过编程方式执行?设计器仅序列化文本属性的字符串。不能直接使用设计器将Text属性设置为资源值 即使打开Form1.Designer.cs文件并在初始化中添加一行,以将Text属性设置为资源值,如Resource1.Key1,在首次更改设计器后,设计器也会通过为Text属性设置该资源的字符串值来替换代码 一般来说,我建议使用windows窗体的标准机制,使用Form的Localizable和Language属
Text
属性:
或者此过程只能通过编程方式执行?设计器仅序列化
文本
属性的字符串。不能直接使用设计器将Text属性设置为资源值
即使打开Form1.Designer.cs
文件并在初始化中添加一行,以将Text
属性设置为资源值,如Resource1.Key1
,在首次更改设计器后,设计器也会通过为Text
属性设置该资源的字符串值来替换代码
一般来说,我建议使用windows窗体的标准机制,使用Form
的Localizable
和Language
属性
但是,如果出于某种原因,您希望使用资源文件并希望使用基于设计器的解决方案,那么作为一个好选项,您可以创建一个在设计时为控件设置资源键,然后在运行时使用它
扩展器组件的代码位于文章的末尾
用法
确保您有一个资源文件。例如属性文件夹中的Resources.resx
。还要确保资源文件中有一些资源键/值。例如,带有value=“Value1”的键1,带有value=“Value2”的键2。然后:
ControlTextExtender
组件ResourceClassName
属性设置为资源文件的全名,例如WindowsApplication1.Properties.Resources`
文本的每个控件,并使用属性网格将ControlTextExtender 1上ResourceKey的值设置为所需的资源键。
Text
属性
在运行时在区域性之间切换
您可以在运行时在区域性之间切换,无需关闭或重新打开表单,只需使用:
System.Threading.Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("fa");
this.controlTextExtender1.EndInit();
实施
以下是该想法的基本实现:
[ProvideProperty("ResourceKey", typeof(Control))]
public class ControlTextExtender
: Component, System.ComponentModel.IExtenderProvider, ISupportInitialize
{
private Hashtable Controls;
public ControlTextExtender() : base() { Controls = new Hashtable(); }
[Description("Full name of resource class, like YourAppNamespace.Resource1")]
public string ResourceClassName { get; set; }
public bool CanExtend(object extendee)
{
if (extendee is Control)
return true;
return false;
}
public string GetResourceKey(Control control)
{
return Controls[control] as string;
}
public void SetResourceKey(Control control, string key)
{
if (string.IsNullOrEmpty(key))
Controls.Remove(control);
else
Controls[control] = key;
}
public void BeginInit() { }
public void EndInit()
{
if (DesignMode)
return;
var resourceManage = new ResourceManager(this.ResourceClassName,
this.GetType().Assembly);
foreach (Control control in Controls.Keys)
{
string value = resourceManage.GetString(Controls[control] as string);
control.Text = value;
}
}
}
您想使用您自己制作的
.Resx
文件设置text属性,还是您的实际需求是本地化?第一个,@RezaAghaei。我知道如何通过编程来设置,但我不知道如何在设计时设置控件的text
属性。设计器只序列化该属性的字符串。您不能直接使用设计器将Text
属性设置为资源值,但您可以在设计时使用扩展器为控件设置资源键,然后在运行时使用它。但总的来说,我认为使用windows窗体的标准本地化机制是一个更好的选择。这适用于控件,但不适用于toolstrip项、datagridview列和嵌入其他控件中的控件,我该如何解决这一问题?@Smith如果你看看代码的逻辑,您将看到,我们只为控件
对象提供了资源键
属性。这是因为我们要为它们设置Text
属性。但是,如果我们决定同时扩展组件
类,如工具提示
,它们的基类与控件
不同,我们就不能依赖文本
属性的存在。就我所知,对于DataGridViewColumn
类型,您不能创建同样在column collection editor中工作的扩展程序组件。