我有一个带有gridview的listview控件,因为它是view属性。 其中一个专栏用于显示非常长的文本。该列单元格模板设置为TextBlock。每当listview项目源只包含一个项目时,无论提到哪个TextBlock内容开始超过listview高度,垂直滚动都不可用。
<ListView ItemsSource="{Binding Path=ReportEntries}" VerticalContentAlignment="Top" ScrollViewer.VerticalScrollBarVisibility="Visible">
<ListView.ItemContainerStyle>
<Style TargetType="ListViewItem">
<Setter Property="VerticalContentAlignment" Value="Top"/>
</Style>
</ListView.ItemContainerStyle>
<ListView.View>
<GridView>
<GridViewColumn Header="Name" Width="120" DisplayMemberBinding="{Binding Path}" />
<GridViewColumn Header="Message" Width="50" DisplayMemberBinding="{Binding Message}" />
<GridViewColumn Header="Details" DisplayMemberBinding="{Binding Details}" >
<GridViewColumn.CellTemplate>
<DataTemplate>
<TextBlock TextWrapping="Wrap" Text="{Binding}"/>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
</GridView>
</ListView.View>
答案 0 :(得分:6)
在ScrollViewer.CanContentScroll="False"
上设置ListView
。
<ListView ItemsSource="{Binding Path=ReportEntries}"
VerticalContentAlignment="Top"
ScrollViewer.VerticalScrollBarVisibility="Visible"
ScrollViewer.CanContentScroll="False">
<!-- etc. -->
</ListView>
默认情况下,ListView
正在尝试虚拟化。虚拟化意味着使用逻辑滚动等。逻辑滚动意味着ScrollViewer逐项滚动,从一个项目跳到另一个项目,而不是平滑地滚动每个项目的整个范围。
通过将CanContentScroll
设置为false
,您告诉ScrollViewer
停止使用逻辑滚动,这也会停用虚拟化。
如果您要在ListView
中展示很多项目,那么虚拟化可能是一个大问题,这会带来性能问题。
如果您要展示一些物品,那么这应该是完全没问题的。
编辑 - 如果性能确实存在问题并且您需要保持虚拟化激活,请考虑为所有行设置固定高度,并在ScrollViewer
周围添加自己的TextBlock
大文。
答案 1 :(得分:3)
尝试在DataTemplate中添加scrollViewer,如下所示
<DataTemplate>
<ScrollViewer>
<TextBlock TextWrapping="Wrap" Text="{Binding}"/>
</ScrollViewer>
</DataTemplate>
答案 2 :(得分:0)
您只需要使用MaxHeight属性限制ListView的高度 例子:
<ListView ItemsSource="{Binding Path=InkersList}"
MaxHeight="400">
<ListView.Resources>
<DataTemplate DataType="{x:Type VM:InkerVM}">
<Views:InkerView />
</DataTemplate>
</ListView.Resources>
</ListView>