Вопрос:

Как получить значение из словаря ресурсов (XAML) в C #

c# wpf xaml dictionary

4260 просмотра

1 ответ

826 Репутация автора

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

<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" во время проверки в моей модели представления. Поэтому я попытался получить это с помощью этого:

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");
}
Автор: Patrick Pirzer Источник Размещён: 01.02.2017 02:08

Ответы (1)


7 плюса

444 Репутация автора

Решение

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

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

Источник

Автор: parameter Размещён: 01.02.2017 02:19
32x32