【问题标题】:Force TextBlock to wrap in WPF ListBox强制 TextBlock 在 WPF ListBox 中换行
【发布时间】:2010-09-28 16:13:39
【问题描述】:

我有一个显示消息的 WPF 列表框。它在左侧包含一个头像,用户名和消息垂直堆叠在头像的右侧。布局很好,直到消息文本应该自动换行,但是我在列表框上得到了一个水平滚动条。

我在谷歌上搜索并找到了类似问题的解决方案,但都没有奏效。

<ListBox HorizontalContentAlignment="Stretch"  ItemsSource="{Binding Path=FriendsTimeline}">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal">
                <Border BorderBrush="DarkBlue" BorderThickness="3" CornerRadius="2" Margin="3" >
                    <Image Height="32" Width="32"  Source="{Binding Path=User.ProfileImageUrl}"/>
                </Border>
                <StackPanel Orientation="Vertical">
                    <TextBlock Text="{Binding Path=User.UserName}"/>
                    <TextBlock Text="{Binding Path=Text}" TextWrapping="WrapWithOverflow"/> <!-- This is the textblock I'm having issues with. -->
                </StackPanel>
            </StackPanel>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

【问题讨论】:

    标签: wpf listbox word-wrap textblock


    【解决方案1】:

    如果您想阻止 TextBlock 增长,并且希望它刚好适合列表框的大小,您应该明确设置它的宽度。

    为了动态改变它,它意味着不是一个固定值,但你需要将它绑定到它在可视化树中的适当父元素。你可以有这样的东西:

    <ListBox ItemsSource="{Binding MyItems}" Name="MyListBox">
    
      <ListBox.Resources>
        <Style TargetType="ListBoxItem">
          <Setter Property="Width" 
                  Value="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ScrollContentPresenter}, Path=ActualWidth}" />
        </Style>
      </ListBox.Resources>
    
      <ListBox.ItemTemplate>
        <DataTemplate>
          <TextBlock Text="{Binding Title}" TextWrapping="Wrap" />
        </DataTemplate>
      </ListBox.ItemTemplate>
    
    </ListBox>
    

    如果它不起作用,请尝试使用 Visual Studio 中的 Live Visual Tree 找到合适的元素(必须绑定到什么)。

    【讨论】:

      【解决方案2】:

      TextBlock 的内容可以使用属性TextWrapping 进行包装。 代替StackPanel,使用DockPanel/Grid。 还有一件事 - 将 ScrollViewer.HorizontalScrollBarVisibility 属性设置为 Disabled 值,以获取 ListBox。

      根据 Matt 的评论将 Hidden 更新为 Disabled。谢谢马特。

      【讨论】:

      • 我认为您需要将 ScrollViewer.Horizo​​ntalScrollBarVisibility 设置为“已禁用”而不是“隐藏”-否则 ListBox 仍会尝试水平滚动,您只是看不到滚动条。
      【解决方案3】:

      问题可能不在 ListBox 中。如果其中一个父控件提供了足够的空间,则 TextBlock 不会换行,因此它不需要换行。这可能是由 ScrollViewer 控件引起的。

      【讨论】:

      • 谢谢!在我的情况下,禁用列表视图中的水平滚动修复了问题 ScrollViewer.Horizo​​ntalScrollBarVisibility="Disabled"
      猜你喜欢
      • 2013-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多