Столбец WPF DataGrid занимает больше места, чем г-жа Pac-Man

Я пытаюсь получить DataGrid колонка, чтобы заполнить оставшееся место для DataGrid когда родительский элемент управления содержит ScrollViewer не имея колонки, взять гораздо больше Width чем окно верхнего уровня.

Как показано на двух изображениях ниже, сама сетка данных ведет себя как нужно, если DataGrid столбцы установлены с Width="Auto", DataGrid растягивается, чтобы заполнить ширину в родительском элементе управления, и позволяет ScrollViewer пнуть, как элемент управления уменьшен. Однако в DataGrid,

Нет прокрутки

Скроллинг

Однако, если я использую Width="*" для столбца описания ширина элемента управления становится значительно шире, чем окно верхнего уровня.

Здесь есть почти идентичный вопрос (без ответа).

Ниже приведен пример XAML для элементов в scrollviewer. Я пытался установить MaxWidth из DataGrid основанный на некоторой родительской ширине, которая будет царить в столбце с пустым пространством, но этот подход пока не работает. Я мог бы жестко кодировать MaxWidth но я хочу DataGrid растянуть как можно больше до видимой области.

<ScrollViewer VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto" Background="{StaticResource ControlBackgroundBrush}">
    <Grid MinWidth="600" MinHeight="400">
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"></RowDefinition>
            <RowDefinition Height="Auto"></RowDefinition>
            <RowDefinition Height="Auto"></RowDefinition>
            <RowDefinition Height="Auto"></RowDefinition>
            <RowDefinition Height="Auto"></RowDefinition>
            <RowDefinition Height="Auto"></RowDefinition>
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="10"></ColumnDefinition>
            <ColumnDefinition Width="Auto"></ColumnDefinition>
            <ColumnDefinition Width="*"></ColumnDefinition>
            <ColumnDefinition Width="10"></ColumnDefinition>
        </Grid.ColumnDefinitions>
        <Label Grid.Row="0" Grid.Column="1" Grid.ColumnSpan="2" Style="{DynamicResource LabelHeader}" Content="{Binding Title, Mode=OneWay}" />
        <Label Grid.Row="1" Grid.Column="1" Style="{DynamicResource EntityIndexNameInput}" Content="{Binding EntityIndexNameLabel, Mode=OneWay}" />
        <Label Grid.Row="3" Grid.Column="1" Style="{DynamicResource DescriptionInput}" Content="{Binding DescriptionLabel, Mode=OneWay}" />
        <TextBox Grid.Row="1" Grid.Column="2" ToolTip="{Binding EntityIndexNameValidationMessage, Mode=OneWay}" Text="{Binding EntityIndexName, Mode=TwoWay, ValidatesOnDataErrors=True, UpdateSourceTrigger=PropertyChanged}" MaxLength="255" Validation.ErrorTemplate="{x:Null}" Loaded="TextBox_Loaded" />
        <WrapPanel Grid.Row="2" Grid.Column="2">
            <CheckBox Style="{DynamicResource IsPrimaryKeyIndexInput}" ToolTip="{Binding IsPrimaryKeyIndexValidationMessage}" Content="{Binding IsPrimaryKeyIndexLabel, Mode=OneWay}" IsChecked="{Binding IsPrimaryKeyIndex}" />
            <CheckBox Style="{DynamicResource IsUniqueIndexInput}" ToolTip="{Binding IsUniqueIndexValidationMessage}" Content="{Binding IsUniqueIndexLabel, Mode=OneWay}" IsChecked="{Binding IsUniqueIndex}" />
        </WrapPanel>
        <TextBox Grid.Row="3" Grid.Column="2" ToolTip="{Binding DescriptionValidationMessage, Mode=OneWay}" Text="{Binding Description, Mode=TwoWay, ValidatesOnDataErrors=True, UpdateSourceTrigger=PropertyChanged}" AcceptsReturn="True" VerticalScrollBarVisibility="Auto" TextWrapping="Wrap" Height="120" MaxLength="2000" Validation.ErrorTemplate="{x:Null}" />
        <GroupBox Header="{Binding Source={StaticResource labels}, Path=PropertiesHeader}" Grid.Row="4" Grid.Column="2">
            <Grid Margin="2">
                <DataGrid AutoGenerateColumns="False" CanUserAddRows="False" CanUserDeleteRows="False" HeadersVisibility="Column" ItemsSource="{Binding Items}" MaxWidth="{Binding RelativeSource={RelativeSource AncestorType=Grid}, Path=ActualSize.Width}">
                    <DataGrid.Columns>
                        <lib:BindableDataGridComboBoxColumn Header="{Binding Source={StaticResource labels}, Path=EntityIndexPropertyNameHeader}" DisplayMemberPath="PropertyName" SelectedValuePath="PropertyID" SelectedValueBinding="{Binding PropertyID}" ItemsSource="{Binding EntityDataProperties}" />
                        <DataGridTextColumn Header="{Binding Source={StaticResource labels}, Path=OrderHeader}" Binding="{Binding PropertyOrder, Mode=TwoWay}" Width="Auto" />
                        <DataGridTextColumn Header="{Binding Source={StaticResource labels}, Path=DescriptionHeader}" Binding="{Binding Description, Mode=TwoWay}" Width="*" />
                    </DataGrid.Columns>
                </DataGrid>
            </Grid>
        </GroupBox>
        <StackPanel Orientation="Horizontal" Grid.Row="5" Grid.Column="2" Margin="5">
            <Button Command="{Binding UpdateCommand}" Content="{Binding UpdateButtonLabel}"></Button>
            <Button Command="{Binding ResetCommand}" Content="{Binding ResetButtonLabel}"></Button>
            <Button Command="{Binding DefaultsCommand}" Content="{Binding DefaultsButtonLabel}"></Button>
            <Button Command="{Binding CloseConfirmCommand}" Content="{Binding CloseButtonLabel}"></Button>
        </StackPanel>
    </Grid>
</ScrollViewer>

Есть ли другие подходы к этому вопросу?

1 ответ

Решение

Я бы постарался предотвратить слишком широкое содержимое ScrollViewer:

<ScrollViewer ...>
    <Grid MinWidth="600" MinHeight="400"
          MaxWidth="{Binding ActualWidth,
                     RelativeSource={RelativeSource FindAncestor,
                                                    AncestorType=ScrollViewer}}">
        ...
Другие вопросы по тегам