WPF DataGrid列包装

时间:2015-05-21 17:34:42

标签: c# wpf datagrid

我有一个包含4列的数据网格。前三个有Width="*",而最后一个有Width="*"来填充剩余的空间。我不想要水平滚动条,所以我禁用了。

Example

当程序调整到一定宽度时,会出现上述情况(只有最后一列的文本被包装)。这看起来还不错, 但是当你进一步减小窗口宽度时(其中没有任何空间来渲染右列),带有&www; wwwwwwwwwwwwwww的列...'仍然没有包装它的文本,一切都变成白色,因为右栏保持包裹到无限(无空间)。现在,我预计这个问题会通过向最右边的列引入最小宽度而消失,但是它会导致该列被渲染(部分或完全)在可见区域之外。

当我将第三列也作为Width="0.1*"时,它的工作方式与预期有些不同,但这会导致最后一列的宽度显着下降(我不想要)。我试着用最小宽度将它设置为<DataGrid Grid.Row="0" Grid.Column="1" IsEnabled="{Binding HasValidSelectedItem}" ItemsSource="{Binding Items, IsAsync=True}" AutoGenerateColumns="False" SnapsToDevicePixels="True" EnableColumnVirtualization="False" HorizontalAlignment="Stretch" CanUserAddRows="False" CanUserDeleteRows="False" CanUserResizeRows="False" HorizontalScrollBarVisibility="Disabled" > <DataGrid.Resources> <Style TargetType="CheckBox" BasedOn="{StaticResource CenteredCheckBoxStyle}" x:Key="CenteredReadOnlyCheckBoxStyle"> <Setter Property="IsHitTestVisible" Value="False"/> <Setter Property="Focusable" Value="False"/> </Style> </DataGrid.Resources> <DataGrid.Columns> <DataGridCheckBoxColumn Header="Test First" Binding="{Binding First, UpdateSourceTrigger=PropertyChanged}" IsReadOnly="True" ElementStyle="{StaticResource CenteredReadOnlyCheckBoxStyle}" EditingElementStyle="{StaticResource CenteredReadOnlyCheckBoxStyle}" > </DataGridCheckBoxColumn> <DataGridCheckBoxColumn Header="Test Second" Binding="{Binding Second, UpdateSourceTrigger=PropertyChanged}" IsReadOnly="True" ElementStyle="{StaticResource CenteredReadOnlyCheckBoxStyle}" EditingElementStyle="{StaticResource CenteredReadOnlyCheckBoxStyle}" /> <DataGridTextColumn Header="Test Third" Binding="{Binding Third}" EditingElementStyle="{StaticResource DataGridEditingTextBoxStyle}" CellStyle="{StaticResource DataGridToolTipDataGridCellStyle}"> <DataGridTextColumn.ElementStyle> <Style BasedOn="{StaticResource DataGridTextBlockStyle}" TargetType="{x:Type TextBlock}"> <Setter Property="TextWrapping" Value="Wrap"/> <Setter Property="Padding" Value="0,6"/> </Style> </DataGridTextColumn.ElementStyle> </DataGridTextColumn> <DataGridTextColumn Header="Test Fourth" Width="*" IsReadOnly="True" Binding="{Binding Path=Fourth}" EditingElementStyle="{StaticResource DataGridEditingTextBoxStyle}" CellStyle="{StaticResource DataGridToolTipDataGridCellStyle}"> <DataGridTextColumn.ElementStyle> <Style BasedOn="{StaticResource DataGridTextBlockStyle}" TargetType="{x:Type TextBlock}"> <Setter Property="TextWrapping" Value="Wrap"/> <Setter Property="Padding" Value="0,6"/> </Style> </DataGridTextColumn.ElementStyle> </DataGridTextColumn> </DataGrid.Columns> </DataGrid> (或沿着这些线的任何东西),但我从数据网格中得到一个无穷大的异常。

这让我疯了,我没有找到出路来实现我的目标。简而言之,我想要的只是要包装到datagrid的可用宽度的列的文本。最后一列应该具有宽度偏好。

XAML:

{{1}}

1 个答案:

答案 0 :(得分:0)

如果您不想要水平滚动条,并且听起来您希望第三列和第四列自动调整(并在必要时进行换行),则不要使用Width="Auto"。在我看来,你需要一个固定的列宽,前两个(类似Width="100",然后第三和第四列分别使用Width="40*"Width="60*"。(或将它们设置为您想要的任何比例。此外,您可以设置MinWidth和/或MaxWidth来控制列的扩展。

要启用换行,您只需向ElementStyle添加DataGridTextColumn

<DataGrid>
    <DataGrid.Columns>
        <DataGridCheckBoxColumn Header="Check1" Binding="{Binding Check1}" Width="100" />
        <DataGridCheckBoxColumn Header="Check2" Binding="{Binding Check2}" Width="100" />
        <DataGridTextColumn Header="Name" Binding="{Binding Name}" Width="40*" MaxWidth="200">
            <DataGridTextColumn.ElementStyle>
                <Style>
                    <Setter Property="TextBlock.TextWrapping" Value="Wrap"></Setter>
                </Style>
            </DataGridTextColumn.ElementStyle>
        </DataGridTextColumn>
        <DataGridTextColumn Header="Name" Binding="{Binding Name}" Width="60*" MinWidth="200">
            <DataGridTextColumn.ElementStyle>
                <Style>
                    <Setter Property="TextBlock.TextWrapping" Value="Wrap"></Setter>                     
                </Style>
            </DataGridTextColumn.ElementStyle>
        </DataGridTextColumn>
    </DataGrid.Columns>
</DataGrid>