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

StackOverflow https://stackoverflow.com/questions/7586

  •  08-06-2019
  •  | 
  •  

Вопрос

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

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

КСАМЛ:

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

С#:

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)

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

Это было полезно?

Решение

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, возможно, за счет интуитивного вида кода.

Другие советы

Местоположение ячейки является прикрепленным свойством: значение принадлежит 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);

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

в С#:

Grid.SetRow( cell, rownumber )

В XAML:

<TextBlock Grid.Row="1" />

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

Вот пример

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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top