【问题标题】:WPF XAML ListView - Make TextBlock Text wrapWPF XAML ListView - 使 TextBlock 文本换行
【发布时间】:2016-05-26 16:35:36
【问题描述】:

我有一个 ListView 和这样的 ListView.ItemTemplate

<ListView
    x:Name="myList" 
    BorderBrush="Transparent"
    ItemsSource="{Binding MyItems}" 
    SelectedIndex="0"
    ScrollViewer.CanContentScroll="True"
    ScrollViewer.VerticalScrollBarVisibility="Auto">

    <ListView.ItemContainerStyle>
        <Style TargetType="ListViewItem">
            <Setter Property="HorizontalContentAlignment" Value="Stretch"/>
            <Setter Property="Padding" Value="0" />
        </Style>
    </ListView.ItemContainerStyle>

    <ListView.ItemTemplate>
        <DataTemplate>
            <Grid Margin="5,5,5,5">
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="200"/> <--THIS WILL FORCE WRAPPING
                    <ColumnDefinition Width="50"/>
                </Grid.ColumnDefinitions>
                <Grid>
                    <Grid.RowDefinitions>
                        <RowDefinition Height="*"/>
                        <RowDefinition Height="*"/>
                    </Grid.RowDefinitions>

                    <TextBlock Text="{Binding FilePath}" 
                               Grid.Row="0" Margin="3,3,3,3" 
                               Style="{StaticResource MyFilePathTextLabel}" 
                               TextWrapping="WrapWithOverflow"/>   <-- THIS WILL NOT WRAP TEXT
                    <StackPanel Orientation="Horizontal" Grid.Row="1" Margin="3,3,3,3">
                        <TextBlock Text="Lab location: "/>
                        <TextBlock Text="{Binding LabLocation}" 
                                   Style="{StaticResource MyLabLocationTextLabel}"/>
                    </StackPanel>
                    ...
                    ...
        </DataTemplate>
    </ListView.ItemTemplate>
    ...
    ...
</ListView>

这将显示这样的 ListView 项目:

----------------------------------
C:/samples/folderA/myfile1.txt     <-- NO WRAP AS IT FITS
Lab location: Chemistry Lab 301
----------------------------------
C:/samples/folderA/folderB/fold
erC/folderD/folderE/folderF/myf
ile2.txt                           <-- WRAP SINCE NOT FITTING
Lab location: Chemistry Lab 301
----------------------------------
C:/samples/folderA/folderB/myfi
le3.txt                            <-- WRAP SINCE NOT FITTING
Lab location: Chemistry Lab 301
----------------------------------
C:/samples/folderA/folderB/fold
erC/folderD/folderE/folderF/fol
derG/folderH/folderI/folderJ/fo
lderK/myfile4.txt                  <-- WRAP SINCE NOT FITTING
Lab location: Chemistry Lab 301
----------------------------------
C:/samples/myfile5.txt             <-- NO WRAP AS IT FITS
Lab location: Chemistry Lab 301
----------------------------------

如上,如果文件位置不适合 ListView 的宽度,则每个项目都会显示文件位置。

更新: 更新 XAML

更新 2: 将网格容器的列宽度设置为硬编码值将强制换行(参见上面的注释行)。但是由于表单是可调整大小的,所以网格和 ListView 也是可调整大小的。因此,我不能硬编码宽度。 需要根据表单的当前大小进行换行。

【问题讨论】:

  • 我无法理解您的要求。 你想要文本换行吗?因为我测试了您的代码,并且文本按预期拆分为更多行。
  • @MK87 我已经更新了 XAML。在我的情况下它不起作用。非常感谢

标签: wpf xaml word-wrap


【解决方案1】:

在 ListView 对象本身上设置 HorizontalContentAlignement="Stretch" 以告诉它水平拉伸其内容以适应可用空间,并将 HorizontalScrollBarVisiblilty 设置为 Disabled 以确保禁用水平滚动。

<ListView x:Name="myList" ...
          HorizontalContentAlignment="Stretch"
          ScrollViewer.HorizontalScrollBarVisibility="Disabled">

【讨论】:

  • 你摇滚! ...就像我读过的你的文章一样。这解决了这个问题。如stackoverflow.com/questions/37465077/… 所述,我只剩下一个问题。你介意评论一下那个瑞秋吗?非常感谢。
【解决方案2】:

如果您使用Grid 并设置&lt;ColumnDefinition Width="*"&gt;,则GridColumn 会尽可能放大以填充所有可用空间。只有之后,才会发生其他操作,如包装。

在这种情况下,GridColumn 变得足够大,可以在一行中包含所有文本。这就是文本不换行的原因:它不需要换行!它具有保持在一行所需的所有空间!

解决方案:设置一个固定的列宽,如 200 或 100,或者尝试更小的宽度,然后查看结果。在某些时候,文本必须换行,GridColumn 足够细。

灵活宽度的解决方案:

您必须将内部GridWidth(带有RowDefinitions 的那个)绑定到外部GridActualWidth(带有ColumnDefinitions 的那个)。

像这样创建一个转换器:

public class OuterGridToInnerGridWidthConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return ((double)value) / 2;
    }
}

在这个例子中,我假设内部的Grid 是外部Width 的一半。相反,如果您有 Grid 的列和 Width="*" 以及具有固定宽度的第二列 - 例如 - 50,则转换器可以是:

public class OuterGridToInnerGridWidthConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return ((double)value) - 50;
    }
}

做了这个,把这个属性加到内部Grid

Width="{Binding ActualWidth,
  RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Grid}},
  Converter={StaticResource OuterGridToInnerGridWidthConverter}}"

最后,将HorizontalContentAlignment="Stretch" 设置为ListView

这在您使窗口变小或变大时都有效:TextBlock 调整大小并正确换行。

【讨论】:

  • 你说得对。我在上面更新了 XAML 并添加了评论。但是,我不能对宽度进行硬编码,因为表单可以调整大小并且会相应地进行调整。这就是相对定位应该如何工作的。所以,我不能使用硬编码的宽度。非常感谢
  • 如果您离开Width="*" 并调整窗口大小以使其更小会怎样?文本是否在某个点换行?或者内容保持固定(可能带有水平滚动条)?
  • 没有。如果我有 Width="*",则根本不会发生换行。水平滚动条显示。
  • 非常感谢。雷切尔回答解决了它,但非常感谢 MK87
  • 我见过,她的解决方案更简单更优雅:)
【解决方案3】:

您可以尝试将第一个 RowDefinition 设置为:

<RowDefinition Height="Auto"/>

而不是

<RowDefinition Height="*"/>

?

如果不成功,请尝试暂时删除

Style="{StaticResource MyFilePathTextLabel}" 

还有。你没有分享它的代码,所以我认为它可能会破坏包装。

【讨论】:

  • 抱歉,这行不通。尝试了这两个建议。非常感谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多