同一用户控件的 WPF 网格行大小的不同规格取决于情况

Different specification of WPF grid row sizes of the same user control depending of situation

我做了可重复使用的用户控件,在我的项目中使用了几次。

通常主网格的第二行需要比第一行大 7 倍,但在特定情况下只需要大 5 倍。

<Grid x:Name="mainGrid">    
    <Grid.RowDefinitions>
        <RowDefinition Height="*"/>
        <RowDefinition Height="7*"/>
    </Grid.RowDefinitions>
    ...
</Grid>

我试过通过XAML设置:

<helperControls:AttachmentsGridControl x:Name="projectAttachmentsControl" ... HeightOfSecondRow="5" />

在 .cs 部分:

public int HeightOfSecondRow { get; set; }
public AttachmentsGridControl()
{
    InitializeComponent();
    if(HeightOfSecondRow > 0)
        this.mainGrid.RowDefinitions[1].Height = new GridLength(HeightOfSecondRow, GridUnitType.Star);
}

但是在调用控件的构造函数时没有传递值。该值需要在调用构造函数时传递,因此我可以指定第二行的高度需要多少并正确渲染它。

不要在构造函数中覆盖 HeightOfSecondRow,而是将其设为 GridLength 类型的依赖项 属性,默认值为 7*。强制值回调将确保在 XAML 中设置的值或绑定绑定的值为正,否则将被替换为默认值。

public partial class AttachmentsGridControl : UserControl
{
   public static readonly DependencyProperty HeightOfSecondRowProperty = DependencyProperty.Register(
      nameof(HeightOfSecondRow), typeof(GridLength), typeof(AttachmentsGridControl),
      new PropertyMetadata(new GridLength(7, GridUnitType.Star), null, OnCoerceValue));

   public GridLength HeightOfSecondRow
   {
      get => (GridLength)GetValue(HeightOfSecondRowProperty);
      set => SetValue(HeightOfSecondRowProperty, value);
   }

   public AttachmentsGridControl()
   {
      InitializeComponent();
   }

   private static object OnCoerceValue(DependencyObject d, object value)
   {
      var gridLength = (GridLength)value;
      return gridLength.Value > 0.0 ? gridLength : HeightOfSecondRowProperty.GetMetadata(d).DefaultValue;
   }
}

调整 Height 的绑定以使用 AttachmentsGridControl.

HeightOfSecondRow 属性
<Grid x:Name="mainGrid">
   <Grid.RowDefinitions>
      <RowDefinition Height="*"/>
      <RowDefinition Height="{Binding HeightOfSecondRow, RelativeSource={RelativeSource AncestorType={x:Type local:AttachmentsGridControl}}}"/>
   </Grid.RowDefinitions>
   <!-- ...your content. -->
</Grid>

然后你可以像以前一样设置HeightOfSecondRow。如果不设置,将使用默认值。

<local:AttachmentsGridControl x:Name="projectAttachmentsControl" HeightOfSecondRow="20*"/>