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:
- Put a
ControlTextExtender
component on your form.
- Using property grid set the
ResourceClassName
property of it to the full name of your resource file for example WindowsApplication1.Properties.Resources`
- 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;
}
}
}
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…