【问题标题】:Generate a complex grid in WPF programmatically以编程方式在 WPF 中生成复杂网格
【发布时间】:2015-07-16 22:51:51
【问题描述】:

我在 wpf 中使用 XAML 编写的复杂网格。

我的目的是将 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

谁能帮我解决这个问题。

【问题讨论】:

  • 这只是一个学习练习吗?为什么不直接使用带有标题模板的 DataGrid 并完成它?
  • 您能向我解释一下如何使用 DataGrid 来实现吗?
  • 啊,好吧,我想我乍一看还不够近。你只是想要合并的标题……好吧,除非你想使用像 Xceed 这样的第三方 DG,否则你展示的方式或多或少是我知道的,但我只做过这种事情xaml,不是 c#

标签: wpf xaml binding datagrid


【解决方案1】:

在我尝试解决此问题时,我有两个意见供您参考。
首先在您的代码示例中,您有这个:

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

【讨论】:

    猜你喜欢
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    • 2014-10-08
    • 2013-10-05
    • 2016-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多