【问题标题】:Dotted Horizontal Grid Lines in WPF DataGridWPF DataGrid 中的虚线水平网格线
【发布时间】:2011-09-05 16:34:05
【问题描述】:

有没有办法在 WPF 数据网格中的水平网格线上有一条虚线?我到处搜索,似乎找不到具体的方法。可以解决此问题的一种解决方案是设置 Datagrid.RowStyle。我已经尝试过了,它会导致错误。我已将我的数据网格绑定到数据表。 2 列只是文本,第 3 列是图像列。对于这些列,我使用了 DataGridTemplateColumn。文本块和图像。我希望你们能帮助我……如果你们想要我的代码示例,就在这里。

 <StackPanel>
                <dg:DataGrid Name="questionList"
                             HeadersVisibility="None"
                             AutoGenerateColumns="False"
                             Background="White"
                             Margin="42,32,43,0"
                             BorderThickness="0" 
                             GridLinesVisibility="Horizontal"
                             CanUserAddRows="False" 
                             HorizontalGridLinesBrush="#FFCCCCCC" 
                             MaxHeight="549" 
                             Cursor="Hand" 
                             PreviewMouseLeftButtonUp="questionnaireList_PreviewMouseLeftButtonUp">
                    <dg:DataGrid.CellStyle>
                        <Style TargetType="{x:Type dg:DataGridCell}">
                            <Setter Property="BorderThickness" Value="0"/>
                        </Style>
                    </dg:DataGrid.CellStyle>
                    <dg:DataGrid.RowStyle>
                        <Style TargetType="{x:Type dg:DataGridRow}">
                            <Setter Property="Background" Value="{Binding MyImage, Converter={x:Static my:StatusColorConverter.instance}}" />
                        </Style>
                    </dg:DataGrid.RowStyle>
                    <dg:DataGrid.Columns>
                        <dg:DataGridTemplateColumn Width="69*">
                            <dg:DataGridTemplateColumn.CellTemplate>
                                <DataTemplate>
                                    <TextBlock Margin="12,16,0,17" 
                                               FontSize="18" 
                                               Foreground="#0891F1" 
                                               Text="{Binding Path=Number}" 
                                               TextWrapping="Wrap"/>
                                </DataTemplate>
                            </dg:DataGridTemplateColumn.CellTemplate>
                        </dg:DataGridTemplateColumn>
                        <dg:DataGridTemplateColumn Width="601*">
                            <dg:DataGridTemplateColumn.CellTemplate>
                                <DataTemplate>
                                    <TextBlock FontSize="16" Foreground="#666666"
                                               Text="{Binding Path=Desc}"
                                               TextWrapping="Wrap"
                                               TextAlignment="Justify"
                                               Margin="0,16,0,17" />
                                </DataTemplate>
                            </dg:DataGridTemplateColumn.CellTemplate>
                        </dg:DataGridTemplateColumn>
                        <dg:DataGridTemplateColumn Width="117*">
                            <dg:DataGridTemplateColumn.CellTemplate>
                                <DataTemplate>
                                    <Image Source="{Binding Path=Imgs}" 
                                           Stretch="None" 
                                           VerticalAlignment="Top" 
                                           HorizontalAlignment="Right" 
                                           Margin="0,16,18,17" />
                                </DataTemplate>
                            </dg:DataGridTemplateColumn.CellTemplate>
                        </dg:DataGridTemplateColumn>
                    </dg:DataGrid.Columns>
                </dg:DataGrid>
            </StackPanel>

