说说我刚才将数据模板写在外部的报错
在WPF的 <Window.Resources>中
可以直接写
<ResourceDictionary Source="../Styles/ContentDemoStyle.xaml"/>,
也可以包裹一层,
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="../Styles/ContentDemoStyle.xaml"/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
这两种写法都是对的
但是当我写了
<ResourceDictionary Source="../Styles/ContentDemoStyle.xaml"/>
<local:People x:Key="MyFriends" />
<Style TargetType="ListBoxItem">
<Setter Property="FontFamily" Value="Verdana" />
<Setter Property="FontSize" Value="11" />
<Setter Property="Padding" Value="10" />
</Style>
绑定报错,出现不兼容的内容
真正的写法应该是
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="../Styles/ContentDemoStyle.xaml"/>
</ResourceDictionary.MergedDictionaries>
<local:People x:Key="MyFriends" />
<Style TargetType="ListBoxItem">
<Setter Property="FontFamily" Value="Verdana" />
<Setter Property="FontSize" Value="11" />
<Setter Property="Padding" Value="10" />
</Style>
</ResourceDictionary>
在 Window.Resources 中包含另一个 ResourceDictionary 作为子元素(通过 ResourceDictionary Source=... 形式)和直接在其中定义样式(如 Style 元素)是两种不同的资源定义方式。
为什么需要包裹一层才不会报错?
资源合并:ResourceDictionary 的设计允许通过 MergedDictionaries 属性合并多个资源字典。如果您直接在 Window.Resources 中写入
资源作用域:当您在 Window.Resources 中直接定义样式时,这些样式是直接添加到当前窗口的资源字典中的。而通过 ResourceDictionary Source=... 引入的资源字典是作为独立的字典合并到当前资源字典中的。WPF 需要一个明确的层次结构来避免混淆。
编译错误:如果直接将
包裹一层的区别:
结构清晰:通过包裹一层 ResourceDictionary,您可以清楚地区分直接定义的资源和通过外部文件合并进来的资源。
避免编译错误:如上所述,这种结构避免了直接混合使用导致的编译错误。
资源隔离:外部的资源字典(通过 Source 引入的)可以包含多个资源,包括数据模板、样式等,它们被合并到一个单独的字典中,有助于资源的组织和管理。
重用性:通过外部资源字典,您可以在不同的窗口或控件中重用相同的资源集合,而不需要在每个地方重复定义。
总结:
将资源字典和样式包裹在一层 ResourceDictionary 中是一种组织资源的好方法,它提供了清晰的结构,避免了编译错误,并有助于资源的隔离和重用。直接在 Window.Resources 中定义资源(如样式)是快速添加少量资源的简便方式,但在资源较多或需要从外部文件合并资源时,使用包裹层可以更好地管理资源。