Comment générer des contrôles WPF via du code
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.
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