加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – WPF基础知识:MVVM的共享全局样式

发布时间:2020-12-15 08:33:22 所属栏目:百科 来源:网络整理
导读:我试图在我的 WPF开发中使用MVVM-ish方法. 我在ViewModel命名空间下有我的逻辑视图模型类,我在View命名空间下有这些视图模型类的匹配样式. 现在我在ResourceDictionary XAML文件中有我的View信息,如DataTemplates和Styles,它们都被合并到app.xaml中的单个App
我试图在我的 WPF开发中使用MVVM-ish方法.

我在ViewModel命名空间下有我的逻辑视图模型类,我在View命名空间下有这些视图模型类的匹配样式.

现在我在ResourceDictionary XAML文件中有我的View信息,如DataTemplates和Styles,它们都被合并到app.xaml中的单个App.Resources ResourceDictionary中.

但是,我遇到了一种鸡/蛋问题.我想在那里使用全球风格.例如,我想要一个名为MonkeyText的自定义文本样式,它可以在各个地方使用各种样式.我不能在app.xaml文件中设置它,因为那个app.xaml文件包含了想要使用MonkeyText的资源.

我想如果这是不可能的替代方法是使用UserControls而不是主要使用DataTemplates来建立我的观点?我担心使用UserControl会将VM和V部分紧密地联系在一起.

解决方法

出于这个原因,WPF提供了DynamicResources. StaticResources – 最类似于编程中的’传统’引用 – 只有你遇到的问题;它们需要在解析样式之前定义和加载.另一方面,DynamicResources不需要在使用它们之前定义 – 实际上,您甚至可以动态创建它们. 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,它将无声地失败而不会抛出任何异常(当无法解析时,StaticResources会抛出异常).但是,它会在发生这种情况时打印调试消息 – 因此请密切关注Visual Studio中的“输出”窗口.

由于DynamicResources使用以任何顺序在任何位置加载的资源,因此您可以按照自己喜欢的方式构建资源字典 – 因此将它们与其他View样式放在一起并通过app.xaml中的单个App.Resources ResourceDictionary合并它们.会很好的.

有关DynamicResources的更多详细信息,请参阅WPF的MSDN文档.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读