Frage

Ich habe versucht, mich mit XAML vertraut zu machen, und dachte, dass ich versuchen sollte, Code zu schreiben.

Ich versuche, ein Raster mit 6 x 6 Spaltendefinitionen hinzuzufügen und dann einen Textblock in eine der Rasterzellen einzufügen.Ich kann anscheinend nicht auf die gewünschte Zelle verweisen.Es gibt keine Methode im Raster, mit der ich den Textblock auch hinzufügen kann.Es gibt nur „grid.children.add(object)“ und keine Zellendefinition.

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

Aktualisieren

Hier ist das Gruselige:

  • Verwendung von VS2008 Pro unter XP

  • WPFbrowser-Projektvorlage (3.5 verifiziert)

Ich bekomme die Methoden bei der automatischen Vervollständigung nicht angezeigt.

War es hilfreich?

Lösung

WPF verwendet ein ungewöhnliches Ding namens angehängte Eigenschaften.In Ihrem XAML könnten Sie also Folgendes schreiben:

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

Dadurch wird der TextBlock effektiv in die Zelle (0,0) Ihres Rasters verschoben.

Im Code sieht das etwas seltsam aus.Ich glaube, es wäre so etwas wie:

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

Schauen Sie sich den Link oben an – angehängte Eigenschaften machen die Arbeit in XAML wirklich einfach, vielleicht auf Kosten des intuitiv aussehenden Codes.

Andere Tipps

Die Zellenposition ist eine angehängte Eigenschaft – der Wert gehört zum TextBlock und nicht zum Grid.Da die Eigenschaft selbst jedoch zu Grid gehört, müssen Sie entweder das Eigenschaftsdefinitionsfeld oder die bereitgestellten statischen Funktionen verwenden.

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

Verwenden Sie angehängte Eigenschaften der Grid-Klasse.

in C#:

Grid.SetRow( cell, rownumber )

In XAML:

<TextBlock Grid.Row="1" />

Wenn Sie keine dynamischen Raster verwenden, würde ich Ihnen außerdem raten, die Auszeichnungssprache XAML zu verwenden.Ich weiß, es erfordert eine gewisse Lernkurve, aber wenn man es erst einmal beherrscht, ist es viel einfacher, vor allem, wenn man ControlTemplates und DataTemplates verwendet!;)

Hier ist ein Beispiel

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top