确定LongListSelector何时滚动

本文关键字:滚动 何时 LongListSelector 确定 | 更新日期: 2023-09-27 18:22:32

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

确定LongListSelector何时滚动

您只需要弄清楚用户何时滚动以及滚动方向。这是一篇很棒的文章,其中包含示例代码。正在检测WP8 LongListSelector的滚动结束。您可以修改它,使其完全符合您的要求。

然而,如果我要去做,我会选择更直接的路线。我会派生出自己的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何时开始滚动。为了实现这一点,这里有一个类似的线程:

Windows Phone 8长列表选择器-数据加载异步后滚动到底部

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

在appbar的xaml代码中,将模式更改为Minimized。

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

此后,每当它向上滚动时,使AppBarDefaultMode

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

检测WP8 LongListSelector的滚动结束