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

时间:2013-11-15 15:32:34

标签: c# xaml windows-store-apps embedded-resource designer

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

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

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

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

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

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

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

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

感谢您的帮助, 卢卡斯

2 个答案:

答案 0 :(得分:11)

旧方法

所以,你可以做几件事。

第一个(也是最简单的,假设您已经使用x:Uid)只是将文本提供给Text字段。与x:Uid相关的值将覆盖其中的任何内容。

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

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

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

希望这有助于编码!

编辑:似乎有一种新的方法,至少从Windows 8.1开始。

新方法

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

    public class LocalizedStrings
    {
        public string this[string key]
        {
            get
            {
                return App.ResourceLoader.GetForViewIndependentUse().GetString(key);
            }
        }
    }
    
  • App.xaml中,定义此类型的StaticResource

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

现在,当您想要使用输入键MainView_Title访问您的媒体资源时,请使用此功能。它更冗长,但它应该在设计师和应用程序本身中进行翻译。

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

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

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

答案 1 :(得分:0)

这是一个老线程,但由于Nate为Win8.1问题提供了这样一个优雅的解决方案,我想我会在这里问......

经过大量调查和实验,Nate的解决方案似乎不适用于VS2017社区下Win10的UWP应用程序。 LocalizedString方法在运行时工作正常,但它出现

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

在设计时拒绝返回String.Empty以外的任何内容。我做了很多实验,比如

ResourceContext.GetForViewIndependentUse().QualifierValues

运行时(工作)和设计时间(不工作)之间似乎相同。

我想知道是否有人遇到过这个并解决了它。内特? :)