TreeView选中项时禁止水平滚动的技术方案咨询(支持虚拟化)
解决TreeView选中项时自动触发水平滚动的问题
核心思路
别直接全局拦截RequestBringIntoView事件——这会毁掉程序化滚动功能。我们只需要拦截由选中操作触发的自动滚动请求,同时保留虚拟化支持、手动滚动的正常使用。
实现方案
1. 用附加属性精准控制(支持虚拟化)
写个附加属性,给每个TreeViewItem绑定,只在选中触发滚动时拦截:
using System.Windows; using System.Windows.Controls; public static class TreeViewScrollFix { public static readonly DependencyProperty DisableScrollOnSelectProperty = DependencyProperty.RegisterAttached( "DisableScrollOnSelect", typeof(bool), typeof(TreeViewScrollFix), new PropertyMetadata(false, OnPropertyChanged)); public static bool GetDisableScrollOnSelect(DependencyObject obj) => (bool)obj.GetValue(DisableScrollOnSelectProperty); public static void SetDisableScrollOnSelect(DependencyObject obj, bool value) => obj.SetValue(DisableScrollOnSelectProperty, value); private static void OnPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { if (d is not TreeViewItem item) return; if ((bool)e.NewValue) item.RequestBringIntoView += OnItemRequestBringIntoView; else item.RequestBringIntoView -= OnItemRequestBringIntoView; } private static void OnItemRequestBringIntoView(object sender, RequestBringIntoViewEventArgs e) { var item = sender as TreeViewItem; // 只拦截选中时触发的滚动请求:焦点在当前项且项已选中 if (item != null && item.IsSelected && Keyboard.FocusedElement == item) { e.Handled = true; // 要是只想禁水平滚动、保留垂直滚动,就替换成下面这行: // e.TargetRect = new Rect(0, e.TargetRect.Y, item.ActualWidth, e.TargetRect.Height); } } }
2. XAML中应用(适配虚拟化)
在TreeView的ItemContainerStyle里设置这个附加属性,虚拟化生成的TreeViewItem也会自动生效:
<TreeView VirtualizingStackPanel.IsVirtualizing="True" VirtualizingStackPanel.VirtualizationMode="Recycling"> <TreeView.ItemContainerStyle> <Style TargetType="TreeViewItem"> <Setter Property="local:TreeViewScrollFix.DisableScrollOnSelect" Value="True"/> </Style> </TreeView.ItemContainerStyle> <!-- 你的TreeView节点内容 --> </TreeView>
方案符合所有要求
- 选中项时不会触发水平滚动:不管项内容多长,选中时都不会自动滚动
- 支持虚拟化:附加属性会绑定到每个生成(包括回收复用)的TreeViewItem
- 水平滚动栏正常可用:用户可以拖动滚动条、按Shift+滚轮、用方向键手动滚动
- 不破坏程序化滚动:手动调用
BringIntoView()或者其他代码控制的滚动仍正常工作
内容的提问来源于stack exchange,提问作者Bent Rasmussen
相关产品推荐
相关产品推荐

