0

保護されたオーバーライド void からイベント ハンドラーのサブスクライブを解除することは可能ですか?

 protected override void OnViewLoaded(object sender, ViewLoadedEventArg e)
    {
        base.OnViewLoaded(sender, e);
        list = VisualTreeUtil.FindFirstInTree<ListView>(Application.Current.MainWindow, "ListView");
        ConfigureAndSuperviseInputControls(this.list);
        ScrollViewer scroll = VisualTreeUtil.FindFirstInTree<ScrollViewer>(this.list);
        scroll.ScrollChanged+=new ScrollChangedEventHandler(scroll_ScrollChanged);       
    }

  void scroll_ScrollChanged(object sender, ScrollChangedEventArgs e)
    {  
        ConfigureAndSuperviseInputControls(this.list);
        ScrollViewer sb = e.OriginalSource as ScrollViewer;
        if (sb.ContentVerticalOffset==sb.ScrollableHeight)
        {
           scroll.ScrollChanged-=new ScrollChangedEventHandler(scroll_ScrollChanged); 
        }
    }

私の問題は、scroll_ScrollChanged メソッドでスクロールオブジェクトにアクセスできないことです。

4

2 に答える 2

0

Sender は、必要なオブジェクトへの参照である必要があります。

protected override void OnViewLoaded(object sender, ViewLoadedEventArg e)
    {
        base.OnViewLoaded(sender, e);
        list = VisualTreeUtil.FindFirstInTree<ListView>(Application.Current.MainWindow, "ListView");
        ConfigureAndSuperviseInputControls(this.list);
        ScrollViewer scroll = VisualTreeUtil.FindFirstInTree<ScrollViewer>(this.list);
        scroll.ScrollChanged+=new ScrollChangedEventHandler(scroll_ScrollChanged);       
    }

  void scroll_ScrollChanged(object sender, ScrollChangedEventArgs e)
    {  
        ConfigureAndSuperviseInputControls(this.list);
        ScrollViewer sb = sender as ScrollViewer;
        if (sb.ContentVerticalOffset==sb.ScrollableHeight)
        {
           scroll.ScrollChanged-=new ScrollChangedEventHandler(scroll_ScrollChanged); 
        }
    }
于 2013-02-26T10:15:32.323 に答える
0

このコードはテストされていませんが、sender オブジェクトを ScrollViewer に単純にキャストして、次のようにイベントから登録解除することはできません。

protected override void OnViewLoaded(object sender, ViewLoadedEventArg e)
    {
        base.OnViewLoaded(sender, e);
        list = VisualTreeUtil.FindFirstInTree<ListView>(Application.Current.MainWindow, "ListView");
        ConfigureAndSuperviseInputControls(this.list);
        ScrollViewer scroll = VisualTreeUtil.FindFirstInTree<ScrollViewer>(this.list);
        scroll.ScrollChanged+=new ScrollChangedEventHandler(scroll_ScrollChanged);       
    }

  void scroll_ScrollChanged(object sender, ScrollChangedEventArgs e)
    {  
        ConfigureAndSuperviseInputControls(this.list);
        ScrollViewer scroll = (ScrollViewer)sender;
        if (scroll.ContentVerticalOffset==scroll.ScrollableHeight)
        {
           scroll.ScrollChanged-=new ScrollChangedEventHandler(scroll_ScrollChanged); 
        }
    }
于 2013-02-26T10:16:56.380 に答える