WPF ListView始终显示完整的项目

时间:2010-11-15 15:40:56

标签: wpf listview scrollviewer

我有一个带有多个ListView控件的应用程序,其中要求ListView中的项目必须完全可见。应该永远不会在列表中显示部分ListViewItem。如果用户在最终显示部分项目的位置释放ScrollViewer,则列表应“快照”并自行更正,以便仅显示完整项目。

以前有人这样做过吗?我想我需要重载ListView和/或ScrollViewer才能执行此操作。我正在寻找有关如何处理此问题的建议。感谢。

以下是我的一个清单:

<ctrls:SnapList x:Name="PART_ProductList" 
                                            ScrollViewer.CanContentScroll="False"  
                                            ScrollViewer.VerticalScrollBarVisibility="Auto" 
                                            ScrollViewer.HorizontalScrollBarVisibility="Hidden"
                                            ItemContainerStyle="{StaticResource ProductFinderItem}" 
                                            Canvas.Top="373" Canvas.Left="75"
                                            Height="910" Width="900" >

                            <ctrls:SnapList.ItemsPanel>
                                    <ItemsPanelTemplate>
                                        <VirtualizingStackPanel VirtualizingStackPanel.IsVirtualizing="True" VirtualizingStackPanel.VirtualizationMode="Standard" />
                                </ItemsPanelTemplate>
                            </ctrls:SnapList.ItemsPanel>

                            <ctrls:SnapList.Template>
                                    <ControlTemplate>
                                    <ScrollViewer  x:Name="Scroller" VerticalAlignment="Top"  CanContentScroll="True" Style="{StaticResource VertScrollViewer}" Focusable="false" >
                                                <ItemsPresenter   />
                                            </ScrollViewer>
                                    </ControlTemplate>
                            </ctrls:SnapList.Template>
                        </ctrls:SnapList>

3 个答案:

答案 0 :(得分:1)

我相信你正在寻找ScrollViewer.CanContentScroll财产

如果您知道ListView中项目的最大大小,请确保ListView的高度大小相同,或者是项目高度的倍数。

工作示例:

<ListView ScrollViewer.CanContentScroll="True"
            Height="200">

    <ListBoxItem Height="50"
                    Content="Test1" />
    <ListBoxItem Height="50"
                    Content="Test2" />
    <ListBoxItem Height="50"
                    Content="Test3" />
    <ListBoxItem Height="50"
                    Content="Test4" />
    <ListBoxItem Height="50"
                    Content="Test5" />
    <ListBoxItem Height="50"
                    Content="Test6" />
    <ListBoxItem Height="50"
                    Content="Test7" />
    <ListBoxItem Height="50"
                    Content="Test8" />
    <ListBoxItem Height="50"
                    Content="Test9" />
    <ListBoxItem Height="50"
                    Content="Test10" />

</ListView>
  

ScrollViewer中的内容可以按物理单位滚动   或逻辑单位。物理单位是与设备无关的像素。   逻辑单元用于滚动ItemsControl中的项目。该   ScrollViewer的默认行为是使用物理单位   滚动其内容。但是,在CanContentScroll的情况下   设置为true,内容可以使用逻辑单元滚动。对于   例如,ListBox,ListView和其他继承的控件   ItemsControl使用逻辑单元滚动。如果CanContentScroll为true,   ExtentHeight,ScrollableHeight,ViewportHeight和的值   VerticalOffset属性是项目数,而不是物理数   单元。

     

如果您需要物理滚动而不是逻辑滚动,请换行   ScrollViewer中的主机Panel元素并设置其CanContentScroll   财产到假。物理滚动是默认的滚动行为   对于大多数Panel元素。

答案 1 :(得分:0)

您是否尝试过ListView.ScrollIntoView

答案 2 :(得分:0)

您可以尝试跟踪scrollview的当前滚动,然后获取所有项目的高度。然后你就会知道如何计算每个项目的正确偏移量。当他们释放滚动动画到最近的偏移。

ScrollInfo to get the current scroll offset and info.

Scroll to vertical offset