Pregunta

Comencé a crear una aplicación de la Tienda Windows para Windows 8.1 y ahora encontré un problema relacionado con la localización.

Me gustaría mostrar un recurso de cadena de un archivo .resw en tiempo de diseño, pero todos los intentos de hacerlo fallaron, aunque funciona en tiempo de ejecución.

Cuando uso el atributo x:Uid, todavía tengo que proporcionar la propiedad Texto (es decir,para un TextBlock) y no me gusta escribir el texto dos veces.

También intenté crear una propiedad para la cadena en el modelo de vista:

public string Title
{
    get { return ResourceLoader.GetForCurrentView("Strings").GetString("MainView_Title"); }
}

Esto funciona en tiempo de ejecución, pero en tiempo de diseño está en blanco.

Entonces la pregunta es, ¿hay alguna manera de mostrar recursos de un archivo .resw en el diseñador XAML?

Más específicamente, ¿la clase ResourceManager permite leer archivos .resw en tiempo de diseño?

Gracias por tu ayuda, Lucas

¿Fue útil?

Solución

Método antiguo

Entonces, hay un par de cosas que puedes hacer.

El primero (y el más simple, dado que estás usando x:Uid ya) es simplemente proporcionar el texto en el campo Texto.El x:Uid-El valor relacionado sobrescribirá todo lo que esté allí.

<TextBlock Text="MyText" x:Uid="MainView_Title"/>

El segundo método es usar la propiedad como ya lo tiene y luego verificar si la aplicación está en tiempo de diseño (a través de un par de métodos diferentes), luego devolver un valor constante si lo está y el recurso si no lo está.

public string Title
{
     if(ViewModelBase.IsInDesignTimeStatic) //Mvvm Light's easy accessor
         return "My Text";
     return ResourceLoader.GetForCurrentView("Strings").GetString("MainView_Title");
}

¡Espero que esto ayude y feliz codificación!

Editar:Parece haber una nueva forma de hacer esto, al menos a partir de Windows 8.1.

Nuevo método

  • Crear una clase que haga referencia a un ResourceLoader (similar a la propiedad descrita anteriormente).
  • Cree un descriptor de acceso de propiedad indexada que acepte una clave de cadena y devuelva el valor del ResourceLoader.

    public class LocalizedStrings
    {
        public string this[string key]
        {
            get
            {
                return App.ResourceLoader.GetForViewIndependentUse().GetString(key);
            }
        }
    }
    
  • En tus App.xaml, definir un StaticResource de este tipo.

    <Application.Resources>
        <ResourceDictionary>
            <common:LocalizedStrings x:Key="Localized"/>
        </ResourceDictionary>
    </Application.Resources>
    

Ahora, cuando quieras acceder a tu propiedad con clave de entrada MainView_Title, utilizar esta.Es más detallado, pero debería traducirse tanto en el diseñador como en la aplicación misma.

<TextBlock Text="{Binding Source={StaticResource Localized}, Path=[MainView_Title]}" />

Puedes mezclarlo para que sea un poco más legible si lo deseas, como por ejemplo:

<TextBlock Text="{Binding [MainView_Title], Source={StaticResource Localized}}" />

Otros consejos

Este es un hilo viejo, pero como Nate le proporcionó una solución tan elegante al problema para Win8.1, pensé que preguntaría aquí ...

Después de mucha investigación y experimentación, la solución de Nate no parece funcionar para las aplicaciones de UWP para Win10 bajo la comunidad VS2017.El enfoque de caída localizado funciona bien en tiempo de ejecución, pero aparece

App.ResourceLoader.GetForViewIndependentUse().GetString(key);

Se niega a devolver cualquier cosa, excepto la cadena.empty durante el tiempo de diseño.He hecho muchos experimentos y cosas como

ResourceContext.GetForViewIndependentUse().QualifierValues

Parece que es idéntico entre el tiempo de ejecución (trabajo) y el tiempo de diseño (no funciona).

Me preguntaba si alguien ha encontrado esto y lo resolvió.Nate?:)

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