1

要素がビューにスクロールされたときに通知を受けようとしています。

私が理解しているように、ScrollViewerはその子要素でBringIntoViewを呼び出し、子要素はRequestBringIntoViewイベントを発生させます。これはScrollViewerが後でキャッチして処理します。

これは、このイベントのクラス ハンドラーを登録し、発生したときにそれをキャッチすることによって行われます。

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

ScrollViewer ソースコード

私が必要としているのは、このプロセスが行われるたびに通知を受けることです。私の試みは、ScrollViewer から派生させ、タイプの独自のイベントを作成し、2 つの方法のいずれかでアプローチすることです。

1) Handled events を処理するために、最後に 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 つの理由で、ハンドラーに到達しません。

1) ハンドラーの登録に関して、ルーティングされたイベントがどのように機能するかを理解していません。2)私の子要素は決して RequestBringIntoView を発生させません。これに対する私の試みは次のとおりです:

cs:

   public List<int> Items
    {
        get
        {
            return new List<int>
            {
                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 、これがデフォルトのパネルであるかどうか確信が持てなかったため、これを配置しました。VirtualizingBringIntoView が呼び出されない場合は、既に表示されているためです。

4

0 に答える 0