由RowHeaderStyle覆盖的WPF Datagrid RowHeaderTemplate

时间:2013-09-30 12:55:53

标签: c# wpf datagrid

我的WPF应用程序中有一个数据网格。我一直在尝试向datagridrowheader添加一个切换按钮,我已经设法做到了。我遇到的问题是尝试设置datagridrowheader的样式。如果我省略了行 - RowHeaderStyle =“{StaticResource DG_RowHeader}”我的按钮正确加载。当我添加此行时,我的按钮不会出现,为什么会这样?

据我所知,DG_RowHeader只是为行标题设置样式?我想知道如何将这种风格应用到我的datagridrowheader并让我的切换按钮也出现?

我的DataGrid

<DataGrid DataContext="{Binding OrderBlock}" 
                  x:Name="dataGridOrders" 
                  ItemsSource="{Binding Orders}"
                  Style="{StaticResource DataGridTemplate}"
                  ColumnHeaderStyle="{StaticResource DG_ColumnHeader}"                                            
                  RowStyle="{StaticResource DG_Row}"
                  CellStyle="{StaticResource DG_Cell}"              
                  RowHeaderStyle="{StaticResource DG_RowHeader}"
                  RowDetailsTemplate="{StaticResource DG_RowDetail}"                      
                  AutoGenerateColumns="False"
                  HorizontalAlignment="Stretch" 
                  VerticalAlignment="Stretch"
                  Background="Silver"
                  RowHeaderWidth="30"                      
                  Margin="25,5,20,15"
                  RowDetailsVisibilityChanged="dataGridOrders_RowDetailsVisibilityChanged">
            <DataGrid.RowHeaderTemplate>                    
                <DataTemplate>
                    <ToggleButton x:Name="RowHeaderToggleButton"                                     
                                  Click="RowHeaderToggleButton_Click"
                                  Cursor="Hand"/>
                </DataTemplate>
            </DataGrid.RowHeaderTemplate>

我的DataGridRowHeader

<!-- Data Grid row with toggle button -->
    <Style x:Key="DG_RowHeader" TargetType="{x:Type DataGridRowHeader}">
        <Setter Property="Width" Value="35"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type DataGridRowHeader}">
                    <Border x:Name="DGRH_Border"
                                BorderBrush="{TemplateBinding BorderBrush}"
                                BorderThickness="{TemplateBinding BorderThickness}"
                                SnapsToDevicePixels="True">
                        <Border.Background>
                            <LinearGradientBrush StartPoint="0,0" EndPoint="1,1">
                                <GradientStop Offset="0" Color="LightGray"/>
                                <GradientStop Offset="1" Color="WhiteSmoke"/>
                            </LinearGradientBrush>
                        </Border.Background>
                    </Border>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

我的ToggleButton

<!-- Toogle Button -->
    <Style TargetType="ToggleButton" x:Name="rowdetailToggleButton">
        <Setter Property="Padding" Value="0" />
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="ToggleButton">
                    <Grid>                             
                        <Path x:Name="DefaultPath"
                          VerticalAlignment="Top"
                          Data="M0,0 14,7 0,14 Z"
                          Fill="DarkGray"
                          Stretch="Fill"
                          Margin="6"/>
                        <Path x:Name="CheckedPath"
                          VerticalAlignment="Top"
                          Data="M0,0 14,0 7,14 Z"
                          Fill="DarkGray"
                          Stretch="Fill"
                          Margin="6"
                          Visibility="Collapsed" />
                        <VisualStateManager.VisualStateGroups>
                            <VisualStateGroup x:Name="CheckStates">
                                <VisualState x:Name="Checked">
                                    <Storyboard>
                                        <ObjectAnimationUsingKeyFrames Duration="0" 
                                                                       Storyboard.TargetName="DefaultPath"
                                                                       Storyboard.TargetProperty="Visibility">
                                            <DiscreteObjectKeyFrame KeyTime="0">
                                                <DiscreteObjectKeyFrame.Value>
                                                    <Visibility>Collapsed</Visibility>
                                                </DiscreteObjectKeyFrame.Value>
                                            </DiscreteObjectKeyFrame>
                                        </ObjectAnimationUsingKeyFrames>
                                        <ObjectAnimationUsingKeyFrames Duration="0" 
                                                                       Storyboard.TargetName="CheckedPath"
                                                                       Storyboard.TargetProperty="Visibility">
                                            <DiscreteObjectKeyFrame KeyTime="0">
                                                <DiscreteObjectKeyFrame.Value>
                                                    <Visibility>Visible</Visibility>
                                                </DiscreteObjectKeyFrame.Value>
                                            </DiscreteObjectKeyFrame>
                                        </ObjectAnimationUsingKeyFrames>
                                        <ColorAnimationUsingKeyFrames Storyboard.TargetName="CheckedPath" Storyboard.TargetProperty="(Path.Fill).(SolidColorBrush.Color)">
                                            <SplineColorKeyFrame KeyTime="0:0:0.2" Value="LightGray" />
                                        </ColorAnimationUsingKeyFrames>
                                    </Storyboard>
                                </VisualState>
                                <VisualState x:Name="Unchecked" />
                            </VisualStateGroup>
                        </VisualStateManager.VisualStateGroups>
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

1 个答案:

答案 0 :(得分:1)

您似乎忘记以DataGridRowHeader样式显示DG_RowHeader的内容,更准确地说是DGRH_Border内部。

您可以在其中添加ContentPresenter:

<Border x:Name="DGRH_Border"
        BorderBrush="{TemplateBinding BorderBrush}"
        BorderThickness="{TemplateBinding BorderThickness}"
        SnapsToDevicePixels="True">
    [...]
   <ContentPresenter Content="{TemplateBinding Content}"
                     ContentTemplate="{TemplateBinding ContentTemplate}"/>
</Border>

至于ToggleButtons,你需要:

  • ToggleButton声明中指定样式:

(假设您的样式是使用x:Key属性定义的(您指定的x:Name)):

   <Style TargetType="ToggleButton" x:Key="rowdetailToggleButton">
  • 通过删除x:Key属性将样式设置为togglebuttons的默认样式:

无论哪种方式,您都需要确保资源的字典可以从按钮的声明位置获得。