0

我有一个包含 20-50 个项目的列表框。所有项目必须按唯一 ID 排序。应用排序后,我的列表框在顶部滚动。如何防止这种情况?排序功能

public static void Sort<TSource, TValue>(IList<TSource> source, Func<TSource, TValue> selector) {
      for (int i = source.Count - 1; i >= 0; i--) {
        for (int j = 1; j <= i; j++) {
          TSource o1 = source.ElementAt(j - 1);
          TSource o2 = source.ElementAt(j);
          TValue x = selector(o1);
          TValue y = selector(o2);
          var comparer = Comparer<TValue>.Default;
          if (comparer.Compare(x, y) > 0) {
            source.Remove(o1);
            source.Insert(j, o1);
          }
        }
      }
    }
4

4 回答 4

0

要将 ListBox 焦点设置到列表中的最后一项,请使用以下表达式。

this.ListBox1.SelectedIndex = this.ListBox1.Items.Count - 1;
于 2012-08-24T22:25:12.773 回答
0

这适用于 Windows 7。我没有 WP7 来测试它。

// Finds the last item on the screen
int index = listBox1.IndexFromPoint(1, listBox1.Height - 5);

// Sorting stuff...

// Set the selected index to the one we saved, this causes the box to scroll it into view
listBox1.SelectedIndex = index;
// Clear the selection
listBox1.ClearSelected();
于 2012-08-24T22:26:11.040 回答
0

使用此函数从列表框中提取滚动查看器

    public ScrollViewer FindScrollViewer(DependencyObject parent)
    {
        var childCount = VisualTreeHelper.GetChildrenCount(parent);
        for (var i = 0; i < childCount; i++)
        {
            var elt = VisualTreeHelper.GetChild(parent, i);
            if (elt is ScrollViewer) return (ScrollViewer)elt;
            var result = FindScrollViewer(elt);
            if (result != null) return result;
        }
        return null;
    }

使用此功能滚动到列表中的新项目:

    private void ScrollToOnFreshLoad()
    {
        ScrollViewer scroll = FindScrollViewer(listBox);
        Int32 offset = Convert.ToInt32(scroll.VerticalOffset);

        //load new list box here

        //then do this
        listBox.ScrollIntoView(listItems[offset]);
    }

注意:使用偏移值直到获得所需的结果。希望能帮助到你

于 2012-08-25T07:36:13.517 回答
0

只有这个有帮助

void loadItems(){
//load
    var t = new DispatcherTimer { Interval = TimeSpan.FromMilliseconds(1000) };
            t.Tick += delegate {
              _ScrollViewer.UpdateLayout();
              SomethingLoading = false;
              listmy.ScrollIntoView(listmy.Items[listmy.Items.Count - 10]);
            };
            t.Start();
}
于 2012-08-25T10:41:09.803 回答