2013-07-22 2 views
0

Моя проблема заключается в том, что у меня есть ящик: списку новостейProgramly список прокрутки окно

enter image description here

Taping на какой-то предмет будет открыть Aticle страницу с полным текстом статьи.

Так что, когда я вернуться обратно на странице новостей я вижу List Box, как это было прежде, чем я переходите к статье, но я хочу элемент, который был использован появляются на верхней

1) Изменение индекса Безразлично потому что они должны оставаться такими, какие они есть.

Я Пытался:

if (currentArticle < NewsListBox.SelectedIndex) 
{ 
    var scrollViwer = GetScrollViewer(NewsListBox) as ScrollViewer; 
    if (scrollViwer != null) 
    { 

     scrollViwer.ScrollToVerticalOffset(scrollViwer.VerticalOffset + (NewsListBox.SelectedIndex - currentArticle)); 
    } 
    currentArticle = NewsListBox.SelectedIndex; 
} 
else if (currentArticle == NewsListBox.SelectedIndex) 
{ 
} 
else 
{ 
    var scrollViwer = GetScrollViewer(NewsListBox) as ScrollViewer; 
    if (scrollViwer != null) 
    { 
     scrollViwer.ScrollToVerticalOffset(scrollViwer.VerticalOffset - (currentArticle - NewsListBox.SelectedIndex)); 
    } 
    currentArticle = NewsListBox.SelectedIndex; 
} 

public static DependencyObject GetScrollViewer(DependencyObject o) 
{ 
    // Return the DependencyObject if it is a ScrollViewer 
    if (o is ScrollViewer) 
    { return o; } 

    for (int i = 0; i < VisualTreeHelper.GetChildrenCount(o); i++) 
    { 
     var child = VisualTreeHelper.GetChild(o, i); 

     var result = GetScrollViewer(child); 
     if (result == null) 
     { 
      continue; 
     } 
     else 
     { 
      return result; 
     } 
    } 
    return null; 
} 

Это работает, но оно не место элемента правильно на вершине, если предыдущий элемент не было правильно сверху - что невозможно, когда пользователь будет делать скроллинг.

Сложение:

NewsListBox.ScrollIntoView(NewsListBox.Items[5]); 

работает отлично, но он показывает элемент на дне, мне нужно сверху.

ДОПОЛНЕНИЕ 2:

Это будет работать нормально:

NewsListBox.ScrollIntoView(NewsListBox.SelectedIndex+OFFSET); 

Мне нужна помощь, чтобы вычислить это смещение

ответ

0

Я не уверен, что вы пытаетесь сделать с ScrollViewer, но когда мне нужно переустановить порядок элементов в контейнере управления UI, например ListBox, я просто переустанавливаю заказ элементов в объекте сбора данных, который связан с элементом управления, и элементы в элементе управления следуют этому порядку.

Вы можете заказать их по дате (и времени) в качестве предложенного или просто переместить выбранный элемент в первую позицию в коллекции с использованием метода Insert.

Извинения, если я пропустил вашу точку.

После прочтения вашего вопроса снова я вижу строку, в которой индексы объектов коллекции должны оставаться неизменными. Если под этим вы подразумеваете, что вы не можете сортировать оригинальную коллекцию, вам нужно будет отсортировать другую коллекцию, скопированную из исходной коллекции.

Я часто делаю это, чтобы позволить пользователю фильтровать коллекцию объектов, сохраняя неизменную первоначальную коллекцию объектов. У вас есть два выбора; либо создайте другое свойство того же типа, что и ваша коллекция, в вашем коде позади/просмотрите модель и скопируйте исходную коллекцию в нее или используйте объект xaml CollectionViewSource для сортировки объектов в пользовательском интерфейсе.

+0

Я нашел решение, возможно, не совершенное, но оно работает: scrollViwer.ScrollToVerticalOffset (0); scrollViwer.ScrollToVerticalOffset (NewsListBox.SelectedIndex); – Cheese

+0

Как насчет того, чтобы ответить на этот вопрос и отметить этот вопрос как «ответил»? – Sheridan

+0

LOL. Извините, я не имел в виду, чтобы вы правильно оценили мой ответ, я хотел правильно указать правильный правильный ответ. :) – Sheridan

0

Как насчет добавления свойства "UsedDate" из "DateTime", что указывает на то, последней используемой даты и сортировки ListBox по UserDate.

+0

Если в тот же день было 2 статьи? И я сказал, что не могу их сортировать - они должны оставаться такими, какими они являются – Cheese

+0

Существует также временная часть объекта DateTime, которая может различать время, в течение которого просматривались различные статьи (даже в тот же день). – Sheridan

1

Я нашел решение, возможно, не совершенное, но оно работает: scrollViwer.ScrollToVerticalOffset (0); scrollViwer.ScrollToVerticalOffset (NewsListBox.SelectedIndex);

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