【问题标题】:Scroll to bottom of listbox wp7滚动到列表框wp7的底部
【发布时间】:2011-09-13 21:13:01
【问题描述】:

我有很多项目(0-100)需要滚动到包含它的列表框底部。我试过了:

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

但这对我不起作用。滚动查看器包装了列表框和文本框。(列表框垂直滚动处于禁用状态)。 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);

【问题讨论】:

  • 这是什么意思:“滚动查看器包装了列表框和文本框”?你有一个 ListBox(它有自己的内部 ScrollViewer)和一个你自己的 Outer ScrollViewer?
  • 发布一些 XAML 来展示你的 UI 布局怎么样?按照目前的措辞,您的问题毫无意义。
  • 对不起,我的英文不好。我贴了代码。

标签: c# silverlight windows-phone-7 listbox scrollviewer


【解决方案1】:

我猜您实际上只想确保 ListBox 的 ScrollBar 始终完全滚动到底部。其他解决方案只是确保最后一行可见(不是同一件事)。

要获得您想要的效果,您可以像这样创建一个简单的子类 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,因此无法从派生类外部访问。

【讨论】:

    【解决方案2】:

    这个怎么样:

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

    我在一个示例项目上尝试过,效果很好!

    【讨论】:

    • 我已经将我的示例项目上传到chriskoenig.net/upload/ScrollToBottom70.zip。我还验证了这在 SDK 7.0 和 SDK 7.1 中都有效。查看示例,看看是否有效 - 如果无效,也许我根本不理解您的问题 :-)
    • 我需要在我的项目中滚动。示例代码:ScrollViewer.SetVerticalScrollBarVisibility(listmy, ScrollBarVisibility.Auto); var lastItem = listmy.Items[listmy.Items.Count - 1]; listmy.ScrollIntoView(lastItem); ScrollViewer.SetVerticalScrollBarVisibility(listmy, ScrollBarVisibility.Disabled);
    • 我想我真的不知道您要做什么,并且在 ScrollViewer 中放置一个 ListBox 对我来说似乎不是一个好的 UX 隐喻。是否有一个示例项目我可以在某处下载以查看您要完成的工作,因为我显然不了解您要做什么...
    • 它运行不正常。想象一下您的来源保留了字符串列表。并且字符串可以重复。您仅为第一个找到的项目编写滚动代码。
    【解决方案3】:

    遇到了这个,还没有找到“开箱即用,没有代码隐藏”的解决方案,所以我就想出了这个类:

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

    只需使用此列表框,无需额外的“魔法”。

    【讨论】:

      【解决方案4】:

      如果您只是设置 ListBox 的选择索引,它应该可以工作。我试了一下,感觉还不错。

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

      我试过了,它滚动到列表框的底部,没有问题。

      【讨论】:

        猜你喜欢
        • 2011-05-02
        • 2013-01-25
        • 1970-01-01
        • 1970-01-01
        • 2013-04-17
        • 1970-01-01
        • 2023-03-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多