为了账号安全,请及时绑定邮箱和手机立即绑定

引用 ResourceDictionaries 和跨多个程序集的样式问题

引用 ResourceDictionaries 和跨多个程序集的样式问题

C#
斯蒂芬大帝 2022-06-12 15:05:30
我在跨多个程序集引用 ResourceDictionaries (RD) 时遇到问题。我目前遇到的具体问题是资源和样式在设计时应用于 LoginWindow 而不是在运行时。我还想确定 RD/资源是否以与 DataContext 相同的方式工作。我有点不知所措,我认为我缺少一些关于 WPF 如何处理 RD 和资源等的基本知识对于上下文,我有两个正在使用的程序集。ControlsAndResources(包含一般控件和资源/样式)登录(处理登录 ui 和逻辑;这包含对 ControlsAndResources 的引用)ControlsAndResources 程序集包含 5 个简单的 RD。这些都放在/Styles/DefaultBase.xaml(包含 FrameworkElement 和控件的基本样式)Buttons.xaml(从基本控件样式继承)Textblocks.xaml(继承自 Base FrameworkElement 样式)Textboxes.xaml(从基本控件样式继承)Package.xaml(将“Buttons.xaml”、“Textblocks.xaml”和“Textboxes.xaml”打包到单个 RD 中,并包含另一个为“Button”、“Textblock”和“Textbox”类型创建隐式样式的 RD )Login 程序集包含 LoginWindow.xaml。(这包含对“Package.xaml”的引用,其意图是隐式样式将应用于“LoginWindow”中包含的“Textblock”、“Textbox”和“Button”——它们只是在设计时才这样做,而不是在运行时)我注释掉了对“DefaultStyles.xaml”RD 的引用,它实际上只是封装了相同的“Package.xaml”RD。出于某种原因,我认为解决方案是在同一个程序集中创建一个物理 RD,然后从不同的程序集中引用我想要的 RD。没有。我对 WPF 相当精通和舒适,这个主题是个例外,因为我才开始将我的样式提取到单独的 RD。我推迟了它,因为与经理打交道似乎很头疼。到目前为止,我似乎是对的。但是我决定开始这个是为了真正遵守 DRY 原则。话虽如此,根据目前的代码,虽然微不足道,但如果有人有更好地遵守 DRY 原则的建议(或者真的有任何建议),那么我会全力以赴。谢谢。
查看完整描述

1 回答

?
海绵宝宝撒

TA贡献1809条经验 获得超8个赞

中的隐式样式Package.xaml应在合并ResourceDictionary本身中定义。尝试这个:


<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

                    xmlns:local="clr-namespace:ControlsAndResources.Styles.Default">

    <ResourceDictionary.MergedDictionaries>

        <ResourceDictionary Source="/ControlsAndResources;component/Styles/Default/Base.xaml"/>

        <ResourceDictionary Source="/ControlsAndResources;component/Styles/Default/Buttons.xaml"/>

        <ResourceDictionary Source="/ControlsAndResources;component/Styles/Default/Textblocks.xaml"/>

        <ResourceDictionary Source="/ControlsAndResources;component/Styles/Default/Textboxes.xaml"/>

    </ResourceDictionary.MergedDictionaries>

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

    <Style TargetType="TextBlock" BasedOn="{StaticResource DefaultTextblocks}"/>

    <Style TargetType="TextBox" BasedOn="{StaticResource DefaultTextboxes}"/>

</ResourceDictionary>


查看完整回答
反对 回复 2022-06-12
  • 1 回答
  • 0 关注
  • 168 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信