recursos - resources file c#
El diseñador solo serializa la cadena para la propiedad de Text
. No puede establecer la propiedad de texto en un valor de recurso directamente con el diseñador.
Incluso si abre el archivo Form1.Designer.cs
y agrega una línea a la inicialización para establecer la propiedad Text
en un valor de recurso como Resource1.Key1
, después del primer cambio en el diseñador, el diseñador reemplaza su código estableciendo el valor de la cadena de ese recurso para propiedad Text
.
En general, recomiendo usar mecanismos de localización estándar de formularios de Windows, utilizando la propiedad Localizable
y Language
de Form
.
Pero si por alguna razón desea usar su archivo de recursos y desea usar una solución basada en diseñador, como buena opción puede crear un componente extensor para establecer la clave de recursos para su control en el tiempo de diseño y luego usarlo en la ejecución. hora.
El código para el componente extensor se encuentra al final de la publicación.
Uso
Asegúrate de tener un archivo de recursos. Por ejemplo Resources.resx
en la carpeta de propiedades. También asegúrese de tener alguna clave / valor de recurso en el archivo de recursos. Por ejemplo Key1 con value = "Value1", Key2 con value = "Value2". Entonces:
- Coloque un componente
ControlTextExtender
en su formulario. - Al usar la cuadrícula de propiedades, establezca la propiedad
ResourceClassName
de la misma en el nombre completo de su archivo de recursos, por ejemplo, WindowsApplication1.Properties.Resources` - Seleccione cada control en el que desee establecer su
Text
y use la cuadrícula de propiedades establezca el valor deResourceKey on controlTextExtender1
propiedadResourceKey on controlTextExtender1
en la clave de recursos que desee.
Luego ejecute la aplicación y vea el resultado.
Resultado
y aquí hay una captura de pantalla de resultado, y como ven, incluso localicé la propiedad Text
del formulario de esta manera.
Cambiar entre culturas en tiempo de ejecución
Puede cambiar entre culturas en tiempo de ejecución, sin necesidad de cerrar y volver a abrir el formulario simplemente usando:
System.Threading.Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("fa");
this.controlTextExtender1.EndInit();
Implementación
Aquí hay una implementación básica de la 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;
}
}
}