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