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中工作的扩展程序组件。