34

DataGrid列のセットに比例した幅を持たせるための最良/正しい方法は何でしょうか(Width="\*"),ただし、最小幅を少なくともコンテンツの幅にするには?現時点では、を使用するWidth="*"と、列は正確に比例したままになりますが、コンテンツ列が細すぎるとトリミングされます. を使用するWidth="Auto"と、列は内容に合わせて完全にサイズ変更されますが、これによりすべてのサイズが異なります.

私が本当に欲しいのは、 のような 2 つの組み合わせです。Width="\*"余分MinWidth="Auto"な幅がある場合、列はすべて同じ幅になるように配置されますが、グリッドが小さくなった場合、コンテンツはトリミングされません。

悲しいことに、MinWidth="Auto"存在しないので、列のプロパティをバインドする必要があると思いますMinWidthが、何にバインドするかを正確に把握するのは困難です。

"MinWidth="列の最も幅の広いコンテンツの幅をWPF に伝えるにはどうすればよいですか?

4

5 に答える 5

21

少し遅れていることは承知していますが、あなたの質問を見つけて、純粋な XAML ソリューションをプログラムしました。

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

ElementNameほとんどのスペースを占めるコントロールを指す場所。もちろん、それは幅が制限されている要素でのみ可能です。たとえば の場合、GroupBox幅を大きくすることしかできず、幅を小さくすることはできません。

の値の候補が複数ある場合は、 object[] を取り、それをフロートに解析し、最大値を返すMinWidtha を自分で作成する必要があり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 に答える
0

必要なものを確保するグリッドコントロールの依存関係プロパティ (例: と呼ばれる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 に答える