从language.xaml文件中读取值

时间:2016-03-03 10:12:24

标签: c# wpf xaml mvvm

我正在创建一个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>

2 个答案:

答案 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文件添加到资源管理器中?