首页 文章

WPF DataGrid列包装

提问于
浏览
0

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

Example

当程序调整到一定的宽度时,会发生上述情况(只有最后一列的文本被包装) . 这看起来并不那么糟糕,但是当你减少窗口宽度时(其中没有任何空间来渲染右列),带有'wwwwwwwwwwwwwww ...'的列仍然不会包装它文本和所有内容都变为白色,因为右列保持包装到无限(无空间) . 现在,我预计这个问题会通过向最右边的列引入最小宽度而消失,但是它会导致该列在可见区域之外(部分或完全)呈现 .

当我将第三列也作为 Width="*" 时,它会像预期的那样工作,但这会导致最后一列的宽度显着下降(我不想要) . 我试着用最小宽度将它设置为 Width="0.1*" (或沿着这些线的任何东西),但是我从数据网格中获得了一个无穷大的异常 .

这让我疯了,我没有看到一条出路来实现我的目标 . 简而言之,我想要的只是要包装到datagrid可用宽度的列的文本 . 最后一列应具有宽度首选项 .

XAML:

<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>

1 回答

  • 0

    如果你不't want a horizontal scrollbar, and it sounds like you want the third and fourth columns to autosize (and wrap if necessary), then don' t使用 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>
    

相关问题