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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了无法在WPF中动态创建列/行相关的知识,希望对你有一定的参考价值。

我希望能够在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;
答案

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

一些修改

  • 专用的Grid
  • 获取ActualHeightActualWidth使用
  • 设置qazxsw poi qazxsw poi,这样你就可以看到发生了什么
  • GridLines对齐设置为true
  • 不要改变窗户的大小

XAML

Grid

代码背后

Stretch

<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

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

MainGrid.ShowGridLines=true;

如果未设置Width / Height,则默认为MainGrid.Children.Add(myDockPanel); ,这意味着Grid将对它们进行相同的大小调整。

作为替代,可以使用r.Height = new GridLength(WindowHeight / RowCount, GridUnitType.Pixel); c.Width = new GridLength(WindowWidth / ColumnCount, GridUnitType.Pixel);

*

但在这种情况下,必须连续添加子元素

以上是关于无法在WPF中动态创建列/行的主要内容,如果未能解决你的问题,请参考以下文章

WPF DataGrid 动态样式

如何在 WPF DataGrid 中动态生成列?

React.js 创建具有动态行数和可编辑列的表

WPF 数据网格性能

WPF Datagrid 动态生成列 并绑定数据

WPF MvvM DataGrid 动态列