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

これだけで助かりました

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 に答える
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

この関数を使用して listBox から scrollviewer を抽出します

    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 に答える