我正在尝试获得一个类似于聊天窗口的窗口,其中绘制了一个文本项列表。窗口应该可以调整大小,如果它不适合一行,每个文本项都应该换行。
到目前为止我所拥有的:
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我在做什么。 (边敲击)
答案 0 :(得分:3)
我不确定你为什么要将ListView放在ScrollViewer中,因为ListView内部有自己的ScrollView。
为了让你的MessageItems包装你需要关闭任何水平滚动条,否则容器(ListView或ScrollViewer)将为MessageItem提供所需的空间并显示滚动条。
尝试
<ScrollViewer ... ScrollViewer.HorizontalScrollBarVisibility="Disabled"/>
和
<ListView ... ScrollViewer.HorizontalScrollBarVisibility="Disabled"/>
虽然我不确定你甚至需要ScrollViewer。
使用ListBox和ItemTemplate而不是ListView和用户控件可能会更好