34

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

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

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

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

4

5 回答 5

21

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

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

其中ElementName指向控件的点占据了大部分空间。当然,这仅适用于宽度有限的元素。例如,如果您为 a 执行此操作GroupBox,则只能将其调整为更大的宽度,而不能将其调整为更小的宽度。

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

这种方式还支持动态改变MinWidth.

于 2012-07-03T08:51:00.233 回答
12

Width = "Auto"在 XAML 中设置。

然后在代码中:

MinWidth = ActualWidth
Width = new GridLength(1, GridUnitType.Star)
于 2010-10-25T02:02:01.857 回答
2

我在 GridViewColumn 中正确调整 Grid 列的大小时也遇到了问题。我尝试了几件事,但后来我找到了 UniformGrid。这对我来说是最终的解决方案。它只是工作。我以前不知道它......默认情况下它似乎不存在于VS工具箱中(?),因此甚至不知道它存在。

您可以从这里找到更多关于 UniformGrid 的信息。

于 2014-02-26T06:43:05.153 回答
0

您可以为Grid控件创建一个依赖属性(称为 eg 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);
         }
      }
   }
}
于 2020-10-02T15:36:23.243 回答
-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
}
于 2012-09-20T15:54:09.083 回答