resource recursos read leer how archivo agregar c# .net winforms localization windows-forms-designer

recursos - resources file c#



¿Cómo establecer el texto en un control desde el archivo de recursos en tiempo de diseño? (1)

Deseo saber si existe una forma de establecer la propiedad Text un control a partir de un archivo de recursos en tiempo de diseño:

¿O este proceso solo puede realizarse programáticamente?


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:

  1. Coloque un componente ControlTextExtender en su formulario.
  2. 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`
  3. Seleccione cada control en el que desee establecer su Text y use la cuadrícula de propiedades establezca el valor de ResourceKey on controlTextExtender1 propiedad ResourceKey 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; } } }