【发布时间】: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#