【问题标题】:WPF - How to create a style that applies styles to child typesWPF - 如何创建将样式应用于子类型的样式
【发布时间】:2012-06-29 19:44:53
【问题描述】:

我正在尝试获取一种样式以将另一种样式应用于某种类型的元素。类似于你会做的 CSS

div a  
{  
    background-color:red;  
}

元素包含的所有 元素应用红色背景。

具体来说,我试图让包含在具有特定样式的 TableRowGroup 中的所有 TableCells 来更改它们的边框。

我有以下解决方案,其中每个单元格样式都是单独设置的。

<Table>
    <Table.Columns>
        <TableColumn/>
        <TableColumn/>
    </Table.Columns>

    <Table.Resources>
        <Style x:Key="HeaderStyle" TargetType="{x:Type TableRowGroup}">
            <Setter Property="FontWeight" Value="Normal"/>
            <Setter Property="FontSize" Value="12"/>
        </Style>

        <Style x:Key="HeaderCellStyle" TargetType="{x:Type TableCell}">
            <Setter Property="BorderThickness" Value="0,1,0,1" />
            <Setter Property="BorderBrush" Value="Black" />
        </Style>
    </Table.Resources>

    <TableRowGroup Name="TableColumnHeaders" Style="{StaticResource HeaderStyle}">
        <TableRow>
            <TableCell Style="{StaticResource HeaderCellStyle}">
                <Paragraph>
                    Description
                </Paragraph>
            </TableCell>
            <TableCell Style="{StaticResource HeaderCellStyle}">
                <Paragraph>
                    Amount
                </Paragraph>
            </TableCell>
        </TableRow>
    </TableRowGroup>
</Table>

这显然不是首选,因为当有很多单元格时它会使 xaml 膨胀。

我尝试了以下但没有成功。

<Table.Resources>
    <Style x:Key="HeaderStyle" TargetType="{x:Type TableRowGroup}">
        <Style.Resources>
            <Style TargetType="{x:Type TableCell}">
                <Setter Property="BorderThickness" Value="0,1,0,1" />
                <Setter Property="BorderBrush" Value="Black" />
            </Style>
        </Style.Resources>
        <Setter Property="FontWeight" Value="Normal"/>
        <Setter Property="FontSize" Value="12"/>
    </Style>
</Table.Resources>

虽然有效,但由于某种原因这也不起作用

<Table.Resources>
    <Style x:Key="HeaderStyle" TargetType="{x:Type TableRowGroup}">
        <Setter Property="FontWeight" Value="Normal"/>
        <Setter Property="FontSize" Value="12"/>
        <Setter Property="TableCell.BorderThickness" Value="0,1,0,1" />
        <Setter Property="TableCell.BorderBrush" Value="Black" />
    </Style>
</Table.Resources>

会有几个行组,每个组都有自己的单元格样式,每个组都包含许多单元格。请告诉我有更好的方法。

