Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/260.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# 依赖属性混淆了吗?_C#_Windows Phone 7_Windows Phone 8_Windows Phone_Dependency Properties - Fatal编程技术网

C# 依赖属性混淆了吗?

C# 依赖属性混淆了吗?,c#,windows-phone-7,windows-phone-8,windows-phone,dependency-properties,C#,Windows Phone 7,Windows Phone 8,Windows Phone,Dependency Properties,我基本上有一个带有2个全景项目的全景控件,它只包含不同项目的列表。我按照windows phone上的教程来检测用户何时到达列表的末尾,然后显示新项目- 然而,我的问题是,我需要这两个列表框,所以我注册了两个不同的依赖属性,但是我如何将依赖属性与特定的列表框“链接”,因为这两个属性混淆了 多谢各位 列表框1 <ListBox Foreground="Black" x:Name="nuus"

我基本上有一个带有2个全景项目的全景控件,它只包含不同项目的列表。我按照windows phone上的教程来检测用户何时到达列表的末尾,然后显示新项目-

然而,我的问题是,我需要这两个列表框,所以我注册了两个不同的依赖属性,但是我如何将依赖属性与特定的列表框“链接”,因为这两个属性混淆了

多谢各位

列表框1

  <ListBox Foreground="Black" 
                         x:Name="nuus"
                         Loaded="nuus_Loaded_1"
                         ItemsSource="{Binding Story}"
                         SelectionChanged="nuus_SelectionChanged_1">
                    <ListBox.ItemTemplate>
                        <DataTemplate>
                            <StackPanel Orientation="Horizontal" Margin="12,2,0,4" Height="105" Width="432">
                                <Image Width="115" Height="115" Source="{Binding ImageUrl}"/>
                                <StackPanel Width="311" Margin="8,0,0,0">
                                    <TextBlock Text="{Binding Title}" 
                                           TextWrapping="Wrap" 
                                           FontWeight="Bold"
                                           Margin="10,0" 
                                           Foreground="Black"
                                           FontSize="20"/>

                                    <TextBlock Text="{Binding CreationDate}" 
                                           TextWrapping="Wrap" 
                                           Foreground="Black"
                                           Margin="10,-2,10,0" 
                                           FontSize="20"/>
                                </StackPanel>
                            </StackPanel>
                        </DataTemplate>
                    </ListBox.ItemTemplate>
                </ListBox>

这里有一个helper类,它提取了相同的功能,以便能够更轻松地复制它:

public class ScollViewerEndListener :FrameworkElement
{

    public event EventHandler EndOfScrollReached;

    private ScrollViewer scrollViewer;
    public ScollViewerEndListener()
    {

    }

    public void Init(ScrollViewer scrollViewer)
    {
        this.scrollViewer = scrollViewer;
        var binding = new Binding
        {
            Source = scrollViewer,
            Path = new PropertyPath("VerticalOffset"),
            Mode = BindingMode.OneWay
        };
        SetBinding(ListVerticalOffsetProperty, binding);
    }



    private void OnListVerticalOffsetChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e)
    {
        var atBottom = scrollViewer.VerticalOffset >= scrollViewer.ScrollableHeight;
        if (atBottom)
        {
            if (EndOfScrollReached != null)
            {
                EndOfScrollReached(this, null);
            }
        }
    }

    public readonly DependencyProperty ListVerticalOffsetProperty;

    public double ListVerticalOffset
    {
        get { return (double)GetValue(ListVerticalOffsetProperty); }
        set { SetValue(ListVerticalOffsetProperty, value); }
    }
}
您可以在文件中这样使用:

ScollViewerEndListener scrollListenerFirstListBox=new ScollViewerEndListener ();
ScollViewerEndListener scrollListenerSecondListBox=new ScollViewerEndListener ();
ScrollViewer scrollViewerListA=this.GetScrollViewer(ListA);
在构造函数中:

scrollListenerFirstListBox.EndOfScrollReached += scrollListenerFirstListBox_EndOfScrollReached;
scrollListenerSecondListBox.EndOfScrollReached += scrollListenerSecondListBox_EndOfScrollReached;
加载第一个列表框时:

 scrollListenerFirstListBox.Init(ScrollViewerFirstListBox);
scrollListenerSecondListBox.Init(ScrollViewerSecondListBox);
加载第二个列表框时:

 scrollListenerFirstListBox.Init(ScrollViewerFirstListBox);
scrollListenerSecondListBox.Init(ScrollViewerSecondListBox);
以下是从列表框获取scrollviewer的函数:

public ScrollViewer GetScrollViewer(DependencyObject parentElement)
    {
        var count = VisualTreeHelper.GetChildrenCount(parentElement);


        for (int i = 0; i < count; i++)
        {
            var child = VisualTreeHelper.GetChild(parentElement, i);
            if (child is ScrollViewer)
            {
                return child as ScrollViewer;
            }
            else
            {
                child = GetScrollViewer(child);
                if (child != null)
                {
                    return child as ScrollViewer;
                }
            }
        }
        return null;
    }

还有一件事要提的是,如果你想做的是创建一个无限滚动,推荐的方法是使用LongListSelector并遵循此操作,并且让您知道它是否工作。当列表框加载时,您从哪里获得ScrollViewerFirstListBox和ScrollViewerSecondListbox?我已经添加了我的第一个列表框的外观,并更新了获取scrollviewer的方法,还添加了一个链接,指向建议的无限滚动方式(如果您正尝试这样做的话)