Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何检测N个列表在列表框末尾的滚动?_C#_Windows Phone 7_Listbox_Scroll - Fatal编程技术网

C# 如何检测N个列表在列表框末尾的滚动?

C# 如何检测N个列表在列表框末尾的滚动?,c#,windows-phone-7,listbox,scroll,C#,Windows Phone 7,Listbox,Scroll,我发现这是由什么造成的: public static readonly DependencyProperty ListVerticalOffsetProperty = DependencyProperty.Register( "ListVerticalOffset", typeof( double ), typeof( SearchBusinessResultsPage ), new PropertyMetadata( new PropertyChangedCallback( O

我发现这是由什么造成的:

public static readonly DependencyProperty ListVerticalOffsetProperty = DependencyProperty.Register(
  "ListVerticalOffset",
  typeof( double ),
  typeof( SearchBusinessResultsPage ),
  new PropertyMetadata( new PropertyChangedCallback( OnListVerticalOffsetChanged ) ) );

public double ListVerticalOffset
{
  get { return ( double )this.GetValue( ListVerticalOffsetProperty ); }
  set { this.SetValue( ListVerticalOffsetProperty, value ); }
}

private static void OnListVerticalOffsetChanged( DependencyObject obj, DependencyPropertyChangedEventArgs e )
{
    // ...
}
它创建一个
readonly
属性和一个静态方法来处理它。但是我想让N个列表在滚动的末尾处理一个事件

 listBox.AddHandler(ScrollViewer.ScrollChangedEvent, new ScrollChangedEventHandler((o , e) => {
            ListBox lb = (ListBox) o;
            ScrollViewer sv = GetDescendantByType(lb, typeof(ScrollViewer)) as ScrollViewer;
            if (sv.ScrollableHeight == sv.VerticalOffset) { 
                //End of the scroll reached
            }
        }));
我不知道如何使用此代码来处理不同的列表


有更好的方法吗?如何在不同的列表中使用相同的内容?

您可以创建一个从列表框继承的BusinessListBox类,并定义其样式和模板,如前面提到的示例所示。然后,可以扩展DependencyProperty更改处理程序,使其具有实例更改处理程序方法

private static void OnListVerticalOffsetChanged(
    DependencyObject d, DependencyPropertyChangedEventArgs e)
{
    var target = (BusinessListBox)d;
    double oldListVerticalOffset = (double)e.OldValue;
    double newListVerticalOffset = target.ListVerticalOffset;
    target.OnListVerticalOffsetChanged(oldListVerticalOffset, newListVerticalOffset);
}

private void OnListVerticalOffsetChanged(
    double oldListVerticalOffset, double newListVerticalOffset)
{
}

理想情况下,您只需实现一个行为或附加属性,允许您在常规列表框上执行相同的操作。

您需要做的就是添加一个用于ScrollChangedEvent检测的处理程序,并使用VerticalOffset属性查找滚动是否已到达滚动的末尾

 listBox.AddHandler(ScrollViewer.ScrollChangedEvent, new ScrollChangedEventHandler((o , e) => {
            ListBox lb = (ListBox) o;
            ScrollViewer sv = GetDescendantByType(lb, typeof(ScrollViewer)) as ScrollViewer;
            if (sv.ScrollableHeight == sv.VerticalOffset) { 
                //End of the scroll reached
            }
        }));
在列表框中查找ScrollViewer的助手方法

   /***
    * Helper method to traverse the root to find the the element of type `type`
    ***/
    public static Visual GetDescendantByType(Visual element, Type type) {
        if (element == null) {
            return null;
        }
        if (element.GetType() == type) {
            return element;
        }
        Visual foundElement = null;

        for (int i = 0; i < VisualTreeHelper.GetChildrenCount(element); i++) {
            Visual visual = VisualTreeHelper.GetChild(element, i) as Visual;
            foundElement = GetDescendantByType(visual, type);
            if (foundElement != null) {
                break;
            }
        }
        return foundElement;
    }
/***
*Helper方法遍历根以查找`type类型的元素`
***/
公共静态可视GetDegenantByType(可视元素,类型){
if(元素==null){
返回null;
}
if(element.GetType()==type){
返回元素;
}
Visual foundElement=null;
for(int i=0;i
这有帮助吗?假设您已将应用程序更新为7.1