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

时间:2014-11-27 20:00:43

标签: c# wpf border wpfdatagrid

我正在尝试删除WPF GridView中最右边的GridLine。 这是一个例子.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 个答案:

答案 0 :(得分:12)

嗯,这只是偷偷摸摸的解决方法,但......:)

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

答案 1 :(得分:3)

虽然@ 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>

This picture demonstrates how the proposed code looks.

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

<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的使用,但这是一个完全不同的主题。

答案 2 :(得分:1)

如果要删除整个网格单元格边框,则可以使用 GridLinesVisibility =“无”。 以下是删除单边框的解决方案。

Removing all DataGrid row and cell borders

答案 3 :(得分: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>

答案 4 :(得分:0)

1)为TextBox自定义 BorderThickness 属性(2,2,0,2)创建样式。

2)在最后一个DataGridColumn中添加样式。

这样,最后一列的TextBox边框就会产生所需的更改。

答案 5 :(得分:0)

如果不重新模板化整个DataGrid,可以将DataGrid的GridLinesVisibility设置为Horizo​​ntal,并指定一个更改每个单元格边框属性的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"删除。

答案 6 :(得分:0)

我找到的解决方案使用Grid而不是DataGrid。我用BorderThickness =&#34; a,b,c,d&#34;将每个单元格包装在一个边框中。其中:

a = Left Border
b = Top Border
c = Right Border
d = Bottom Border

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

答案 7 :(得分:0)

可能会有所帮助:

这解决了WPF DataGrid中的边缘问题。只要把&#34; 0&#34;到RowHeaderWidth属性