UWP Telerik RadDataGrid расширяется со страницей, но не уменьшается - PullRequest
0 голосов
/ 22 мая 2018

У меня есть RadDataGrid, который используется для отображения некоторых бизнес-данных.Все столбцы, кроме одного, имеют заданный размер, поэтому необходимо заполнить один столбец, чтобы заполнить этот пробел.Когда страница расширяется, сетка расширяется, и вместе с ней увеличивается один столбец.Когда я пытаюсь сжать страницу вниз, сетка остается того же размера, и вместо этого страница получает полосы прокрутки.Я могу заставить его сжиматься, если я очень медленно сжимаю страницу, но как только мышь набирает некоторую скорость, она теряет ее и перестает сжиматься.Я пытался обернуть его в сетку или RelativePanel, но ни одно из них не изменило.

Я посмотрел пример кода и демонстрацию Enterprise Contorso, которая использует сетку, и они, кажется, могут расширятьсяи уменьшите при необходимости.

Пример XAML:

<Page x:Class="RadDataGridTest.MainPage"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:local="using:RadDataGridTest"
  xmlns:Grid="using:Telerik.UI.Xaml.Controls.Grid"
  xmlns:telerikGridPrimitive="using:Telerik.UI.Xaml.Controls.Grid.Primitives"
  xmlns:Primitives="using:Telerik.UI.Xaml.Controls.Primitives"
  xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
  xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
  mc:Ignorable="d"
  Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">

<Grid>
    <Grid:RadDataGrid ItemsSource="{x:Bind DataItems, Mode=OneWay}"
                      UserGroupMode="Disabled"
                      UserFilterMode="Disabled"
                      UserColumnReorderMode="None"
                      UserSortMode="None"
                      AutoGenerateColumns="False"
                      GridLinesVisibility="Horizontal">
        <Grid:RadDataGrid.Columns>
            <Grid:DataGridNumericalColumn Header="1"
                                          PropertyName="Key"
                                          SizeMode="Auto" />
            <Grid:DataGridTextColumn Header="2"
                                     PropertyName="First"
                                     SizeMode="Auto" />
            <Grid:DataGridTextColumn Header="3"
                                     PropertyName="Second"
                                     SizeMode="Auto" />
            <Grid:DataGridTextColumn Header="Stretchy"
                                     PropertyName="Stretch" />
            <Grid:DataGridTextColumn Header="5"
                                     PropertyName="SecondLast"
                                     SizeMode="Auto" />
            <Grid:DataGridTextColumn Header="6"
                                     PropertyName="Last"
                                     SizeMode="Auto" />
            <Grid:DataGridNumericalColumn Header="7"
                                          PropertyName="Count"
                                          SizeMode="Auto" />
        </Grid:RadDataGrid.Columns>
    </Grid:RadDataGrid>
</Grid>

Любая помощь в том, что я могу делать неправильно?

Ответы [ 2 ]

0 голосов
/ 24 мая 2018

На всякий случай, если другие захотят увидеть, как я взял ответ Ланса и заставил его работать так, как мне нужно:

    private void OnLayoutUpdated(object sender, object e)
    {
        if (agendaDataGrid == null || agendaDataGrid.Columns.Count <= 0
            || ItemNameColumn == null)
        {
            return;
        }

        // iterate over all the other columns and add the total width
        double autoColumnsWidthTotal = agendaDataGrid.Columns.Sum(c => c.ActualWidth)
            - ItemNameColumn.ActualWidth;

        if (autoColumnsWidthTotal < 10)
            return;

        // Get the remaining with available for the "Stretchy" column
        double remainingSpace = agendaDataGrid.ActualWidth
            - agendaDataGrid.Margin.Left - agendaDataGrid.Margin.Right
            - agendaDataGrid.Padding.Left - agendaDataGrid.Padding.Right
            - autoColumnsWidthTotal - 5;

        if (remainingSpace < 100)
        {
            remainingSpace = 100;
        }

        // Set the Stretchy column's width using the remaining space
        // IMPORTANT: You need to set the column's SizeMode to Fixed
        // in order for it to respect the Width value.
        ItemNameColumn.Width = remainingSpace;
    }
0 голосов
/ 22 мая 2018

Мне удалось воспроизвести это.Вы не делаете ничего плохого, центральный столбец должен изменить размер при изменении размера окна.

Я добавил его в бэклог, за который вы можете проголосовать и проследить в этом пункте портала обратной связи:

https://feedback.telerik.com/Project/167/Feedback/Details/250207-datagrid-when-start-and-end-columns-are-auto-sized-the-middle-stretch-sized-col

Когда вы подписаны, вы будете уведомлены, когда есть изменения статуса элемента.

Обходной путь

Обходной путь, ты можешь попробовать.Если вы установите для столбца Stretchy SizeMode значение Fixed, вы можете вручную изменить его размер при изменении размера DataGrid.

Шаг 1 - Подписаться на DataGrid.SizedChanged и установить Stretchy от SizeMode до Fixed

<grid:RadDataGrid SizeChanged="DataGrid_OnSizeChanged" ...>
    <grid:RadDataGrid.Columns>
        ...
        <grid:DataGridTextColumn Header="Stretchy"
                                 PropertyName="Stretch"
                                 SizeMode="Fixed"
                                 Width="200"/>
        ...
    </grid:RadDataGrid.Columns>
</grid:RadDataGrid>

Шаг 2 - В OnSizeChanged обновите ширину столбца Stretchy, используя доступное пространство (см. мои комментарии к коду)

private void DataGrid_OnSizeChanged(object sender, SizeChangedEventArgs e)
{
    // for performance improvement only do this when the resize is larger than 1 px
    if (e.NewSize.Width - e.PreviousSize.Width > 1)
        return;

    if (sender is RadDataGrid dg && dg.Columns.Count > 0)
    {
        var middleColumn = dg.Columns[3];

        if (middleColumn == null)
            return;

        double autoColumnsWidthTotal = 0;

        // iterate over all the other columns and add the total width
        foreach (var column in dg.Columns)
        {
            if (column != middleColumn)
            {
                autoColumnsWidthTotal = autoColumnsWidthTotal + column.Width;
            }
        }

        // Get the remaining with available for the "Stretchy" column
        var remainingSpace = e.NewSize.Width - autoColumnsWidthTotal;

        // Set the Stretchy column's width using the remaingin space
        // IMPORTANT: You need to set the column's SizeMode to Fixed in order for it to respect the Width value.
        middleColumn.Width = remainingSpace;
    }
}
...