在WPF中的ResourceDictionary中没有键的DataTemplate

时间:2014-03-07 22:15:33

标签: wpf xaml resourcedictionary

我在ResourceDictionary中有几个DataTemplates:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                    xmlns:z="clr-namespace:ZoomPan">
    <DataTemplate DataType="{x:Type z:Circle}">
        <z:Circle Center="{Binding Center}" Radius="{Binding Radius}" x:Name="circle"/>
        <DataTemplate.Triggers>
            <DataTrigger ... />
        </DataTemplate.Triggers>
    </DataTemplate>
    .... etc.
</ResourceDictionary>

我在Window

中使用它
<z:MyUserControl>
    <z:MyUserControl.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="Dictionary.xaml"/>
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </z:MyUserControl.Resources>
</z:MyUserControl>

DataTemplates和触发器工作正常。

我有两个问题:

  • 为什么ResourceDictionary中的DataTemplates不需要x:Key?

  • 我可以在某个部分用一个Key划分ResourceDictionary,然后指向一个部分中的DataTemplates吗?

2 个答案:

答案 0 :(得分:10)

  

为什么ResourceDictionary中的DataTemplates不需要x:Key?

当您错过StyleDataTemplate的密钥时,此结构:

<DataTemplate TargetType="{x:Type local:MyType}">

自动转换为:

<DataTemplate x:Key="{x:Type local:MyType}" TargetType="{x:Type local:MyType}">

这意味着Style / DataTemplate将明确用于此类型的所有控件,因为在ResourceDictionaries中不能是没有键的元素,而是这样做是为了简化结构。引自MSDN

  

将TargetType属性设置为TextBlock类型而不设置x:Key implicitly sets the x:Key to {x:Type TextBlock}.这也意味着如果您为上面的Style赋予除{x:Type TextBlock}以外的任何内容的x:Key值,则样式不会自动应用于所有TextBlock元素。相反,您需要明确地将样式应用于TextBlock元素。


  

当我向DataTemplates提供密钥时,他们就会停止工作

DataTemplate指定密钥时,应将其用于此密钥,例如:

<ContentControl Name="MyContent"
                ContentTemplate="{StaticResource MainView}"> // here set the key

    <MainWindowViewModels:MainViewModel />
</ContentControl>

  

我可以在某个部分用一个Key划分ResourceDictionary,然后指向一个部分中的DataTemplates吗?

不幸的是,不,ResourceDictionary是Quote

  

类不是从DictionaryBase派生的。相反,ResourceDictionary类实现IDictionary但在内部依赖于Hashtable。

在这种情况下,它不是有序字典,其中每个元素都分配给散列。对于使用ResourceDictionary.MergedDictionaries的词典区域的分离。

答案 1 :(得分:1)

要回答您的第一个问题,您可以在其上放置一个x:Key,但x:Type允许它们影响它们所属的控件子级中的所有类型。它还在项目上设置隐式 x:Key。这篇MSDN文档中的评论很好地解释了这一点。

要回答第二个问题,那将非常困难。您可以在单独的资源字典中定义每个资源并使用聪明的合并。至于一个简单的方法,我相信答案是否定的。