WPF中DataGrid包含DataGridTemplateColumn列时,怎么写样式?

寂空冷 2017-05-26 12:33:28
如题:WPF中DataGrid包含DataGridTemplateColumn列时,在资源文件中该怎么写DataGrid的Style,ColumnHeaderStyle,RowHeaderStyle,CellStyle,RowStyle....

WPF界面如下:

<StackPanel Orientation="Vertical" MinHeight="80" Margin="0,10" HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
<DataGrid x:Name="dgDutyInfo" ItemsSource="{Binding DutyInfoes, Mode=TwoWay}" Style="{StaticResource MainDataGridStyle}">
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding SN,Mode=TwoWay}" Width="60"/>
<DataGridTextColumn Binding="{Binding UserName,Mode=TwoWay}" Width="100"/>
<DataGridTextColumn Binding="{Binding RoleName,Mode=TwoWay}" Width="100"/>
<DataGridTemplateColumn x:Name="dgtcMonday" MinWidth="120" HeaderTemplate="{StaticResource MondayMergeHeader}" CellTemplate="{StaticResource MondayMergeColumn}"/>
</DataGrid.Columns>
</DataGrid>
</StackPanel>


HeaderTemplate:

<DataTemplate x:Key="MondayMergeHeader">
<StackPanel x:Name="spnlMonday" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Background="Transparent"
DataContext="{Binding ElementName=dutyInfoManageView,Path=DataContext.TemplateHeaders[0],Mode=TwoWay}">
<Border>
<Label Content="{Binding Date,Mode=TwoWay}" HorizontalContentAlignment="Center"/>
</Border>
<Border>
<Label Content="{Binding DayOfWeek,Mode=TwoWay}" HorizontalContentAlignment="Center"/>
</Border>
<Border>
<GridSplitter BorderBrush="Gray" BorderThickness="0.5" HorizontalAlignment="Stretch"/>
</Border>
<Border x:Name="borderMonday" DataContext="{Binding MealTimes,Mode=TwoWay}" Background="Transparent" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" MinWidth="180">
<i:Interaction.Triggers>
<i:EventTrigger EventName="Loaded">
<i:InvokeCommandAction Command="{Binding ElementName=dutyInfoManageView,Path=DataContext.HeaderTemplateLoaded}" CommandParameter="{Binding ElementName=borderMonday}"/>
</i:EventTrigger>
</i:Interaction.Triggers>
</Border>
</StackPanel>
</DataTemplate>

说明:Loaded事件往borderMonday控件添加一个StackPanel,StackPanel中添加N个Label控件,数据来源于borderMonday的DataContext属性

CellTemplate:

<DataTemplate x:Key="MondayMergeColumn">
<Border x:Name="borderMonday" IsEnabled="{Binding ElementName=dutyInfoManageView,Path = DataContext.IsEnabledEdit,Mode=TwoWay}"
DataContext="{Binding Monday,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" MinWidth="180">
<i:Interaction.Triggers>
<i:EventTrigger EventName="Loaded">
<i:InvokeCommandAction Command="{Binding ElementName=dutyInfoManageView,Path=DataContext.DataTemplateLoaded}" CommandParameter="{Binding ElementName=borderMonday}"/>
</i:EventTrigger>
</i:Interaction.Triggers>
</Border>
</DataTemplate>



说明:Loaded事件往borderMonday控件添加一个StackPanel,StackPanel中添加N个CheckBox控件,数据来源于borderMonday的DataContext属性
...全文
938 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
寂空冷 2017-05-31
  • 打赏
  • 举报
