WPF listview垂直滚动条

时间:2015-07-27 16:39:12

标签: wpf

我有一个带有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>

enter image description here 谢谢你的帮助

3 个答案:

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