Question

J'essayais de comprendre XAML et j'ai pensé que j'essaierais d'écrire du code.

Essayez d'ajouter une grille avec des définitions de colonnes de 6 x 6, puis ajoutez un bloc de texte dans l'une des cellules de la grille.Je ne semble pas pouvoir référencer la cellule que je souhaite.Il n’existe aucune méthode sur la grille permettant d’ajouter également le bloc de texte.Il n'y a que grid.children.add(object), pas de définition de cellule.

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

Mise à jour

Voici le côté effrayant :

  • Utiliser VS2008 Pro sur XP

  • Modèle de projet WPFbrowser (vérifié 3.5)

Je ne reçois pas les méthodes en saisie semi-automatique.

Était-ce utile?

La solution

WPF utilise un truc génial appelé propriétés attachées.Ainsi, dans votre XAML, vous pourriez écrire ceci :

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

Et cela déplacera efficacement le TextBlock dans la cellule (0,0) de votre grille.

Dans le code, cela semble un peu étrange.Je crois que ce serait quelque chose comme :

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

Jetez un œil à ce lien ci-dessus - les propriétés attachées rendent les choses vraiment faciles à faire en XAML, peut-être au détriment d'un code intuitif.

Autres conseils

L'emplacement de la cellule est une propriété attachée - la valeur appartient au TextBlock plutôt qu'à la Grid.Cependant, puisque la propriété elle-même appartient à Grid, vous devez utiliser soit le champ de définition de propriété, soit les fonctions statiques fournies.

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

Utilisez les propriétés attachées de la classe Grid.

en C# :

Grid.SetRow( cell, rownumber )

En XAML :

<TextBlock Grid.Row="1" />

De plus, je vous conseillerais, si vous n'utilisez pas de grilles dynamiques, d'utiliser le langage de balisage XAML.Je sais, il y a une courbe d'apprentissage, mais une fois que vous l'avez maîtrisé, c'est tellement plus facile, surtout si vous comptez utiliser ControlTemplates et DataTemplates !;)

Voici un échantillon

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top