首页 文章

WPF - 对标准样式的控件使用控件继承?

提问于
浏览
0

我有一个带有许多窗口和用户控件的WPF应用程序,我想为整个应用程序中出现的某些控件实现标准样式 . 举个例子,假设我在整个应用程序中需要两个标准的TextBlock:一个用于大 Headers ,一个用于小 Headers . 它们之间唯一的区别是字体大小,分别为36和24 . 所有其他属性(颜色,fontfamily等)可以通过TextBlock模板或全局TargetType =“{x:Type TextBlock}”样式设置 .

当然,我可以创建两个全局命名样式,只设置字体大小,并将整个XAML中的那些静态资源样式应用到我的TextBlocks,或者在TextBlocks之上的最高级别,不会干扰其他TextBlocks . 但作为一种替代方案,可以在很多地方删除设置Style标签的要求,继承TextBlock是一个很好的方法吗?

TextBlock控件:

class TextBlockLargeHeading : TextBlock
{
    public TextBlockLargeHeading()
    { }
}

class TextBlockSmallHeading : TextBlock
{
    public TextBlockSmallHeading()
    { }
}

全球资源:

<Application.Resources>
    <Style TargetType="TextBlock">
        <Setter Property="Foreground" Value="Red" />
    </Style>
    <Style TargetType="MyApp:TextBlockLargeHeading" BasedOn="{StaticResource {x:Type TextBlock}}" >
        <Setter Property="FontSize" Value="36" />
    </Style>
    <Style TargetType="MyApp:TextBlockSmallHeading" BasedOn="{StaticResource {x:Type TextBlock}}" >
        <Setter Property="FontSize" Value="24" />
    </Style>
</Application.Resources>

然后,要在任何地方使用它们,只需引用自定义文本块:

<StackPanel>
    <MyApp:TextBlockLargeHeading Text="Large" />
    <MyApp:TextBlockSmallHeading Text="Small" />
</StackPanel>

这将创建两个具有适当字体大小的红色TextBlocks .

这是一种合理的方法吗?如果我有100个这样的实例,可维护性或其他方面,是否有任何问题?是否有更好的(更安全或更少的代码/ XAML)方法?也许使用用户控件?

谢谢!

1 回答

  • 1

    没有理由做到这一切 . 创建样式并直接使用它们 .

    ....
    <Style x:Key="DefaultTextBlockStyle" TargetType="TextBlock">
        <Setter Property="Foreground" Value="Red" />
        <Setter Property="FontSize" Value="24" />
    </Style>
    <Style x:Key="LargeTextBlockStyle" TargetType="TextBlock" BasedOn="{StaticResource DefaultTextBlockStyle}">
        <Setter Property="FontSize" Value="36" />
    </Style>
    
    <!-- Style applies to all TextBoxes -->
    <Style TargetType="{x:Type TextBlock}" BasedOn="{StaticResource DefaultTextBlockStyle}" />
    ...
    
    <StackPanel>
        <TextBlock Text="Large" Style="{StaticResource LargeTextBlockStyle}"/>
        <TextBlock Text="Small"/>
    </StackPanel>
    

相关问题