C# - 在WPF DataGrid中删除右侧边框行

8

我正在尝试删除WPF GridView中最右侧的网格线。以下是一个.xaml示例:

<Window x:Class="Pack.ExampleForm"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:Pack"
    Background="{DynamicResource {x:Static SystemColors.ControlBrushKey}}"
    Width="400" Height="300">

    <DataGrid Margin="5" AutoGenerateColumns="False" 
        CanUserReorderColumns="False" HeadersVisibility="Column">

        <DataGrid.Columns>
            <DataGridTextColumn Binding="{x:Null}" CanUserResize="False"/>
            <DataGridTextColumn Binding="{Binding Path=Key}" Header="Request Header" Width="*"/>
            <DataGridTextColumn Binding="{Binding Path=Value}" Header="Value" Width="*"/>
        </DataGrid.Columns>

        <local:RequestHeader Key="Subject 1" Value="Body 1" />
        <local:RequestHeader Key="Subject 1" Value="Body 1" />
    </DataGrid>
</Window>

然而,如设计师所示,这有一个极右边的网格线,用黄色圈出来。

Example

是否有办法将其去除并没有边框,就像左侧一样。如果可能的话,最好在.xaml文件中完成。

8个回答

17

嗯,这只是一种诡计,但是... :)

<DataGridTextColumn Binding="{Binding Value}" Width="*">
    <DataGridTextColumn.CellStyle>
        <Style TargetType="DataGridCell">
            <Setter Property="Margin" Value="0,0,-1,0"></Setter>
        </Style>
    </DataGridTextColumn.CellStyle>    
</DataGridTextColumn>

哈!这样做的好处是不会移除右边框,如果用户调整列大小,这很好。 - Mike Strobel
1
删除边框有什么问题吗?调整大小时会发生什么?为什么使用BorderThickness而不是Margin不起作用? - Kaspatoo

4

虽然@monstr的解决方案确实可行,但感觉滥用了Margin属性(这也可能会使后期跟踪布局问题更加困难)。另一种解决方案与@Nick Sologoub和@Xtr建议的方案非常相似,但略微更加清晰一些,即使用DataGrid的CellStyle属性修改与该DataGrid关联的所有单元格样式以及DataGrid的GridLinesVisibility属性。

<DataGrid GridLinesVisibility="None">
    <DataGrid.CellStyle>
        <Style TargetType="DataGridCell">
            <Setter Property="BorderThickness" Value="1,0,0,1"/>
            <Setter Property="BorderBrush" Value="Black"/>
        </Style>
    </DataGrid.CellStyle>
    <!--Other DataGrid Items-->
</DataGrid>

这张图片展示了建议代码的外观。

通过这种方式设置单元格的样式,您不会影响控件的布局(而更改边距会影响布局)。您还可以获得仅影响此特定DataGrid(而不是应用程序中的其他DataGrid)的好处。然而,如果您希望该样式应用于窗口中的所有DataGrid,则可以将其放在窗口的资源或甚至应用程序的资源中。

<Window>
    <Window.Resources>
        <Style TargetType="DataGrid">
            <Setter Property="GridLinesVisibility" Value="None"/>
        </Style>
        <Style TargetType="DataGridCell">
            <Setter Property="BorderThickness" Value="1,0,0,1"/>
            <Setter Property="BorderBrush" Value="Black"/>
        </Style>
    </Window.Resources>
    <Grid>
        <DataGrid>
            <!--DataGrid Items-->
        </DataGrid>
    </Grid>
</Window>

请注意,GridLinesVisibility属性也包含在内,因为它对于此解决方案的正常工作是必要的。

实现窗口/应用程序级别的样式(如上所示)的正确方法很可能涉及使用ResourceDictionaries,但这是一个完全不同的主题。


这很容易是最好的答案。 - Isaac Zais
1
你的解决方案只是创建了一个最左边的边框线,因为你明确定义了它的厚度。 - Kaspatoo

