WPF自定义datagrid样式单元格样式行列表头Style

前言:随着wpf的发展,越来越多的开源控件库出来,像比较优秀免费好用的HandyControl,MaterialDesign,收费的代表DevExpress,虽然这些控件库用起来非常的方便,尤其收费的devexpress基本包含了所有你想要的样子,专门为企业大项目服务,但是与此同时也同样产生一个问题,你有没有想过,加入没有这些控件库怎么办,你会用但是你知道底层的样式结构么?出于这点,我选择之后遇到各种控件,有比较复杂一点的样式,我都尝试自己手写一份,这篇作为开章,以此记录下!

今天我要记录的是一个仿excel单元格样式的datagrid样式,说到excel,用devexpress的Gridcontrol直接就可以实现,但是Datagrid也不是不可以,毕竟是原生的控件。

要实现这个给自己的需求,首先妖之道要改那些,针对datagrid,需要改的主要是以下几个Style,Datagrid本身的Style

<Style x:Key="DatagridCommon" TargetType="{x:Type DataGrid}">
   <Setter Property="Background" Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}"/>
   <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/>
   <Setter Property="BorderBrush" Value="Gray"/>
   <Setter Property="BorderThickness" Value="1"/>
   <Setter Property="RowDetailsVisibilityMode" Value="VisibleWhenSelected"/>
   <Setter Property="ScrollViewer.CanContentScroll" Value="true"/>
   <Setter Property="ScrollViewer.PanningMode" Value="Both"/>
   <Setter Property="Stylus.IsFlicksEnabled" Value="False"/>
   <Setter Property="AutoGenerateColumns" Value="False"/>
   <Setter Property="ColumnHeaderHeight" Value="50"/>
   <Setter Property="FontSize" Value="16"/>
   <Setter Property="RowHeight" Value="40"/>
   <Setter Property="HorizontalGridLinesBrush" Value="LightGray"></Setter>
   <Setter Property="VerticalGridLinesBrush" Value="LightGray"></Setter>
   <!--<Setter Property="AlternationCount" Value="2"/>-->
   <Setter Property="Template">
       <Setter.Value>
           <ControlTemplate TargetType="{x:Type DataGrid}">
               <Grid>
                   <Border Background="White" CornerRadius="6">
                       <Border.Effect>
                           <DropShadowEffect ShadowDepth="0" Direction="0" Color="#FFDADADA"/>
                       </Border.Effect>
                   </Border>
                   <Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" Padding="{TemplateBinding Padding}" SnapsToDevicePixels="True">
                       <ScrollViewer x:Name="DG_ScrollViewer" Focusable="false">
                           <ScrollViewer.Template>
                               <ControlTemplate TargetType="{x:Type ScrollViewer}">
                                   <Grid>
                                       <Grid.ColumnDefinitions>
                                          <ColumnDefinition Width="Auto"/>
                                           <ColumnDefinition Width="*"/>
                                           <ColumnDefinition Width="Auto"/>
                                       </Grid.ColumnDefinitions>
                                       <Grid.RowDefinitions>
                                           <RowDefinition Height="Auto"/>
                                           <RowDefinition Height="*"/>
                                           <RowDefinition Height="Auto"/>
                                       </Grid.RowDefinitions>
                                       <Grid Background="White" Grid.Column="1">
                                           <Grid.Effect>
                                               <DropShadowEffect Direction="270" Color="#FFF3F3F3"/>
                                           </Grid.Effect>
                                       </Grid>
                                       <Button Command="{x:Static DataGrid.SelectAllCommand}" Focusable="false" Style="{DynamicResource {ComponentResourceKey ResourceId=DataGridSelectAllButtonStyle, TypeInTargetAssembly={x:Type DataGrid}}}" Visibility="{Binding HeadersVisibility, ConverterParameter={x:Static DataGridHeadersVisibility.All}, Converter={x:Static DataGrid.HeadersVisibilityConverter}, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}" 
