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>

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

相关推荐
晚风一隅6 小时前
阿里云盘古存储系统:EB级分布式存储的架构革命与技术突破
wpf
大空大地20268 小时前
C#高级语法总结
开发语言·c#
周杰伦fans15 小时前
C# AutoCAD 二次开发极简入门:从环境搭建到高效实战
开发语言·c#
.NET修仙日记16 小时前
.NET EFCore批量插入性能优化实战:30秒 → 0.5秒
性能优化·c#·.net·.netcore·微软技术·efcore·踩坑实录
Esofar17 小时前
Dddify:给 ASP.NET Core 项目一套轻量、清晰、可落地的 DDD 基础设施
c#·ddd·asp.net core·cqrs·dddify·clean architecture
步步为营DotNet17 小时前
深挖.NET 11:.NET Aspire 在云原生应用状态管理的创新与实践
云原生·.net·wpf
Coder_Shenshen18 小时前
【基于LibUA库的OPC UA服务器与客户端Demo——协议解析与Bug修复实践】
网络·c#·bug
信必诺19 小时前
C# —— VS2022配置终端程序跨平台发布方法(部署Ubuntu22.04举例,详细多图)
ubuntu·c#·跨平台部署
我是唐青枫19 小时前
C#.NET YARP 跨域配置详解:网关统一处理 CORS
开发语言·c#·.net
lzhdim19 小时前
C#性能优化技巧
开发语言·性能优化·c#