1

我只想要移除右边的网格线边框。另一个链接并没有提供如何这样做的任何信息,它只是指引我们去移除每一个边框。 - Nick Kitto
@NickKitto 你可能不想完全删除它,因为用户可能会调整列的大小,这种情况下,列标题将具有边框,但单元格本身不会。monstr的答案巧妙地避免了这个问题。 - Mike Strobel

1
我做了一些研究,但似乎MSFT没有公开暴露修改每个特定网格线的属性。所以我为您提供一个解决方法。虽然不是理想的,但它相当简洁,不需要代码后台。
基本上有一个属性来控制网格线的可见性。您要做的就是隐藏垂直线,然后创建一个单元格样式,手动创建垂直网格线。您将该样式应用到除最后一个之外的每列,并获得所需的设计。
   <Window.Resources>
    <Style x:Key="DataGridCellStyle">
      <Setter Property="DataGridCell.BorderThickness" Value="0 0 1 0" />
      <Setter Property="DataGridCell.BorderBrush" Value="Black" />
    </Style>
  </Window.Resources>
  <Grid>
    <DataGrid x:Name="grid" Margin="5" AutoGenerateColumns="False" CanUserReorderColumns="False" HeadersVisibility="Column" 
        GridLinesVisibility="Horizontal" >
      <DataGrid.Columns>
        <DataGridTextColumn Binding="{x:Null}" CanUserResize="False" CellStyle="{StaticResource DataGridCellStyle}"/>
        <DataGridTextColumn Binding="{Binding Path=Key}" Header="Request Header" Width="*" CellStyle="{StaticResource DataGridCellStyle}"/>
        <DataGridTextColumn Binding="{Binding Path=Value}" Header="Value" Width="*"/>
      </DataGrid.Columns>
    </DataGrid>
  </Grid>

0
我发现的解决方案使用网格(Grid)而不是数据网格(DataGrid)。我将每个单元格用边框包装起来,BorderThickness="a,b,c,d",其中:
a = Left Border
b = Top Border
c = Right Border
d = Bottom Border

任何我不想看到被设置为0的人。 如果我反复使用特定的一个,我会设置一个样式并重复使用它。


0

也许这会有所帮助:

这个解决了我在 WPF DataGrid 中遇到的边缘问题。只需将 RowHeaderWidth 属性设置为 "0" 即可。


0

1) 创建一个样式,自定义BorderThickness属性(2,2,0,2)的文本框。

2) 将该样式添加到最后一个数据列中。

这样,最后一列的文本框边框就会得到所需的更改。


这没有产生预期的效果。它在单元格内添加了2像素的灰色边框。它并没有影响周围的黑色网格线边框。 - Nick Kitto

0

不需要重新对整个DataGrid进行模板化,您可以将DataGrid的GridLinesVisibility设置为Horizontal,并指定一个DataGridCell样式来更改每个单元格的边框属性。

<DataGrid Margin="5"
          AutoGenerateColumns="False"
          CanUserReorderColumns="False" 
          HeadersVisibility="Column"
          GridLinesVisibility="Horizontal"
          ItemsSource="{Binding SomeDictionary}">
      <DataGrid.Resources>
        <Style TargetType="DataGridCell">
          <Setter Property="BorderThickness" Value="1,0,0,0"/>
          <Setter Property="BorderBrush" Value="Black"/>
        </Style>
      </DataGrid.Resources>
      <DataGrid.Columns>
        <DataGridTextColumn Binding="{x:Null}" CanUserResize="False"/>
        <DataGridTextColumn Binding="{Binding Path=Key}" Header="Request Header" Width="*"/>
        <DataGridTextColumn Binding="{Binding Path=Value}" Header="Value" Width="*"/>
      </DataGrid.Columns>
    </DataGrid>

然后你只会看到实际的DataGrid边框,如果你想要移除它,可以在DataGrid上使用BorderThickness="1,1,0,1"


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接