Wpf ScrollViewer在请求时通知BringInToView

Wpf ScrollViewer在请求时通知BringInToView,wpf,virtualization,scrollviewer,routed-events,Wpf,Virtualization,Scrollviewer,Routed Events,当元素滚动到视图中时,我试图得到通知 据我所知,ScrollViewer在其子元素上调用BringIntoView,然后 子元素引发一个RequestBringIntoView事件,ScrollViewer稍后会捕获该事件 和手柄 这是通过为此事件注册一个类处理程序并在它冒泡时捕获它来完成的 EventManager.RegisterClassHandler(typeof(ScrollViewer), RequestBringIntoViewEvent, new RequestBringInto

当元素滚动到视图中时,我试图得到通知

据我所知,ScrollViewer在其子元素上调用BringIntoView,然后 子元素引发一个RequestBringIntoView事件,ScrollViewer稍后会捕获该事件 和手柄

这是通过为此事件注册一个类处理程序并在它冒泡时捕获它来完成的

EventManager.RegisterClassHandler(typeof(ScrollViewer), RequestBringIntoViewEvent, new RequestBringIntoViewEventHandler(OnRequestBringIntoView));

我需要的是在每次这个过程发生时得到通知,我的尝试是从 ScrollViewer并创建我自己的类型事件,并通过以下两种方式之一进行处理:

1) 为同一事件添加一个类处理程序,并在末尾添加一个true以处理已处理的事件

2) 创建处理RequestBringIntoViewEvent类型事件的我自己的事件

public class NotifyOnBringIntoViewScrollViewer : ScrollViewer
{
    static NotifyOnBringIntoViewScrollViewer()
    {
        // for secnario (2) replace RequestBringIntoViewEvent with Noti
        EventManager.RegisterClassHandler(typeof(NotifyOnBringIntoViewScrollViewer),RequestBringIntoViewEvent , new RequestBringIntoViewEventHandler(OnRequestBringIntoView), true);                       
    }


    public static readonly RoutedEvent NotifyBringIntoViewEvent = EventManager.RegisterRoutedEvent(
                "NotifyBringIntoView", RoutingStrategy.Direct, typeof(RequestBringIntoViewEventHandler), typeof(NotifyOnBringIntoViewScrollViewer));

    private static void OnRequestBringIntoView(object sender, RequestBringIntoViewEventArgs e)
    {
        // notify ..
    }
}
由于一个或两个原因,始终无法联系到处理程序

1) 我不理解路由事件在注册处理程序方面的工作方式。 2) 我的子元素从不引发RequestBringIntoView,我的尝试如下:

政务司司长:

公共列表项
{
收到
{
返回新列表
{
1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25
};
}
}
xaml:

  <local:NotifyOnBringIntoViewScrollViewer>
      <ItemsControl ItemsSource="{Binding Items}">

         <ItemsControl.ItemsPanel>
              <ItemsPanelTemplate>
                  <VirtualizingStackPanel />
              </ItemsPanelTemplate>
          </ItemsControl.ItemsPanel>

          <ItemsControl.ItemTemplate>
              <DataTemplate>
                  <TextBlock Text="{Binding}"/>
               </DataTemplate>
           </ItemsControl.ItemTemplate>                
       </ItemsControl>
    </local:NotifyOnBringIntoViewScrollViewer>

仅供参考:VirtualizingStackPanel,我之所以这样做是因为我不确定这是默认面板
如果调用with with out Virtualization BringIntoView,因为它们已经在视图中了。

我之前关于这个问题的问题得到了一些很好的回答,我想避免使用另一种方法,因为它可以遍历每个更改的卷轴上的卷轴查看器的所有子元素,我还收到了@ouflak的建议,他提出了这个问题,他建议创建我自己的活动。你需要与物品进行任何形式的互动。点击任何项目,您将获得您的活动。您必须对项目执行某些操作,或者使用scrollviewer中的项目触发该事件。否。我想你在这里的某个地方也有类似的问题。就在那时,我认为您需要一个事件,当您在ScrollViewer中与该项目进行任何类型的交互时,该事件将在每个项目上触发。我建议你带金托维尤。现在我知道你希望在滚动时触发事件,对吗?@devhedgehog谢谢,这确实有效,但是当项目滚动到视图中时,我如何模拟一种单击项目的方式呢?我真的无法在用户滚动后单击项目。@devhedgehog是,但与scroll changed不同的是,我想知道哪些元素变得“可见”
  <local:NotifyOnBringIntoViewScrollViewer>
      <ItemsControl ItemsSource="{Binding Items}">

         <ItemsControl.ItemsPanel>
              <ItemsPanelTemplate>
                  <VirtualizingStackPanel />
              </ItemsPanelTemplate>
          </ItemsControl.ItemsPanel>

          <ItemsControl.ItemTemplate>
              <DataTemplate>
                  <TextBlock Text="{Binding}"/>
               </DataTemplate>
           </ItemsControl.ItemTemplate>                
       </ItemsControl>
    </local:NotifyOnBringIntoViewScrollViewer>