Wpf 将ListView的宽度约束为父视图以强制子文本换行

Wpf 将ListView的宽度约束为父视图以强制子文本换行,wpf,layout,Wpf,Layout,我正在尝试获得一个类似于聊天窗口的窗口,其中绘制了一个文本项列表。窗口应可调整大小,如果不适合一行,则每个文本项应换行 到目前为止,我所拥有的: MessageItem-用户控件,边框中的多行文本块 <Grid VerticalAlignment="Stretch" HorizontalAlignment="Stretch"> <Border BorderBrush="Silver" BorderThickness="1" Height="Auto" Horizonta

我正在尝试获得一个类似于聊天窗口的窗口,其中绘制了一个文本项列表。窗口应可调整大小,如果不适合一行,则每个文本项应换行

到目前为止,我所拥有的:

MessageItem-用户控件,边框中的多行文本块

<Grid VerticalAlignment="Stretch" HorizontalAlignment="Stretch">
    <Border BorderBrush="Silver" BorderThickness="1" Height="Auto" HorizontalAlignment="Left" Margin="0,10,0,10" Name="messageContainer" VerticalAlignment="Top" Width="Auto">
        <TextBlock Height="Auto" HorizontalAlignment="Stretch" Margin="0" Name="messageContent" VerticalAlignment="Stretch" Width="Auto" Text="This is some longer text. Wow that wasn't as long as I thought." TextWrapping="Wrap" Padding="10" />
    </Border>
</Grid>
问题是:

如果我使用注释掉的StackPanel保存MessageItems,它将收缩MessageItem并使文本正确包装。如果我使用ListView,它不会收缩


我已经或多或少地从研究中弄明白了原因,但我还没有弄明白如何避开它。据我所知,我需要覆盖测量覆盖和/或安排覆盖,但我对WPF来说太陌生了,不知道我在做什么。rimshot

我不知道为什么要将ListView放在ScrollViewer中,因为ListView内部有自己的ScrollView

为了让MessageItems包装,您需要关闭任何水平滚动条,否则容器ListView或ScrollViewer将为MessageItem提供所需的空间并显示滚动条

试一试

虽然我不确定你是否需要ScrollViewer


您最好使用ListBox和ItemTemplate,而不是ListView和用户控件

我不知道为什么要将ListView放在ScrollViewer中,因为ListView内部有自己的ScrollView

为了让MessageItems包装,您需要关闭任何水平滚动条,否则容器ListView或ScrollViewer将为MessageItem提供所需的空间并显示滚动条

试一试

虽然我不确定你是否需要ScrollViewer


您最好使用ListBox和ItemTemplate,而不是ListView和用户控件,这比我想象的要简单得多。至于ScrollViewer:调整窗口大小,使ListView比窗口大->嘿,滚动条没有显示->工具箱->ScrolViewer->这正是我需要的就像我说的,我是WPF的新手,这比我想象的要容易得多。至于ScrollViewer:调整窗口大小,使ListView比窗口大->嘿,滚动条没有显示->工具箱->ScrolViewer->这正是我需要的就像我说的,我是WPF的新手
<Grid Name="messageGrid" VerticalAlignment="Stretch" HorizontalAlignment="Stretch">
    <ScrollViewer VerticalScrollBarVisibility="Auto">
        <!--<StackPanel Height="Auto" HorizontalAlignment="Stretch" Margin="0" Name="messagePanel" VerticalAlignment="Stretch" Width="Auto">

        </StackPanel> -->
        <ListView HorizontalContentAlignment="Stretch" VerticalContentAlignment="Stretch">
            <local:MessageItem></local:MessageItem>
        </ListView>
    </ScrollViewer>
</Grid>
<ScrollViewer ... ScrollViewer.HorizontalScrollBarVisibility="Disabled"/>
<ListView ... ScrollViewer.HorizontalScrollBarVisibility="Disabled"/>