【问题标题】:How to set Grid row and column positions programmatically如何以编程方式设置网格行和列位置
【发布时间】:2025-12-01 13:35:01
【问题描述】:

我在 Stackpanel 中有两个网格。 第一个网格被命名为 GridX。 最初,在网格内部,有一个 2D 文本框数组(RowDefs/ColumnDefs)。 XAML 中的 TextBox 定义是

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

我想在与 GridX 的一部分相同的位置以编程方式添加一个 TextBlock

效果一定是这样的

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

如何添加。 我试过这个:

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

但是失败了。

我又试了一次:

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;    

现在的问题是 TextBlock 不可见。文本框隐藏它。 我感谢您的帮助。

【问题讨论】:

  • 代码已更新。现在问题是文本块的可见性

标签: wpf gridview


【解决方案1】:

对于附加属性,您可以在要为其分配值的对象上调用 SetValue:

tblock.SetValue(Grid.RowProperty, 4);

或为所有者类型上的属性调用静态 Set 方法(而不是像您尝试过的实例方法),在本例中为 SetRow:

Grid.SetRow(tblock, 4);

【讨论】:

  • SetRow 工作,而 SetValue 没有:它按原样离开行(在我的情况下为零)
  • 你需要确保TextBlock实例是Grid实例的一部分,你可以这样做:mygrid.Children.Add(myTextBlock);
  • 当您需要在运行时执行更改时,不要忘记使用调度程序。这就是我的情况。
【解决方案2】:

这是一个可能对某人有所帮助的示例:

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

【讨论】:

    【解决方案3】:
    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);
    }
    

    【讨论】:

      【解决方案4】:

      试试这个:

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

      【讨论】:

        最近更新 更多