2017-02-01 2 views
0

Я работаю над WPF-приложением, в котором пользователь может изменить язык (а не текущую культуру!) Во время выполнения. Так у меня есть несколько словарей ресурсов типа XAML, к которому я добавил тексты для создания мой WPF-приложение многоязычного так:Как получить значение из ресурсного словаря (XAML) в C#

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
        xmlns:system="clr-namespace:System;assembly=mscorlib" 
        xmlns:local="clr-namespace:Validation_DataAnnotations2.Resources"> 
    <system:String x:Key="firstname">First name</system:String> 
    <system:String x:Key="lastname">Last name</system:String> 
    <system:String x:Key="mainwindowtitle">Validation with DataAnnotations</system:String> 
    <system:String x:Key="german_language">German</system:String> 
    <system:String x:Key="english_language">English</system:String> 
    <system:String x:Key="insert_first_name">The first name has to be inserted</system:String> 
</ResourceDictionary> 

В WPF-окна и элементы управления связаны окна ресурсов. Но я использую DataAnnotations для проверки. Моя первая мысль заключалась в том, чтобы получить текст с ключом «insert_first_name» во время проверки в моей модели viewmodel. Так я пытался получить его с помощью этого:

System.Windows.Application.Current.Resources.FindName("insert_first_name") 

Но когда я использую метод FindName, я получаю нуль.

И когда я пытаюсь

System.Windows.Application.Current.Resources.Contains("insert_first_name") 

я получить "истинный", что означает, что ключ существует.

Как я могу получить значение ключа?

protected void ValidateModel() 
{ 
    validationErrors.Clear(); 
    ICollection<ValidationResult> validationResults = new List<ValidationResult>(); 
    ValidationContext validationContext = new ValidationContext(personmodel, null, null); 
    if (!Validator.TryValidateObject(personmodel, validationContext, validationResults, true)) 
    { 
     foreach (ValidationResult validationResult in validationResults) 
     { 
      string property = validationResult.MemberNames.ElementAt(0); 
      if (validationErrors.ContainsKey(property)) 
      { 
       validationErrors[property].Add(validationResult.ErrorMessage); 
      } 
      else 
      { 
       validationErrors.Add(property, new List<string> { validationResult.ErrorMessage }); 
       if (validationResult.ErrorMessage == "insert_first_name") 
       { 
        var text = System.Windows.Application.Current.Resources.FindName("insert_first_name"); 
       } 
      } 
     } 
    } 

    // Raises the ErrorsChanged for all properties explicitly. 
    RaiseErrorsChanged("FirstName"); 
    RaiseErrorsChanged("LastName"); 
} 

ответ

5

Для просмотра приложений в масштабах ресурсов из кода, используйте Application.Current.Resources, чтобы получить словарь ресурсов в приложении, как показано здесь:

string insertFirstName = Application.Current.Resources["insert_first_name"]; 

Source

+0

Спасибо параметра! Ты прав. Я искал это последние два часа, читая десятки статей. –

Смежные вопросы