【发布时间】:2014-11-12 05:19:05
【问题描述】:
我只是希望能够在向下滚动时最小化应用程序栏,然后在向上滚动时显示其正常大小。我在 facebook 应用程序上看到了这种功能,它看起来非常吸引人且用户友好。我有我的 LongListSelector 与绑定到它的项目,和一个 appbar 已经在代码后面。启用此类功能缺少的关键是什么?
【问题讨论】:
标签: c# windows-phone-8 converter longlistselector
我只是希望能够在向下滚动时最小化应用程序栏,然后在向上滚动时显示其正常大小。我在 facebook 应用程序上看到了这种功能,它看起来非常吸引人且用户友好。我有我的 LongListSelector 与绑定到它的项目,和一个 appbar 已经在代码后面。启用此类功能缺少的关键是什么?
【问题讨论】:
标签: c# windows-phone-8 converter longlistselector
您只需要弄清楚用户何时滚动以及向哪个方向滚动。这是一篇带有示例代码的好文章。 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;
}
}
}
【讨论】:
ManipulationStateChanged 更改事件中。查看更新的解决方案。
因此,您必须检测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"></>
此后每当它向上滚动时,将AppBar 的Mode 变为Default。
或者看看这个来检测longlistselector的底部。
【讨论】: