2014-09-18 1 views
2

Я просто хотел бы иметь возможность минимизировать панель приложений при прокрутке вниз, а затем показывать ее нормальный размер при прокрутке вверх. Я видел эту способность в приложении facebook, и это кажется очень привлекательным и удобным для пользователя. У меня есть LongListSelector с привязанными к нему элементами и панель приложений уже в коде. Каков недостающий ключ для включения такой функции?Определите, когда прокрутка LongListSelector

ответ

0

Вам просто нужно выяснить, когда пользователь прокручивает и в каком направлении. Вот отличная статья с примером кода. 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; 
     }    
    } 
} 
+0

Ok я реализовал пользовательский LongListSelector, теперь мой вопрос с созданием режима приложения бар конвертера для любого дисплея свернутого или обычного размером AppBar .. – Matthew

+0

я добавил код в режиме AppBar преобразователь I создано. Так как моя панель приложений находится в коде, как я могу привязать ее в коде, чтобы обновить режим панели приложений, когда прокручивается longlistselector? – Matthew

+0

Вы не можете привязать обычный AppBar, вы можете использовать стороннюю панель с более слабым шаблоном (Caliburn.Micro). В вашем случае я бы перезвонил, когда ScrollDirectionDown изменился, чтобы изменить видимость ApplicationBar. Но для простоты я просто добавлю его в событие изменения ManipulationStateChanged в пользовательском LLS. См. Обновленное решение. –

0

Для этого вам необходимо определить, когда начинается прокрутка 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.

Detecting WP8 LongListSelector’s end of scroll

 Смежные вопросы

  • Нет связанных вопросов^_^