在构造函数中的属性中循环

本文关键字:循环 属性 构造函数 | 更新日期: 2023-09-27 18:33:17

如果你看看下面的代码。有没有办法编写某种循环而不是重复的行和列定义?

var grid = new Grid
            {
                RowSpacing = 12,
                ColumnSpacing = 12,
                VerticalOptions = LayoutOptions.FillAndExpand,
                RowDefinitions =
            {
                new RowDefinition { Height = new GridLength(1, GridUnitType.Star) },
                new RowDefinition { Height = new GridLength(1, GridUnitType.Star) },
                new RowDefinition { Height = new GridLength(1, GridUnitType.Star) },
            },
                ColumnDefinitions =
            {
                new ColumnDefinition { Width = new GridLength(1, GridUnitType.Star) },
                new ColumnDefinition { Width = new GridLength(1, GridUnitType.Star) },
            }
            };

在构造函数中的属性中循环

您可以使用循环事先创建行数组和列数组,并将其分配给RowDefinitionsColumnDefinitions属性。

不过,我应该认为您需要呼叫RowDefinitions.Add()并循环ColumnDefinitions.Add()才能这样做。

不,这是不可能的,因为这的唯一方法是您可以为 RowDefinitions 属性分配一个全新的值,而您不能:

public RowDefinitionCollection RowDefinitions { get; }
                                                ^^^^

问题中显示的语法只是在该属性中的对象上调用.Add的一种便捷方法,因此您无法在该语法中内联执行此操作。您的代码只是"简短":

var temp = new Grid();
temp.RowSpacing = 12;
temp.ColumnSpacing = 12;
temp.VerticalOptions = LayoutOptions.FillAndExpand;
temp.RowDefinitions.Add(new RowDefinition { Height = new GridLength(1, GridUnitType.Star) });
temp.RowDefinitions.Add(new RowDefinition { Height = new GridLength(1, GridUnitType.Star) });
temp.RowDefinitions.Add(new RowDefinition { Height = new GridLength(1, GridUnitType.Star) });
... same for columns

具体来说,您的代码不会这样做:

temp.RowDefinitions = ...
                    ^

您可能需要这样的代码:

var grid = new Grid()
{
    RowSpacing = 12,
    ColumnSpacing = 12,
    VerticalOptions = LayoutOptions.FillAndExpand,
    RowDefinitions = Enumerable.Range(0, 100).Select(_ =>
        new RowDefinition { Height = new GridLength(1, GridUnitType.Star) }),
    ColumnDefinitions = Enumerable.Range(.....

但是你不能这样做,因为这需要RowDefinitionsColumnDefinitions是可写的。

最接近的事情是这样的:

var temp = new Grid
{
    RowSpacing = 12,
    ColumnSpacing = 12,
    VerticalOptions = LayoutOptions.FillAndExpand,
};
for (int index = 0; index < rowCount; index++)
    temp.RowDefinitions.Add(new RowDefinition { Height = new GridLength(1, GridUnitType.Star) });
... same for columns
var grid = temp;
RowDefinition

是 RowDefinitionCollection。RowDefinitionCollection 是内部的,不能在 Grid 外部创建。