父滚动查看器'Scroll Changed'子列表框的滚动触发的事件



我在滚动查看器中有一个列表框。滚动查看器已附加一个滚动更改的侦听器,其中我放置了一个:

MessageBox.Show("Something Happened!");

这是我的 WPF 代码:

<ScrollViewer ScrollChanged="ScrollViewer_ScrollChanged" VerticalScrollBarVisibility="Disabled" HorizontalScrollBarVisibility="Disabled">
<ListBox>
<ListBox.Items>
<ListBoxItem Content="item 2"/>
<ListBoxItem Content="item 2"/>
<ListBoxItem Content="item 2"/>
<ListBoxItem Content="item 2"/>
<ListBoxItem Content="item 2"/>
<ListBoxItem Content="item 2"/>
<ListBoxItem Content="item 2"/>
<ListBoxItem Content="item 2"/>
<ListBoxItem Content="item 2"/>
<ListBoxItem Content="item 2"/>
<ListBoxItem Content="item 2"/>
<ListBoxItem Content="item 2"/>
<ListBoxItem Content="item 2"/>
<ListBoxItem Content="item 2"/>
</ListBox.Items>
</ListBox>
</ScrollViewer>

现在的问题是,当我滚动列表框时,不知何故,ScrollViewer的"ScrollChanged"事件通过向我显示消息框=>发生了一些事情来触发!

我尝试过启用或禁用水平滚动条,但同样的事情发生了...... 我的垂直滚动条现在被禁用,我将其设置为"隐藏",但现在它也隐藏了列表框的垂直滚动条,我也无法通过鼠标滚轮滚动列表框

提前感谢...🙂

发生这种情况是因为ScrollViewer.ScrollChanged是路由事件。具体来说,这是一个冒泡事件,这意味着当它被引发时,它会沿着可视化树向上(从引发它的更深元素向上,向上到根(寻找处理程序。

这使您可以执行以下操作:

<ListBox ScrollViewer.ScrollChanged="listBox_ScrollChanged"/>

由于ListBox内部使用ScrollViewer,因此您可以在ListBox级别侦听ScrollChanged事件并对其进行处理,即使ListBox本身不会公开事件。

当然,这也会导致您正在经历的情况。幸运的是,这很容易解决。在事件处理程序中,可以使用RoutedEventArgs.Source来判断正在滚动的元素:

//Assuming the ScrollViewer you want to listen to is given the name "OutsideScrollViewer"
private void ScrollViewer_ScrollChanged(object sender, ScrollChangedEventArgs e)
{
if (object.ReferenceEquals(e.Source,  OutsideScrollViewer))
{
}
}

最新更新