增加 Silverlight DataGrid 中的列宽以填充整个 DG 宽度
Posted
技术标签:
【中文标题】增加 Silverlight DataGrid 中的列宽以填充整个 DG 宽度【英文标题】:Increase columns width in Silverlight DataGrid to fill whole DG width 【发布时间】:2010-10-28 01:21:02 【问题描述】:我有一个绑定到 SQL 表的 DataGrid 控件。
XAML 代码是:
<data:DataGrid x:Name="dg_sql_data"
Grid.Row="1"
Visibility="Collapsed"
Height="auto"
Margin="0,5,5,5"
AutoGenerateColumns="false"
AlternatingRowBackground="Aqua"
Opacity="80"
>
<data:DataGrid.Columns>
<data:DataGridTextColumn Header="Latitude" Binding="Binding lat" />
<data:DataGridTextColumn Header="Longitude" Binding="Binding long" />
<data:DataGridTextColumn Header="Time" Binding="Binding time" />
</data:DataGrid.Columns>
</data:DataGrid>
是否可以增加单个列的大小来填充数据网格的完整宽度?
谢谢, 亨里克
编辑: Silverlight SDK 4 提供了以“*”为宽度的列。
【问题讨论】:
我在 Silverligth 5 中尝试过Width="*"
,我遇到了 [this[(***.com/q/5652195/75500) 问题,有什么建议吗?
【参考方案1】:
解决方案:
void dg_sql_data_SizeChanged(object sender, SizeChangedEventArgs e)
DataGrid myDataGrid = (DataGrid)sender;
// Do not change column size if Visibility State Changed
if (myDataGrid.RenderSize.Width != 0)
double all_columns_sizes = 0.0;
foreach (DataGridColumn dg_c in myDataGrid.Columns)
all_columns_sizes += dg_c.ActualWidth;
// Space available to fill ( -18 Standard vScrollbar)
double space_available = (myDataGrid.RenderSize.Width - 18) - all_columns_sizes;
foreach (DataGridColumn dg_c in myDataGrid.Columns)
dg_c.Width = new DataGridLength(dg_c.ActualWidth + (space_available / myDataGrid.Columns.Count));
【讨论】:
仅供参考,图片链接已损坏【参考方案2】:仅在 WPF 中测试,未在 Silverlight 中测试:
我在 WPF 3.5 SP1 中进行了设置,它运行良好,对 Silverlight 没有任何保证,但如果它运行起来确实很迷人。
<data:DataGridTextColumn Header="Time" Binding="Binding" Width="*" />
【讨论】:
太棒了!在 WPF 中工作,不确定 Silverlight 不过,这有一个讨厌的错误 - 如果您有这样的列并且在 RowDetails 中有右对齐的内容,则当网格宽度减小时它不会向左移动。 对,这个sux,我也经历过。【参考方案3】:我为 DataGrid 创建了一个 attached property,让您可以在 XAML 中执行此操作:
<UserControl
xmlns:data="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data"
x:Class="GridProperties.Page"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:gp="clr-namespace:GridProperties">
<Grid x:Name="LayoutRoot" Background="White">
<data:DataGrid gp:GridEx.StarColumn="2">
<data:DataGrid.Columns>
<data:DataGridTextColumn Header="Column 1"/>
<data:DataGridTextColumn Header="Column 2"/>
<data:DataGridTextColumn Header="Column 3"/>
</data:DataGrid.Columns>
</data:DataGrid>
</Grid>
</UserControl>
【讨论】:
【参考方案4】:以 Henrik P 的回答为基础,此解决方案使用 Width='*'
简单地纠正了错误,以便您可以像在网格上一样将任何列设置为成比例:
private void DgSQLDataSizeChanged(object sender, SizeChangedEventArgs e)
var myDataGrid = (DataGrid)sender;
// Do not change column size if Visibility State Changed
if (myDataGrid.RenderSize.Width == 0) return;
double totalActualWidthOfNonStarColumns = myDataGrid.Columns.Sum(
c => c.Width.IsStar ? 0 : c.ActualWidth);
double totalDesiredWidthOfStarColumns =
myDataGrid.Columns.Sum(c => c.Width.IsStar ? c.Width.Value : 0);
if ( totalDesiredWidthOfStarColumns == 0 )
return; // No star columns
// Space available to fill ( -18 Standard vScrollbar)
double spaceAvailable = (myDataGrid.RenderSize.Width - 18) - totalActualWidthOfNonStarColumns;
double inIncrementsOf = spaceAvailable/totalDesiredWidthOfStarColumns;
foreach (var column in myDataGrid.Columns)
if ( !column.Width.IsStar ) continue;
var width = inIncrementsOf * column.Width.Value;
column.Width = new DataGridLength(width, DataGridLengthUnitType.Star);
我喜欢 Henrik 的回答,但需要两列来填充额外的空间,比如网格。
【讨论】:
【参考方案5】:在 silverlight 4 中:只需在 DataGrid 上设置 ColumnWidth="*"
<data:DataGrid ColumnWidth="*" />
【讨论】:
我用一个简单的 DataGrid 尝试过(我试图让最后一列占据可用空间),但我遇到了this 问题,有什么建议吗?【参考方案6】:您可以通过编程方式设置它:
var col = new DataGridTextColumn();
col.Width = new DataGridLength(100, DataGridLengthUnitType.Star);
Grid1.Columns.Add(col);
【讨论】:
以上是关于增加 Silverlight DataGrid 中的列宽以填充整个 DG 宽度的主要内容,如果未能解决你的问题,请参考以下文章
在 Silverlight 中更改 Datagrid Header 的背景颜色
Silverlight 更改 Datagrid 上 selectedItem 的前景