首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何定制和重用DataGridColumnHeader样式?

如何定制和重用DataGridColumnHeader样式?
EN

Stack Overflow用户
提问于 2010-03-21 23:16:24
回答 1查看 9.6K关注 0票数 7

我正在尝试自定义DataGrid的列标题,以显示子列标题,如以下屏幕截图所示:

我已经为两个子列创建了一个样式,如下所示:

代码语言:javascript
复制
<UserControl
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:data="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data"
xmlns:primitives="clr-namespace:System.Windows.Controls.Primitives;assembly=System.Windows.Controls.Data"
xmlns:sl="clr-namespace:UI" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" x:Class="UI.ColumnHeaderGrid"
mc:Ignorable="d">
<UserControl.Resources>
    <Style x:Key="SplitColumnHeaderStyle" TargetType="primitives:DataGridColumnHeader">
        <Setter Property="Foreground" Value="#FF000000"/>
        <Setter Property="HorizontalContentAlignment" Value="Center"/>
        <Setter Property="VerticalContentAlignment" Value="Center"/>
        <Setter Property="IsTabStop" Value="False"/>
        <Setter Property="SeparatorBrush" Value="#FFC9CACA"/>
        <Setter Property="Padding" Value="4"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="primitives:DataGridColumnHeader">
                    <Grid x:Name="Root">
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition/>
                            <ColumnDefinition Width="Auto"/>
                        </Grid.ColumnDefinitions>
                        <Rectangle x:Name="BackgroundRectangle" Fill="#FF1F3B53" Stretch="Fill" Grid.ColumnSpan="2"/>
                        <Rectangle x:Name="BackgroundGradient" Stretch="Fill" Grid.ColumnSpan="2">
                            <Rectangle.Fill>
                                <LinearGradientBrush EndPoint=".7,1" StartPoint=".7,0">
                                    <GradientStop Color="#FCFFFFFF" Offset="0.015"/>
                                    <GradientStop Color="#F7FFFFFF" Offset="0.375"/>
                                    <GradientStop Color="#E5FFFFFF" Offset="0.6"/>
                                    <GradientStop Color="#D1FFFFFF" Offset="1"/>
                                </LinearGradientBrush>
                            </Rectangle.Fill>
                        </Rectangle>
                        <Grid>
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition/>
                                <ColumnDefinition Width="1"/>
                                <ColumnDefinition/>
                            </Grid.ColumnDefinitions>
                            <Grid.RowDefinitions>
                                <RowDefinition/>
                                <RowDefinition/>
                                <RowDefinition/>
                            </Grid.RowDefinitions>
                            <TextBlock Grid.Row="0" Grid.ColumnSpan="3" Text="Headers" TextAlignment="Center"/>
                            <Rectangle Grid.Row="1" Grid.ColumnSpan="3" Fill="{TemplateBinding SeparatorBrush}" Height="1"/>
                            <TextBlock Grid.Row="2" Grid.Column="0" Text="Header 1" TextAlignment="Center"/>
                            <Rectangle Grid.Row="2" Grid.Column="1" Fill="{TemplateBinding SeparatorBrush}" Width="1"/>
                            <TextBlock Grid.Row="2" Grid.Column="2" Text="Header 2" TextAlignment="Center"/>
                            <Path x:Name="SortIcon" Grid.Column="2" Fill="#FF444444" Stretch="Uniform" HorizontalAlignment="Left" Margin="4,0,0,0" VerticalAlignment="Center" Width="8" Opacity="0" RenderTransformOrigin=".5,.5" Data="F1 M -5.215,6.099L 5.215,6.099L 0,0L -5.215,6.099 Z "/>
                        </Grid>
                        <Rectangle x:Name="VerticalSeparator" Fill="{TemplateBinding SeparatorBrush}" VerticalAlignment="Stretch" Width="1" Visibility="{TemplateBinding SeparatorVisibility}" Grid.Column="1"/>
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</UserControl.Resources>
<data:DataGrid x:Name="LayoutRoot">
    <data:DataGrid.Columns>
        <data:DataGridTemplateColumn HeaderStyle="{StaticResource SplitColumnHeaderStyle}">
            <data:DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <Grid>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition/>
                            <ColumnDefinition/>
                        </Grid.ColumnDefinitions>
                        <Border Grid.Column="0" BorderBrush="#FFC9CACA" BorderThickness="0,0,0,0">
                            <TextBlock Grid.Column="0" Text="{Binding GridData.Column1}"/>
                        </Border>
                        <Border Grid.Column="1" BorderBrush="#FFC9CACA" BorderThickness="1,0,0,0">
                            <TextBlock Grid.Column="0" Text="{Binding GridData.Column2}"/>
                        </Border>
                    </Grid>
                </DataTemplate>
            </data:DataGridTemplateColumn.CellTemplate>
        </data:DataGridTemplateColumn>
    </data:DataGrid.Columns>
</data:DataGrid>

现在我想重用和扩展这种样式,以支持2->6个子列标题,但我不知道是否有方法可以做到这一点,比如ContentPresenter“覆盖”:

代码语言:javascript
复制
<Style x:Key="SplitColumnHeaderStyle" TargetType="primitives:DataGridColumnHeader">
    <Setter property="Template">
        <Setter.Value>
            ...
            <ContentPresenter Content="{TemplateBinding Content}".../>
            ...
        </Setter.Value>
    </Setter>
</Style>

<Style x:Key="TwoSubColumnHeaderStyle" BasedOn="SplitColumnHeaderStyle">
    <Setter property="Content">
        <Setter.Value>
            <Grid 2x2.../>
        </Setter.Value>
    </Setter>
</Style>

<Style x:Key="ThreeSubColumnHeaderStyle" BasedOn="SplitColumnHeaderStyle">
    <Setter property="Content">
        <Setter.Value>
            <Grid 2x3.../>
        </Setter.Value>
    </Setter>
</Style>

无论如何,请在这些问题上帮助我:

  1. 给出了上面的模板,如何支持更多的子列标题,而不必为每个子列标题创建新的模板?
  2. 假设上面的问题已经解决。如何在样式之外附加列名?
  3. 我发现XAML中的一些部件、属性和可视化规则只是从原始Silverlight组件的样式复制过来的,即BackgroundGradient、BackgroundRectangle、VisualStateManager……它们必须在那里才能支持默认行为或效果,但是...有谁知道如何删除它们,但保留所有的默认behaviors/effects?

请具体一点,因为我刚刚开始使用C#和Silverlight。

EN

回答 1

Stack Overflow用户

发布于 2010-05-10 00:43:25

这里有一个很好的例子:http://weblogs.asp.net/dwahlin/archive/2009/06/11/customizing-silverlight-3-datagrid-headers.aspx

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2487539

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档