WPF - DataGrid列,宽度=“*”,但MinWidth适合内容

时间:2010-08-04 09:07:20

标签: wpf xaml datagrid width datagridcolumn

让一组DataGrid列具有比例宽度(Width="\*"),但是最小宽度至少为宽度的最佳/正确方法是什么?它们的内容?目前,如果我使用Width="*",那么列保持完全成比例,但如果列太薄,内容会被裁剪。如果我使用Width="Auto",那么列的大小完全是它们的内容,但这使它们的大小各不相同。

我想要的实际上是两者的组合,例如Width="\*"MinWidth="Auto",以便当有额外的宽度时,列将全部空出到相等的宽度,但是当网格变小时,内容永远不会被裁剪。

可悲的是,MinWidth="Auto"不存在,所以我想我需要绑定列的MinWidth属性,但很难弄清楚我将它绑定到什么。

如何告诉WPF "MinWidth="列最宽内容的宽度?

5 个答案:

答案 0 :(得分:19)

我知道它有点晚了,但我找到了你的问题并编写了一个纯XAML解决方案。

 <ColumnDefinition Width="42*" MinWidth="{Binding Path=ActualWidth, ElementName=projectInfoHeader }"/> 

ElementName指向控件占据大部分空间的位置。当然这只能用于宽度有限的元素。 例如,如果您为GroupBox执行此操作,则只能调整为较大的宽度,而不会调整为较小的宽度。

如果你有几个值MinWidth的候选者,你需要自己写一个IMultiValueConverter,它接受​​一个对象[],将它解析为浮点数,并返回最大值(它只是1 linq查询,如果你只使用它自己并且不需要处理转换器的错误使用)

这种方式还支持动态更改MinWidth

答案 1 :(得分:12)

在XAML中设置Width = "Auto"

然后在代码中:

MinWidth = ActualWidth
Width = new GridLength(1, GridUnitType.Star)

答案 2 :(得分:2)

我在GridViewColumn中正确调整Grid列的大小也存在问题。我尝试了几件事,但后来我发现了UniformGrid。这是我的终极解决方案。它只是有效。我之前不知道......似乎默认情况下它在VS工具箱中不存在(?),因此不知道它是否存在。

您可以从here找到有关UniformGrid的更多信息。

答案 3 :(得分:1)

在XAML中为列命名:

<Grid>
      <Grid.ColumnDefinitions>
             <ColumnDefinition Width="*" Name="Col1"/>
             <ColumnDefinition Width="*"/>
      </Grid.ColumnDefinitions>
</Grid>

然后在代码中设置MinWidth属性,如下所示:

public MainWindow()
{
    InitializeComponent();

    Col1.MinWidth = 340; //enter desired minimum width here
}

答案 4 :(得分:0)

您可以为 Grid 控件创建依赖项属性(例如,称为HorizontalPropFillOfBlankSpace),该属性将确保您需要的内容(具有Width =“ *”的列,但MinWidth可以容纳内容)。然后,您可以将其应用于所需的任何网格:

<Grid namespace:GridHelper.HorizontalPropFillOfBlankSpace="True">
   <Grid.ColumnDefinitions>
      <ColumnDefinition Width="Auto" />
      <ColumnDefinition Width="Auto" />
   </Grid.ColumnDefinitions>
   ...

您可以在下面看到此依赖项属性的实现示例。只有带有Width="Auto"的列会自动调整大小以填充空白空间。您可以根据自己的需要对其进行自定义。

public class GridHelper
{
   /// <summary>
   /// Columns are resized to proportionally fill horizontal blank space.
   /// It is applied only on columns with the Width property set to "Auto".
   /// Minimum width of columns is defined by their content.
   /// </summary>
   public static readonly DependencyProperty HorizontalPropFillOfBlankSpaceProperty =
      DependencyProperty.RegisterAttached("HorizontalPropFillOfBlankSpace", typeof(bool), typeof(GridHelper), new UIPropertyMetadata(false, OnHorizontalPropFillChanged));

   public static bool GetHorizontalPropFillOfBlankSpace(Grid grid)
      => (bool)grid.GetValue(HorizontalPropFillOfBlankSpaceProperty);

   public static void SetHorizontalPropFillOfBlankSpace(Grid grid, bool value)
      => grid.SetValue(HorizontalPropFillOfBlankSpaceProperty, value);

   private static void OnHorizontalPropFillChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
   {
      if (!(d is Grid grid))
         return;

      if ((bool)e.NewValue)
      {
         grid.Loaded += Grid_Loaded;
      }
      else
      {
         grid.Loaded -= Grid_Loaded;
      }
   }

   private static void Grid_Loaded(object sender, RoutedEventArgs e)
   {
      if (!(sender is Grid grid))
         return;

      foreach (var cd in grid.ColumnDefinitions)
      {
         if (cd.Width.IsAuto && cd.ActualWidth != 0d)
         {
            if (cd.MinWidth == 0d)
               cd.MinWidth = cd.ActualWidth;
            cd.Width = new GridLength(1d, GridUnitType.Star);
         }
      }
   }
}