在 WPF 中为 DataGrid 缩小列的宽度

Posted

技术标签:

【中文标题】在 WPF 中为 DataGrid 缩小列的宽度【英文标题】:Shrinking the width of a column in WPF for DataGrid 【发布时间】:2011-11-02 02:37:25 【问题描述】:

我的第一行看起来像这样:

Title 1 2 3 4 5 6 7 ...

如果我选择

ColumnWidth="Auto"

它的大小正确,但列之间的空间太大。有没有办法缩小它?我尝试在我的 xaml 背后的代码中获取数据来做

if (textColumn != 0) 
textColumn.Width = 8;

或类似的东西,但大小似乎没有改变。我不确定这是否正确,因为我是 WPF 和 C# 的新手。谢谢。

编辑:

XAML:

<DataGrid x:Name="dtGridReads"  AutoGenerateColumns="False" 
        VirtualizingStackPanel.IsVirtualizing="True"                                       
        VirtualizingStackPanel.VirtualizationMode ="Standard"
          EnableColumnVirtualization="True"
          EnableRowVirtualization="True"
        ScrollViewer.IsDeferredScrollingEnabled="True"
        CanUserReorderColumns="False" CanUserResizeColumns="False" CanUserSortColumns="True"
         ItemsSource ="Binding" Block.TextAlignment="Center"
         AlternatingRowBackground="LightGoldenrodYellow" RowBackground="White"
          CanUserAddRows="False" CanUserDeleteRows="False" FrozenColumnCount="1"
           GridLinesVisibility="None" Style="StaticResource ConcensusDataGridStyle" FontSize="12" >
</DataGrid>

【问题讨论】:

你为什么不在你的 xaml 中做呢,如果你做 MVVM 你可以对它进行数据绑定,这样你就不用使用后面的代码了。顺便说一句,你也可以按百分比来做!如果您粘贴代码,也许我可以为您提供更多帮助 不确定如何在 XAML 中执行此操作,因为第一列与其他列不同。我发布了我的代码,看看是否有助于解决问题。 如果我正确理解您的问题,您希望低于DataGridColumn 的“最小宽度”。 DataGrid 似乎对DataGridColumn 可以变得多小有某种限制。我试着用反射器看这个,但找不到它的来源。还尝试使用 Snoop 更改每个列标题、拇指、文本块等,但这也无济于事 我也用它来填充所有的网格。 ***.com/questions/5028894/… 【参考方案1】:

您将需要创建一个列宽转换器类并将一个值传递给转换器以相应地设置您的大小。

这是转换器

 private const double StaticGridWidth = 602;


public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)

    if ((value != null) && (parameter != null))
    
        double newValue = (double)value - StaticGridWidth;
        double dparam = double.Parse(parameter.ToString());
        double width = newValue * (dparam/1000);
        return (width > 0) ? width : 0;
    

    return null;

这是 XAML 中的用法

<Converters:WidthConverter x:Key="widthConvert" />

<GridViewColumn Header="Binding TypeColumnHeader"  
                                Width="Binding Path=ActualWidth, ElementName=treeGrid, Converter=StaticResource widthConvert, ConverterParameter=190" 

                            />

请注意,如果您正在构建区域应用程序,则传入的值必须是整数。如果您在 xaml 和本地使用小数,对于小数 - 它会爆炸。

【讨论】:

请注意,静态网格宽度是为了说明我为其设置静态宽度的网格中的列。这允许您在同一个网格中混合静态/动态列宽,并希望在默认情况下避免滚动条。【参考方案2】:

有很多方法可以做到这一点。

    首先,您需要为每一列创建一个列。

所以,即。来自 MSDN

<sdk:DataGrid x:Name="dataGrid4" 
    Height="160" Margin="0,5,0,10" 
    RowHeight="40" AutoGenerateColumns="False" >    
    <sdk:DataGrid.Columns>
        <sdk:DataGridTextColumn 
            Header="First Name" 
            Width="SizeToHeader"
            Binding="Binding FirstName" 
            FontSize="20" />
        <sdk:DataGridTextColumn 
            Header="Last Name" 
            Width="SizeToCells"
            Binding="Binding LastName" 
            FontSize="20" />
        <sdk:DataGridTextColumn 
            Header="Address"
            Width="150"
            Binding="Binding Address" >
            <sdk:DataGridTextColumn.ElementStyle>
                <Style TargetType="TextBlock">
                    <Setter Property="TextWrapping" Value="Wrap"/>
                </Style>
            </sdk:DataGridTextColumn.ElementStyle>
            <sdk:DataGridTextColumn.EditingElementStyle>
                <Style TargetType="TextBox">
                    <Setter Property="Foreground" Value="Blue"/>
                </Style>
            </sdk:DataGridTextColumn.EditingElementStyle>
        </sdk:DataGridTextColumn>
        <sdk:DataGridCheckBoxColumn 
            Header="New?" 
            Width="40"
            Binding="Binding IsNew" />
        <sdk:DataGridCheckBoxColumn 
            Header="Subscribed?" 
            Width="Auto"
            Binding="Binding IsSubscribed" 
            IsThreeState="True" />
    </sdk:DataGrid.Columns>
</sdk:DataGrid>

SizeToHeader 意味着它将根据标题的长度来调整大小 在宽度上你也可以做类似的事情 这意味着您将宽度的值硬编码为 8

你也可以用百分比来表示

假设您有 3 列 你想要的一列宽度 .3* ,接下来你想要 .5* ,接下来你想要 .2* 构成数据网格的 100%。你可以这样说 宽度=".5*";

您还可以将宽度绑定到视图模型中的某种属性,如果您想要更改它,您还可以执行 tsells 状态并通过转换器运行它。

【讨论】:

以上是关于在 WPF 中为 DataGrid 缩小列的宽度的主要内容,如果未能解决你的问题,请参考以下文章

WPF DataGrid 列宽自动和滚动条

在 WPF Datagrid 中为网格线着色

在wpf中怎么获取datagrid某行某列的值

wpf datagrid自适应列宽错位

wpf datagrid 滚动条如何设置宽度和颜色

在wpf中怎么获取datagrid某行某列的值啊?急!跪求!