如何实现Silverlight DataGrid控件的列宽自动填充
1个回答
展开全部
但是在Silverlight中,DataGrid控件的列宽只有四种模式:Auto、Pixel、SizeToCells、SizeToHeader,没有Fill模式,无法实现自动填充列宽。
那怎么实现此功能呢?用自定义模板?似乎比较麻烦,并且很难实现重用。看来只有用自定义控件了,先初步分析,首先,我们要控制列宽,肯定得处理DataGrid的SizeChanged事件;其次,我们必须定义DataGrid中每列宽度的填充模式;最后,还得定义每列宽度所占的权重。后两个步骤如何实现呢?Silverlight DataGrid控件中的列有三种类型DataGridTextColumn、DataGridCheckBoxColumn以及DataGridTemplateColumn,如果我们再分别为这三种类型创建子类来添加自定义属性显然太麻烦。
DataGrid需要知道每个DataGridColumn中的宽度模式及填充比例,以便在DataGrid SizeChanged事件中设置每列的宽度,但是我们又要避免重新去定义每个DataGridColumn类型。Silverlight已经为此中问题提供了一种设计模式:即附加属性。我们常用的Grid布局控件,其中Grid.Row及Grid.Column属性即为附加属性,添加到Grid中的控件并没有Row和Column属性,但是通过Grid的Row和Column附加属性即可通知Grid控件应该被放到哪行哪列。同理,我们为DataGrid添加一个附加属性,即可让DataGrid中的每一列向DataGrid说明该列的填充模式和宽度所占的权重。为了简便,我们添加一个附加属性:WidthWeight,int类型,如果为0表示该列为固定宽度,否则表示该列所占权重。
那怎么实现此功能呢?用自定义模板?似乎比较麻烦,并且很难实现重用。看来只有用自定义控件了,先初步分析,首先,我们要控制列宽,肯定得处理DataGrid的SizeChanged事件;其次,我们必须定义DataGrid中每列宽度的填充模式;最后,还得定义每列宽度所占的权重。后两个步骤如何实现呢?Silverlight DataGrid控件中的列有三种类型DataGridTextColumn、DataGridCheckBoxColumn以及DataGridTemplateColumn,如果我们再分别为这三种类型创建子类来添加自定义属性显然太麻烦。
DataGrid需要知道每个DataGridColumn中的宽度模式及填充比例,以便在DataGrid SizeChanged事件中设置每列的宽度,但是我们又要避免重新去定义每个DataGridColumn类型。Silverlight已经为此中问题提供了一种设计模式:即附加属性。我们常用的Grid布局控件,其中Grid.Row及Grid.Column属性即为附加属性,添加到Grid中的控件并没有Row和Column属性,但是通过Grid的Row和Column附加属性即可通知Grid控件应该被放到哪行哪列。同理,我们为DataGrid添加一个附加属性,即可让DataGrid中的每一列向DataGrid说明该列的填充模式和宽度所占的权重。为了简便,我们添加一个附加属性:WidthWeight,int类型,如果为0表示该列为固定宽度,否则表示该列所占权重。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询