WPF实现ListBox滚动条自动定位至最底部
摘要#
在有些场景下为了提升用户体验可能需要自动定位数据至最新的地方,比如实时运行日志、表格最新添加的数据记录等等,这种其实都可以使用WPF中的Behavior(行为)来进行实现,当然你硬要直接在后台事件处理也不是不行,封装成行为之后代码更简洁且可以共用。
示例代码#
废话不多说直接上代码
1、实现一个Listbox滚动至最底部的行为
/// <summary>
/// ClassName: ListBoxScrollToBottomBehavior
/// Description:列表框滚动条行为
/// Author: luc
/// CreatTime: 2022/12/12 18:11:48
/// </summary>
public class ListBoxScrollToBottomBehavior:Behavior<ListBox>
{
protected override void OnAttached()
{
base.OnAttached();
((ICollectionView)AssociatedObject.Items).CollectionChanged += ListBoxScrollToBottomBehavior_CollectionChanged;
}
protected override void OnDetaching()
{
base.OnDetaching();
((ICollectionView)AssociatedObject.Items).CollectionChanged -= ListBoxScrollToBottomBehavior_CollectionChanged;
}
private void ListBoxScrollToBottomBehavior_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
{
if (AssociatedObject.HasItems)
{
AssociatedObject.ScrollIntoView(AssociatedObject.Items[AssociatedObject.Items.Count - 1]);
}
}
}
原理很简单,就是通过AssociatedObject
的ScrollIntoView
方法滚动至集合项的总数-1就是最后1行底部了。
Tips:需要注意的是,传入的行为泛型必须是ICollectionView
类型的才可以,因为这里是通过触发ICollectionView
的CollectionChanged
事件进行处理操作的。
2、在XAML页面上使用行为
//导入自己封装的行为所在位置
xmlns:beavior="clr-namespace:xxxxx.Extensions.Behaviors"
//导入微软的行为类库
xmlns:i="http://schemas.microsoft.com/xaml/behaviors"
<i:Interaction.Behaviors>
<beavior:ListBoxScrollToBottomBehavior />
</i:Interaction.Behaviors>
那有的同学又要问了,如果要自动定位至顶部呢?那不是更简单,要学会举一反三,直接定位到数据下标为0的位置就是第一行也就是顶部了
那还有同学要问了,如果是DataGrid,ListView咋整呢?其实还是一样的,换汤不换药,Behavior是一个泛型,可传入不同的DependencyObject
对象类型
效果#
作者:傲慢与偏见
出处:https://www.cnblogs.com/chonglu/p/16983979.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
声明:如果本文对您有帮助,请点击【推荐】您的赞赏将鼓励我继续创作!想跟我一起进步么?那就【关注】我吧
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
2021-12-14 ASP.NET Core MVC Razor小记