So legen Sie die Zeilen- und Spaltenpositionen des Rasters programmgesteuert fest

87

Ich habe zwei Gitter in einem Stackpanel. Das erste Raster heißt GridX. Im Raster befindet sich zunächst ein 2D-Array von Textfeldern (RowDefs / ColumnDefs). Die TextBox-Definition in XAML lautet

<TextBox x:Name="A1" Grid.Row="4" Grid.Column="5" TextAlignment="Center" />

Ich möchte einen TextBlock programmgesteuert an derselben Position wie in GridX hinzufügen.

Der Effekt muss so sein

<TextBlock Grid.Row="4" Grid.Column="5"
HorizontalAlignment="Left" VerticalAlignment="Top" Text="10" FontSize="8"/>

Wie man das hinzufügt. Ich habe das versucht:

TextBlock tblock = new TextBlock();
GridX.SetColumn(tblock, cIndex);
GridX.SetRow(tblock, rIndex);

Aber scheiterte.

Wieder habe ich das versucht:

int rIndex = Grid.GetRow(txtBox);
int cIndex = Grid.GetColumn(txtBox);                               

TextBlock tblock = new TextBlock();
tblock.VerticalAlignment = VerticalAlignment.Top;
tblock.HorizontalAlignment = HorizontalAlignment.Left;
tblock.FontSize = 8;
tblock.Text = rc[i, j - 1];

Grid.SetColumn(tblock, cIndex);
Grid.SetRow(tblock, rIndex);

txtBox.MaxLength = 1;    

Das Problem ist nun, dass TextBlock nicht sichtbar ist. TextBox versteckt es. Ich schätze Ihre Hilfe.

Vinod
quelle
Code wurde aktualisiert. Jetzt ist das Problem die Sichtbarkeit des Textblocks
Vinod

Antworten:

152

Für angehängte Eigenschaften können Sie entweder SetValue für das Objekt aufrufen, für das Sie den Wert zuweisen möchten:

tblock.SetValue(Grid.RowProperty, 4);

Oder rufen Sie die statische Set-Methode (nicht als Instanzmethode, wie Sie es versucht haben) für die Eigenschaft des Besitzertyps auf, in diesem Fall SetRow:

Grid.SetRow(tblock, 4);
John Bowen
quelle
SetRow funktionierte, während SetValue dies nicht tat: Es verließ die Zeile wie sie ist (in meinem Fall Null)
Anton Tropashko
1
Sie müssen sicherstellen, dass die TextBlock-Instanz Teil der Grid-Instanz ist. Sie können dies tun: mygrid.Children.Add (myTextBlock);
Rodrigo Caballero
Vergessen Sie nicht, einen Dispatcher zu verwenden, wenn Sie die Änderung zur Laufzeit ausführen müssen. Das war mein Fall.
Hagen
30

Hier ist ein Beispiel, das jemandem helfen könnte:

Grid test = new Grid();
test.ColumnDefinitions.Add(new ColumnDefinition());
test.ColumnDefinitions.Add(new ColumnDefinition());
test.RowDefinitions.Add(new RowDefinition());
test.RowDefinitions.Add(new RowDefinition());
test.RowDefinitions.Add(new RowDefinition());

Label t1 = new Label();
t1.Content = "Test1";
Label t2 = new Label();
t2.Content = "Test2";
Label t3 = new Label();
t3.Content = "Test3";
Label t4 = new Label();
t4.Content = "Test4";
Label t5 = new Label();
t5.Content = "Test5";
Label t6 = new Label();
t6.Content = "Test6";

Grid.SetColumn(t1, 0);
Grid.SetRow(t1, 0);
test.Children.Add(t1);

Grid.SetColumn(t2, 1);
Grid.SetRow(t2, 0);
test.Children.Add(t2);

Grid.SetColumn(t3, 0);
Grid.SetRow(t3, 1);
test.Children.Add(t3);

Grid.SetColumn(t4, 1);
Grid.SetRow(t4, 1);
test.Children.Add(t4);

Grid.SetColumn(t5, 0);
Grid.SetRow(t5, 2);
test.Children.Add(t5);

Grid.SetColumn(t6, 1);
Grid.SetRow(t6, 2);
test.Children.Add(t6);
Dave
quelle
1
for (int i = 0; i < 6; i++)
{
    test.ColumnDefinitions.Add(new ColumnDefinition());

    Label t1 = new Label();
    t1.Content = "Test" + i;

    Grid.SetColumn(t1, i);
    Grid.SetRow(t1, 0);
    test.Children.Add(t1);
}
KobCoder
quelle
1

Versuche dies:

                Grid grid = new Grid(); //Define the grid
                for (int i = 0; i < 36; i++) //Add 36 rows
                {
                    ColumnDefinition columna = new ColumnDefinition()
                    {
                        Name = "Col_" + i,
                        Width = new GridLength(32.5),
                    };
                    grid.ColumnDefinitions.Add(columna);
                }

                for (int i = 0; i < 36; i++) //Add 36 columns
                {
                    RowDefinition row = new RowDefinition();
                    row.Height = new GridLength(40, GridUnitType.Pixel);
                    grid.RowDefinitions.Add(row);
                }

                for (int i = 0; i < 36; i++)
                {
                    for (int j = 0; j < 36; j++)
                    {
                        Label t1 = new Label()
                        {
                            FontSize = 10,
                            FontFamily = new FontFamily("consolas"),
                            FontWeight = FontWeights.SemiBold,
                            BorderBrush = Brushes.LightGray,
                            BorderThickness = new Thickness(2),
                            HorizontalContentAlignment = HorizontalAlignment.Center,
                            VerticalContentAlignment = VerticalAlignment.Center,
                        };
                        Grid.SetRow(t1, i);
                        Grid.SetColumn(t1, j);
                        grid.Children.Add(t1); //Add the Label Control to the Grid created
                    }
                }
Kenlly Acosta
quelle