Width="{Binding CellsPanelHorizontalOffset, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}"/>
                                       <DataGridColumnHeadersPresenter x:Name="PART_ColumnHeadersPresenter" Grid.Column="1" Visibility="{Binding HeadersVisibility, ConverterParameter={x:Static DataGridHeadersVisibility.Column}, Converter={x:Static DataGrid.HeadersVisibilityConverter}, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}"/>
                                       <ScrollContentPresenter x:Name="PART_ScrollContentPresenter" CanContentScroll="{TemplateBinding CanContentScroll}" Grid.ColumnSpan="2" Grid.Row="1"/>
                                       <ScrollBar x:Name="PART_VerticalScrollBar" Grid.Column="2" Maximum="{TemplateBinding ScrollableHeight}" Orientation="Vertical" Grid.Row="1" Visibility="{TemplateBinding ComputedVerticalScrollBarVisibility}" Value="{Binding VerticalOffset, Mode=OneWay, RelativeSource={RelativeSource TemplatedParent}}" ViewportSize="{TemplateBinding ViewportHeight}"/>
                                       <Grid Grid.Column="1" Grid.Row="2">
                                           <Grid.ColumnDefinitions>
                                               <ColumnDefinition Width="{Binding NonFrozenColumnsViewportHorizontalOffset, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}"/>
                                               <ColumnDefinition Width="*"/>
                                           </Grid.ColumnDefinitions>
                                          <ScrollBar x:Name="PART_HorizontalScrollBar" Grid.Column="1" Maximum="{TemplateBinding ScrollableWidth}" Orientation="Horizontal" Visibility="{TemplateBinding ComputedHorizontalScrollBarVisibility}" Value="{Binding HorizontalOffset, Mode=OneWay, RelativeSource={RelativeSource TemplatedParent}}" ViewportSize="{TemplateBinding ViewportWidth}"/>
                                       </Grid>
                                   </Grid>
                               </ControlTemplate>
                           </ScrollViewer.Template>
                           <ItemsPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
                       </ScrollViewer>
                   </Border>
               </Grid>
           </ControlTemplate>
       </Setter.Value>
   </Setter>
   <Style.Triggers>
       <MultiTrigger>
           <MultiTrigger.Conditions>
               <Condition Property="IsGrouping" Value="true"/>
               <Condition Property="VirtualizingPanel.IsVirtualizingWhenGrouping" Value="false"/>
           </MultiTrigger.Conditions>
           <Setter Property="ScrollViewer.CanContentScroll" Value="false"/>
       </MultiTrigger>
   </Style.Triggers>
</Style>

然后是DataGridColumnHeader的estyle主要是设置datagrid的列头属性,下面是代码。

<Style x:Key="DataGridColumnHeaderCommon" TargetType="DataGridColumnHeader">
  <Setter Property="Background" Value="LightGray"/>
      <Setter Property="VerticalContentAlignment" Value="Center"/>
      <Setter Property="HorizontalContentAlignment" Value="Center"/>
      <Setter Property="Template">
          <Setter.Value>
              <ControlTemplate TargetType="DataGridColumnHeader">
                  <Grid Background="{TemplateBinding Background}">
                      <Grid.ColumnDefinitions>
                          <ColumnDefinition/>
                          <ColumnDefinition Width="0"/>
                      </Grid.ColumnDefinitions>
                      <ContentPresenter Margin="0 0 0 0" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"/>
                  </Grid>
                  <!--sortDirection-->
                  <!--<ControlTemplate.Triggers>
                  <Trigger Property="SortDirection" Value="Ascending">
                      <Setter TargetName="SortArrow" Property="Visibility" Value="Visible" />
                      <Setter TargetName="SortArrow" Property="Text" Value="&#xf160;" />
                  </Trigger>
                  <Trigger Property="SortDirection" Value="Descending">
                      <Setter TargetName="SortArrow" Property="Visibility" Value="Visible" />
                      <Setter TargetName="SortArrow" Property="Text" Value="&#xf161;" />
                  </Trigger>
              </ControlTemplate.Triggers>-->
              </ControlTemplate>
          </Setter.Value>
      </Setter>
  </Style>

接着是设置每行格式的DataGridRow的style

 <Style x:Key="DataGridRowCommon" TargetType="DataGridRow">
   <Setter Property="Cursor" Value="Hand"/>
    <Setter Property="Template" >
        <Setter.Value>
            <ControlTemplate TargetType="DataGridRow">
                <Grid >
                    <Border x:Name="border" Background="{TemplateBinding Background}" BorderThickness="1" BorderBrush="Transparent"/>
                    <DataGridCellsPresenter />
                </Grid>
                <!--<ControlTemplate.Triggers>
                    <Trigger Property="IsMouseOver" Value="True">
                        <Setter Property="BorderBrush" TargetName="border"  Value="gray"/>
                    </Trigger>
                    <Trigger Property="IsSelected" Value="true">
                        <Setter Property="BorderBrush" TargetName="border"  Value="gray"/>
                    </Trigger>
                </ControlTemplate.Triggers>-->
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

然后是设置每个单元格属性的DataGridCell的style

<Style x:Key="DataGridCellCommon" TargetType="DataGridCell">
   <Setter Property="Background" Value="Transparent"/>
   <Setter Property="VerticalContentAlignment" Value="Center"/>
   <Setter Property="HorizontalContentAlignment" Value="Center"/>
   <Setter Property="Template">
       <Setter.Value>
           <ControlTemplate TargetType="DataGridCell">
               <Border Name="cellborder" BorderThickness="1" Background="{TemplateBinding Background}">
                   <ContentPresenter VerticalAlignment="{TemplateBinding VerticalContentAlignment}" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"/>
               </Border>
               <ControlTemplate.Triggers>
                   <Trigger Property="IsMouseOver" Value="True">
                       <Setter Property="BorderBrush" TargetName="cellborder"  Value="gray"/>
                   </Trigger>
                   <Trigger Property="IsSelected" Value="true">
                       <Setter Property="Foreground" Value="Black" />
                   </Trigger>
               </ControlTemplate.Triggers>
           </ControlTemplate>
       </Setter.Value>
   </Setter>
</Style>

综上大概可以实现的界面长这样
请添加图片描述

这四个基本样式基本上可以实现所有的基本外观,当然对于控件本身现实的具体的内容则是要通过控件的datatemplate去实现

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MasterRyan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值