【问题标题】:WPF DataGrid column wrappingWPF DataGrid 列换行
【发布时间】:2015-08-03 12:43:35
【问题描述】:

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

当程序调整到一定宽度时,会出现上述情况(只有最后一列的文本被换行)。这看起来还没有那么糟糕, 但是,当您进一步减小窗口宽度时(其中没有任何空间来呈现右列),带有“wwwwwwwwwwwwwww ...”的列仍然不会换行它的文本,并且所有内容都变成白色的右列不断包装到无穷大(没有空间)。现在,我希望通过在最右边的列中引入最小宽度来解决这个问题,但它会导致该列(部分或全部)呈现在可见区域之外。

当我将第三列也作为Width="*" 执行时,它的工作方式与预期的一样,但这会导致最后一列的宽度显着削弱(这是我不想要的)。我尝试将其设置为具有最小宽度的Width="0.1*"(或任何类似的东西),但我从数据网格中得到了一个无穷大的异常。

这让我发疯了,我看不到摆脱这里的方法来实现我想要的。简而言之,我想要的只是将列的文本换行到数据网格的可用宽度。最后一列应该有宽度偏好。

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> 

【问题讨论】:

  • 你能提供你所有的网格吗
  • 忘记了@Cedric,再检查一次。

标签: c# wpf datagrid


【解决方案1】:

如果您不想要水平滚动条,并且听起来您希望第三列和第四列自动调整大小(必要时换行),那么不要使用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>

【讨论】:

  • 我已经使用了一个环绕文本列(它有效,我已经测试过了)。 Width=20 并不理想,因为有列标题(需要大约 100 像素,具体取决于语言) 两个宽度和 * 可以工作,但第三列并不那么重要,这意味着很多空间被浪费了。我非常希望最后一列具有最大的可用宽度,同时为所有列保留最小宽度。
  • @Areius, WIdth=20 只是一个例子,因为它们看起来就像是复选框。我想我无法理解您要完成的工作。如果第三列不是那么重要,那么您可以在第 3 列上设置 MaxWidth 以防止其扩展超过某个宽度,并在第 4 列上设置 MinWidth 以防止其变得太小...
  • 我目前通过在所有列上引入 50 的 MinWidth 并在第三列上结合 MaximumWidth 同时在 *.它并不完美(因为对于某些语言来说第三列的宽度可能太大或太小,但它比默认方式更好(即溢出窗口外)。不幸的是,无法设置 MaxWidth到 SizeByHeader 或 SizeByCells。
  • @Areius,也许不是,但我怀疑您可以自己计算列标题(或列字段)中文本的宽度并以这种方式设置。不过,您必须决定结果是否值得。
猜你喜欢
  • 1970-01-01
  • 2011-08-22
  • 1970-01-01
  • 2018-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-29
  • 1970-01-01
相关资源
最近更新 更多