我已经开始为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文件?
感谢您的帮助, 卢卡斯
答案 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
运行时(工作)和设计时间(不工作)之间似乎相同。
我想知道是否有人遇到过这个并解决了它。内特? :)