2012-08-24 2 views
0

У меня есть список, который содержит 20-50 элементов. Все элементы должны сортироваться по уникальному идентификатору. После применения сортировки мой список прокручивается вверху. Как это предотвратить? Сортировать функцияКак сохранить позицию listboxitem при добавлении/удалении элементов?

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

Вам использовать ScollIntoView (пункт), если вы нашли нужный элемент. Или получить ActualHeight из ScrollViewer –

ответ

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

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

this.ListBox1.SelectedIndex = this.ListBox1.Items.Count - 1; 
+0

Я пробовал это, и ничего не происходит. – SevenDays

+0

Вы пробовали это после вызова вашей функции сортировки? –

+0

Да, я пробовал. Ничего не происходит, когда я вызываю свиток сортировки функции свитки вверху. – SevenDays

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(); 
+0

В WP7 listbox нет метода IndexFromPoint – SevenDays

0

Извлечение ScrollViewer с ListBox, используя эту функцию

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

Примечание: играть с значением смещения до вас получить желаемый результат. Надеюсь, что это помогает

Смежные вопросы