笔者刚刚接触WPF,菜鸟一枚,在做一个练手程序时遇到这样一个需求,创建一个新的Grid并将其添加至一个ListView中,要求Grid及其子元素应按一定顺序给Name属性赋值,直接使用XAML创建的话重复代码过多,且新建一个Grid时名称重复,C#代码创建虽然代码量较大,但是很好的解决了这一问题,可以广泛应用,下面就贴出代码与诸位分享一下,代码质量不高,需要改进的地方还请诸位大神多多指教。
在函数外定义了一个变量Entries用于计数。使用数据绑定使得该Grid前几列与之前XAML中定义的标题宽度一致。
public Grid newgrid()
{
Grid grid = new Grid();
grid.Name = "grid" + Entries.ToString(); RowDefinition row1 = new RowDefinition(); //实例化一个Grid行
ColumnDefinition co1 = new ColumnDefinition(); //实例化一个Grid列
ColumnDefinition co2 = new ColumnDefinition();
ColumnDefinition co3 = new ColumnDefinition();
ColumnDefinition co4 = new ColumnDefinition();
ColumnDefinition co5 = new ColumnDefinition();
ColumnDefinition co6 = new ColumnDefinition();
ColumnDefinition co7 = new ColumnDefinition();
ColumnDefinition co8 = new ColumnDefinition();
//将前三列的宽度与在XAML中定义的标题宽度绑定
Binding binding1 = new Binding();
//设置绑定数据源对象
binding1.ElementName = "titleco1";
//设置源属性
binding1.Path = new PropertyPath("Width");
//进行数据绑定
co1.SetBinding(ColumnDefinition.WidthProperty, binding1); Binding binding2 = new Binding();
binding2.ElementName = "titleco2";
binding2.Path = new PropertyPath("Width");
co2.SetBinding(ColumnDefinition.WidthProperty, binding2); Binding binding3 = new Binding();
binding3.ElementName = "titleco3";
//设置源属性
binding3.Path = new PropertyPath("Width");
//进行数据绑定
co3.SetBinding(ColumnDefinition.WidthProperty, binding3);
//将实例化的行和列添加到Grid中
grid.RowDefinitions.Add(row1);
grid.ColumnDefinitions.Add(co1);
grid.ColumnDefinitions.Add(co2);
grid.ColumnDefinitions.Add(co3);
grid.ColumnDefinitions.Add(co4);
grid.ColumnDefinitions.Add(co5);
grid.ColumnDefinitions.Add(co6);
grid.ColumnDefinitions.Add(co7);
grid.ColumnDefinitions.Add(co8); //实例化需要的控件
CheckBox ckbChose = new CheckBox();
ckbChose.Name = "Chose" + Entries.ToString();
TextBox txtNumber = new TextBox();
txtNumber.Name = "number" + Entries.ToString();
ComboBox cmbProcedure = new ComboBox();
cmbProcedure.Name = "cmbProcedure" + Entries.ToString();
TextBox txtCompletion = new TextBox();
txtCompletion.Name = "Completion" + Entries.ToString();
TextBox txtDuration = new TextBox();
txtDuration.Name = "Duration" + Entries.ToString();
TextBox txtStartTime = new TextBox();
txtStartTime.Name = "StartTime" + Entries.ToString();
TextBox txtPredecessor = new TextBox();
txtPredecessor.Name = "Predecessor" + Entries.ToString();
TextBox txtResource = new TextBox();
txtResource.Name = "Resource" + Entries.ToString();
//将前面实例化的元素添加至Grid
grid.Children.Add(ckbChose);
grid.Children.Add(txtNumber);
grid.Children.Add(cmbProcedure);
grid.Children.Add(txtCompletion);
grid.Children.Add(txtDuration);
grid.Children.Add(txtStartTime);
grid.Children.Add(txtPredecessor);
grid.Children.Add(txtResource);
//添加后全部是堆积在第一行第一列,下面是对其进行排序
Grid.SetColumn(ckbChose, );
Grid.SetColumn(txtNumber, );
Grid.SetColumn(cmbProcedure, );
Grid.SetColumn(txtCompletion, );
Grid.SetColumn(txtDuration, );
Grid.SetColumn(txtStartTime, );
Grid.SetColumn(txtPredecessor, );
Grid.SetColumn(txtResource, );
return grid;
}