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