将标记扩展名写为嵌套元素

时间:2013-04-06 02:58:29

标签: wpf xaml user-controls resourcedictionary markup-extensions

是否可以将标记扩展名编写为嵌套元素而不是属性?我正在尝试使用Boolean作为ResourceDictionary条目的关键字。

ResourceDictionary密钥类型为字符串的当前代码:

<UserControl.Resources>
    <my:ObjectToResourceConverter x:Key="StatusConverter">
        <ResourceDictionary>
            <BitmapImage x:Key="True" UriSource="/TestProject;/Resources/Open.png"/>
            <BitmapImage x:Key="False" UriSource="/TestProject;/Resources/Closed.png" />
        </ResourceDictionary>
    </my:ObjectToResourceConverter>
</UserControl.Resources>

所需代码但由于以下原因而无法编译:

  

无法识别的代码x:密钥

XAML

... 
<BitmapImage UriSource="/TestProject;/Resources/Open.png">
    <x:Key>
        <x:Boolean>True</x:Boolean>
    </x:Key>
</BitmapImage>
...

1 个答案:

答案 0 :(得分:3)

嗯,是的,您通常可以使用元素语法声明标记扩展,但x:Key实际上是指令,而不是标记扩展。如上所述,herex:Key不支持XAML 2006中的元素语法。如果您使用XAML 2009,则可以,但您不太可能(或者想要)。

但即使你能做到这一点,也没有用,因为(在XAML 2006中; XAML 2009可能不同,没有检查)资源字典的密钥只能使用string设置, x:Typex:Static。因此,对于您的情况,您需要定义一个生成false的静态属性,并使用x:Static将其设置为键。

修改仅支持stringx:Typex:Static的部分并非完全正确。我太信任编译器错误消息(支持'Only String,TypeExtension和StaticExtension'。)。至少还有一种其他受支持的密钥类型:ComponentResourceKey。可能有更多我忘记了或者我不知道。但无论如何,不​​支持任意标记扩展(如返回布尔值的自定义标记扩展)。