首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

WPF 4 DataGrid 進階樣式完全指南:ColumnHeader、RowHeader、Row、Cell 深度自定義

     編輯:關於.NET

DataGrid 是 WPF 數據展示的核心控件,其視覺樹層級豐富,支援從整體到局部的多層次樣式自定義。本文系統講解四大樣式屬性的聲明式配置與觸發器互動技巧。

樣式層級架構

層級屬性作用範圍優先級
全域列表頭DataGrid.ColumnHeaderStyle所有列標題基礎
單列列表頭DataGridColumn.HeaderStyle特定列標題覆蓋全域
全域行表頭DataGrid.RowHeaderStyle所有行首基礎
全域行DataGrid.RowStyle所有數據行基礎
全域單元格DataGrid.CellStyle所有單元格基礎

1. ColumnHeaderStyle:列表頭樣式

全域樣式(漸層背景 + 懸停提示)

<DataGrid.ColumnHeaderStyle>
    <Style TargetType="DataGridColumnHeader">
        <Setter Property="Background">
            <Setter.Value>
                <LinearGradientBrush StartPoint="0,0" EndPoint="0,1">
                    <GradientStop Color="White" Offset="0"/>
                    <GradientStop Color="Yellow" Offset="0.5"/>
                    <GradientStop Color="White" Offset="1"/>
                </LinearGradientBrush>
            </Setter.Value>
        </Setter>
        <Setter Property="Foreground" Value="Black"/>
        <Setter Property="FontSize" Value="13"/>
        <Style.Triggers>
            <Trigger Property="IsMouseOver" Value="True">
                <Setter Property="ToolTip" Value="Click to Sort"/>
            </Trigger>
        </Style.Triggers>
    </Style>
</DataGrid.ColumnHeaderStyle>

單列覆蓋樣式(Name 欄位藍色系)

<DataGridTextColumn Header="Name" Binding="{Binding Name}">
    <DataGridColumn.HeaderStyle>
        <Style TargetType="DataGridColumnHeader">
            <Setter Property="Background">
                <Setter.Value>
                    <LinearGradientBrush StartPoint="0,0" EndPoint="0,1">
                        <GradientStop Color="White" Offset="0"/>
                        <GradientStop Color="SkyBlue" Offset="0.5"/>
                        <GradientStop Color="White" Offset="1"/>
                    </LinearGradientBrush>
                </Setter.Value>
            </Setter>
            <Setter Property="Foreground" Value="Black"/>
            <Setter Property="FontSize" Value="13"/>
            <Setter Property="Width" Value="80"/>
        </Style>
    </DataGridColumn.HeaderStyle>
</DataGridTextColumn>

列表頭樣式效果:各列不同漸層,未定義列繼承全域

2. RowHeaderStyle:行表頭樣式

<DataGrid.RowHeaderStyle>
    <Style TargetType="DataGridRowHeader">
        <Setter Property="Content" Value=" •"/>
        <Setter Property="Width" Value="10"/>
        <Setter Property="Background">
            <Setter.Value>
                <LinearGradientBrush StartPoint="0,0" EndPoint="1,1">
                    <GradientStop Color="White" Offset="0"/>
                    <GradientStop Color="SkyBlue" Offset="1"/>
                </LinearGradientBrush>
            </Setter.Value>
        </Setter>
        <Style.Triggers>
            <Trigger Property="IsMouseOver" Value="True">
                <Setter Property="ToolTip" Value="Select this Row"/>
            </Trigger>
        </Style.Triggers>
    </Style>
</DataGrid.RowHeaderStyle>

行表頭顯示圓點標記,漸層藍色背景

3. RowStyle:數據行樣式

基礎藍色 + 懸停變灰白字

<DataGrid.RowStyle>
    <Style TargetType="DataGridRow">
        <Setter Property="Background" Value="LightBlue"/>
        <Style.Triggers>
            <Trigger Property="IsMouseOver" Value="True">
                <Setter Property="Background" Value="LightGray"/>
                <Setter Property="Foreground" Value="White"/>
            </Trigger>
            <!-- 交替行顏色 -->
            <Trigger Property="AlternationIndex" Value="1">
                <Setter Property="Background" Value="AliceBlue"/>
            </Trigger>
            <!-- 選中行 -->
            <Trigger Property="IsSelected" Value="True">
                <Setter Property="Background" Value="DodgerBlue"/>
                <Setter Property="Foreground" Value="White"/>
            </Trigger>
        </Style.Triggers>
    </Style>
