【问题标题】:C# - Removing right edge row border in WPF DataGridC# - 删除 WPF DataGrid 中的右边缘行边框
【发布时间】:2015-01-26 11:37:24
【问题描述】:

我正在尝试删除 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>

然而,这有最右边的网格线,如设计器所示,用黄色圈起来。

有什么办法可以去掉这个并且没有边框,因为它在左侧。如果可能,希望在 .xaml 中执行此操作。

【问题讨论】:

    标签: c# wpf border wpfdatagrid


    【解决方案1】:

    这可能会有所帮助:

    这为我解决了 WPF DataGrid 中的边缘问题。只需将“0”放入 RowHeaderWidth 属性

    【讨论】:

      【解决方案2】:

      虽然@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,则可以将其放在窗口的资源中,甚至是应用程序的资源中。

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

      【讨论】:

      • 这无疑是最好的答案
      • 您的解决方案只是创建了一条最左边的边界线,因为您明确定义了厚度
      【解决方案3】:

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

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

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

      【讨论】:

        【解决方案4】:

        无需重新模板化整个 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" 将其移除。

        【讨论】:

          【解决方案5】:

          我做了一些研究,但似乎 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>
          

          【讨论】:

            【解决方案6】:

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

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

            【讨论】:

            • 哈!这样做的好处是不删除右边框,如果用户调整列的大小,这很好。
            • 去掉边框有什么问题?调整大小会发生什么?为什么这不适用于 BorderThickness 而不是边距?
            【解决方案7】:

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

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

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

            【讨论】:

            • 这没有达到预期的效果。这在单元格内添加了 2 px 灰色边框作为额外的。它不会影响周围的黑色网格线边框。
            【解决方案8】:

            如果您想删除整个网格单元格边框,则可以使用 GridLinesVisibility="None"。 else 下面是去除单边框的解决方案。

            Removing all DataGrid row and cell borders

            【讨论】:

            • 我只想删除右网格线边框。另一个链接没有提供任何关于如何做到这一点的信息,它只是指删除每个边框。
            • @NickKitto 您可能不想完全删除它,因为用户可能会调整列的大小以使其更小,在这种情况下,列标题会有边框,但单元格本身不会。 monstr 的回答巧妙地避免了这个问题。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2016-12-22
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2023-02-25
            • 1970-01-01
            • 2016-05-20
            相关资源
            最近更新 更多