0

在 WPF 应用程序中,我使用 aDataGrid来显示已解析为多列的文本文件中的数据。其中一列特别包含长度可变的文本。由于默认情况下列宽会自动适应其内容,因此该列中的一些非常长的文本通常会将以下列推到视线之外,从而迫使用户水平滚动。

起初,我尝试通过MaxWidth为列指定 a 来解决此问题,但这将完全阻止用户调整列大小以查看完整内容(如果他们愿意)。简单地设置Width为一个固定值会稍微好一些,但是列通常会比它需要的更宽......

所以,我正在寻找的是一种“软” MaxWidth,它只会影响列的自动调整大小,但不会影响用户将其调整到超出该值的能力......理想情况下,有一种轻量级的方法可以做到这一点没有代码隐藏(或至少很少)?

4

1 回答 1

0

你有一些选择。您可以将 设置DataGrid.ColumnWidth为固定宽度或DataGridLength.SizeToHeader

对于所有列:

<DataGrid ColumnWidth="{x:Static DataGridLength.SizeToHeader}" />

对于单个列:

<DataGridTextColumn Width="{x:Static DataGridLength.SizeToHeader}" />

此外,您可以在单元格内容中添加省略号,以向用户指示单元格内容溢出。

自动生成列时:

<DataGrid AutoGeneratingColumn="OnDataGrid_AutoGeneratingColumn"
          ColumnWidth="{x:Static DataGridLength.SizeToHeader}">
  <DataGrid.Resources>
    <Style x:Key="DataGridTextColumnEditStyle"
           TargetType="{x:Type TextBlock}"
           BasedOn="{StaticResource {x:Type TextBlock}}">
      <Setter Property="TextTrimming"
              Value="CharacterEllipsis" />
    </Style>
  </DataGrid.Resources>
</DataGrid>
private void OnDataGrid_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
{
  if (e.Column is DataGridTextColumn textColumn)
  {
    var dataGrid = sender as DataGrid;
    var textColumnEditStyle = dataGrid.FindResource("DataGridTextColumnEditStyle") as Style;
    textColumn.ElementStyle = textColumnEditStyle;
  }
}

明确定义列时:

<DataGrid AutoGenerateColumns="False">
  <DataGrid.Columns>
    <DataGridTextColumn Width="{x:Static DataGridLength.SizeToHeader}">
      <DataGridTextColumn.ElementStyle>
        <Style TargetType="{x:Type TextBlock}"
               BasedOn="{StaticResource {x:Type TextBlock}}">
          <Setter Property="TextTrimming"
                  Value="CharacterEllipsis" />
        </Style>
      </DataGridTextColumn.ElementStyle>
    </DataGridTextColumn>
  </DataGrid.Columns>
</DataGrid>

另一种解决方案是允许DataGrid计算宽度并在之后验证和强制每个列宽:

<DataGrid Loaded="OnDataGrid_Loaded" />
private const double MaxColumnWidth = 200;

private void OnDataGrid_Loaded(object sender, RoutedEventArgs e)
{
  var dataGrid = sender as DataGrid;

  // Alternatively, select the particular column of interest by index or Header value
  foreach (DataGridColumn column in dataGrid.Columns)
  {
    if (column.ActualWidth > MaxColumnWidth)
    {
      column.Width = MaxColumnWidth;
    }
  }
}
于 2022-01-24T13:33:10.127 回答