什么时候使用基于其他样式的样式会变得过多?

时间:2019-04-11 19:24:05

标签: wpf

与代码的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>

2 个答案:

答案 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)

太容易了,在此之前您需要此级别,但是如果您尝试变得“聪明”,则还取决于其他因素。

如果样式层叠起来或者有混合,但是它们没有,而我们没有,这将是很棒的。

因此,这是我们所拥有的全部东西,与网络相比,这有点笨拙。