Построение ResourceDictionary со строковыми парами Ключ - Значение программным способом

Как имея Dictionary<string, string> создать ResourceDictionary словарь языковых ресурсов без ручного редактирования файла? Есть ли какие-либо встроенные инструменты в рамках фреймворка для сериализации/десериализации ResourceDictionary?

Пример словаря:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                    xmlns:v="clr-namespace:System;assembly=mscorlib">
    <!-- Main window -->
    <v:String x:Key="m_Title">Пример WPF локализации</v:String>
    <v:String x:Key="m_lblHelloWorld">Привет мир!</v:String>
    <v:String x:Key="m_menu_Language">Язык</v:String>
    <v:Double x:Key="m_Number">10.5</v:Double>
</ResourceDictionary>

Пример локализации взят отсюда.


Ответы (1 шт):

Автор решения: Rootware

Нашёл рабочий вариант который решает мою задачу на 99%. Во фреймворке уже предусмотрены функции по созданию, динамическому наполнению, сохранению в файл и последующей загрузке. Единственное, не разобрался как добавлять комментарии в XAML разметку выходного файла вида:

<!-- Main Window Resources -->

Пример кода в отдельном классе:

public class DictionaryResourceManager
{
    public static void Main()
    {
        ResourceDictionary ResDict = new ResourceDictionary();
        List<DictionaryEntry> array = new List<DictionaryEntry>();

        array.Add(new DictionaryEntry("KEY_1", "Value #1"));
        array.Add(new DictionaryEntry("KEY_2", "Value #2"));
        array.Add(new DictionaryEntry("KEY_3", "Value #3"));

        foreach (DictionaryEntry entry in array)
            ResDict.Add(entry.Key, entry.Value);

        Write(ResDict);

        ResourceDictionary NewResDict = Read();
    }

    public static ResourceDictionary Read()
    {
        StreamResourceInfo sri = Application.GetResourceStream(new Uri("/MyAssemblyName;component/MyResourceDict.xaml", UriKind.Relative));
        return (ResourceDictionary)Load(sri.Stream);
    }

    public static void Write(ResourceDictionary ResDict)
    {
        XmlWriter writer = XmlWriter.Create("MyResourceDict.xaml", new XmlWriterSettings() { Indent = true });
        XamlWriter.Save(ResDict, writer);
    }

    private static object Load(Stream stream)
    {
        ParserContext pc = new ParserContext();
        MethodInfo loadBamlMethod = typeof(XamlReader).GetMethod("LoadBaml", BindingFlags.NonPublic | BindingFlags.Static);

        return loadBamlMethod.Invoke(null, new object[] { stream, pc, null, false });
    }
}

Результирующий файл:

<?xml version="1.0" encoding="utf-8"?>
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
  <s:String x:Key="KEY_1">Value #1</s:String>
  <s:String x:Key="KEY_3">Value #3</s:String>
  <s:String x:Key="KEY_2">Value #2</s:String>
</ResourceDictionary>

P.S. Чтение не проверял, но запись работает исправно и выходной файл содержит правильное представление переменных.

Источник №1

Источник №2

→ Ссылка