Windows在设计时存储应用程序ResourceLoader

lor*_*gia 11 c# xaml designer embedded-resource windows-store-apps

我已经开始为Windows 8.1创建Windows应用商店应用程序,现在我遇到了有关本地化的问题.

我想在设计时从.resw文件中显示字符串资源,但每次尝试这样做都会失败,即使它在运行时也能正常工作.

当使用x:Uid属性时,我仍然需要提供Text属性(即对于TextBlock),我不喜欢写两次文本.

我还尝试在viewmodel上为字符串创建一个属性:

public string Title
{
    get { return ResourceLoader.GetForCurrentView("Strings").GetString("MainView_Title"); }
}
Run Code Online (Sandbox Code Playgroud)

这在运行时工作,但在设计时它是空白的.

所以问题是,有没有办法在XAML设计器中显示来自.resw文件的资源?

更具体地说,ResourceManager类是否允许在设计时读取.resw文件?

谢谢你的帮助,卢卡斯

Nat*_*ond 11

旧方法

所以,你可以做几件事.

第一个(也是最简单的,假设你已经使用过x:Uid)只是将文本提供给Text字段.该x:Uid产权相关值将覆盖无论是在那里.

<TextBlock Text="MyText" x:Uid="MainView_Title"/>
Run Code Online (Sandbox Code Playgroud)

第二种方法是使用你已经拥有的属性,然后检查应用程序是否处于设计时间(通过几种不同的方法),然后返回一个常量值(如果是)和资源(如果不是).

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

希望这有助于编码!

编辑:似乎有一种新方法可以做到这一点,至少从Windows 8.1开始.

新方法

  • 创建一个引用a的类ResourceLoader(类似于上面描述的属性).
  • 创建一个索引属性访问器,它接受一个字符串键并从中返回值ResourceLoader.

    public class LocalizedStrings
    {
        public string this[string key]
        {
            get
            {
                return App.ResourceLoader.GetForViewIndependentUse().GetString(key);
            }
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  • 在你的中App.xaml,定义一个StaticResource这种类型.

    <Application.Resources>
        <ResourceDictionary>
            <common:LocalizedStrings x:Key="Localized"/>
        </ResourceDictionary>
    </Application.Resources>
    
    Run Code Online (Sandbox Code Playgroud)

现在,当您想使用输入键访问您的属性时MainView_Title,请使用此选项.它更冗长,但它应该在设计师和应用程序本身中进行翻译.

<TextBlock Text="{Binding Source={StaticResource Localized}, Path=[MainView_Title]}" />
Run Code Online (Sandbox Code Playgroud)

如果您愿意,可以将其随机播放,以便更具可读性,例如:

<TextBlock Text="{Binding [MainView_Title], Source={StaticResource Localized}}" />
Run Code Online (Sandbox Code Playgroud)