Прокрутите до конца списка wp7 - PullRequest
2 голосов
/ 14 сентября 2011

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

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

, но это не сработало для меня.listbox и textbox. (вертикальная прокрутка списка в отключенном состоянии).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 ]

5 голосов
/ 27 сентября 2011

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

3 голосов
/ 22 сентября 2011

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

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

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

2 голосов
/ 03 января 2013

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

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);
        }
    }
}

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

1 голос
/ 14 сентября 2011

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

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

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

...