【问题标题】:WPF DataGrid column gobbles up space faster than Ms Pac-ManWPF DataGrid 列比吃豆人女士更快地吞噬空间
【发布时间】:2011-10-05 16:51:35
【问题描述】:

当父控件包含ScrollViewer 而该列占用的Width 比顶层窗口多得多时,我正在尝试获取一个DataGrid 列来填充DataGrid 的剩余空间.

如下面的两张图片所示,如果DataGrid 列设置为Width="Auto",则数据网格本身的行为符合预期。 DataGrid 拉伸以填充父控件中的宽度,并允许ScrollViewer 在控件缩小时启动。但是DataGrid 有很多空间浪费。

但是,如果我将Width="*" 用于描述列,则控件的宽度会明显比顶层窗口宽。

有一个几乎相同的问题(未回答)here

下面是滚动查看器中元素的一些示例 XAML。我尝试根据一些父宽度设置DataGridMaxWidth,这将在空间吞噬列中占主导地位,但这种方法到目前为止还没有奏效。我可以硬编码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>

还有其他解决这个问题的方法吗?

【问题讨论】:

    标签: wpf datagrid scrollviewer column-width


    【解决方案1】:

    我会尽量防止 ScrollViewer 的内容太宽:

    <ScrollViewer ...>
        <Grid MinWidth="600" MinHeight="400"
              MaxWidth="{Binding ActualWidth,
                         RelativeSource={RelativeSource FindAncestor,
                                                        AncestorType=ScrollViewer}}">
            ...
    

    【讨论】:

    • +1 完美,谢谢弗拉德!我几乎用 MaxWidth 绑定。
    猜你喜欢
    • 2021-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-15
    • 2013-01-03
    相关资源
    最近更新 更多