Pregunta

Tengo un control que podríamos identificarlo como similar al control de ListBox. Cada elemento se representa con un elemento (ejemplo de bloques de texto). Lo que me gustaría es cambiar el diseño de este artículo, para que contenga dos bloques de texto. Así que creo un control de control, coloque una cuadrícula fronteriza, Twotextblocks, y todo está bien. Ahora el problema:

Necesito poder localizar el texto en el artículo, y lo hice normalmente así:

<... Text="{Binding Strings.SomeString, Source={StaticResource ApplicationResources}}" />

Ahora necesito poder hacer lo mismo con ambos bloques de texto. Así que pensé que necesito crear un tipo personalizado en el que este elemento se enlazará y expondrá dos propiedades: título y descripción. Si expongo estas propiedades como tipo de cadena, todo funciona bien, pero estoy perdiendo la unión de marcado que usé anteriormente. ¿Cómo lograr lo mismo con dos propiedades? El resultado debe ser como:

<... Title="{Binding Strings.SomeString, Source={StaticResource ApplicationResources}}", Description="{Binding Strings.AnotherString, Source={StaticResource ApplicationResources}}" />

Pude hacer trabajo de localización con la clase ResourceMManager, pero se complica incluso para poder aplicar la localización dinámicamente en tiempo de ejecución.

Entonces, ¿qué debo hacer para poder usar el código anterior? Luego, solo necesito implementar inotifypropertychanged en ApplicationResource y todo está establecido.

¿Fue útil?

Solución

¡Genial!

Voy a hacer lo mismo que hiciste aquí. Sí, tengo una solución, pero no estoy seguro de si funciona hasta ahora.

Primero, necesitamos un mancha localizador que sostiene un diccionario.

Por ejemplo, si necesita localizar una ventana de cuenta de usuario, simplemente haga esto

<TextBlock Text="something, UsernameKey">

y la localización del localización se asignará a Usernamekey a "Nombre de usuario" u otro idioma

Segundo, una extensión XAML que encuentra el valor de la llave de localizationManager.

Me pregunto si esta extensión personalizada podría derivarse de la extensión de unión, de ser así, esto será muy fácil, simplemente cree un objeto vinculante al objetivo. Si no, creo que mantenga presionada una referencia débil a la UIELEMENT por la extensión XAML a la actualización dinámica, el texto es correcto.

Esta solución es simple pero no genérica. Hay algún idioma que se lee de derecha a izquierda. Pide que la aplicación muestre contenido de derecha a izquierda.

Entonces, tengo otra solución genérica pero más compleja.

En lugar de la extensión XAML, usamos una propiedad de dependencia adjunta.

Hazlo así:

<TextBlock LocalizationManager.LocalizationKey="UsernameKey" />

Entonces, ¿el problema ahora es cómo configurar la propiedad "Texto" por localizationManager?

Utilizamos adaptadores, el localizationManager buscará un adaptador adecuado para el tipo "TEXTBLOCK"

Entonces, cuando la aplicación está iniciando, registramos algunos adaptadores a LocalizationManager:

LocalizationManager.Current.RegisterAdapter<TextBlock>(new TextBlockAdapter())

Esta solución es más genérica, es compatible con cualquier tipo de control si proporciona un adaptador, pero como se ve, esta solución necesita más trabajo y mucho más complejo que el anterior.

Espero que estas soluciones de diseño puedan ayudarle ~

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top