WPF列表视图垂直滚动条

15
我有一个列表视图控件,其中网格视图是它的视图属性之一。其中一个列专门用于显示非常长的文本。该列单元格模板设置为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>

输入图像描述 感谢帮助


ListView周围包装了什么类型的容器? - Breeze
4个回答

31

在您的ListView上设置ScrollViewer.CanContentScroll="False"

<ListView ItemsSource="{Binding Path=ReportEntries}"  
          VerticalContentAlignment="Top"  
          ScrollViewer.VerticalScrollBarVisibility="Visible"
          ScrollViewer.CanContentScroll="False">
    <!-- etc. -->
</ListView>

ListView默认启用虚拟化。虚拟化意味着使用逻辑滚动,即ScrollViewer每次跳过一个项而不是平稳地滚动整个项的范围。

CanContentScroll设置为false,即可停止使用逻辑滚动,也会禁用虚拟化。

如果您在ListView中要展示很多项,则虚拟化可能会导致性能问题。

如果只需要展示一小部分项,则完全没有问题。

- 如果确实存在性能问题并且需要保持虚拟化激活,请考虑为所有行设置固定高度,并在包含大文本的TextBlock周围添加自己的ScrollViewer


5

你只需要使用 MaxHeight 属性限制 ListView 的高度。

例如:

<ListView  ItemsSource="{Binding Path=InkersList}"
           MaxHeight="400">
   <ListView.Resources>
       <DataTemplate DataType="{x:Type VM:InkerVM}">
               <Views:InkerView />
       </DataTemplate>
   </ListView.Resources>
</ListView>  

                            

4
尝试像下面这样在DataTemplate中添加一个scrollViewer,
<DataTemplate>
 <ScrollViewer>
   <TextBlock TextWrapping="Wrap" Text="{Binding}"/>
 </ScrollViewer>
</DataTemplate>

1
对我不起作用。此外,如果有多个项目,每个项目都将被包裹在一个ScrollViewer中,那么它将变得混乱和丑陋,你不这么认为吗? - user3101007
1
这不是模板的问题。问题在于,该模板将用于列表视图中的所有项目 - 因此有50个项目 - 每个项目都有50个滚动视图,这不是任何人想看到的东西。 - user3101007

-1
将ListView包装在DockPanel中。

我没有对这个答案做出负面评价。但是,为了解释为什么其他人会这样做,DockPanel 对许多使用情况可能不可用,也可能对 OP 不适用。解决问题肯定有更好的方法。 - Joseph Van Riper
没关系,我不在乎数量。我的建议是基于实际运行的代码,所以无论数量如何,通过谷歌找到这里的人可能会发现这很有用。 - Bent Tranberg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接