回复
引用 5 楼 duanzi_peng 的回复:

                <!--DataGridRowStyle-->
                <Style TargetType="{x:Type DataGridRow}">
                    <Setter Property="SnapsToDevicePixels" Value="true"/>
                    <Setter Property="Template">
                        <Setter.Value>
                            <ControlTemplate TargetType="{x:Type DataGridRow}">
                                <Border x:Name="DGR_Border"  Background="Transparent" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}"  SnapsToDevicePixels="True">
                                    <SelectiveScrollingGrid Background="Transparent">
                                        <SelectiveScrollingGrid.ColumnDefinitions>
                                            <ColumnDefinition Width="Auto"/>
                                            <ColumnDefinition Width="*"/>
                                        </SelectiveScrollingGrid.ColumnDefinitions>
                                        <SelectiveScrollingGrid.RowDefinitions>
                                            <RowDefinition Height="*"/>
                                            <RowDefinition Height="Auto"/>
                                        </SelectiveScrollingGrid.RowDefinitions>
                                        <!--设置行中的单元格-->
                                        <DataGridCellsPresenter Margin="0,0,0,0" Background="Transparent" Grid.Column="1" ItemsPanel="{TemplateBinding ItemsPanel}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
                                        <DataGridDetailsPresenter  Grid.Column="1" Grid.Row="1" SelectiveScrollingGrid.SelectiveScrollingOrientation="{Binding AreRowDetailsFrozen, ConverterParameter={x:Static SelectiveScrollingOrientation.Vertical}, Converter={x:Static DataGrid.RowDetailsScrollingConverter}, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}" Visibility="{TemplateBinding DetailsVisibility}"/>
                                        <DataGridRowHeader Background="Transparent" Grid.Row="0" Grid.RowSpan="2" SelectiveScrollingGrid.SelectiveScrollingOrientation="Vertical" Visibility="{Binding HeadersVisibility, ConverterParameter={x:Static DataGridHeadersVisibility.Row}, Converter={x:Static DataGrid.HeadersVisibilityConverter}, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}"/>
                                    </SelectiveScrollingGrid>
                                </Border>
                                <ControlTemplate.Triggers>
                                    <Trigger Property="IsSelected" Value="True">
                                        <!--选择行颜色-->
                                        <Setter Property="Background"  TargetName="DGR_Border" Value="#5C686B"/>
                                    </Trigger>
                                    <Trigger Property="IsMouseOver" Value="True">
                                        <!--鼠标悬浮颜色-->
                                        <Setter Property="Background" TargetName="DGR_Border" Value="#BAC4D5"/>
                                    </Trigger>
                                </ControlTemplate.Triggers>
                            </ControlTemplate>
                        </Setter.Value>
                    </Setter>
                </Style>
                <!--DataGridCellStyle-->
                <Style TargetType="{x:Type DataGridCell}">
                    <Setter Property="Background" Value="Transparent"/>
                    <Setter Property="BorderBrush" Value="Transparent"/>
                    <Setter Property="MinHeight" Value="25"></Setter>
                    <!--<Setter Property="IsEnabled" Value="False"></Setter>-->
                    <!--<Setter Property="Margin" Value="0,0,1,0"></Setter>-->
                    <!--<Setter Property="BorderThickness" Value="1,0,1,1"/>-->
                    <Setter Property="Template">
                        <Setter.Value>
                            <ControlTemplate TargetType="{x:Type DataGridCell}">
                                <!--- BorderBrush="#2A3A57" Margin="-1,0,0,0" BorderThickness="1,0,0,0"-->
                                <Grid>
                                    <Grid.RowDefinitions>
                                        <RowDefinition Height="*"></RowDefinition>
                                        <RowDefinition Height="auto"></RowDefinition>
                                    </Grid.RowDefinitions>
                                    <!-- BorderBrush="#2A3A57" Margin="-2,0,-1,0" BorderThickness="0,0,1,0"-->
                                    <Border Grid.Row="0"   Background="{Binding Converter={StaticResource DataGridCellBackgroundConverter}}"  SnapsToDevicePixels="True">
                                        <ContentPresenter  SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"  HorizontalAlignment="Center" VerticalAlignment="Center"/>
                                    </Border>
                                </Grid>

                            </ControlTemplate>
                        </Setter.Value>
                    </Setter>
                    <Style.Triggers>
                        <Trigger Property="IsSelected" Value="True">
                        </Trigger>
                        <Trigger Property="IsKeyboardFocusWithin" Value="True">
                        </Trigger>
                    </Style.Triggers>
                </Style>
            </Style.Resources>
        </Style>
没有RowHeaderStyle定义,自己定义好 添加到里面就行了。
我自己找了个样式,改吧改吧就可以了
xuggzu 2017-05-26
  • 打赏
  • 举报
回复
楼主要的style基本上不都写了嘛,至于row的样式,接着写就行了。。。
xuggzu 2017-05-26
  • 打赏
  • 举报
回复
还是不太明白楼主意思。 但看了duanzi_peng 的答复,感觉只是换了个写法,和楼主的代码无非是:楼主的集中写,duanzi_peng 的一次定义在一起,直接应用而已。难道楼主是这个想法?
exception92 2017-05-26
  • 打赏
  • 举报
