将ListView的宽度约束到父级以强制子文本换行

时间:2012-05-16 21:01:02

标签: wpf layout

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

到目前为止我所拥有的:

MessageItem - 边框中的用户控件,多行TextBlock

<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>

MessageBox - 具有ListView的用户控件,其中包含MessageItems

<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>

问题:

如果我使用注释掉的StackPanel来保存MessageItems,它将正确收缩MessageItem(并使文本换行)。如果我使用ListView,它不会缩小。

我或多或少地从研究中找出原因,但我还没弄清楚如何解决这个问题。据我所知,我需要覆盖MeasureOverride和/或ArrangeOverride,但我对WPF来说太新了,不知道WTF我在做什么。 (边敲击)

1 个答案:

答案 0 :(得分:3)

我不确定你为什么要将ListView放在ScrollViewer中,因为ListView内部有自己的ScrollView。

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

尝试

<ScrollViewer ... ScrollViewer.HorizontalScrollBarVisibility="Disabled"/>

<ListView ... ScrollViewer.HorizontalScrollBarVisibility="Disabled"/>

虽然我不确定你甚至需要ScrollViewer。

使用ListBox和ItemTemplate而不是ListView和用户控件可能会更好