同一用户控件的不同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 的绑定以使用AttachmentsGridControlHeightOfSecondRow 属性。

<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网格行大小规格取决于情况的主要内容,如果未能解决你的问题,请参考以下文章

WPF之UniformGrid使用小记

WPF 自动调整字体大小,直到它适合父控件

在 WPF 的网格中显示对其他控件的控件

如何使 wpf 行缩小以适合内容

WPF:将控件高度设置为填充网格行高

冻结wpf数据网格中的列