Как генерировать элементы управления WPF с помощью кода

Я пытался разобраться с XAML и подумал, что попробую написать какой-нибудь код.

Попытка добавить сетку с определениями столбцов 6 на 6, а затем добавить текстовый блок в одну из ячеек сетки. Кажется, я не могу сослаться на нужную ячейку. В сетке нет метода, чтобы я тоже мог добавить текстовый блок. Существует только grid.children.add (объект), без определения ячейки.

XAML:

<Page x:Class="WPF_Tester.Page1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Page1"
    Loaded="Page_Loaded">

</Page>

C #:

private void Page_Loaded(object sender, RoutedEventArgs e)
{
    //create the structure
    Grid g = new Grid();
    g.ShowGridLines = true;
    g.Visibility = Visibility.Visible;

    //add columns
    for (int i = 0; i < 6; ++i)
    {
        ColumnDefinition cd = new ColumnDefinition();
        cd.Name = "Column" + i.ToString();

        g.ColumnDefinitions.Add(cd);
    }
    //add rows
    for (int i = 0; i < 6; ++i)
    {
        RowDefinition rd = new RowDefinition();
        rd.Name = "Row" + i.ToString();

        g.RowDefinitions.Add(rd);
    }
    TextBlock tb = new TextBlock();
    tb.Text = "Hello World";

    g.Children.Add(tb);
}

Обновить

Вот немного жуткий:

  • Использование VS2008 Pro на XP

  • Шаблон проекта WPFbrowser (проверено 3.5)

Я не получаю методы в автозаполнении.

11.08.2008 07:26:46
4 ОТВЕТА
РЕШЕНИЕ

В WPF используется интересная вещь, называемая прикрепленными свойствами . Так что в вашем XAML вы можете написать это:

<TextBlock Grid.Row="0" Grid.Column="0" />

И это эффективно переместит TextBlock в ячейку (0,0) вашей сетки.

В коде это выглядит немного странно. Я считаю, что это будет что-то вроде:

g.Children.Add(tb);
Grid.SetRow(tb, 0);
Grid.SetColumn(tb, 0);

Посмотрите на эту ссылку выше - прикрепленные свойства делают вещи в XAML действительно простыми, возможно, за счет интуитивно-понятного кода.

7
11.08.2008 07:42:16

Расположение ячейки является вложенным свойством - значение принадлежит TextBlock, а не Grid. Однако, поскольку само свойство принадлежит Grid, вам необходимо использовать либо поле определения свойства, либо предоставленные статические функции.

TextBlock tb = new TextBlock();
//
// Locate tb in the second row, third column.
// Row and column indices are zero-indexed, so this
// equates to row 1, column 2.
//
Grid.SetRow(tb, 1);
Grid.SetColumn(tb, 2);
0
11.08.2008 07:39:44

Используйте вложенные свойства класса Grid.

в C #:

Grid.SetRow( cell, rownumber )

В XAML:

<TextBlock Grid.Row="1" />

Кроме того, я бы посоветовал, если вы не используете динамические сетки, используйте язык разметки XAML. Я знаю, у него есть кривая обучения, но как только вы освоите его, это станет намного проще, особенно если вы собираетесь использовать ControlTemplates и DataTemplates! ;)

0
11.08.2008 07:54:26

Вот пример

Grid grid = new Grid();

// Set the column and row definitions
grid.ColumnDefinitions.Add(new ColumnDefinition() {
     Width = new GridLength(1, GridUnitType.Auto) });
grid.ColumnDefinitions.Add(new ColumnDefinition() {
     Width = new GridLength(1, GridUnitType.Star) });
grid.RowDefinitions.Add(new RowDefinition() {
     Height = new GridLength(1, GridUnitType.Auto) });
grid.RowDefinitions.Add(new RowDefinition() {
     Height = new GridLength(1, GridUnitType.Auto) });

// Row 0
TextBlock tbFirstNameLabel = new TextBlock() { Text = "First Name: "};
TextBlock tbFirstName = new TextBlock() { Text = "John"};

grid.Children.Add(tbFirstNameLabel ); // Add to the grid
Grid.SetRow(tbFirstNameLabel , 0); // Specify row for previous grid addition
Grid.SetColumn(tbFirstNameLabel , 0); // Specity column for previous grid addition

grid.Children.Add(tbFirstName ); // Add to the grid
Grid.SetRow(tbFirstName , 0);  // Specify row for previous grid addition
Grid.SetColumn(tbFirstName , 1); // Specity column for previous grid addition

// Row 1
TextBlock tbLastNameLabel = new TextBlock() { Text = "Last Name: "};
TextBlock tbLastName = new TextBlock() { Text = "Smith"};

grid.Children.Add(tbLastNameLabel ); // Add to the grid
Grid.SetRow(tbLastNameLabel , 1);  // Specify row for previous grid addition
Grid.SetColumn(tbLastNameLabel , 0); // Specity column for previous grid addition

grid.Children.Add(tbLastName ); // Add to the grid
Grid.SetRow(tbLastName , 1);  // Specify row for previous grid addition
Grid.SetColumn(tbLastName , 1); // Specity column for previous grid addition
0
1.12.2011 18:18:54