XAML 如何在网格的特定列和行内创建元素,在WPF中的C#文件内[重复]

yfwxisqw  于 2023-08-01  发布在  C#
关注(0)|答案(3)|浏览(106)

此问题已在此处有答案

Add dynamic buttons in grid [duplicate](1个答案)
3天前关闭。
在xaml文件中,我创建了一个Grid和一个TextBox,如下所示:

<Grid Margin="6">
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="1*"/>
        <ColumnDefinition Width="1*"/>
        <ColumnDefinition Width="1*"/>
        <ColumnDefinition Width="1*"/>
    </Grid.ColumnDefinitions>

    <Grid.RowDefinitions>
        <RowDefinition Height="3*"/>
        <RowDefinition Height="1*"/>
        <RowDefinition Height="1*"/>
        <RowDefinition Height="1*"/>
        <RowDefinition Height="1*"/>
        <RowDefinition Height="1*"/>
        <RowDefinition Height="1*"/>
    </Grid.RowDefinitions>

    <TextBox x:Name="tB" IsReadOnly="True" TextWrapping="Wrap"
             BorderThickness="2" Margin="0, 0, 0, 16"
             Grid.Column="0" Grid.Row="0" Grid.ColumnSpan="4"
             Text="0" FontSize="36" TextAlignment="Right"
             />
</Grid>

字符串
现在,对于所有剩余的列和行,我想在它们内部创建一个单独的按钮。我不认为一遍又一遍地重复同一行代码,单独创建所有按钮是一个好主意。
我认为使用for循环在C#脚本中创建按钮可以工作,但我无法访问C#脚本中的Grid.ColumnGrid.Row属性
我希望你能理解我在做什么,如果你能帮助我,我会非常感激,谢谢。

9rnv2umw

9rnv2umw1#

public MainWindow()
{
    InitializeComponent();
    // Add buttons to each row and column in the Grid
    for (int row = 1; row < grid.RowDefinitions.Count; row++)
    {
        for (int column = 0; column < grid.ColumnDefinitions.Count; column++)
        {
            var button = new Button
            {
                Content = $"Button {row}-{column}",
                Margin = new Thickness(6),
                HorizontalAlignment = HorizontalAlignment.Stretch,
                VerticalAlignment = VerticalAlignment.Stretch,
                // You can customize other button properties here
            };

            // Set the row and column positions for the button
            Grid.SetRow(button, row);
            Grid.SetColumn(button, column);

            // Add the button to the Grid
            grid.Children.Add(button);
        }
    }
}

字符串
使用此代码,将动态创建按钮,并将其添加到Grid中的每一行和每一列(第一行(TextBox所在的位置)除外)。按钮将在网格中正确设置其行和列位置。您可以自定义按钮属性以满足您的需要。


的数据

b5lpy0ml

b5lpy0ml2#

为代码中的访问网格添加x:Name=“grid”。然后你可以用你的按钮填充它。

for (int colIndex=0; colIndex<grid.Columns; colIndex++)
  for (int rowIndex=0; rowIndex<grid.Rows; rowIndex++)
{
  var btn = new Button();
  btn.Content = "Command";
  btn.MinWidth = 50;

  btn.SetValue(Grid.ColumnProperty, columnIndex);
  btn.SetValue(Grid.RowProperty, rowIndex);

  // add button to the grid
  grid.Childs.Add(btn);
}

字符串

jjhzyzn0

jjhzyzn03#

您无法访问Grid.RowGrid.Column,因为Grid类中不存在这些属性。您要查找的是ColumnDefinitionsRowDefinitions属性。
你首先要命名你的网格,这样你就可以在你的代码隐藏中访问它。
于是:

<Grid Name="MySickGrid" Margin="6"> <!-- notice MySickGrid as the name! -->
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="1*"/>
            <ColumnDefinition Width="1*"/>
            <ColumnDefinition Width="1*"/>
            <ColumnDefinition Width="1*"/>
        </Grid.ColumnDefinitions>

        <Grid.RowDefinitions>
            <RowDefinition Height="3*"/>
            <RowDefinition Height="1*"/>
            <RowDefinition Height="1*"/>
            <RowDefinition Height="1*"/>
            <RowDefinition Height="1*"/>
            <RowDefinition Height="1*"/>
            <RowDefinition Height="1*"/>
        </Grid.RowDefinitions>

        <TextBox x:Name="tB" IsReadOnly="True" TextWrapping="Wrap"
             BorderThickness="2" Margin="0, 0, 0, 16"
             Grid.Column="0" Grid.Row="0" Grid.ColumnSpan="4"
             Text="0" FontSize="36" TextAlignment="Right"
             />
    </Grid>

字符串
然后我们可以创建一个方法来实际填充网格,如下所示:

public void AddButtons()
{
    for (int i = 0; i < MySickGrid.RowDefinitions.Count; ++i)
    {
        for (int j = 0; j < MySickGrid.ColumnDefinitions.Count; ++j)
        {
            Button button = new Button();
            button.Click += Click_EventHandler;
            button.Content = $"[{i}][{j}]";
            MySickGrid.Children.Add(button);
            Grid.SetRow(button, i);
            Grid.SetColumn(button, j);
        }
    }
}


最后,不要忘记实际调用AddButtons()

public MainWindow()
{
    InitializeComponent();
    AddButtons();
}


您可能还注意到您的文本框不再显示。这是因为它被我们生成的按钮所覆盖。如果你想看到它,你需要修改你把TextBox放在哪一列和哪一行。

相关问题