【问题标题】:Windows store app ResourceLoader at design time设计时的 Windows 应用商店应用 ResourceLoader
【发布时间】:2013-11-29 01:20:41
【问题描述】:

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

我想在设计时显示 .resw 文件中的字符串资源,但每次尝试都失败了,即使它在运行时有效。

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

我还尝试为视图模型上的字符串创建一个属性:

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

这在运行时有效,但在设计时它是空白的。

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

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

感谢您的帮助, 卢卡斯

【问题讨论】:

  • 添加了一个新的修复程序,它应该为您提供您想要的设计器功能 (d)。

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


【解决方案1】:

旧方法

所以,你可以做几件事。

第一个(也是最简单的,因为您已经在使用x:Uid)是将文本提供到文本字段中。 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}}" />

【讨论】:

  • 感谢您的回复。恐怕这正是我想要避免的。我不喜欢写两次,因为如果我要更改资源中的文本,我还必须在 XAML 中使用它的任何地方更新此文本,我认为这是不必要的冗余。
  • 不幸的是,根据我的研究,这是需要的。设计图面实际上是针对样本数据而不是实际数据。
  • 那么我将不得不尝试在没有这个的情况下进行管理。不过还是谢谢。
【解决方案2】:

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

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

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

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

ResourceContext.GetForViewIndependentUse().QualifierValues

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

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多