2016-02-04 3 views
0

Если вы посмотрите на мой код ниже. Есть ли способ написать какой-то цикл вместо повторения строк и столбцов?Loop in property in constructor

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

Каков тип 'RowDefinitions'? –

+1

Используйте циклы для создания массива строк и массива столбцов заблаговременно и назначьте их для 'RowDefinitions' и' ColumnDefinitions'? –

+0

@CodeCaster 'Enumerable.Repeat()' будет возвращать ссылки на один и тот же объект, что может быть не очень полезно в этом случае (но не зная деталей 'Grid', это трудно сказать) –

ответ

1

Вы можете использовать циклы для создания массива строк и массива столбцов заранее и назначить их свойствам RowDefinitions и ColumnDefinitions.

Я должен был подумать, что вам нужно будет позвонить RowDefinitions.Add() и ColumnDefinitions.Add() в цикле, чтобы сделать это.

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(..... 

Но вы не можете этого сделать, поскольку это потребует, чтобы RowDefinitions и ColumnDefinitions были доступны для записи.

Самое близкое, как это:

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; 
0

RowDefinitions является RowDefinitionCollection. RowDefinitionCollection является внутренним, который вы не можете создать вне Grid.