【问题标题】:WPF listview vertical scrollbarWPF listview垂直滚动条
【发布时间】:2015-07-27 16:39:12
【问题描述】:

我有一个带有gridview 的listview 控件作为它的view 属性。 其中一列专门用于显示很长的文本。该列单元格模板设置为 TextBlock。每当listview item source 只包含一个item 时,无论提到的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 周围包裹着什么类型的容器?

标签: wpf


【解决方案1】:

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

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

默认情况下,ListView 正在尝试虚拟化。除其他外,虚拟化意味着使用逻辑滚动。逻辑滚动意味着 ScrollViewer 逐项滚动,从一个项目跳到另一个项目,而不是平滑滚动每个项目的整个范围。

通过将CanContentScroll 设置为false,您是在告诉ScrollViewer 停止使用逻辑滚动,这也会停用虚拟化。

如果您要在 ListView 中显示很多项目,那么虚拟化可能很重要,这会带来性能问题。

如果你只是要展示几个项目,那么这应该完全没问题。

编辑 - 如果性能确实是一个问题并且您需要保持虚拟化处于激活状态,请考虑为所有行设置一个固定高度,并在 TextBlock 周围添加自己的 ScrollViewer 和大文本.

【讨论】:

    【解决方案2】:

    尝试在 DataTemplate 中添加一个滚动查看器,如下所示,

    <DataTemplate>
     <ScrollViewer>
       <TextBlock TextWrapping="Wrap" Text="{Binding}"/>
     </ScrollViewer>
    </DataTemplate>
    

    【讨论】:

    • 对我不起作用。况且ff有不止一个item,而且每一个都会有一个scrollviewer,会变得凌乱难看,你不觉得吗?
    • 不是模板的问题。这是一个问题,这个模板将用于列表视图中的所有项目 - 所以 50 个项目 - 每个项目有 50 个滚动浏览器,不是任何人都想看到的
    【解决方案3】:

    您只需要使用 MaxHeight 属性限制 ListView 的高度 示例:

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

    【讨论】:

      【解决方案4】:

      将 ListView 包装在 DockPanel 中。

      【讨论】:

        猜你喜欢
        • 2012-01-29
        • 2012-05-23
        • 2015-07-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-14
        • 2017-02-08
        • 1970-01-01
        相关资源
        最近更新 更多