2016-04-28 5 views
0

Я хотел бы создать сетку во время выполнения. Это XAML код, чтобы проиллюстрировать то, что я ищу:Настройка ColumnDefinition и RowDefinition программно

<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}" 
      Name='Test'> 
    <Grid.RowDefinitions> 
     <RowDefinition Height='*' /> 
     <RowDefinition Height='*' /> 
    </Grid.RowDefinitions> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width='*' /> 
     <ColumnDefinition Width='*' /> 
     <ColumnDefinition Width='*' /> 
     <ColumnDefinition Width='*' /> 
     <ColumnDefinition Width='*' /> 
    </Grid.ColumnDefinitions> 
</Grid> 

код XAML выше штраф за исключением того, что является статическим и фиксировано. Я хотел бы, чтобы приложение создало определение столбцов и строк во время выполнения в зависимости от ввода пользователя. Итак, я создал метод, названный инициируют сетки:

private void initiateGrid() 
{ 
    int numberOfColumn = 10; 
    for (int j = 0; j < (numberOfColumn/5) + 1; j++) 
    { 
     RowDefinition r1 = new RowDefinition(); 
     Test.RowDefinitions.Add(r1); 
     for (int i = 0; i < numberOfColumn; i++) 
     { 
      ColumnDefinition c1 = new ColumnDefinition(); 
      c1.Width = new GridLength(1, GridUnitType.Star); 
      Test.ColumnDefinitions.Add(c1); 
      TextBlock tb = new TextBlock(); 
      tb.FontSize = 20; 
      tb.VerticalAlignment = VerticalAlignment.Top; 
      tb.HorizontalAlignment = HorizontalAlignment.Stretch; 
      tb.Text = string.Format("Text row {0}, column {1}", j, i); 
      Test.Children.Add(tb); 
      Grid.SetColumn(Test, i); 
      Grid.SetRow(Test, j); 
     } 
    } 
} 

, и я назвал его после того как я InitializeComponent в MainPage.

public MainPage() 
{ 
    this.InitializeComponent(); 
    initiateGrid(); 
} 

Я не получаю ошибку компилятора, ни ошибки времени выполнения, но я не вижу TextBlock я пытался заполнить, чтобы проверить точность позиции. Может ли кто-то пролить свет на меня? Что было не так в моем коде?

Спасибо!

ответ

1

Это именно то, что было wron г в моем коде:

1) Я создал слишком много столбцов

2) Я должен был назначен строку и столбец в текстовых блоков, а не сетка Это то, что правильный код должен быть:

private void initiateGrid() 
{ 
    int numberOfColumn = 10; 
     for (int i = 0; i < numberOfColumn; i++) 
     { 
      ColumnDefinition c1 = new ColumnDefinition(); 
      c1.Width = new GridLength(1, GridUnitType.Star); 
      Test.ColumnDefinitions.Add(c1); 
     } 
    for (int j = 0; j < (numberOfColumn/5) + 1; j++) 
    { 
     RowDefinition r1 = new RowDefinition(); 
     Test.RowDefinitions.Add(r1); 
     for (int i = 0; i < numberOfColumn; i++) 
     { 
      TextBlock tb = new TextBlock(); 
      tb.FontSize = 20; 
      tb.VerticalAlignment = VerticalAlignment.Top; 
      tb.HorizontalAlignment = HorizontalAlignment.Stretch; 
      tb.Text = string.Format("Text row {0}, column {1}", j, i); 
      Test.Children.Add(tb); 
      Grid.SetColumn(tb, i); 
      Grid.SetRow(tb, j); 
     } 
    } 
} 
0

Это хороший пример того, что вы пытаетесь достичь с помощью AttachedProperty https://rachel53461.wordpress.com/2011/09/17/wpf-grids-rowcolumn-count-properties/

и в вашем XAML вы просто использовать как так .....

XAML

<Grid local:GridHelpers.RowCount="{Binding RowCount}" 
      local:GridHelpers.ColumnCount="{Binding ColumnCount}" /> 

ViewModel

public MainWindowVM() 
    { 
     this.RowCount = 4; 
     this.ColumnCount = 5; 
    } 

    private int _RowCount; 

    public int RowCount 
    { 
     get { return _RowCount; } 
     set { _RowCount = value; NotifyPropertyChanged("RowCount"); } 
    } 

    private int _ColumnCount; 

    public int ColumnCount 
    { 
     get { return _ColumnCount; } 
     set { _ColumnCount = value; NotifyPropertyChanged("ColumnCount"); } 
    } 
+1

Свойства связаны с видом - не помещайте их в виртуальную машину. – slugster

+1

Вид может иметь код в файле кода, который приводит к тому, что модель представления назначается как свойство DataContext. Это может быть так же просто, как представление, создающее новую модель представления и назначение ее в свой DataContext или ввод модели представления в представление с использованием контейнера с инверсией контроля. Однако подключение модели представления к представлению в файле с кодом не рекомендуется, так как это может вызвать проблемы для дизайнеров как в Visual Studio, так и в программном обеспечении Microsoft Expression Blend®. – Monty

+0

Был ли этот комментарий для меня ответом? Я смущен - что именно вы пытаетесь сказать? Кажется, это откуда-то цитата? – slugster

Смежные вопросы