如何通过代码生成WPF控件

时间:2008-08-11 07:26:47

标签: c# .net wpf xaml

我试图了解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);
}

更新

这是一个幽灵般的位:

  • 在XP上使用VS2008 Pro

  • WPFbrowser项目模板(3.5已验证)

我没有自动完成方法。

4 个答案:

答案 0 :(得分:7)

WPF使用了一种名为attached properties的时髦东西。所以在你的XAML中你可以这样写:

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

这将有效地将TextBlock移动到网格的单元格(0,0)中。

在代码中,这看起来有点奇怪。我相信它会像:

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

看看上面的链接 - 附加的属性使XAML中的事情变得非常简单,可能会牺牲直观的代码。

答案 1 :(得分:0)

以下是一些示例

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

答案 2 :(得分:0)

单元格位置是附加属性 - 该值属于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);

答案 3 :(得分:0)

使用Grid类的附加属性。

在C#中

Grid.SetRow( cell, rownumber )

在XAML中:

<TextBlock Grid.Row="1" />

另外,如果您不使用动态网格,我会建议您使用XAML标记语言。我知道,它有一个学习曲线,但是一旦你掌握了它,它就会变得容易得多,特别是如果你要使用ControlTemplates和DataTemplates! ;)