1

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

到目前为止我所拥有的:

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>

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

<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 来保存 MessageItem,它将正确缩小 MessageItem(并导致文本换行)。如果我使用 ListView,它不会缩小。

我或多或少地从研究中弄清楚了原因,但我无法弄清楚如何解决它。据我所知,我需要覆盖 MeasureOverride 和/或 ArrangeOverride,但我对 WPF 太陌生了,不知道我在做什么。(边缘)

4

1 回答 1

4

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

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

尝试

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

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

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

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

于 2012-05-16T21:33:15.960 回答