无法在WPF中动态创建列/行

时间:2018-02-28 08:43:11

标签: c# wpf xaml grid

我希望能够在WPF中动态设置窗口大小,然后根据需要在网格中创建尽可能多的列和行。

我为它创建了一个方法,但它似乎不起作用。我还在XAML中添加了一个边框,看看是否有列和行,但我只看到一个正方形。 此外,它不会引发任何错误。

这是我的方法:

public void CreateField(Grid MainGrid, TextBox Columns, TextBox Rows, TextBox WHeight, TextBox WWidth, MainWindow MainWindow)
{
    int ColumnCount = Int32.Parse(Columns.Text);
    int RowCount = Int32.Parse(Rows.Text);
    int WindowHeight = Int32.Parse(WHeight.Text);
    int WindowWidth = Int32.Parse(WWidth.Text);

    MainWindow.MainWindow1.Height = WindowHeight;
    MainWindow.MainWindow1.Width = WindowWidth;

    for(int a = 0; a <= ColumnCount; a++){
        ColumnDefinition c = new ColumnDefinition();
        c.Width = new GridLength(WindowWidth / ColumnCount, GridUnitType.Pixel);                
        MainGrid.ColumnDefinitions.Add(c);          
    }
    for (int a = 0; a <= RowCount; a++)
    {
        RowDefinition r = new RowDefinition();
        r.Height = new GridLength(WindowHeight / RowCount, GridUnitType.Pixel);
        MainGrid.RowDefinitions.Add(r);
    }
}

在XAML中,我只有1列和1行以及文本框和按钮的dockpanel。

<Border BorderBrush="Black" BorderThickness="2">
    <Grid Name="MainWindowGrid">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Name="DockPanel"/>
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition/>
        </Grid.RowDefinitions>
        <DockPanel Background="LightSalmon" Grid.Row="0" Grid.Column="0" Grid.RowSpan="8">
            <StackPanel>
                <TextBox Name="txtColums" Text="16"/>
                <TextBox Name="txtRows" Text="8"/>
                <TextBox Name="txtWindowHeight" Text="800"/>
                <TextBox Name="txtWindowWidth" Text="1600"/>
                <Button x:Name="ButtonCreate" Content="Create" Click="ButtonCreate_Click"/>
            </StackPanel>
        </DockPanel>
        <ContentControl Content="{Binding}"/>
    </Grid>
</Border>

enter image description here

根据这里写的参数,该方法应该在按钮点击时执行。但是,我只有1列1行,而不是16列和8行的网格。 (你可以在边缘看到边框)

那我在这里做错了什么?我对网格没有任何实际经验,而且我很无能为力。希望有人可以帮助我。

enter image description here

编辑:

如ASh所说,激活MainGrid.ShowGridLines的建议有效。不知道这个功能。事实证明,我确实已经成功创建了列和行。我认为它不起作用,因为我试图用一种不起作用的颜色在网格中绘制一个字段。现在我想知道,为什么这不起作用,因为我认为这是正确的代码。

var converter = new System.Windows.Media.BrushConverter();
var brush1 = (Brush)converter.ConvertFromString("#FFFFFFF0");
DockPanel myDockPanel = new DockPanel();
Grid.SetColumn(myDockPanel, 3);
Grid.SetRow(myDockPanel, 3);
myDockPanel.Background = brush1;

2 个答案:

答案 0 :(得分:2)

这里出现了很多问题,这是一个神奇的怀疑,为什么你要这样做,但这应该指向你更好的方向

一些修改

  • 专注Grid
  • 获取ActualHeightActualWidth以使用
  • 设置GridLines true,以便了解最新情况
  • Grid路线设置为Stretch
  • 不要改变窗户的大小

<强>的Xaml

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto" />
        <RowDefinition Height="*" />
    </Grid.RowDefinitions>
    <Border Grid.Row="0"
            Grid.Column="0"
            BorderBrush="Black"
            BorderThickness="2">
        <DockPanel Grid.RowSpan="8" Background="LightSalmon">
            <StackPanel>
                <TextBox Name="txtColums" Text="16" />
                <TextBox Name="txtRows" Text="8" />
                <TextBox Name="txtWindowHeight" Text="800" />
                <TextBox Name="txtWindowWidth" Text="1600" />
                <Button x:Name="ButtonCreate"
                        Click="ButtonCreate_OnClick"
                        Content="Create" />
            </StackPanel>
        </DockPanel>
    </Border>
    <Grid Name="MainWindowGrid"
          Grid.Row="1"
          HorizontalAlignment="Stretch"
          VerticalAlignment="Stretch"
          ShowGridLines="True" />

</Grid>

代码

public void CreateField(Grid MainGrid, TextBox Columns, TextBox Rows) // TextBox WHeight, TextBox WWidth, MainWindow MainWindow)
{
   var ColumnCount = int.Parse(Columns.Text);
   var RowCount = int.Parse(Rows.Text);
   var width = MainGrid.ActualWidth;
   var height = MainGrid.ActualHeight;

   for (var a = 0; a <= ColumnCount; a++)
   {
      var c = new ColumnDefinition();
      c.Width = new GridLength(width / ColumnCount, GridUnitType.Pixel);
      MainGrid.ColumnDefinitions.Add(c);
   }
   for (var a = 0; a <= RowCount; a++)
   {
      var r = new RowDefinition();
      r.Height = new GridLength(height / RowCount, GridUnitType.Pixel);
      MainGrid.RowDefinitions.Add(r);
   }
}

private void ButtonCreate_OnClick(object sender, RoutedEventArgs e)
{
   CreateField(MainWindowGrid, txtColums, txtRows);
}

enter image description here

答案 1 :(得分:1)

网格布局正确。设置MainGrid.ShowGridLines=true;以查看

要查看动态创建的控件,您应该将其添加到网格中:

MainGrid.Children.Add(myDockPanel);

由于网格行的高度相等且列宽度相等,因此可以安全地删除以下行:

r.Height = new GridLength(WindowHeight / RowCount, GridUnitType.Pixel);
c.Width = new GridLength(WindowWidth / ColumnCount, GridUnitType.Pixel);

如果未设置宽度/高度,则默认为*,这意味着网格将平均大小。

可以使用替代UniformGrid

AnotherMainGrid = new UnifromGrid {Rows = RowCount, Columns = ColumnCount };

但在这种情况下,必须相继添加子元素