与代码的DRY并行,我不喜欢在XAML中具有相同的属性分配。我看过一些代码示例,其中很多代码可以合并为一种样式。一旦完成并清理了更多代码,就可以由另一种基于初始样式的样式表示,该样式具有一些更具体的编辑,依此类推。有一种观点认为这导致了“聪明”的方式。其中一种样式的更改会导致对所有依赖该样式的样式产生级联影响。使用Style ... BasedOn={...}
时要记住一些经验法则或一般准则吗?
Head First C#中使用WPF version的示例。在754页上,它们具有下面显示的示例。由于这是简介,因此可以使用样式合并一些属性分配。
<StackPanel Margin="20">
<TextBlock Foreground="White" FontFamily="Segoe" FontSize="20px"
FontWeight="Bold" Text="{Binding TeamName}" />
<TextBlock Foreground="White" FontFamily="Segoe" FontSize="16px"
Text="Starting Players" Margin="0,5,0,0"/>
<ListView Background="Black" Foreground="White" Margin="0,5,0,0"
ItemTemplate="{StaticResource PlayerItemTemplate}"
ItemsSource="{Binding Starters}" />
<TextBlock Foreground="White" FontFamily="Segoe" FontSize="16px"
Text="Bench Players" Margin="0,5,0,0"/>
<ListView Background="Black" Foreground="White" ItemsSource="{Binding Bench}"
ItemTemplate="{StaticResource PlayerItemTemplate}" Margin="0,5,0,0"/>
</StackPanel>
使用样式进行重构,以删除重复的属性分配。这显示了一个中间步骤,可以进一步整合Margin
属性。
<StackPanel Margin="20">
<StackPanel.Resources>
<Style x:Key="whiteForground" TargetType="TextBlock">
<Setter Property="Foreground" Value="White" />
<Setter Property="FontFamily" Value="Segoe" />
</Style>
<Style TargetType="ListView">
<Setter Property="Margin" Value="0,5,0,0" />
<Setter Property="Background" Value="Black" />
<Setter Property="Foreground" Value="White" />
</Style>
<Style x:Key="appliedMargin" TargetType="TextBlock" BasedOn="{StaticResource whiteForground}">
<Setter Property="Margin" Value="0,5,0,0" />
</Style>
</StackPanel.Resources>
<TextBlock Style="{StaticResource whiteForground}" FontSize="20px"
FontWeight="Bold" Text="{Binding TeamName}" />
<TextBlock Style="{StaticResource appliedMargin}" FontSize="16px"
Text="Starting Players" />
<ListView ItemTemplate="{StaticResource PlayerItemTemplate}"
ItemsSource="{Binding Starters}" />
<TextBlock Style="{StaticResource appliedMargin}" FontSize="16px"
Text="Bench Players" />
<ListView ItemsSource="{Binding Bench}"
ItemTemplate="{StaticResource PlayerItemTemplate}" />
</StackPanel>
答案 0 :(得分:0)
答案 1 :(得分:0)
我尝试只坚持一个级别的基础。
基本样式,仅一种继承(叶子)样式。
但是,很明显,设置值会覆盖使用该叶子的控件中的任何值。
最多是另一层。
有几个原因。
1)
这是跟踪复杂继承的噩梦-正如您可能已经意识到的那样。
2)
资源字典链接(rd)过去曾经(而且可能仍然是)潜在问题。
您要做的是在rd中添加样式。
这些通常很快就会变大。
所以您将它们分为多个rd。
您想要一个基于另一个,以便需要了解基本样式。 因此,您将基数1合并到叶rd中。
一层合并字典,例如:
<ResourceDictionary
...
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="pack://application:,,,/Blaa.Validation.UILib;component/Resources/UIlibResources.xaml"/>
</ResourceDictionary.MergedDictionaries>
<Style TargetType="{x:Type ComboBox}" BasedOn="{StaticResource ErrorStyle}"/>
<Style TargetType="{x:Type DatePicker}" BasedOn="{StaticResource ErrorStyle}"/>
此处的combobxox样式基于UILibResources中的错误样式。
没问题。
如果rd合并了另一个rd,又又合并了另一个rd ...,依此类推。
您可能会遇到一些神秘的问题,这些问题似乎是由于合并延迟所致。
我已经看到间歇性错误和样式问题。
因此,我认为最好使链接浅而基础资源字典小。
该问题可能已经在该框架的最新版本中修复,但是我什么都没有提及,并且WPF在相当长的一段时间内几乎没有变化。
3)
太容易了,在此之前您需要此级别,但是如果您尝试变得“聪明”,则还取决于其他因素。
如果样式层叠起来或者有混合,但是它们没有,而我们没有,这将是很棒的。
因此,这是我们所拥有的全部东西,与网络相比,这有点笨拙。