合并的ResourceDictionary与App.xaml

合并的ResourceDictionary与App.xaml,xaml,resourcedictionary,Xaml,Resourcedictionary,我正在阅读有关资源词典的内容,现在已经到了一个令人困惑的地步 似乎每个XAML只能有一个ResourceDictionary。因此,如果我想使用多个,我可以合并ResourceDictionary 如果我可以合并字典,“全局”样式应该在哪里?我可以拥有一个ApplicationResourceDictionary,其中包含在整个应用程序中保持一致的所有样式,或者,我可以将此信息保存到App.xaml文件中。两者似乎都是有效的选择,但我不知道是否如此 这是关于个人选择还是一个比另一个好?将它们保存

我正在阅读有关资源词典的内容,现在已经到了一个令人困惑的地步

似乎每个XAML只能有一个ResourceDictionary。因此,如果我想使用多个,我可以合并ResourceDictionary

如果我可以合并字典,“全局”样式应该在哪里?我可以拥有一个ApplicationResourceDictionary,其中包含在整个应用程序中保持一致的所有样式,或者,我可以将此信息保存到App.xaml文件中。两者似乎都是有效的选择,但我不知道是否如此


这是关于个人选择还是一个比另一个好?将它们保存在ResourceDictionary中似乎更好,因为所有样式都在一起(在字典中),而不是在XAML页面中拆分一些样式。

我们当前的解决方案中有100多个项目。每个人都需要访问几个资源字典,其中包含主题和统一性等的全局资源。我所做的是将资源字典集中放置在一个项目中,而其他项目则引用,在这种情况下,我们称之为“基础设施”然后,我通过每个项目自己的app.xaml直接向每个项目提供字典,并合并字典,例如:

<Application.Resources>
  <ResourceDictionary>
    <ResourceDictionary.MergedDictionaries>
        <ResourceDictionary Source="/Our.Client.Infrastructure;component/Resources/Styles/ResDictName1.xaml" />
        <ResourceDictionary Source="/Our.Client.Infrastructure;component/Resources/Styles/ResDictName2.xaml" />
    </ResourceDictionary.MergedDictionaries>
  </ResourceDictionary>
</Application.Resources>

到目前为止,它工作得非常出色,但我使样式应用全局的方法是在一个自定义资源字典的底部指定它们,并从默认资源字典中删除相同的声明。例如,如果你发现

<Style BasedOn="{StaticResource DefaultButtonStyle}" TargetType="Button" />

在默认的CoreStyles.xaml或SdkStyles.xaml中,或者不管它们是什么,我只是将其删除,并将该声明移到自定义资源字典的底部,并根据需要进行相应的更改

<Style BasedOn="{StaticResource OurSuperAwesomeCustomNewGlobalButtonStyle}" TargetType="Button" />

瞧。。。此后的任何
按钮
默认继承我们的自定义样式,而不是原始默认模板。整个解决方案只有一个或两个资源字典的优点在您采用它后会很快变得明显。也就是说,前提是模板实际上需要全局可用。如果你正在使用一个只与它所使用的视图相关的临时模板,请明确地将其保留在该视图中,如果没有其他需要它,则无需将其保留在其他地方


希望这有帮助

我认为将资源放入全局资源字典(如App.xaml)而不是本地资源字典(即使它仅由一个控件使用)可能会带来性能上的好处。据我所知,每个控件都会获得其本地资源的单独副本@PatrickV根据我的经验,这是不正确的,但不幸的是,我没有我过去为以前的雇主所做的任何基准文件可供分享。因此,如果你感到无聊,你可能会抛出一些指标的概念。特别是考虑到,每当你将一个字典与另一个字典合并时,它实际上是在运行时为每个实例向新的字典注入一个原始字典的副本。我创建了一个应用程序,其中包含一个自定义控件的大量实例和一个非常大的字符串资源。当字符串位于App.xaml中时,应用程序占用56 MB内存;当在本地控件的资源中定义或合并到该控件的资源中时,应用程序占用1 GB内存。控件未引用该资源。因此,在我看来,最好将所有资源保存在app.xaml中(或合并到app.xaml中),除非你知道你的控件只有一个实例。我想重点是你肯定不想做的是为你的所有控件创建一个包含所有资源的资源字典,然后将它合并到每个本地控件的资源字典中。我差点就做到了。那真的很糟糕。我确实意识到你不是说要这么做。@PatrickV-hmmm,那么我必须再看一眼,我可以发誓,如果你在全球目录中保留大量资源,而这些资源几乎不被使用,并且只在必要时在例如窗口中实例化它们。资源我总是通过这种方式获得更好的性能。我已经有一段时间被踢到了另一个网站,所以我可能比2013年的时候更加生疏了,为这条信息干杯!