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

我在跨多个程序集引用 ResourceDictionaries (RD) 时遇到问题。

我目前遇到的具体问题是资源和样式在设计时应用于 LoginWindow 而不是在运行时。

我还想确定 RD/资源是否以与 DataContext 相同的方式工作。

我有点不知所措,我认为我缺少一些关于 WPF 如何处理 RD 和资源等的基本知识

对于上下文,我有两个正在使用的程序集。

  • ControlsAndResources(包含一般控件和资源/样式)

  • 登录(处理登录 ui 和逻辑;这包含对 ControlsAndResources 的引用)

ControlsAndResources 程序集包含 5 个简单的 RD。这些都放在/Styles/Default

  • Base.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 原则的建议(或者真的有任何建议),那么我会全力以赴。

谢谢。


斯蒂芬大帝
浏览 169回答 1
1回答

海绵宝宝撒

中的隐式样式Package.xaml应在合并ResourceDictionary本身中定义。尝试这个:<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; xmlns:local="clr-namespace:ControlsAndResources.Styles.Default">&nbsp; &nbsp; <ResourceDictionary.MergedDictionaries>&nbsp; &nbsp; &nbsp; &nbsp; <ResourceDictionary Source="/ControlsAndResources;component/Styles/Default/Base.xaml"/>&nbsp; &nbsp; &nbsp; &nbsp; <ResourceDictionary Source="/ControlsAndResources;component/Styles/Default/Buttons.xaml"/>&nbsp; &nbsp; &nbsp; &nbsp; <ResourceDictionary Source="/ControlsAndResources;component/Styles/Default/Textblocks.xaml"/>&nbsp; &nbsp; &nbsp; &nbsp; <ResourceDictionary Source="/ControlsAndResources;component/Styles/Default/Textboxes.xaml"/>&nbsp; &nbsp; </ResourceDictionary.MergedDictionaries>&nbsp; &nbsp; <Style TargetType="Button" BasedOn="{StaticResource DefaultButtons}"/>&nbsp; &nbsp; <Style TargetType="TextBlock" BasedOn="{StaticResource DefaultTextblocks}"/>&nbsp; &nbsp; <Style TargetType="TextBox" BasedOn="{StaticResource DefaultTextboxes}"/></ResourceDictionary>
打开App,查看更多内容
随时随地看视频慕课网APP