【问题讨论】:

    标签: c# .net wpf datagrid


    【解决方案1】:

    最简单的方法是简单地使用具有绝对映射模式的渐变画笔:

    <DataGrid ItemsSource="{Binding People}">
        <DataGrid.HorizontalGridLinesBrush>
            <LinearGradientBrush StartPoint="0,0" EndPoint="3,0" MappingMode="Absolute" SpreadMethod="Repeat">
                <GradientStop Offset="0" Color="Black"/>
                <GradientStop Offset="0.5" Color="Black"/>
                <GradientStop Offset="0.5" Color="Transparent"/>
                <GradientStop Offset="1" Color="Transparent"/>
            </LinearGradientBrush>
        </DataGrid.HorizontalGridLinesBrush>
        <DataGrid.VerticalGridLinesBrush>
            <LinearGradientBrush StartPoint="0,0" EndPoint="0,3" MappingMode="Absolute" SpreadMethod="Repeat">
                <GradientStop Offset="0" Color="Black"/>
                <GradientStop Offset="0.5" Color="Black"/>
                <GradientStop Offset="0.5" Color="Transparent"/>
                <GradientStop Offset="1" Color="Transparent"/>
            </LinearGradientBrush>
        </DataGrid.VerticalGridLinesBrush>
        <DataGrid.Columns>
            <DataGridTextColumn Header="First Name"  Binding="{Binding FirstName}"/>
            <DataGridTextColumn Header="Last Name" Binding="{Binding LastName}" />
        </DataGrid.Columns>
    </DataGrid>
    

    结果:

    【讨论】:

    • 所以你对我投了反对票,因为你想出了另一个解决方案?谢谢
    • @Meleak:试图删除我的反对票,但除非您的帖子被编辑,否则它不会让我投票。我只想让更好的答案排在首位,不管是谁提供的。与个人无关!否决票并不意味着“你很烂”,而是意味着“这个答案有点误导/次优”。
    • 是的,我知道,我只是认为它不应该被否决。您的解决方案确实很优雅,一旦 OP 更改接受的答案,我将删除我的答案。这是+1
    • 干杯。我刚刚对你的帖子进行了厚颜无耻的编辑,所以我可以删除我的反对票。
    • 这个解决方案产生strange result for me
    【解决方案2】:

    您可以通过在DataGrid 中指定GridLinesVisibility="Vertical" 来禁用在代码中绘制的水平网格线。然后您可以重新模板 DataGridRow 并在每行的末尾添加虚线

    看起来像这样:

    <DataGrid GridLinesVisibility="Vertical">
        <DataGrid.RowStyle>
            <Style TargetType="DataGridRow">
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="{x:Type DataGridRow}">
                            <Border x:Name="DGR_Border" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" SnapsToDevicePixels="True">
                                <SelectiveScrollingGrid>
                                    <SelectiveScrollingGrid.ColumnDefinitions>
                                        <ColumnDefinition Width="Auto"/>
                                        <ColumnDefinition Width="*"/>
                                    </SelectiveScrollingGrid.ColumnDefinitions>
                                    <SelectiveScrollingGrid.RowDefinitions>
                                        <RowDefinition Height="*"/>
                                        <RowDefinition Height="Auto"/>
                                        <RowDefinition Height="Auto"/>
                                    </SelectiveScrollingGrid.RowDefinitions>
                                    <DataGridCellsPresenter 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 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}}}"/>
                                    <Path Grid.Row="2" Grid.ColumnSpan="2"
                                          Data="M0,0.5 L1,0.5"
                                          Stretch="Fill" Stroke="Black" StrokeThickness="1"
                                          StrokeDashArray="1.0 2.0"/>
                                </SelectiveScrollingGrid>
                            </Border>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
        </DataGrid.RowStyle>
        <!-- ... -->
    </DataGrid>
    

    编辑:这是工具包中 3.5 DataGrid 的模板

    <Custom:DataGrid GridLinesVisibility="Vertical">
        <Custom:DataGrid.RowStyle>
            <Style TargetType="Custom:DataGridRow">
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="{x:Type Custom:DataGridRow}">
                            <Border x:Name="DGR_Border" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" SnapsToDevicePixels="True">
                                <Custom:SelectiveScrollingGrid>
                                    <Custom:SelectiveScrollingGrid.ColumnDefinitions>
                                        <ColumnDefinition Width="Auto"/>
                                        <ColumnDefinition Width="*"/>
                                    </Custom:SelectiveScrollingGrid.ColumnDefinitions>
                                    <Custom:SelectiveScrollingGrid.RowDefinitions>
                                        <RowDefinition Height="*"/>
                                        <RowDefinition Height="Auto"/>
                                        <RowDefinition Height="Auto"/>
                                    </Custom:SelectiveScrollingGrid.RowDefinitions>
                                    <Custom:DataGridCellsPresenter Grid.Column="1" ItemsPanel="{TemplateBinding ItemsPanel}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
                                    <Custom:DataGridDetailsPresenter Grid.Column="1" Grid.Row="1" Visibility="{TemplateBinding DetailsVisibility}">
                                        <Custom:SelectiveScrollingGrid.SelectiveScrollingOrientation>
                                            <Binding Path="AreRowDetailsFrozen" RelativeSource="{RelativeSource FindAncestor, AncestorLevel=1, AncestorType={x:Type Custom:DataGrid}}">
                                                <Binding.ConverterParameter>
                                                    <Custom:SelectiveScrollingOrientation>Vertical</Custom:SelectiveScrollingOrientation>
                                                </Binding.ConverterParameter>
                                            </Binding>
                                        </Custom:SelectiveScrollingGrid.SelectiveScrollingOrientation>
                                    </Custom:DataGridDetailsPresenter>
                                    <Custom:DataGridRowHeader Grid.RowSpan="2" Custom:SelectiveScrollingGrid.SelectiveScrollingOrientation="Vertical">
                                        <Custom:DataGridRowHeader.Visibility>
                                            <Binding Path="HeadersVisibility" RelativeSource="{RelativeSource FindAncestor, AncestorLevel=1, AncestorType={x:Type Custom:DataGrid}}">
                                                <Binding.ConverterParameter>
                                                    <Custom:DataGridHeadersVisibility>Row</Custom:DataGridHeadersVisibility>
                                                </Binding.ConverterParameter>
                                            </Binding>
                                        </Custom:DataGridRowHeader.Visibility>
                                    </Custom:DataGridRowHeader>
                                    <Path Grid.Row="2" Grid.ColumnSpan="2"
                                          Data="M0,0.5 L1,0.5"
                                          Stretch="Fill" Stroke="Black" StrokeThickness="1"
                                          StrokeDashArray="1.0 2.0"/>
                                </Custom:SelectiveScrollingGrid>
                            </Border>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
        </Custom:DataGrid.RowStyle>
        <!-- ... -->
    </Custom:DataGrid>
    

    【讨论】:

    • 我试过你的示例代码,但似乎“Converter={x:Static dg:DataGrid.RowDetailsS​​crollingConverter}”有问题。该错误表明 DataGrid 没有静态成员“RowDetailsS​​crollingConverter”。我使用 WPFToolkit,因为我使用的是 .net 3.5 和 Visual Studio 2008。我还检查了 MSDN 并确认 DataGrid 有一个静态成员“RowDetailsS​​crollingConverter”。我错过了什么?
    • 使用 3.5 工具包的 Template 更新了我的答案 DataGrid
    • 虽然这可能有效,但首先将它们绘制在代码中是有原因的。我建议您在使用此方法之前对网格中的大量数据进行性能测试 - 使用和不使用自定义线。如果您改为子类化 DataGridCell 并在那里渲染线条,您可能会看到更好的性能。
    • 请查看我的更新答案 - 这是一种更简单且不妥协的方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-04
    • 2011-07-01
    • 2015-02-11
    • 1970-01-01
    相关资源
    最近更新 更多