代码之家  ›  专栏  ›  技术社区  ›  DotNetSpartan

如何根据datagrid单元格中内容的宽度设置datagridcolumn的宽度

  •  0
  • DotNetSpartan  · 技术社区  · 6 年前

    我想设置datagridcolumn的宽度,以便根据datagrid单元格中的内容调整列宽,以便 列之间的间距相等。

    这就是我目前所尝试的:

    <DataGrid  x:Name="MyGrid"  AutoGenerateColumns="False" BorderBrush="Transparent"  
            GridLinesVisibility="None" Background="Transparent" RowHeaderWidth="0" > 
     <DataGrid.Resources>
     <Style  TargetType="{x:Type DataGridColumnHeader}">
         <Setter Property="Background" Value="Transparent" />
         <Setter Property="FontFamily" Value="Segoe UI"/>
         <Setter Property="FontWeight" Value="Normal"/>
         <Setter Property="FontSize" Value="20"/>
         <Setter Property="Padding" Value="0,5"/>
     </Style>
     </DataGrid.Resources>
    <DataGrid.Columns>
            <DataGridTemplateColumn Header = "Column 1">
                   <DataGridTemplateColumn.CellTemplate>
                       <DataTemplate>
                              <TextBlock Text="{Binding SomeText}" Width=120 TextWrapping="WrapWithOverflow" />
                       </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>  
    
            <DataGridTemplateColumn ..../>
            <DataGridTemplateColumn ..../>             
    </DataGrid.Columns>
    </Datagrid> 
    

    一些类似这样的东西(如下所示),其中列之间有相等的空间,列根据数据网格单元中定义的内容宽度进行调整。

    enter image description here

    1 回复  |  直到 6 年前
        1
  •  0
  •   mahlatse    6 年前

    以下是您可以尝试的,字符串宽度可以使用 TextFomratter 类( 假设网格只包含文本 ) 所以您需要通过一种方法来计算最大列的宽度,这可以通过使用binding-relativepath等来计算。

    private Size MeasureString(string candidate)
    {
        var formattedText = new FormattedText(
            candidate,
            CultureInfo.CurrentCulture,
            FlowDirection.LeftToRight,
            new Typeface(this.textBlock.FontFamily, this.textBlock.FontStyle, this.textBlock.FontWeight, this.textBlock.FontStretch),
            this.textBlock.FontSize,
            Brushes.Black,
            new NumberSubstitution(),
            1);
    
        return new Size(formattedText.Width, formattedText.Height);
    } 
    

    您可以将上述代码与 MultiConverter 若要获取对父网格对象的引用,可以将其与forloop一起使用以计算当前时间的最大宽度,则可能需要从中使用新的列宽更新所有列。

    您需要将text+grid父对象作为多转换器的参数。