WPF ScrollViewer вокруг DataGrid влияет на ширину столбца

У меня проблема с ScrollViewer, которую я использую для прокрутки пользовательского элемента управления, содержащего сетку данных. Без средства просмотра прокрутки столбцы заполняют сетку данных так, как я хочу, но при добавлении средства просмотра прокрутки столбцы сокращаются до ~ 15 пикселей. Я смог упростить свой макет и все еще способен воспроизвести это поведение.

При привязке ширины datagrid к другому элементу управления столбцы имеют свои нормальные значения, но это имеет неудивительно тот же эффект, что и фиксированная ширина в datagrid. Наверное, я не первый, у кого есть эта проблема. Как я могу обойти это поведение, чтобы моя сетка регулировала свой размер до доступного пространства и давала ему столбцы ширину propotional?

С scrollviewer: enter image description here и без: enter image description here

<Window x:Class="GridTest.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525">
<ScrollViewer HorizontalScrollBarVisibility="Auto">
<Grid MinWidth="200">
    <DataGrid Margin="0" AutoGenerateColumns="False">
        <DataGrid.Columns>
            <DataGridCheckBoxColumn Header="Column A" Width="*"/>
            <DataGridCheckBoxColumn Header="Column B" Width="*"/>
        </DataGrid.Columns>
    </DataGrid>
</Grid>
</ScrollViewer>

Ответ 1

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

<ScrollViewer HorizontalScrollBarVisibility="Auto">
    <Grid x:Name="grid" MinWidth="200">
        <DataGrid Width="{Binding ElementName=grid, Path=ActualWidth}">
            <DataGrid.Columns>
                <DataGridCheckBoxColumn Header="Column A" Width="1*"/>
                <DataGridCheckBoxColumn Header="Column B" Width="1*"/>
            </DataGrid.Columns>
        </DataGrid>
    </Grid>
</ScrollViewer>

Хитрость заключалась в том, чтобы дать ширину DataGrid a, в этом случае я привязался к содержащему элементу

Или, если вы не используете HorizontalScrollBar, вы можете отключить его, это позволит ScrollViewer рассчитать ширину, позволяющую DataGrid рассчитать ширину.

Ответ 2

Я испытал то же самое на прошлой неделе.

Как правило, эта проблема возникает, когда у вас есть следующие элементы:

  1. DataGrid с неопределенной шириной, помещенный в ScrollViewer со свойством HorizontalScrollBarVisibility установленным в Auto
  2. По крайней мере один DataGridColumn имеет неограниченную/неопределенную ширину (например: Width="*")


На самом деле, решение зависит от ваших потребностей:

  • Либо вы хотите, чтобы ваши DataGridColumns все доступное пространство вашей DataGrid при отображении окна (даже если нет отображаемых данных): в этом случае ответ sa_ddam213 может помочь вам справиться.
  • Или вы не против иметь пробелы между последним столбцом и правой границей DataGrid в Window.

Для последнего варианта вам просто нужно установить фиксированную ширину для ваших DataGridColumns (или просто не определять ее, если вы этого не хотите, это не очень важно, так как пользователь может легко изменить размеры столбцов с помощью двойного щелчка). В этом контексте ваша DataGrid может быть определена без ширины.


Вот пример:

<ScrollViewer HorizontalScrollBarVisibility="Auto">
    <Grid x:Name="grid" MinWidth="200">
        <DataGrid>
            <DataGrid.Columns>
                <DataGridCheckBoxColumn Header="Column A" Width="100"/>
                <DataGridCheckBoxColumn Header="Column B" />
            </DataGrid.Columns>
        </DataGrid>
    </Grid>
</ScrollViewer>


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