Построение 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 шт):
Нашёл рабочий вариант который решает мою задачу на 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. Чтение не проверял, но запись работает исправно и выходной файл содержит правильное представление переменных.