Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
强制TextBlock在WPF列表框中换行_Wpf_Listbox_Word Wrap_Textblock - Fatal编程技术网

强制TextBlock在WPF列表框中换行

强制TextBlock在WPF列表框中换行,wpf,listbox,word-wrap,textblock,Wpf,Listbox,Word Wrap,Textblock,我有一个显示消息的WPF列表框。它在左侧包含一个化身,用户名和消息垂直堆叠在化身的右侧。布局很好,直到消息文本应该换行,但是我在列表框上得到了一个水平滚动条 我在谷歌上搜索并找到了类似问题的解决方案,但没有一个有效 <ListBox HorizontalContentAlignment="Stretch" ItemsSource="{Binding Path=FriendsTimeline}"> <ListBox.ItemTemplate> &l

我有一个显示消息的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>


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

可以使用属性
TextWrapping
TextBlock
的内容进行包装。 使用
DockPanel
/
Grid
代替
StackPanel
。 还有一件事-将
ScrollViewer.HorizontalScrollBarVisibility
属性设置为
列表框的
禁用


根据马特的评论将
隐藏
更新为
禁用
。谢谢Matt。

如果您希望防止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树查找适当的元素(必须绑定到什么元素)。

我认为您需要将ScrollViewer.HorizontalScrollBarVisibility设置为“禁用”而不是“隐藏”-否则列表框仍将尝试水平滚动,您将看不到滚动条。谢谢!在我的例子中,在listview中禁用水平滚动修复了ScrollViewer的问题。HorizontalScrollBarVisibility=“Disabled”