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> |
但是,正如设计师所显示的那样,该网格的最右边是黄色圆圈。
有什么办法可以删除它并且没有边框,因为它在左侧。 如果可能,最好在.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> |
通过以这种方式对单元格进行样式设置,您不会影响控件的布局(而对边距的混乱则会造成影响)。您还可以获得仅影响这一特定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行和单元格边框
可能这会有所帮助:
我发现的解决方案使用网格而不是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边框,如果需要,可以使用
1)为TextBox创建样式,以自定义BorderThickness属性(2,2,0,2)。
2)在最后一个DataGridColumn中添加样式。
这样,最后一列的TextBox边框将单独进行所需的更改。