【问题标题】:WPF DataGridRow BorderThickness increase row's widthWPF DataGridRow BorderThickness 增加行的宽度
【发布时间】:2018-04-12 06:30:51
【问题描述】:

我想在 DataGrid 中显示我的数据。 我为它写了我的风格,就在这里

<Style TargetType="DataGridColumnHeader">
    <Setter Property="FontSize" Value="20"/>
    <Setter Property="Background" Value="DarkGreen" />
    <Setter Property="Foreground" Value="White"/>
    <Setter Property="BorderThickness" Value="0,0,0,1"/>
    <Setter Property="BorderBrush" Value="ForestGreen"/>
    <Setter Property="Height" Value="80"/>
    <Setter Property="Padding" Value="5,0,0,0"/>
</Style>

<Style TargetType="DataGridRow">
    <Setter Property="FontSize" Value="18"/>
    <Setter Property="Background" Value="White"/>
    <Setter Property="Margin" Value="0,6,0,0"/>
    <Style.Triggers>
        <Trigger Property="IsMouseOver" Value="True">
            <Setter Property="Background" Value="LightGreen"/>
            <Setter Property="Foreground" Value="DarkGreen"/>
        </Trigger>
        <Trigger Property="IsSelected" Value="True">
            <Setter Property="Background" Value="LightGreen"/>
            <Setter Property="Foreground" Value="DarkGreen"/>
            <Setter Property="BorderBrush" Value="ForestGreen"/>
            <Setter Property="BorderThickness" Value="1"/>
        </Trigger>
    </Style.Triggers>
</Style>

<Style TargetType="DataGridCell">
    <Setter Property="Height" Value="80"/>
    <Setter Property="VerticalContentAlignment" Value="Center"/>
    <Setter Property="Focusable" Value="False"/>
    <Style.Triggers>
        <Trigger Property="IsSelected" Value="True">
            <Setter Property="Background" Value="LightGreen"/>
            <Setter Property="Foreground" Value="DarkGreen"/>
            <Setter Property="BorderThickness" Value="0"/>
        </Trigger>
    </Style.Triggers>    
</Style>

当我选择行时,边框显示向上,但行的宽度变得大于 DataGrid 的宽度 -> 我看不到边框的右侧部分和水平滚动条显示向上。

那么问题来了:如何增加行的边框厚度,但不增加行的宽度和高度?

UPD 选择前:

选择后:

【问题讨论】:

  • 你能在点击之前和之后发布截图吗?当边框厚度为 1 时。控件将重绘,因为边框需要占用其所需的空间/像素(因此调整行的大小)。一种替代方法是仅更改颜色(边框厚度始终为 1)并稍微调整窗口大小以适应这 1 个额外像素。
  • @PrateekShrivastava 我通过添加所需图片来更新我的问题。如果我从一开始就使用borderThincknes 设置行的样式,则该行在开始时就比数据网格大,并且我有水平滚动条
  • 正如预期的那样 - BorderThickness 更改导致宽度略有增加(因此出现滚动条)。要么保持你的视图/窗口大小 1 像素宽以适应这一点。或者在触发器中使用边框颜色变化而不是边框​​厚度来获得视觉效果
  • @PrateekShrivastava 有没有办法在数据网格中保持行的大小?这个dataGrid在网格中,所有的大小都是动态变化的。所以,我希望我的行不要用边框调整自己的大小
  • 你在 datagridrow 中有一个边距。随着边框厚度的增加,将其设置得较低。

标签: c# .net wpf xaml


【解决方案1】:
<ColumnDefinition Width="50"/>
<ColumnDefinition Width="5*"/>
<ColumnDefinition Width="5*"/>

第一列是固定宽度 50,而其他 2 列的宽度相同。这使您的窗口的左边距很窄,但右边的 Grid 大小的边距。更改第 3 列的宽度 = 50。如果这不是您想要的方式,请将 col 2 *& 3 width = * 设为与 5* 相同。

接下来,您的每个网格列都被分配了一个宽度作为比例。当您调整窗口大小时,只有最后一列文本被截断。否则它看起来不错。

【讨论】:

  • 该死!我忘记了,在将其添加到 git 之前,我更改了我的 xaml。有一个错误:我需要所有网格周围的边框,但不是每个单元格周围,所以在代码中你需要将borderThickness setter从一个单元格移动到另一个行,我在github上更改了代码,所以你可以从那里抓取。无论如何,我需要那些我描述的 (50,5*,5*) 和所有其他比例的贪婪,我有
【解决方案2】:

将 DataGridRow 样式更改为以下:

<DataGrid.RowStyle>
    <Style TargetType="{x:Type DataGridRow}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type DataGridRow}">
                    <Border x:Name="DGR_Border" 
                            Background="{TemplateBinding Background}"
                            SnapsToDevicePixels="True">
                        <SelectiveScrollingGrid>
                            <SelectiveScrollingGrid.ColumnDefinitions>
                                <ColumnDefinition Width="Auto"/>
                                <ColumnDefinition Width="*"/>
                            </SelectiveScrollingGrid.ColumnDefinitions>
                            <Grid Grid.Column="1">
                                <Grid.RowDefinitions>
                                    <RowDefinition Height="*"/>
                                    <RowDefinition Height="Auto"/>
                                </Grid.RowDefinitions>
                                <DataGridCellsPresenter ItemsPanel="{TemplateBinding ItemsPanel}" 
                                                        SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
                                <DataGridDetailsPresenter Margin="4" 
                                                          Grid.Row="1" 
                                                          SelectiveScrollingGrid.SelectiveScrollingOrientation="{Binding AreRowDetailsFrozen, ConverterParameter={x:Static SelectiveScrollingOrientation.Vertical}, Converter={x:Static DataGrid.RowDetailsScrollingConverter}, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}" 
                                                          Visibility="{TemplateBinding DetailsVisibility}"/>

                                <Border BorderBrush="{TemplateBinding BorderBrush}" 
                                        BorderThickness="{TemplateBinding BorderThickness}" 
                                        Grid.RowSpan="2"/>
                            </Grid>
                            <DataGridRowHeader SelectiveScrollingGrid.SelectiveScrollingOrientation="Vertical" 
                                               Visibility="{Binding HeadersVisibility, ConverterParameter={x:Static DataGridHeadersVisibility.Row}, Converter={x:Static DataGrid.HeadersVisibilityConverter}, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}"/>
                        </SelectiveScrollingGrid>
                    </Border>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
        <Style.Triggers>
            <Trigger Property="DetailsVisibility" Value="Visible">
                <Setter Property="BorderThickness" Value="4,1,4,4"/>
                <Setter Property="BorderBrush" Value="#FF3886B9"/>
            </Trigger>
            <Trigger Property="IsSelected" Value="True">
                <Setter Property="Background" Value="LightGreen"/>
                <Setter Property="Foreground" Value="DarkGreen"/>
                <Setter Property="BorderBrush" Value="ForestGreen"/>
                <Setter Property="BorderThickness" Value="1"/>
            </Trigger>
        </Style.Triggers>
    </Style>
</DataGrid.RowStyle>

希望这能解决您的问题...

【讨论】:

    猜你喜欢
    • 2010-11-22
    • 2014-12-20
    • 2015-10-18
    • 1970-01-01
    • 1970-01-01
    • 2011-05-05
    • 2017-11-20
    • 1970-01-01
    • 2017-08-11
    相关资源
    最近更新 更多