2008-08-11 20 views
5

? Estaba tratando de entender a XAML y pensé que intentaría escribir algún código.¿Cómo puedo generar controles WPF a través del código

Intentando agregar una cuadrícula con 6 por 6 definiciones de columna luego agrega un bloque de texto en una de las celdas de la grilla. No parece poder hacer referencia a la celda que quiero. No hay ningún método en la cuadrícula al que pueda agregar el bloque de texto. Solo hay grid.children.add (object), no hay definición de celda.

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

actualización

Aquí está el poco tenebroso:

  • Usando V Pro S2008 en XP

  • WPFbrowser plantilla de proyecto (3,5 verificado)

Me Don; t consigue los métodos en función de autocompletar.

Respuesta

7

WPF hace uso de una cosa funky llamada attached properties. Así que en su XAML puede escribir esto:

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

y esto va a moverse con eficacia TextBlock en la celda (0,0) de su red.

En el código esto se ve un poco extraño. Creo que sería algo así como:

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

Tener un vistazo a ese enlace anterior - propiedades adjuntas hacen cosas muy fácil de hacer en XAML tal vez a expensas de código de aspecto intuitivo.

0

La ubicación de la celda es una propiedad adjunta: el valor pertenece a TextBlock en lugar de a Grid. Sin embargo, dado que la propiedad en sí misma pertenece a Grid, debe usar el campo de definición de propiedad o las funciones estáticas proporcionadas.

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

Utilice las propiedades adjuntas de la clase Grid.

en C#:

Grid.SetRow(cell, rownumber)

En XAML:

<TextBlock Grid.Row="1" />

Además, yo aconsejaría si no utiliza las redes dinámicas, utiliza el lenguaje de marcado XAML. Lo sé, tiene una curva de aprendizaje, pero una vez que la dominas, es mucho más fácil, especialmente si vas a usar Plantillas de Control y Plantillas de Datos. ;)

0

Aquí es un poco de muestra 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 
Cuestiones relacionadas