在多个程序集之间引用ResourceDictionary和样式时出现问题



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

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

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

我有点不知所措,我想我错过了一些关于WPF如何处理RD和资源等的基本知识

就上下文而言,我有两个正在处理的程序集。

  • 控件和资源(包含常规控件和资源/样式(
  • Login(处理登录ui和逻辑;其中包含对ControlsAndResources的引用(

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

  • Base.xaml(包含FrameworkElement和Control的基本样式(
  • Buttons.xaml(从基本控件样式继承(
  • Textblocks.xaml(从基本FrameworkElement样式继承(
  • Textboxes.xaml(从基本控件样式继承(
  • Package.xaml(将"Buttons.xaml"、"Textblocks.xml"one_answers"Textboxes.xaml"打包到单个RD中,并包含为"Button"、"Textblock"one_answers"Textbox"类型创建隐式样式的另一个RD(

Login程序集包含LoginDow.xaml

我注释掉了对"DefaultStyles.xaml"RD的引用,它实际上只是封装了相同的"Package.xml"RD。出于某种原因,我认为解决方案是在同一程序集中创建一个物理RD,然后引用我想要的来自不同程序集的RD。没有。

我对WPF相当熟练和熟悉,这个主题是个例外,因为我刚刚开始提取我的风格来分离RD。我推迟了,因为这似乎是一个头痛的处理和经理。到目前为止,我似乎是对的。然而,我决定开始这样做是为了真正遵守DRY原则。话虽如此,根据现有的代码,尽管微不足道,但如果有人有更好地遵守DRY原则的建议(或任何真正的建议(,那么我会洗耳恭听。

谢谢。

PS-我试着将StaticResource的所有内容都更改为DynamicResource,但这只是抛出了一个异常,无论我在哪里更改它

系统。Windows。加成XamlParseException:不能在"Style"类型的"BasedOn"属性上设置"DynamicResourceExtension"。只能在DependencyObject的DependencyProperty上设置"DynamicResourceExtension">

~~~~~~~~~~~~~~~~~~~~ Base.xaml ~~~~~~~~~~~~~~~~~~~~
<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">
<Style TargetType="{x:Type FrameworkElement}" x:Key="BaseDefaultFrameworkElement">
<Setter Property="Margin" Value="5"/>
</Style>
<Style TargetType="{x:Type Control}" x:Key="BaseDefaultControl" BasedOn="{StaticResource BaseDefaultFrameworkElement}">
<Setter Property="Padding" Value="5"/>
</Style>
</ResourceDictionary>

~~~~~~~~~~~~~~~~~~~~ Package.xaml ~~~~~~~~~~~~~~~~~~~~
<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>
<Style TargetType="Button" BasedOn="{StaticResource DefaultButtons}"/>
<Style TargetType="TextBlock" BasedOn="{StaticResource DefaultTextblocks}"/>
<Style TargetType="TextBox" BasedOn="{StaticResource DefaultTextboxes}"/>
</ResourceDictionary>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
~~~~~~~~~~~~~~~~~~~~ Buttons.xaml ~~~~~~~~~~~~~~~~~~~~
<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>
<Style TargetType="Button" x:Key="DefaultButtons" BasedOn="{StaticResource BaseDefaultControl}"/>
</ResourceDictionary>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>

~~~~~~~~~~~~~~~~~~~~ Textblocks.xaml ~~~~~~~~~~~~~~~~~~~~
<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>
<Style TargetType="TextBlock" x:Key="DefaultTextblocks" BasedOn="{StaticResource BaseDefaultFrameworkElement}"/>
</ResourceDictionary>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>

~~~~~~~~~~~~~~~~~~~~ Textboxes.xaml ~~~~~~~~~~~~~~~~~~~~
<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>
<Style TargetType="TextBox" x:Key="DefaultTextboxes" BasedOn="{StaticResource BaseDefaultControl}"/>
</ResourceDictionary>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
~~~~~~~~~~~~~~~~~~~~ LoginWindow.xaml ~~~~~~~~~~~~~~~~~~~~
<Window x:Class="Login.LoginWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:Login"
SizeToContent="WidthAndHeight"
Title="{Binding WindowTitle, FallbackValue=Login, TargetNullValue=Login}">
<Window.Resources>
<ResourceDictionary Source="pack://application:,,,/ControlsAndResources;component/Styles/Default/Package.xaml"/>
<!--<ResourceDictionary Source="pack://application:,,,/Login;component/Resources/XAML/DefaultStyles.xaml"/>-->
</Window.Resources>
<Grid>
<StackPanel>
<TextBlock>This is a textblock</TextBlock>
<Button>This is a button</Button>
<TextBox>This is a textbox</TextBox>
</StackPanel>
</Grid>
</Window>
~~~~~~~~~~~~~~~~~~~~ DefaultStyles.xaml ~~~~~~~~~~~~~~~~~~~~
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:Login.Resources.XAML">
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="/ControlsAndResources;component/Styles/Default/Package.xaml"/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>

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>

最新更新