以编程方式在 WPF 中生成复杂的网格

Generate a complex grid in WPF programmatically

我在用 XAML 编写的 wpf 中工作了复杂的网格。

我的目的是将 XAML 代码转换为 c#,因此我将能够以编程方式生成此网格。

这是有效的 XAML 代码

<Grid>
<!--<Grid.RowDefinitions>
    <RowDefinition Height="auto"/>
    <RowDefinition Height="2*"/>
</Grid.RowDefinitions>
<Grid Grid.Row="0">
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="{Binding ElementName=datagrid1, Path=RowHeaderWidth}" />
        <ColumnDefinition Width="{Binding ElementName=Column1, Path=ActualWidth}" />
        <ColumnDefinition Width="{Binding ElementName=Column2, Path=ActualWidth}" />
        <ColumnDefinition Width="{Binding ElementName=Column3, Path=ActualWidth}" />
        <ColumnDefinition Width="{Binding ElementName=Column4, Path=ActualWidth}" />
    </Grid.ColumnDefinitions>
    <Border Grid.Column="1" Grid.ColumnSpan="4"  HorizontalAlignment="Stretch" BorderThickness="2">
        <Label HorizontalAlignment="Center">Super Header!!</Label>
    </Border>
</Grid>
<DataGrid AutoGenerateColumns="False"
                        Name="datagrid1" Grid.Row="1"   Width="10">
    <DataGrid.Columns>
        <DataGridTextColumn Header="column 1" Width="100" x:Name="Column1" />
        <DataGridTextColumn Header="column 2" Width="80" x:Name="Column2"/>
        <DataGridTextColumn Header="column 3" Width="80" x:Name="Column3"/>
        <DataGridTextColumn Header="column 4" Width="*" x:Name="Column4"/>
    </DataGrid.Columns>
</DataGrid>-->

当我编译它时,它显示了看起来像的期望结果 这个:http://i.imgur.com/BK8GDtd.png?1

我试过的是这样的:

          Grid outernGrid = new Grid();
        outernGrid.ShowGridLines = true;
        RowDefinition row1 = new RowDefinition();
        row1.Height = GridLength.Auto;
        RowDefinition row2 = new RowDefinition();
        row2.Height = new GridLength(2, GridUnitType.Star);
        outernGrid.RowDefinitions.Add(row1);
        outernGrid.RowDefinitions.Add(row2);

        //Second grid
        Grid innerGrid = new Grid();
        ColumnDefinition col0 = new ColumnDefinition();
        ColumnDefinition col1 = new ColumnDefinition();
        ColumnDefinition col2 = new ColumnDefinition();
        ColumnDefinition col3 = new ColumnDefinition();
        ColumnDefinition col4 = new ColumnDefinition();

        //Binding Initialize
        Binding b0 = new Binding { ElementName = "dataGrid2", Path = new PropertyPath("RowHeaderWidth") };
        Binding b1 = new Binding { ElementName = "Column1", Path = new PropertyPath("ActualWidth") };
        Binding b2 = new Binding { ElementName = "Column2", Path = new PropertyPath("ActualWidth") };
        Binding b3 = new Binding { ElementName = "Column3", Path = new PropertyPath("ActualWidth") };
        Binding b4 = new Binding { ElementName = "Column4", Path = new PropertyPath("ActualWidth") };

        //Set binding
        BindingOperations.SetBinding(col1, DataGrid.ColumnWidthProperty, b1);
        BindingOperations.SetBinding(col2, DataGrid.ColumnWidthProperty, b2);
        BindingOperations.SetBinding(col3, DataGrid.ColumnWidthProperty, b3);
        BindingOperations.SetBinding(col4, DataGrid.ColumnWidthProperty, b4);
        BindingOperations.SetBinding(col0, DataGrid.ColumnWidthProperty, b0);

        //Adding columns
        innerGrid.ColumnDefinitions.Add(col0);
        innerGrid.ColumnDefinitions.Add(col1);
        innerGrid.ColumnDefinitions.Add(col2);
        innerGrid.ColumnDefinitions.Add(col3);
        innerGrid.ColumnDefinitions.Add(col4);


        Label header = new Label();
        header.Content = "This is the superheader";




        //Datagrid
        DataGrid dataGrid = new DataGrid { Name = "dataGrid2" };
        dataGrid.AutoGenerateColumns = false;
        dataGrid.RowHeaderWidth = 10;



        //datagrid columns
        DataGridTextColumn datacol1 = new DataGridTextColumn();
        DataGridTextColumn datacol2 = new DataGridTextColumn();
        DataGridTextColumn datacol3 = new DataGridTextColumn();
        DataGridTextColumn datacol4 = new DataGridTextColumn();

        datacol1.Header = "Column1";
        datacol2.Header = "Column2";
        datacol3.Header = "Column3";
        datacol4.Header = "Column4";


        datacol1.Width = 100;
        datacol1.Width = 80;
        datacol1.Width = 80;
        datacol1.Width = DataGridLength.Auto;

        Grid.SetColumn(header,1);
        header.SetValue(Grid.ColumnSpanProperty,4);
        Grid.SetRow(innerGrid, 0);
        Grid.SetColumn(dataGrid, 1);

        outernGrid.Children.Add(innerGrid);
        outernGrid.Children.Add(dataGrid);
        RootWindow.Content = outernGrid;

    }

输出为this

谁能帮我解决这个问题。

在尝试处理此问题时,我有两个观察结果要告诉您。
首先在你的代码示例中你有这个:

    datacol1.Width = 100;
    datacol1.Width = 80;
    datacol1.Width = 80;
    datacol1.Width = DataGridLength.Auto;

我想你想要这个:

    datacol1.Width = 100;
    datacol2.Width = 80;
    datacol3.Width = 80;
    datacol4.Width = DataGridLength.Auto;

其次,您没有以编程方式命名 Datagrid 中的列。

你必须为每一列做这样的事情:

    datacol1.ColumnName = "Column1";
    datacol2.ColumnName = "Column2";
    datacol3.ColumnName = "Column3";
    datacol4.ColumnName = "Column4";