我有一个xaml资源字典,如下所示
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:sys="clr-namespace:System;assembly=mscorlib"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:loc="http://temp/uri"
mc:Ignorable="loc">
<sys:String x:Key="ResouceKey" loc:Note="This is a note for the resource.">ResourceText</sys:String>
</ResourceDictionary>
我正在循环遍历所有.xaml文件并尝试转换为POCO类并获取loc:注意属性以及使用XamlReader。
using (var sr = new StreamReader(...))
{
var xamlreader = new XamlReader();
var resourceDictionary = xamlreader.LoadAsync(sr.BaseStream) as ResourceDictionary;
if (resourceDictionary == null)
{
continue;
}
foreach (var key in resourceDictionary.Keys)
{
// In this loop i would like to get the loc:Note
var translation = new Translation
{
LocaleKey = locale,
Note = string.Empty, // How to get the note from the xaml
Text = resourceDictionary[key] as string
});
}
}
这是可能的还是我必须使用自定义xml序列化逻辑?
答案 0 :(得分:1)
XamlReader
包含仅包含键/值对的词典。除非您创建自己的类或类型,否则它将忽略自定义属性。 String是一个原始项,将如此显示,而不是可能具有其他属性的类。
创建一个类会更简洁,更安全:
public class MyString {
public string _string { get; set; }
public string _note { get; set; }
}
然后将它们存储在ResourceDictionary中。现在,您可以将值转换为:(MyString)r.Values[0]
,然后将它们分配给Translation
对象。
答案 1 :(得分:1)
结束使用Xdocument读取xaml资源。
var xdoc = XDocument.Load(...);
if (xdoc.Root != null)
{
XNamespace xNs = "http://schemas.microsoft.com/winfx/2006/xaml";
XNamespace sysNs = "clr-namespace:System;assembly=mscorlib";
XNamespace locNs = "http://temp/uri";
foreach (var str in xdoc.Root.Elements(sysNs + "String"))
{
var keyAttribute = str.Attribute(xNs + "Key");
if (keyAttribute == null)
{
continue;
}
var noteAttribute = str.Attribute(locNs + "Note");
var translation = new Translation
{
LocaleKey = locale,
Note = noteAttribute != null ? noteAttribute.Value : null,
Text = str.Value
});
}
}