</DataGrid.RowStyle>

行樣式:淡藍底,懸停灰底白字

4. CellStyle:單元格樣式

選中單元格綠色高亮

<DataGrid.CellStyle>
    <Style TargetType="DataGridCell">
        <Style.Triggers>
            <Trigger Property="IsSelected" Value="True">
                <Setter Property="Background" Value="SeaGreen"/>
                <Setter Property="Foreground" Value="White"/>
                <Setter Property="BorderThickness" Value="1"/>
                <Setter Property="BorderBrush" Value="DarkGreen"/>
            </Trigger>
            <!-- 編輯狀態 -->
            <Trigger Property="IsEditing" Value="True">
                <Setter Property="Background" Value="LightYellow"/>
            </Trigger>
            <!-- 錯誤驗證 -->
            <Trigger Property="Validation.HasError" Value="True">
                <Setter Property="Background" Value="MistyRose"/>
                <Setter Property="ToolTip" Value="{Binding RelativeSource={RelativeSource Self}, Path=(Validation.Errors)[0].ErrorContent}"/>
            </Trigger>
        </Style.Triggers>
    </Style>
</DataGrid.CellStyle>

單元格選中時海綠色高亮

進階技巧:多重觸發條件與優先級控制

MultiTrigger:滑鼠懸停且未選中時

<MultiTrigger>
    <MultiTrigger.Conditions>
        <Condition Property="IsMouseOver" Value="True"/>
        <Condition Property="IsSelected" Value="False"/>
    </MultiTrigger.Conditions>
    <Setter Property="Background" Value="LightCyan"/>
</MultiTrigger>

DataTrigger:根據資料值動態樣式

<DataTrigger Binding="{Binding Pass}" Value="False">
    <Setter Property="Foreground" Value="Red"/>
    <Setter Property="FontWeight" Value="Bold"/>
</DataTrigger>

完整 DataGrid 樣式整合範例

<DataGrid x:Name="dataGrid" ItemsSource="{Binding}" AutoGenerateColumns="False"
          SelectionUnit="CellOrRowHeader" IsReadOnly="True"
          AlternationCount="2">  <!-- 啟用交替行 -->
    <DataGrid.ColumnHeaderStyle> ... </DataGrid.ColumnHeaderStyle>
    <DataGrid.RowHeaderStyle> ... </DataGrid.RowHeaderStyle>
    <DataGrid.RowStyle> ... </DataGrid.RowStyle>
    <DataGrid.CellStyle> ... </DataGrid.CellStyle>
    <DataGrid.Columns>
        <DataGridTextColumn Header="Name" Binding="{Binding Name}" 
            HeaderStyle="{StaticResource NameHeaderStyle}"/>
        <DataGridTextColumn Header="Age" Binding="{Binding Age}"/>
        <DataGridComboBoxColumn Header="Sex" SelectedItemBinding="{Binding Sex}" 
            ItemsSource="{Binding Source={StaticResource sexEnum}}"/>
        <DataGridCheckBoxColumn Header="Pass" Binding="{Binding Pass}"/>
        <DataGridHyperlinkColumn Header="Email" Binding="{Binding Email}"/>
    </DataGrid.Columns>
</DataGrid>

效能與維護建議

  • 樣式資源化:將 Style 定義於 `Window.Resources` 或 `ResourceDictionary`,多處複用
  • 避免過度視覺樹:複雜 Template 會增加渲染開銷,大數據量時優先用 Setter 屬性
  • Virtualization:確保 `EnableRowVirtualization=True`、`EnableColumnVirtualization=True`(預設開啟)
  • AlternationCount:設定 >1 啟用交替行,配合 `AlternationIndex` Trigger 實現斑馬紋

總結

DataGrid 樣式系統遵循「全域基礎 + 局部覆蓋 + 觸發器動態」模式。掌握 ColumnHeaderStyle/HeaderStyle、RowHeaderStyle、RowStyle、CellStyle 四大屬性與 `Trigger`/`MultiTrigger`/`DataTrigger` 三種觸發器,即可構建專業級、高可用性的數據網格介面。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved