我在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吗?
答案 0 :(得分:10)
为什么ResourceDictionary中的DataTemplates不需要x:Key?
当您错过Style
或DataTemplate
的密钥时,此结构:
<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文档中的评论很好地解释了这一点。
要回答第二个问题,那将非常困难。您可以在单独的资源字典中定义每个资源并使用聪明的合并。至于一个简单的方法,我相信答案是否定的。