我正在创建一个C#WPF MVVM应用程序,目前正忙着添加不同的语言。 现在我使用的xaml文件包含很多行,如:
<system:String x:Key="btnNew">New</system:String>
<system:String x:Key="btnEdit">Edit</system:String>
程序读取特定文件夹,获取不同的语言文件(English.xaml,Dutch.xaml)并将所选文件添加到Resources.MergedDictionaties:
void updateLanguage(int id)
{
string sSelectedLanguage = obcLanguages[id].sRealName; // Get selected language name
ResourceDictionary dict = new ResourceDictionary(); // Create new resource dictionary
string sSelectedLanguageUrl = "pack://siteoforigin:,,,/Languages/" + sSelectedLanguage; // Create url to file
dict.Source = new Uri(sSelectedLanguageUrl, UriKind.RelativeOrAbsolute);
App.Current.MainWindow.Resources.MergedDictionaries.Add(dict); // Add new Language file to resources. This file will be automaticly selected
}
我的带按钮的xaml内容引用了DynamicResource
到'bntNew':
<Button x:Name="btnNewSeam" Content="{DynamicResource btnNew}"Style="{StaticResource BtnStyle}" Command="{Binding newSeamTemplateCommand}" />
这很棒。 但是现在我正在使用Observablecollections用于组合框,我在这样的代码中添加了选项:
obcFunctionsPedalOptions.Add(new clCbbFilltype1("Block", 0));
obcFunctionsPedalOptions.Add(new clCbbFilltype1("Free", 1));
obcFunctionsPedalOptions.Add(new clCbbFilltype1(">0", 2));
但是必须使用Language.xaml文件中的信息翻译选项“Block”,“Free”和“&gt; 0”。
如何使用代码阅读此特定Xml文件,获取PedalOptions
x:Key的示例并阅读其选项?
示例:
<system:String x:Key="PedalOptions">Block, Free, >0</system:String>
答案 0 :(得分:2)
不是在XAML中定义字符串,而是使用资源(.resx)文件。您有一个默认的(ResourceFile.resx)文件,然后是语言特定的文件(荷兰语的ResourceFile.nl.resx,美国英语的ResourceFile.en-US.resx等)。系统根据当前的区域设置选择正确的资源文件。
您应该阅读的MSDN has a section on this。
然后,您可以在代码中使用以下内容:
obcFunctionsPedalOptions.Add(new clCbbFilltype1(Resources.ResourceFile.Block, 0));
您需要通过定义类来使XAML可见:
public class Localize : INotifyPropertyChanged
{
#region INotifyPropertyChanged Members
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyChange(String name)
{
if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs(name));
}
#endregion
//Declarations
private static ResourceFile _localizedStrings = new ResourceFile();
public ResourceFile LocalizedStrings
{
get { return _localizedStrings; }
set { NotifyChange("LocalizedStrings"); }
}
}
然后从XAML中引用它:
<local:Localize x:Key="LocalizedStrings"
xmlns:local="clr-namespace:Module" />
然后您可以按如下方式使用它:
<TextBlock Text="{Binding LocalizedStrings.Block, Source={StaticResource LocalizedStrings}}" />
答案 1 :(得分:0)
感谢您的回答,我确实让它像您告诉我和MSDN页面一样工作:) 所以,现在我有一个默认的“LanguageResource.resx”文件添加到我的资源中,并使用第二个“LanguageResource.nl.resx”文件进行测试,并使用CultureInfo(“nl”)更改了语言。
但是,我的客户需要一个文件夹,他可以在其中放置不同的“LanguageResource.XX.resx”文件,应用程序会从文件夹中添加此文件,并且他可以更改语言。
我的客户每次添加新语言时都不想编译此程序。 那么我如何运行时将一些.resx文件添加到资源管理器中?