【问题标题】:Determine when LongListSelector is Scrolling确定 LongListSelector 何时滚动
【发布时间】:2014-11-12 05:19:05
【问题描述】:

我只是希望能够在向下滚动时最小化应用程序栏,然后在向上滚动时显示其正常大小。我在 facebook 应用程序上看到了这种功能,它看起来非常吸引人且用户友好。我有我的 LongListSelector 与绑定到它的项目,和一个 appbar 已经在代码后面。启用此类功能缺少的关键是什么?

【问题讨论】:

    标签: c# windows-phone-8 converter longlistselector


    【解决方案1】:

    您只需要弄清楚用户何时滚动以及向哪个方向滚动。这是一篇带有示例代码的好文章。 Detecting WP8 LongListSelector’s end of scroll。您可以将其修改为完全符合您的要求。

    但是,如果我要这样做,我会采取更直接的路线。我会派生自己的 LLS 并将属性附加到滚动条的值。像这样的:)

    public class MyLLS : LongListSelector, INotifyPropertyChanged
    {
        // implement the INotify
        public event PropertyChangedEventHandler PropertyChanged;
        private void NotifyPropertyChanged(String propertyName)
        {            
            PropertyChangedEventHandler handler = PropertyChanged;
            if (null != handler)
            {
                handler(this, new PropertyChangedEventArgs(propertyName));
            }
        }
    
        public override void OnApplyTemplate()
        {
            base.OnApplyTemplate();
    
            // dat grab doe
            sb = this.GetTemplateChild("VerticalScrollBar") as System.Windows.Controls.Primitives.ScrollBar;
            sb.ValueChanged += sb_ValueChanged;           
        }
    
        void sb_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
        {
            // an animation has happen and they have moved a significance distance
            // set the new value
            ScrollValue = e.NewValue;
    
            // determine scroll direction
            if(e.NewValue > e.OldValue)
            {
                scroll_direction_down = true;
            }
            else
            {
                scroll_direction_down = false;
            }
        }
    
        public System.Windows.Controls.Primitives.ScrollBar sb;
    
        private bool scroll_direction_down = false;   // or whatever default you want
    
        public bool ScrollDirectionDown
        { get { return scroll_direction_down; } }
    
        public double ScrollValue
        {
            get
            {
                if (sb != null)
                {
                    return sb.Value;
                }
                else
                    return 0;
            }
            set
            {
                sb.Value = value;
                NotifyPropertyChanged("ScrollValue");
            }
        }
    }
    

    现在您知道了确切的滚动位置。你甚至可以通过做得到顶部和底部值

    double min = this.sb.Minimum;
    double max = this.sb.Maximum;
    

    现在将 ScrollDirectionDown 属性绑定到一个转换器到您的 AppBar 可见性,您将实现您的目标。


    如果您无法绑定,则必须执行回调以更新可见性。但是,如果您想要更简单的东西,只需将其连接到自定义 LLS 的 ManipulationStateChanged 事件即可。

    public partial class MainPage : PhoneApplicationPage
    {
        // Constructor
        public MainPage()
        {
            InitializeComponent();
        } 
    
        private void lls_ManipulationStateChanged(object sender, EventArgs e)
        {
            if (lls.ScrollDirectionDown)
            {
                ApplicationBar.IsVisible = false;
            }
            else
            {
                ApplicationBar.IsVisible = true;
            }             
        }
    }
    

    【讨论】:

    • 好的,我已经实现了自定义 LongListSelector,现在我的问题是创建应用栏模式转换器以显示最小化或常规大小的应用栏..
    • 我添加了我创建的应用栏模式转换器的代码。由于我的 appbar 位于代码后面,如何在 longlistselector 向下滚动时将其绑定到代码后面以更新 appbar 模式?
    • 不能绑定普通的AppBar,可以使用模式更宽松的第三方bar(Caliburn.Micro)。在您的情况下,当 ScrollDirectionDown 更改以更改 ApplicationBar 可见性时,我会写一个回调。但为简单起见,我只是将其添加到自定义 LLS 上的 ManipulationStateChanged 更改事件中。查看更新的解决方案。
    【解决方案2】:

    因此,您必须检测longlistselector 何时开始滚动。为此,这里有一个类似的线程:

    Windows Phone 8 Long List Selector - scroll to bottom after data loaded async

    DoAndScroll 方法中,您可以简单地包含代码以最小化AppBar

    在应用栏的 xaml 代码中,将模式更改为最小化。

    <shell:ApplicationBar Mode="Minimized" Opacity="1.0" IsMenuEnabled="True" IsVisible="True"></>
    

    此后每当它向上滚动时,将AppBarMode 变为Default

    或者看看这个来检测longlistselector的底部。

    Detecting WP8 LongListSelector’s end of scroll

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多