【问题标题】:Dependency properties getting mixed up?依赖属性混淆了?
【发布时间】:2013-09-25 21:45:55
【问题描述】:

我基本上有一个带有 2 个全景项目的全景控件,其中仅包含不同项目的列表。我按照 windows phone 上的教程来检测用户何时到达列表末尾,然后显示新项目 - fire (call) method, when scrollviewer scrolled to its end

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

谢谢

列表框 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>

【问题讨论】:

    标签: c# windows-phone-7 windows-phone-8 windows-phone dependency-properties


    【解决方案1】:

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

    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 ();
    

    在构造函数中:

    scrollListenerFirstListBox.EndOfScrollReached += scrollListenerFirstListBox_EndOfScrollReached;
    scrollListenerSecondListBox.EndOfScrollReached += scrollListenerSecondListBox_EndOfScrollReached;
    

    当第一个列表框加载时:

     scrollListenerFirstListBox.Init(ScrollViewerFirstListBox);
    

    加载第二个列表框时:

    scrollListenerSecondListBox.Init(ScrollViewerSecondListBox);
    

    这是一个从 ListBox 中获取滚动查看器的函数:

    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;
        }
    

    你应该像这样在 ListBox 的 Loaded 中调用这个函数:

    ScrollViewer scrollViewerListA=this.GetScrollViewer(ListA);
    

    还有一点要提的是,如果您要创建无限滚动,推荐的方法是使用windows phone toolkit LongListSelector 并遵循article

    【讨论】:

    • 嘿,谢谢你的帮助,现在试试这个,如果它有效,请告诉你
    • 加载列表框时从哪里获得 ScrollViewerFirstListBox 和 ScrollViewerSecondListbox?
    • 我添加了我的第一个列表框的样子
    • 更新了获取滚动查看器的方法,还添加了一个链接,指向推荐的无限滚动方式(如果您正在尝试这样做)
    猜你喜欢
    • 2017-01-31
    • 2021-06-29
    • 2020-11-30
    • 1970-01-01
    • 2015-01-16
    • 1970-01-01
    • 2023-03-20
    • 2011-12-16
    • 2018-12-16
    相关资源
    最近更新 更多