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

C# - Removing right edge row border in WPF DataGrid

我试图在WPF GridView中删除最右边的GridLine。
这是一个示例.xaml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<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中执行此操作。


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

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


尽管@monstr的解决方案确实有效,但感觉像是在滥用Margin属性(这也可能使以后很难跟踪布局问题)。另一个解决方案与@Nick Sologoub和@Xtr所建议的解决方案非常相似,但更为简洁,它是使用DataGrid的CellStyle属性来修改与该DataGrid关联的所有单元格样式以及DataGrid的GridLinesVisibility属性。

1
2
3
4
5
6
7
8
9
<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,则可以将其放在窗口的资源中,甚至可以放在应用程序的资源中。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<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的一些用法,但这是一个完全不同的主题。


我做了一些研究,但似乎MSFT似乎不公开这些属性来修改每个特定的网格线。因此,我为您提供了一种解决方法。这不是理想的方法,但是它很干净而且没有任何代码隐藏。

基本上,有一个属性可以控制网格线的可见性。您要做的是隐藏垂直网格线,然后为单元格创建样式,以手动创建垂直网格线。您可以将该样式应用于除最后一列之外的所有列,并获得所需的设计。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
   <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>

如果要删除整个Grid单元格边框,则可以使用GridLinesVisibility =" None"。
否则,下面是删除单个边框的解决方案。

删除所有DataGrid行和单元格边框


可能这会有所帮助:

>
</p>
<p>
这为我解决了WPF DataGrid中的边缘问题。只需将


我发现的解决方案使用网格而不是DataGrid。我用BorderThickness =" a,b,c,d"将每个单元格包裹在边框中,其中:

1
2
3
4
a = Left Border
b = Top Border
c = Right Border
d = Bottom Border

我不想看到的任何人都设为0。
如果我一遍又一遍地使用特定的样式,则会设置一个样式并重复使用。


无需重新模板化整个DataGrid,就可以将DataGrid的GridLinesVisibility设置为Horizo??ntal,并指定DataGridCell样式来更改每个单元格的边框属性。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<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边框,如果需要,可以使用BorderThickness="1,1,0,1"在DataGrid上删除该边框。


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

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

这样,最后一列的TextBox边框将单独进行所需的更改。