您引用的答案正是导致您的问题的原因,您的 ScrollViewer 中的 ListBox(由 ScrollViewer 等组成)捕获并处理 MouseWheel 事件,防止它冒泡,因此 ScrollViewer 不知道该事件曾经发生过。
使用以下极其简单的 ControlTemplate 为您的 ListBox 进行演示(注意它没有 ScrollViewer,因此不会捕获 MouseWheel 事件) ScrollViewer 仍将使用鼠标在 ListBox 上滚动。
<UserControl.Resources>
<ControlTemplate x:Key="NoScroll">
<ItemsPresenter></ItemsPresenter>
</ControlTemplate>
</UserControl.Resources>
<ScrollViewer>
<SomeContainerControl>
<.... what ever other controls are inside your ScrollViewer>
<ListBox Template="{StaticResource NoScroll}"></ListBox>
<SomeContainerControl>
</ScrollViewer>
您确实可以选择在鼠标进入 ScrollViewer 时捕获鼠标,因此它会继续接收所有鼠标事件,直到鼠标被释放,但是此选项将要求您将任何进一步的鼠标事件委托给 ScrollViewer 中包含的控件,如果您想要一个响应...以下 MouseEnter MouseLeave 事件处理程序就足够了。
private void ScrollViewerMouseEnter(object sender, MouseEventArgs e)
{
((ScrollViewer)sender).CaptureMouse();
}
private void ScrollViewerMouseLeave(object sender, MouseEventArgs e)
{
((ScrollViewer)sender).ReleaseMouseCapture();
}
但是,我提供的两种解决方法都不是真正的首选,我建议重新考虑您实际尝试做的事情。如果您在问题中解释您要达到的目标,我相信您会得到更多建议......