xaml resourcedictionary中的自定义属性

时间:2015-10-13 08:03:12

标签: c# wpf xaml resourcedictionary

我有一个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序列化逻辑?

2 个答案:

答案 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
            });
    }
}