Увеличьте ширину столбцов в Silverlight DataGrid, чтобы заполнить всю ширину DG

У меня есть элемент управления 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>

Можно ли увеличить размеры отдельных столбцов, чтобы заполнить всю ширину сетки данных?

Спасибо,
Хенрик

Изменить: столбцы со знаком «*» в качестве ширины входят в Silverlight SDK 4.


person Henrik P. Hessel    schedule 21.05.2009    source источник
comment
Я пробовал Width="*" в Silverligth 5 и обнаружил [это [(stackoverflow.com/q/5652195/75500 ) вопрос, есть предложения?   -  person Shimmy Weitzhandler    schedule 24.01.2012


Ответы (6)


Решение:

    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));
            }
        }
    }
person Henrik P. Hessel    schedule 22.05.2009
comment
К вашему сведению, ссылка на картинку не работает - person Shimmy Weitzhandler; 09.01.2010

Проверено только в WPF, но не в Silverlight:

Я установил WPF 3.5 SP1, и он работает отлично, никаких гарантий насчет Silverlight, но если он работает, это действительно очаровательно.

<data:DataGridTextColumn Header="Time" Binding="{Binding}" Width="*" />
person Shimmy Weitzhandler    schedule 15.11.2009
comment
Потрясающий! Работает в WPF, не уверен в Silverlight - person Sergey Aldoukhov; 16.12.2009
comment
Однако в этом есть неприятная ошибка - если у вас есть такой столбец, а также выровненный по правому краю контент в RowDetails, он не сдвинется влево при уменьшении ширины сетки. - person Sergey Aldoukhov; 06.01.2010
comment
Да, это sux, я тоже это испытал. - person Shimmy Weitzhandler; 06.01.2010

Я создал прикрепленное свойство для 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>
person Michael S. Scherotter    schedule 15.11.2009

Основываясь на ответе Хенрика П., это решение просто исправляет ошибку с 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);
        }
    }

Мне понравился ответ Хенрика, но мне потребовалось два столбца, чтобы заполнить дополнительное пространство, например, сетку.

person HiredMind    schedule 10.08.2011

В silverlight 4: просто установите ColumnWidth = "*" в DataGrid.

<data:DataGrid ColumnWidth="*" />
person felickz    schedule 17.08.2011
comment
Я пробовал это с помощью простого DataGrid (я пытаюсь сделать так, чтобы последний столбец занимал доступное пространство), но я столкнулся с этим вопрос, есть предложения? - person Shimmy Weitzhandler; 24.01.2012

Вы можете установить это программно:

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