xaml - 合并 ResourceDictionary 与 App.xaml

标签 xaml resourcedictionary

我正在阅读有关 ResourceDictionary 的内容,但遇到了一个令人困惑的问题。

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

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

这是关于个人选择还是一个比另一个更好?将它们保留在 ResourceDictionaries 中似乎更好,因为所有样式都在一起(在字典中)而不是在 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" />

在您的 Default CoreStyles.xaml 或 SdkStyles.xaml 或任何它们中,我只是将其删除,并将该声明移至我们自定义资源字典的底部并相应地进行更改;

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

瞧...任何 Button 之后默认继承我们的自定义样式,而不是原始的默认模板。一旦您采用它,整个解决方案只有一个或两个资源字典的优势就会变得非常明显。也就是说,前提是模板实际上需要全局可用。如果您将模板用于仅适用于其所用 View 的特定内容,请将其明确保留在该 View 中,如果没有其他需要,则无需将其保留在其他地方。

希望这对您有所帮助。

关于xaml - 合并 ResourceDictionary 与 App.xaml,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15788869/

相关文章:

wpf - 有WPF资源字典的设计者吗?

.net - 菜单项触发器不工作

.net - 创建具有 ObservableCollection 类型的 DependencyProperty 的 CustomUserControl

wpf - 从 UI 绑定(bind)到 View 模型属性需要从 TextBox 中移除焦点

wpf - 在网格 WPF 中对齐标签

c# - XAML 中的资源转换

c# - 将对话框置于窗口之上,但不置于所有内容之上

wpf - GridView 双击

wpf - 在 ResourceDictionary 中定义 UserControl?

c# - ResourceDictionary.Source 属性中的 MarkupExtension