同一用户控件的 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*"/>
我做了可重复使用的用户控件,在我的项目中使用了几次。
通常主网格的第二行需要比第一行大 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*"/>