Pergunta

Eu estava tentando colocar minha cabeça em torno XAML e pensei que eu iria tentar escrever algum código.

Tentando adicionar uma grade com 6 por 6 definições de coluna, em seguida, adicione um bloco de texto em uma das células da grade.Eu não parecem ser capazes de fazer referência a célula que eu quero.Não há nenhum método na grelha que posso adicionar o bloco de texto também.Não é só grade.crianças.add(object), nenhuma Célula definição.

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);
}

Atualização

Aqui está o assustador bits:

  • Usando o VS2008 Pro XP

  • WPFbrowser Modelo de Projeto (3.5 verificado)

Eu não obter os métodos de 'conclusão automática'.

Foi útil?

Solução

WPF faz uso de uma coisa chamada funky propriedades anexadas.Assim, em seu XAML, você pode escrever isso:

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

E isso efetivamente mover TextBlock na célula (0,0) de sua grade.

No código isso parece um pouco estranho.Eu acredito que seria algo como:

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

Dê uma olhada no link acima - propriedades anexadas tornar as coisas muito fáceis de fazer em XAML, talvez, em detrimento da intuitivo-à procura de código.

Outras dicas

O local da célula é uma propriedade anexada - o valor pertence ao TextBlock, em vez de Grade.No entanto, uma vez que a propriedade pertence à Grade, você precisa usar a propriedade de definição do campo ou a fornecida funções estáticas.

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

Use anexado propriedades da classe de Grade.

em C#:

Grid.SetRow( cell, rownumber )

Em XAML:

<TextBlock Grid.Row="1" />

Também, gostaria de conselhos, se você não usar o dynamic grades, usar a linguagem de marcação XAML.Eu sei, ele tem uma curva de aprendizado, mas uma vez que você domina-lo, é muito mais fácil, especialmente se você estiver indo para usar ControlTemplates e DataTemplates!;)

Eis alguns exemplos de

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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top