在Silverlight DataGrid中增加列宽以填满整个DG宽度

16

我有一个DataGrid控件,它与一个SQL表绑定。

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>

有没有可能增加单个列的大小,以填满数据网格的整个宽度?

谢谢,
Henrik

编辑: 使用 Silverlight SDK 4,可以在宽度上使用 "*" 来设置列宽。


我已经尝试在Silverlight 5中使用Width="*",但遇到了这个问题,有什么建议吗? - Shimmy Weitzhandler
6个回答

11

解决方案:

    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));
            }
        }
    }

请注意,图片链接已损坏。 - Shimmy Weitzhandler

8

仅在WPF中进行了测试,未在Silverlight中测试:

我已在WPF 3.5 SP1中设置并且它完美运行,但无法保证在Silverlight中的效果,如果可以运行,那确实很迷人。

<data:DataGridTextColumn Header="Time" Binding="{Binding}" Width="*" />

2
真棒!在WPF中可行,但不确定在Silverlight中是否可行。 - Sergey Aldoukhov
这里有一个很讨厌的 bug - 如果你有这样的一列,并且在 RowDetails 中还有右对齐的内容,当网格宽度减小时,它不会向左移动。 - Sergey Aldoukhov
是的,这很糟糕,我也经历过。 - Shimmy Weitzhandler

1

在 Henrik P 的答案基础上,这个解决方案简单地修复了 Width='*' 的 bug,因此您可以像在网格中一样设置任何列为比例:

    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的答案,但需要两列来填补额外的空间,就像一个网格一样。

1
在Silverlight 4中:只需在DataGrid上设置ColumnWidth="*"即可。
<data:DataGrid ColumnWidth="*" />

我尝试着使用一个简单的DataGrid(我想让最后一列占据可用空间),但我遇到了这个问题(https://dev59.com/zFbTa4cB1Zd3GeqP8S-P),有什么建议吗? - Shimmy Weitzhandler

1

我已经为DataGrid创建了一个附加属性,让您可以在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>

0

您可以通过编程进行设置:

var col = new DataGridTextColumn();
col.Width = new DataGridLength(100, DataGridLengthUnitType.Star);                        
Grid1.Columns.Add(col);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接