回复

                <!--DataGridRowStyle-->
                <Style TargetType="{x:Type DataGridRow}">
                    <Setter Property="SnapsToDevicePixels" Value="true"/>
                    <Setter Property="Template">
                        <Setter.Value>
                            <ControlTemplate TargetType="{x:Type DataGridRow}">
                                <Border x:Name="DGR_Border"  Background="Transparent" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}"  SnapsToDevicePixels="True">
                                    <SelectiveScrollingGrid Background="Transparent">
                                        <SelectiveScrollingGrid.ColumnDefinitions>
                                            <ColumnDefinition Width="Auto"/>
                                            <ColumnDefinition Width="*"/>
                                        </SelectiveScrollingGrid.ColumnDefinitions>
                                        <SelectiveScrollingGrid.RowDefinitions>
                                            <RowDefinition Height="*"/>
                                            <RowDefinition Height="Auto"/>
                                        </SelectiveScrollingGrid.RowDefinitions>
                                        <!--设置行中的单元格-->
                                        <DataGridCellsPresenter Margin="0,0,0,0" Background="Transparent" Grid.Column="1" ItemsPanel="{TemplateBinding ItemsPanel}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
                                        <DataGridDetailsPresenter  Grid.Column="1" Grid.Row="1" SelectiveScrollingGrid.SelectiveScrollingOrientation="{Binding AreRowDetailsFrozen, ConverterParameter={x:Static SelectiveScrollingOrientation.Vertical}, Converter={x:Static DataGrid.RowDetailsScrollingConverter}, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}" Visibility="{TemplateBinding DetailsVisibility}"/>
                                        <DataGridRowHeader Background="Transparent" Grid.Row="0" Grid.RowSpan="2" SelectiveScrollingGrid.SelectiveScrollingOrientation="Vertical" Visibility="{Binding HeadersVisibility, ConverterParameter={x:Static DataGridHeadersVisibility.Row}, Converter={x:Static DataGrid.HeadersVisibilityConverter}, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}"/>
                                    </SelectiveScrollingGrid>
                                </Border>
                                <ControlTemplate.Triggers>
                                    <Trigger Property="IsSelected" Value="True">
                                        <!--选择行颜色-->
                                        <Setter Property="Background"  TargetName="DGR_Border" Value="#5C686B"/>
                                    </Trigger>
                                    <Trigger Property="IsMouseOver" Value="True">
                                        <!--鼠标悬浮颜色-->
                                        <Setter Property="Background" TargetName="DGR_Border" Value="#BAC4D5"/>
                                    </Trigger>
                                </ControlTemplate.Triggers>
                            </ControlTemplate>
                        </Setter.Value>
                    </Setter>
                </Style>
                <!--DataGridCellStyle-->
                <Style TargetType="{x:Type DataGridCell}">
                    <Setter Property="Background" Value="Transparent"/>
                    <Setter Property="BorderBrush" Value="Transparent"/>
                    <Setter Property="MinHeight" Value="25"></Setter>
                    <!--<Setter Property="IsEnabled" Value="False"></Setter>-->
                    <!--<Setter Property="Margin" Value="0,0,1,0"></Setter>-->
                    <!--<Setter Property="BorderThickness" Value="1,0,1,1"/>-->
                    <Setter Property="Template">
                        <Setter.Value>
                            <ControlTemplate TargetType="{x:Type DataGridCell}">
                                <!--- BorderBrush="#2A3A57" Margin="-1,0,0,0" BorderThickness="1,0,0,0"-->
                                <Grid>
                                    <Grid.RowDefinitions>
                                        <RowDefinition Height="*"></RowDefinition>
                                        <RowDefinition Height="auto"></RowDefinition>
                                    </Grid.RowDefinitions>
                                    <!-- BorderBrush="#2A3A57" Margin="-2,0,-1,0" BorderThickness="0,0,1,0"-->
                                    <Border Grid.Row="0"   Background="{Binding Converter={StaticResource DataGridCellBackgroundConverter}}"  SnapsToDevicePixels="True">
                                        <ContentPresenter  SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"  HorizontalAlignment="Center" VerticalAlignment="Center"/>
                                    </Border>
                                </Grid>

                            </ControlTemplate>
                        </Setter.Value>
                    </Setter>
                    <Style.Triggers>
                        <Trigger Property="IsSelected" Value="True">
                        </Trigger>
                        <Trigger Property="IsKeyboardFocusWithin" Value="True">
                        </Trigger>
                    </Style.Triggers>
                </Style>
            </Style.Resources>
        </Style>
没有RowHeaderStyle定义,自己定义好 添加到里面就行了。
exception92 2017-05-26
  • 打赏
  • 举报
回复
可以使用Style.Resources 来嵌套设置Style, 贴一个DataGrid的Style,比较长,自己看着修改吧,

