在构造函数中的属性循环

时间:2016-02-04 13:50:27

标签: c# xamarin

如果您查看下面的代码。有没有办法编写某种循环而不是重复的Row和ColumnDefinitions?

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) },
            }
            };

3 个答案:

答案 0 :(得分:1)

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

我应该认为你需要在循环中调用RowDefinitions.Add()ColumnDefinitions.Add()才能这样做。

答案 1 :(得分:0)

不,这是不可能的,因为这样做的唯一方法是,如果你可以为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;

答案 2 :(得分:0)

RowDefinitions是RowDefinitionCollection。 RowDefinitionCollection 是内部的,您无法在Grid外部创建。