【问题讨论】:

    标签: wpf xaml styles tablecell


    【解决方案1】:

    根据您的评论更新

    根据您的评论,我相信使用Style 继承可以轻松解决您的问题。下面是在不同 TableRowGroups 上使用 2 种不同单元格样式的示例:

    <Table>
        <Table.Resources>
    
            <Style x:Key="HeaderCellStyle" TargetType="{x:Type TableCell}">
                <Setter Property="BorderThickness" Value="0,1,0,1" />
                <Setter Property="BorderBrush" Value="Black" />
                <Setter Property="TextAlignment" Value="Center" />
                <Setter Property="FontStyle" Value="Italic" />
                <Setter Property="Padding" Value="5" />
            </Style>
    
            <Style x:Key="FooterCellStyle" BasedOn="{StaticResource HeaderCellStyle}" TargetType="{x:Type TableCell}">
                <Setter Property="Background" Value="AliceBlue" />
                <Setter Property="TextAlignment" Value="Right" />
                <Setter Property="FontWeight" Value="Bold" />
            </Style>
    
            <Style x:Key="HeaderTableRowGroupStyle" TargetType="{x:Type TableRowGroup}">
                <Style.Resources>
                    <Style BasedOn="{StaticResource HeaderCellStyle}" TargetType="{x:Type TableCell}" />
                </Style.Resources>
            </Style>
    
            <Style x:Key="FooterTableRowGroupStyle" TargetType="{x:Type TableRowGroup}">
                <Style.Resources>
                    <Style BasedOn="{StaticResource FooterCellStyle}" TargetType="{x:Type TableCell}" />
                </Style.Resources>
            </Style>
    
        </Table.Resources>
        <Table.Columns>
            <TableColumn />
            <TableColumn />
            <TableColumn />
            <TableColumn />
        </Table.Columns>
    
        <!--  This TableRowGroup hosts a header row for the table.  -->
        <TableRowGroup Style="{StaticResource HeaderTableRowGroupStyle}">
            <TableRow>
                <TableCell />
                <TableCell>
                    <Paragraph>Gizmos</Paragraph>
                </TableCell>
                <TableCell>
                    <Paragraph>Thingamajigs</Paragraph>
                </TableCell>
                <TableCell>
                    <Paragraph>Doohickies</Paragraph>
                </TableCell>
            </TableRow>
        </TableRowGroup>
    
        <!--  This TableRowGroup hosts the main data rows for the table.  -->
        <TableRowGroup>
            <TableRow>
                <TableCell>
                    <Paragraph>Blue</Paragraph>
                </TableCell>
                <TableCell>
                    <Paragraph>1</Paragraph>
                </TableCell>
                <TableCell>
                    <Paragraph>2</Paragraph>
                </TableCell>
                <TableCell>
                    <Paragraph>3</Paragraph>
                </TableCell>
            </TableRow>
            <TableRow>
                <TableCell>
                    <Paragraph>Red</Paragraph>
                </TableCell>
                <TableCell>
                    <Paragraph>1</Paragraph>
                </TableCell>
                <TableCell>
                    <Paragraph>2</Paragraph>
                </TableCell>
                <TableCell>
                    <Paragraph>3</Paragraph>
                </TableCell>
            </TableRow>
            <TableRow>
                <TableCell>
                    <Paragraph>Green</Paragraph>
                </TableCell>
                <TableCell>
                    <Paragraph>1</Paragraph>
                </TableCell>
                <TableCell>
                    <Paragraph>2</Paragraph>
                </TableCell>
                <TableCell>
                    <Paragraph>3</Paragraph>
                </TableCell>
            </TableRow>
        </TableRowGroup>
    
        <!--  This TableRowGroup hosts a footer row for the table.  -->
        <TableRowGroup Style="{StaticResource FooterTableRowGroupStyle}">
            <TableRow>
                <TableCell>
                    <Paragraph>Totals</Paragraph>
                </TableCell>
                <TableCell>
                    <Paragraph>3</Paragraph>
                </TableCell>
                <TableCell>
                    <Paragraph>6</Paragraph>
                </TableCell>
                <TableCell>
                    <Paragraph>9</Paragraph>
                </TableCell>
            </TableRow>
        </TableRowGroup>
    </Table>
    

    当您想要定义一个通用的Style 以针对特定类型的所有元素时,您不得为该样式指定 Key。尝试从 Style 中删除 x:Key ,一切都应该正常工作,如下所示:

    <Table.Resources>
        <Style TargetType="{x:Type TableRowGroup}">
            <Setter Property="FontWeight" Value="Normal"/>
            <Setter Property="FontSize" Value="12"/>
            <Setter Property="TableCell.BorderThickness" Value="0,1,0,1" />
            <Setter Property="TableCell.BorderBrush" Value="Black" />
        </Style>
    </Table.Resources>
    

    【讨论】:

    • 我知道 x:Key 属性是如何工作的;你的例子也不起作用。请注意,在我的示例中,我将“HeaderStyle”应用于特定的 RowGroups(因为我不希望所有表格行组都具有这种样式),因此仍然可以正确应用该样式。
    猜你喜欢
    • 2010-11-30
    • 2019-06-08
    • 2011-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多