Я пытался осмыслить XAML и подумал, что попробую написать код.
Попытка добавить сетку с определениями столбцов 6 на 6, а затем добавить текстовый блок в одну из ячеек сетки. Кажется, я не могу сослаться на нужную ячейку. В сетке нет метода, которым я мог бы добавить текстовый блок. Есть только grid.children.add (объект), нет определения Cell.
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)
Я не получаю методы автозаполнения.





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.
в C#:
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