简短的回答是:如果不编写一些自定义滚动代码,就没有办法做到这一点,但不要让它吓到你,它并不是那么难。 ScrollViewer的工作方式是使用物理单位(即像素)滚动,或者与IScrollInfo实现结合使用逻辑单位。这由设置the CanContentScroll property控制,其中false值表示"使用物理单位滚动内容",true值表示"逻辑滚动内容"。 那么ScrollViewer如何逻辑地滚动内容呢?通过与IScrollInfo实现通信。这就是当有人执行逻辑操作时,您可以控制面板内容滚动的确切程度。Take a look at the documentation for IScrollInfo以获取可以请求滚动的所有逻辑测量单位的列表,但既然提到了鼠标滚轮,那么您最感兴趣的就是MouseWheelUp/Down/Left/Right方法。
public class StepSizeBehavior : Behavior<ScrollViewer>
{
public int StepSize { get; set; }
#region Attach & Detach
protected override void OnAttached()
{
CheckHeightModulesStepSize();
AssociatedObject.ScrollChanged += AssociatedObject_ScrollChanged;
base.OnAttached();
}
protected override void OnDetaching()
{
AssociatedObject.ScrollChanged -= AssociatedObject_ScrollChanged;
base.OnDetaching();
}
#endregion
[Conditional("DEBUG")]
private void CheckHeightModulesStepSize()
{
var height = AssociatedObject.Height;
var remainder = height%StepSize;
if (remainder > 0)
{
throw new ArgumentException($"{nameof(StepSize)} should be set to a value by which the height van be divised without a remainder.");
}
}
private void AssociatedObject_ScrollChanged(object sender, ScrollChangedEventArgs e)
{
const double stepSize = 62;
var scrollViewer = (ScrollViewer)sender;
var steps = Math.Round(scrollViewer.VerticalOffset / stepSize, 0);
var scrollPosition = steps * stepSize;
if (scrollPosition >= scrollViewer.ScrollableHeight)
{
scrollViewer.ScrollToBottom();
return;
}
scrollViewer.ScrollToVerticalOffset(scrollPosition);
}
}
5条答案
按热度按时间dbf7pr2w1#
简短的回答是:如果不编写一些自定义滚动代码,就没有办法做到这一点,但不要让它吓到你,它并不是那么难。
ScrollViewer的工作方式是使用物理单位(即像素)滚动,或者与IScrollInfo实现结合使用逻辑单位。这由设置the CanContentScroll property控制,其中false值表示"使用物理单位滚动内容",true值表示"逻辑滚动内容"。
那么ScrollViewer如何逻辑地滚动内容呢?通过与IScrollInfo实现通信。这就是当有人执行逻辑操作时,您可以控制面板内容滚动的确切程度。Take a look at the documentation for IScrollInfo以获取可以请求滚动的所有逻辑测量单位的列表,但既然提到了鼠标滚轮,那么您最感兴趣的就是MouseWheelUp/Down/Left/Right方法。
wkyowqbh2#
下面是一个简单、完整且有效的WPF
ScrollViewer
类,该类具有可绑定数据的SpeedFactor
属性,用于调整鼠标滚轮的灵敏度。将SpeedFactor
设置为1.0意味着与WPFScrollViewer
的行为相同。dependency属性的默认值为2.5,这允许非常快速的滚轮滚动。当然,您也可以通过绑定到
SpeedFactor
属性本身来创建其他有用的特性,例如,允许用户轻松地控制乘数。完整的XAML演示“快速鼠标滚轮滚动”约3200个数据项:
快速鼠标滚轮:
p4tfgftt3#
你可以在scrollviewer上实现一个行为。在我的例子中
CanContentScroll
不起作用。下面的解决方案可以用鼠标滚轮滚动以及拖动滚动条。您可以像这样使用它:
2eafrhcq4#
我想补充一下Drew Marsh接受的答案--虽然其他建议的答案可以解决这个问题,但在某些情况下,您无法覆盖
PreviewMouseWheel
事件并在不引起其他副作用的情况下处理它。也就是说,如果您有子控件应该获得优先级,以便在父ScrollViewer
之前滚动 *-类似于嵌套的ListBox
或ComboBox
弹出窗口。在我的场景中,我的父控件是一个
ItemsControl
,它的ItemsPanel
是一个VirtualizingStackPanel
。我希望它的逻辑滚动是每项1个单位,而不是默认的3个单位。我没有摆弄附加的行为和拦截/处理鼠标滚轮事件,而是简单地实现了一个自定义VirtualizingStackPanel
来完成这一任务。然后我们像在xaml标记中一样使用该面板:
显然,我的场景是人为设计的,解决方案非常简单,但是这可能会为其他人提供一条路径,使他们能够更好地控制滚动行为,而不会产生我遇到的副作用。
kxeu7u2r5#
我这样做是为了确保scrollbar1.ValueChanged上显示整数: