如何在设计时将文本从资源文件设置为控件?

How to set text to a control from resource file in design time?(如何在设计时将文本从资源文件设置为控件?)
本文介绍了如何在设计时将文本从资源文件设置为控件?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想知道是否有办法在设计时从资源文件中设置控件的 Text 属性:

或者这个过程只能以编程方式执行?

解决方案

设计器只序列化 Text 属性的字符串.您不能直接使用设计器将 Text 属性设置为资源值.

即使您打开 Form1.Designer.cs 文件并在初始化中添加一行以将 Text 属性设置为像 Resource1.Key1 这样的资源值,在第一次更改设计器后,设计器通过为 Text 属性设置该资源的字符串值来替换您的代码.

一般来说,我建议使用标准

  • 选择要设置其 Text 的每个控件,并使用属性网格将 ResourceKey on controlTextExtender1 属性的值设置为所需的资源键.
  • 然后运行应用程序并查看结果.

    结果

    这是结果的截图,如你所见,我什至以这种方式本地化了表单的 Text 属性.

    在运行时切换文化

    您可以在运行时在文化之间切换,而无需关闭并重新打开表单,只需使用:

    System.Threading.Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("fa");this.controlTextExtender1.EndInit();

    实施

    这是该想法的基本实现:

    [ProvideProperty("ResourceKey", typeof(Control))]公共类 ControlTextExtender:组件,System.ComponentModel.IExtenderProvider,ISupportInitialize{私有哈希表控件;公共 ControlTextExtender() : base() { Controls = new Hashtable();}[Description("资源类全名,如YourAppNamespace.Resource1")]公共字符串 ResourceClassName { 获取;放;}公共布尔 CanExtend(对象扩展对象){if (extendee is Control)返回真;返回假;}public string GetResourceKey(控制控件){以字符串形式返回 Controls[control];}public void SetResourceKey(控制控件,字符串键){if (string.IsNullOrEmpty(key))Controls.Remove(控制);别的控制[控制] = 键;}公共无效 BeginInit() { }公共无效 EndInit(){如果(设计模式)返回;var resourceManage = new ResourceManager(this.ResourceClassName,this.GetType().Assembly);foreach(Controls.Keys 中的控制控件){字符串值 = resourceManage.GetString(Controls[control] as string);control.Text = 值;}}}

    I want to know if there exists a way to set a control's Text property from a resource file in design time:

    Or this process can only be performed programatically?

    解决方案

    The designer only serializes string for Text property. You can not set the Text property to a resource value directly using designer.

    Even if you open the Form1.Designer.cs file and add a line to initialization to set the Text property to a resource value like Resource1.Key1, after first change in designer, the designer replace your code by setting the string value of that resource for Text property.

    In general I recommend using standard localization mechanisms of windows forms, using Localizable and Language property of Form.

    But if in some reason you want to use your resource file and want to use a designer-based solution, as good option you can create an extender component to set the resource key for your control at design-time and then use it at run-time.

    Code for the extender component is at the end of the post.

    Usage

    Make sure you have a resource file. For example Resources.resx in the properties folder. Also make sure you have some resource key/value in the resource file. For example Key1 with value = "Value1", Key2 with value = "Value2". Then:

    1. Put a ControlTextExtender component on your form.
    2. Using property grid set the ResourceClassName property of it to the full name of your resource file for example WindowsApplication1.Properties.Resources`
    3. Select each control you want to set its Text and using property grid set the value of ResourceKey on controlTextExtender1 property to the resource key that you want.

    Then run the application and see the result.

    Result

    and here is an screenshot of result, and as you see, I even localized Text property of the form this way.

    Switch between Cultures at Run-Time

    You can switch between cultures at run-time, without need to close and reopen the form simply using:

    System.Threading.Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("fa");
    this.controlTextExtender1.EndInit();
    

    Implementation

    Here is a basic implementation of the idea:

    [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;
            }
        }
    }
    

    这篇关于如何在设计时将文本从资源文件设置为控件?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

    本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

    相关文档推荐

    DispatcherQueue null when trying to update Ui property in ViewModel(尝试更新ViewModel中的Ui属性时DispatcherQueue为空)
    Drawing over all windows on multiple monitors(在多个监视器上绘制所有窗口)
    Programmatically show the desktop(以编程方式显示桌面)
    c# Generic Setlt;Tgt; implementation to access objects by type(按类型访问对象的C#泛型集实现)
    InvalidOperationException When using Context Injection in ASP.Net Core(在ASP.NET核心中使用上下文注入时发生InvalidOperationException)
    LINQ many-to-many relationship, how to write a correct WHERE clause?(LINQ多对多关系,如何写一个正确的WHERE子句?)