wpf控件Expander集合下的像素滚动

项目场景:Expander集合滚动

如下图,有一个Expander集合,且设置 ScrollViewer.VerticalScrollBarVisibility = "Auto"

每个Expaner下包含有若干元素,当打开Expader(即IsExpanded = "true")时,集合右侧会出现滚动条,用户拉动滚动条来浏览集内容。


问题描述:每次滚动跳转太多

如下图所示,当用户滚轮下滑时,每次滚动了一个Expander(也就是一个集合的项------Expaner),这显然不是想要的。


原因分析:

当出现滚轮时,实际上创建了一个VirtualizingPanel,这是WPF为了优化性能做的事情,这里不深入探讨。VirtualizingPanel有个附加属性ScrollUnit,通过反编译可知(也可以查看微软官方文档),它是一个枚举,有两种模式。

csharp 复制代码
  public enum ScrollUnit
  {
	    Pixel,
	    Item,
  }

解决方案:

设置附加属性:VirtualizingPanel.ScrollUnit="Pixel"

csharp 复制代码
   <ListBox
       HorizontalAlignment="Stretch"
       VerticalAlignment="Stretch"
       Background="Transparent"
       BorderThickness="0"
       ScrollViewer.VerticalScrollBarVisibility="Auto"
       ScrollViewer.HorizontalScrollBarVisibility="Disabled"
       VirtualizingPanel.ScrollUnit="Pixel"
       VirtualizingPanel.VirtualizationMode="Recycling"
       ItemsSource="{Binding MyItemCollection}">
       <ListBox.ItemContainerStyle>
           <Style TargetType="{x:Type ListBoxItem}">
               <Setter Property="Template">
                   <Setter.Value>
                       <ControlTemplate>
                           <Expander Header="{Binding Ip, Mode=OneWay}" HeaderHeight="26">
                               <ContentPresenter Content="{Binding}" />
                           </Expander>
                       </ControlTemplate>
                   </Setter.Value>
               </Setter>
           </Style>
       </ListBox.ItemContainerStyle>
   </ListBox>

解决后效果,如下,非常丝滑

相关推荐
软件黑马王子3 小时前
12.缓存池优化:对象上限
开发语言·前端框架·c#
唐青枫16 小时前
别把日志、权限写进业务方法:C#.NET 动态代理从原理到实战
c#·.net
fujisheng66118 小时前
Unity UI 生命周期状态机:处理 Covered、异步竞态与事务回滚
c#·unity3d
leoZ2311 天前
第 8 篇:与 AI 协作的工作流 + 完整案例
前端·人工智能·神经网络·自然语言处理·性能优化·c#·php
fujisheng6611 天前
Unity 异步 UI 实战:取消令牌、版本校验与旧句柄隔离
c#·unity3d
额鹅恶饿呃1 天前
随着CentOS官方停服的时间越来越久,大量仍在使用CentOS7的企业和运维从业者
java·python·算法·c#·ruby
乌药ice1 天前
c#中一个多线程安全的HashSet
开发语言·c#
lfSeanDragon1 天前
数据结构-前缀树(Trie)
开发语言·c#
张人玉1 天前
基于 C# WinForms + .NET 8 + SQLite + TCP Socket 的多连接通讯调试工具——TCP通讯助手(TcpAssistant)
tcp/ip·sqlite·c#·.net
mldong1 天前
C# 开发者也有自己的轻量工作流引擎了:NuGet 装包,5 分钟跑通一条审批流
后端·c#·.net