我正在尝试使用 MVVM 式的方法来进行 WPF 开发。
我在 ViewModel 命名空间下有我的逻辑视图模型类,并且在 View 命名空间下有这些视图模型类的匹配样式。
现在,我的视图信息位于 ResourceDictionary XAML 文件中,如 DataTemplates 和 Styles,它们全部合并到 app.xaml 中的单个 App.Resources ResourceDictionary 中。
然而,我遇到了先有鸡还是先有蛋的问题。我希望有一种可以在任何地方使用的全局样式。例如,我想要自己的自定义文本样式,称为 MonkeyText,它可以在任何地方的各种样式中使用。我不能只在 app.xaml 文件中设置它,因为想要使用 MonkeyText 的资源字典包含在该 app.xaml 文件中。
我想如果这是不可能的,替代方案是使用 UserControls 而不是主要使用 DataTemplates 来建立我的视图?我担心使用 UserControls 会将 VM 和 V 部分联系得太紧密。
出于这个原因,WPF 提供了 DynamicResources。 StaticResources - 最类似于编程中的“传统”引用 - 恰好有您遇到的问题;它们需要在解析样式之前定义和加载。另一方面,动态资源不需要在使用之前定义 - 事实上,您甚至可以动态创建它们。 WPF 负责确保 DynamicResources 在实际加载后由引用它们的所有样式自动加载。
使用 DynamicResources 非常简单。当您创建 MonkeyText 样式时,请像平常一样创建它:
<Style TargetType="TextBlock" x:Key="MonkeyText">
<Setter Property="TextAlignment" Value="Center"/>
<!-- etc. -->
</Style>
然后使用 DynamicResource 从其他地方引用它:
<TextBlock Text="Hello, World!" Style="{DynamicResource MonkeyText}"/>
如果出于任何原因,WPF 无法解析您的 DynamicResource,它将失败silently没有抛出任何异常(当无法解析时,StaticResources 确实会抛出异常)。但是,当发生这种情况时,它会打印一条调试消息 - 因此请密切关注 Visual Studio 中的“输出”窗口。
由于 DynamicResources 使用以任何顺序在任何点加载的资源,因此您可以按照自己喜欢的方式构建资源字典 - 因此将它们与其他视图样式一起放入,并通过 app.xaml 中的单个 App.Resources ResourceDictionary 合并它们会工作得很好。
有关动态资源的更多详细信息,请参阅 WPF 的 MDN 文档。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)