Прокрутите до конца списка wp7

У меня есть много элементов (0-100) и конец необходимо прокрутить до нижней части списка, который содержит его. Я пытался:

ScrollViewer.SetVerticalScrollBarVisibility(listmy, ScrollBarVisibility.Auto);
            listmy.SelectedItem =  listmy.Items.Count-1;
            listmy.ScrollIntoView(listmy.SelectedItem);
            ScrollViewer.SetVerticalScrollBarVisibility(listmy, ScrollBarVisibility.Disabled);

но это не работает для меня. Scrollviewer оборачивает список и текстовое поле.(вертикальная прокрутка списка в отключенном состоянии). UPD xaml:

<Grid>

    <ScrollViewer Name="_ScrollViewer" VerticalScrollBarVisibility="Auto">
        <StackPanel Name="stackPanel" Height="auto">
          <ListBox ScrollViewer.VerticalScrollBarVisibility="Disabled"  x:Name="listmy">
            <ListBox.ItemTemplate>
              <DataTemplate>...

и CS:

listmy.ItemsSource = ((App)Application.Current).DIALOG;
        ScrollViewer.SetVerticalScrollBarVisibility(listmy, ScrollBarVisibility.Auto);
        listmy.SelectedIndex =  listmy.Items.Count-1;
        listmy.ScrollIntoView(listmy.SelectedItem);
        ScrollViewer.SetVerticalScrollBarVisibility(listmy, ScrollBarVisibility.Disabled);

4 ответа

Решение

Я полагаю, что вы на самом деле хотите просто убедиться, что полоса прокрутки ListBox всегда полностью прокручивается вниз. Другие решения только для того, чтобы убедиться, что последняя строка видна (не то же самое).

Чтобы получить желаемый эффект, вы можете создать простой подклассный ListBox, например:

    using System.Windows.Controls;
    namespace ScrollBarTest
    {
        public class CustomListBox : ListBox
        {
            public void ScrollToBottom()
            {
                var scrollviewer = GetTemplateChild("ScrollViewer") as ScrollViewer;
                scrollviewer.ScrollToVerticalOffset(scrollviewer.ScrollableHeight);
            }
        }
    }

Не используйте внешний ScrollViewer, как в примере, только подклассный ListBox

Просто вызывайте метод ScrollToBottom() всякий раз, когда вы хотите прокрутить его до последней строки.

Причина подкласса заключается в том, что GetTemplateChild является protected поэтому недоступен извне производного класса.

Как насчет этого:

var lastItem = listmy.Items[listmy.Items.Count - 1];
listmy.ScrollIntoView(lastItem);

Я попробовал это на примере проекта, и он работал отлично!

Наткнулся на это и не нашел решения "работает из коробки без кода", поэтому я просто придумал этот класс:

using System.Windows.Controls;

/// <summary>
/// A list box which automatically scrolls to the last line if new items were added.
/// </summary>
public class AutoscrollListBox : ListBox
{
    /// <summary>
    /// The on items changed.
    /// </summary>
    /// <param name="e">
    /// The e.
    /// </param>
    protected override void OnItemsChanged(System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
    {
        this.ScrollDown();
        base.OnItemsChanged(e);
    }

    /// <summary>
    /// Scrolls to the last element.
    /// </summary>
    private void ScrollDown()
    {
        if (this.Items.Count > 0)
        {
            var lastItem = this.Items[this.Items.Count - 1];
            this.ScrollIntoView(lastItem);
        }
    }
}

Просто используйте этот список, и никакой дополнительной "магии" не требуется.

Если вы просто устанавливаете индекс выбора ListBox, он должен работать. Я попробовал это, и это, казалось, работало хорошо.

listBox1.SelectedIndex = listBox1.Items.Count - 1;

Я попробовал это, и он прокрутил до конца ListBox, без проблем.

Другие вопросы по тегам