我有一个带有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>
Run Code Online (Sandbox Code Playgroud)
alm*_*ulo 10
设置ScrollViewer.CanContentScroll="False"在你的ListView.
<ListView ItemsSource="{Binding Path=ReportEntries}"
VerticalContentAlignment="Top"
ScrollViewer.VerticalScrollBarVisibility="Visible"
ScrollViewer.CanContentScroll="False">
<!-- etc. -->
</ListView>
Run Code Online (Sandbox Code Playgroud)
ListView默认情况下,它正在尝试虚拟化.虚拟化意味着使用逻辑滚动等.逻辑滚动意味着ScrollViewer逐项滚动,从一个项目跳到另一个项目,而不是平滑地滚动每个项目的整个范围.
通过设置CanContentScroll为false,您告诉ScrollViewer停止使用逻辑滚动,这也会停用虚拟化.
如果你要展示大量的项目ListView,也许虚拟化是一个大问题,这将引入性能问题.
如果你要展示一些物品,那么这应该是完全没问题的.
编辑 -如果性能确实是一个问题,你需要保持虚拟化激活,考虑设置一个固定的高度,所有行和加入了自己ScrollViewer周围TextBlock的大文本.
小智 5
您只需要使用 MaxHeight 属性限制 ListView 的高度示例:
<ListView ItemsSource="{Binding Path=InkersList}"
MaxHeight="400">
<ListView.Resources>
<DataTemplate DataType="{x:Type VM:InkerVM}">
<Views:InkerView />
</DataTemplate>
</ListView.Resources>
</ListView>
Run Code Online (Sandbox Code Playgroud)