同一用户控件的不同WPF网格行大小规格取决于情况
Posted
技术标签:
【中文标题】同一用户控件的不同WPF网格行大小规格取决于情况【英文标题】:Different specification of WPF grid row sizes of the same user control depending of situation 【发布时间】:2021-01-12 05:34:30 【问题描述】:我已经完成了在我的项目中使用过几次的可重用用户控件。
通常主网格的第二行需要比第一行大 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);
但是在调用控件的构造函数时不会传递值。该值需要在调用构造函数时传递,因此我可以指定第二行的高度需要多少并正确渲染。
【问题讨论】:
在什么条件下,行需要大 5 倍而不是 7 倍? 可能是我一开始就搞错了项目。我设置了 40 行和 40 列的主网格。在此我有许多控件,包括我自己的新用户控件,在某些情况下,我放置了 6 行和一些 8 行。只是临时设计问题。在我学会如何做好它并将所有内容重构为可扩展和支持 4k 之前,我想解决这个问题,所以它看起来没问题,无论同一个用户控件是通过我的主窗口网格的 6 行还是 8 行。 【参考方案1】:不要覆盖构造函数中的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*"/>
【讨论】:
我在想我不需要为此使用依赖属性,但我已经习惯了,因为最近我经常遇到这种情况。无论如何,非常感谢你,当然回答接受并给予加号。最好的问候,谢谢你,先生。 仅供参考:我必须将您的依赖属性设置为静态,因为否则我会收到它已经注册的错误。但是,因为我将其更改为静态,所以我必须在 OnCoerceValue 方法的最后一行硬编码默认值。我写它只是为了提供信息(也许我错过了一些东西,或者你得到了一个有趣的信息),我非常感谢你的帮助:) @ninidow359 谢谢和抱歉,当然依赖属性必须是static
,已更正。以上是关于同一用户控件的不同WPF网格行大小规格取决于情况的主要内容,如果未能解决你的问题,请参考以下文章