<Style TargetType="{x:Type DataGrid}">
            <Setter Property="CanUserResizeColumns" Value="False"></Setter>
            <Setter Property="CanUserAddRows" Value="False"></Setter>
            <Setter Property="CanUserResizeRows" Value="False"></Setter>
            <Setter Property="AutoGenerateColumns" Value="False"></Setter>
            <Setter Property="Background" Value="Transparent"></Setter>
            <!--<Setter Property="BorderBrush" Value="red"></Setter>
            <Setter Property="BorderThickness"  Value="1,0,0,0"></Setter>-->
            <Setter Property="RowHeaderWidth" Value="0"></Setter>
            <Setter Property="HorizontalScrollBarVisibility" Value="Auto"></Setter>
            <Setter Property="VerticalScrollBarVisibility" Value="Auto"></Setter>
            <Setter Property="VerticalGridLinesBrush">
                <Setter.Value>
                    <SolidColorBrush Color="#2C3D5A"></SolidColorBrush>
                </Setter.Value>
            </Setter>
            <Setter Property="HorizontalGridLinesBrush">
                <Setter.Value>
                    <SolidColorBrush Color="#2C3D5A"></SolidColorBrush>
                </Setter.Value>
            </Setter>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate>
                        <Border x:Name="BDataGrid" Background="Transparent" BorderBrush="#2A3A57" Padding="0" BorderThickness="1">
                            <ScrollViewer Focusable="False" x:Name="DG_ScrollViewer">
                                <ScrollViewer.Template>
                                    <ControlTemplate TargetType="{x:Type ScrollViewer}">
                                        <Grid>
                                            <Grid.RowDefinitions>
                                                <!--行标题-->
                                                <RowDefinition Height="auto"></RowDefinition>
                                                <!--内容-->
                                                <RowDefinition Height="*"></RowDefinition>
                                                <!--最右侧部分-->
                                                <RowDefinition Height="auto"></RowDefinition>
                                            </Grid.RowDefinitions>
                                            <Grid.ColumnDefinitions>
                                                <!--行标题宽度-->
                                                <ColumnDefinition Width="auto"></ColumnDefinition>
                                                <!--中间内容宽度-->
                                                <ColumnDefinition Width="*"></ColumnDefinition>
                                                <!--滚动条列宽度-->
                                                <ColumnDefinition Width="auto"></ColumnDefinition>
                                            </Grid.ColumnDefinitions>
                                            <!--出现滚动条时右上角部分-->
                                            <Border x:Name="BRight" Panel.ZIndex="5" Margin="-2,0,-1,0" Grid.Row="0" Grid.Column="2" Background="#BDC7D7" BorderBrush="#2C3D5A" BorderThickness="0,0,1,1" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"></Border>
                                            <!--中间列集合显示-->
                                            <DataGridColumnHeadersPresenter Grid.Column="1" Grid.ColumnSpan="2" Grid.Row="0" x:Name="PART_ColumnHeadersPresenter">
                                                <DataGridColumnHeadersPresenter.Visibility>
                                                    <Binding Path="HeadersVisibility" RelativeSource="{RelativeSource FindAncestor, AncestorLevel=2, AncestorType={x:Type DataGrid}}">
                                                        <Binding.ConverterParameter>
                                                            <DataGridHeadersVisibility>Column</DataGridHeadersVisibility>
                                                        </Binding.ConverterParameter>
                                                    </Binding>
                                                </DataGridColumnHeadersPresenter.Visibility>
                                            </DataGridColumnHeadersPresenter>
                                            <!--滚动条显示-->
                                            <ScrollContentPresenter CanContentScroll="{TemplateBinding ScrollViewer.CanContentScroll}" CanHorizontallyScroll="False" CanVerticallyScroll="True" Content="{TemplateBinding Content}" ContentStringFormat="{TemplateBinding ContentStringFormat}" ContentTemplate="{TemplateBinding ContentTemplate}" Margin="0" Grid.ColumnSpan="2" Grid.Row="1" Grid.Column="0"  x:Name="PART_ScrollContentPresenter" />
                                            <!--垂直滚动条显示-->
                                            <ScrollBar VerticalAlignment="Stretch" Grid.Column="2" Grid.Row="1" Maximum="{TemplateBinding ScrollableHeight}" x:Name="PART_VerticalScrollBar" Orientation="Vertical" Value="{Binding VerticalOffset, Mode=OneWay, RelativeSource={RelativeSource TemplatedParent}}" ViewportSize="{TemplateBinding ViewportHeight}" Visibility="{TemplateBinding ComputedVerticalScrollBarVisibility}" />
                                            <!--水平滚动条显示-->
                                            <Grid Grid.Column="1" Grid.Row="2">
                                                <Grid.ColumnDefinitions>
                                                    <ColumnDefinition Width="{Binding NonFrozenColumnsViewportHorizontalOffset, RelativeSource={RelativeSource FindAncestor, AncestorLevel=1, AncestorType={x:Type DataGrid}}}" />
                                                    <ColumnDefinition Width="*" />
                                                </Grid.ColumnDefinitions>
                                                <ScrollBar Grid.Column="1" Maximum="{TemplateBinding ScrollableWidth}" x:Name="PART_HorizontalScrollBar" Orientation="Horizontal"  Value="{Binding HorizontalOffset, Mode=OneWay, RelativeSource={RelativeSource TemplatedParent}}" ViewportSize="{TemplateBinding ViewportWidth}" Visibility="{TemplateBinding ComputedHorizontalScrollBarVisibility}" />
                                            </Grid>
                                        </Grid>
                                        <ControlTemplate.Triggers>
                                            <Trigger Property="Visibility" Value="Collapsed" SourceName="PART_VerticalScrollBar">
                                                <!--当垂直滚动条消失,显示BRight最右侧垂直线-->
                                                <Setter Property="Margin" TargetName="BRight" Value="-2,0,0,0"></Setter>
                                            </Trigger>
                                        </ControlTemplate.Triggers>
                                    </ControlTemplate>
                                </ScrollViewer.Template>
                                <!--显示列名称-->
                                <ItemsPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" MinHeight="710"  HorizontalAlignment="Stretch" VerticalAlignment="Stretch" />
                            </ScrollViewer>
                        </Border>
                        <ControlTemplate.Triggers>
                            <Trigger Property="ComputedVerticalScrollBarVisibility" Value="Collapsed" SourceName="DG_ScrollViewer">
                                <!--当垂直滚动条消失,覆盖最右侧垂直线-->
                                <Setter Property="Margin" TargetName="DG_ScrollViewer" Value="0,0,-1,0"></Setter>
                            </Trigger>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Setter.Value>

            </Setter>
            <Style.Resources>
                <!--DataGridColumnHeaderStyle-->
                <Style TargetType="{x:Type DataGridColumnHeader}">
                    <Setter Property="SnapsToDevicePixels" Value="True" />
                    <Setter Property="MinWidth" Value="0" />
                    <Setter Property="MinHeight" Value="32" />
                    <!--<Setter Property="Foreground" Value="White" />-->
                    <Setter Property="FontSize" Value="13" />
                    <!--<Setter Property="FontWeight" Value="Bold"></Setter>-->
                    <Setter Property="Template">
                        <Setter.Value>
                            <ControlTemplate TargetType="DataGridColumnHeader">
                                <!--显示列边框为左边框-->
                                <Border x:Name="BackgroundBorder" Margin="-1,0,0,0" BorderThickness="1,0,1,1" BorderBrush="#2A3A57" Background="#BDC7D7" Width="Auto">
                                    <Grid >
                                        <Grid.ColumnDefinitions>
                                            <ColumnDefinition Width="*" />
                                        </Grid.ColumnDefinitions>
                                        <ContentPresenter  Margin="0" VerticalAlignment="Center" HorizontalAlignment="Center"/>
                                    </Grid>
                                </Border>
                            </ControlTemplate>
                        </Setter.Value>
                    </Setter>
                </Style>

ilikeff8 2017-05-26
  • 打赏
  • 举报
回复
没有 TargetType="{x:Type DataGridTemplateColumn}" 这种写法 只能单独设置

<Window x:Class="WpfApp2.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApp2"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <Style TargetType="{x:Type StackPanel}" x:Key="ContentStyle">
            <Setter Property="Background" Value="Red"/>
        </Style>
    </Window.Resources>
    
    <Grid >
        <DataGrid ItemsSource="{Binding SimpleList}">
            <DataGrid.Columns>
            <DataGridTemplateColumn Header="col" Width="*">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <StackPanel Style="{StaticResource ContentStyle}">
                            <TextBlock Text="{Binding A}" />
                            <TextBlock Text="{Binding B}" />
                        </StackPanel>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
            </DataGrid.Columns>
        </DataGrid>
    </Grid>
</Window>
寂空冷 2017-05-26
  • 打赏
  • 举报
回复
引用 1 楼 xuggzu 的回复:
楼主要的style基本上不都写了嘛,至于row的样式,接着写就行了。。。
一个个简单的没啥意义,我是想通过资源文件设置DataGrid的Style="{StaticSource 样式名}"控制所有的ColumnHeaderStyle,RowHeaderStyle,CellStyle,RowStyle....

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