Я просто хотел бы иметь возможность минимизировать панель приложений при прокрутке вниз, а затем показывать ее нормальный размер при прокрутке вверх. Я видел эту способность в приложении facebook, и это кажется очень привлекательным и удобным для пользователя. У меня есть LongListSelector с привязанными к нему элементами и панель приложений уже в коде. Каков недостающий ключ для включения такой функции?Определите, когда прокрутка 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, и вы будете иметь ваши цели выполнены.
Если вы не можете связаться, вам необходимо выполнить обратный вызов, чтобы обновить видимость. Но если вам нужно что-то более простое, просто подключите его к событию ManipulationStateChanged
пользовательского LLS.
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 Long List Selector - scroll to bottom after data loaded async
В методе DoAndScroll
вы могли бы просто включить код, чтобы минимизировать AppBar
.
В вашем xaml-коде вашей панели приложений измените режим на Minimized.
<shell:ApplicationBar Mode="Minimized" Opacity="1.0" IsMenuEnabled="True" IsVisible="True"></>
После этого всякий раз, когда она прокручивается обратно, сделать Mode
из AppBar
в Default
.
Или еще посмотрите на это, чтобы обнаружить нижнюю часть longlistselector
.
Ok я реализовал пользовательский LongListSelector, теперь мой вопрос с созданием режима приложения бар конвертера для любого дисплея свернутого или обычного размером AppBar .. – Matthew
я добавил код в режиме AppBar преобразователь I создано. Так как моя панель приложений находится в коде, как я могу привязать ее в коде, чтобы обновить режим панели приложений, когда прокручивается longlistselector? – Matthew
Вы не можете привязать обычный AppBar, вы можете использовать стороннюю панель с более слабым шаблоном (Caliburn.Micro). В вашем случае я бы перезвонил, когда ScrollDirectionDown изменился, чтобы изменить видимость ApplicationBar. Но для простоты я просто добавлю его в событие изменения ManipulationStateChanged в пользовательском LLS. См. Обновленное решение. –