Бесконечный поворотный контроль - PullRequest
5 голосов
/ 28 февраля 2011

Я пытаюсь использовать элемент управления Pivot для приложения типа календаря, где каждое представление Pivot показывает некоторую информацию о текущем дне. Когда пользователь перемещается вперед, отображается следующий день. Я реализовал это, добавив элементы в конец коллекции Pivot Item, которая отлично работает.

Моя проблема возникает, когда пользователь пытается вернуться назад к предыдущему дню. В этом случае новый элемент добавляется в начало коллекции элементов Pivot. Хотя добавление работает, показанный элемент Pivot всегда неправильный (т. Е. Вновь добавленный элемент). Установка SelectedItem на элементе управления Pivot не помогает.

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

код для моей Viewmodel, который реализует движение вперед / назад на один день. Pages связан с осью ItemSource.

public class TrackDayViewModel : HubViewModelBase
{
    private DateTime _CurrentDay;
    public DateTime CurrentDay
    {
        get { return _CurrentDay; }
        set
        {
            if (value.CompareTo (_CurrentDay) != 0)
            {
                _CurrentDay = value;
                OnPropertyChanged("CurrentDay");
            }
        }
    }

    public TrackDayViewModel ()
    {
        var day = DateTime.Now;

        CurrentDay = day.Midnight();

        Pages.Add(new DayViewModel(CurrentDay.AddDays(-1)));
        Pages.Add(new DayViewModel(CurrentDay));
        Pages.Add(new DayViewModel(CurrentDay.AddDays(1)));

        SelectedItem = Pages[1];

        this.PropertyChanged += (s, e) =>
        {
            if (e.PropertyName == "SelectedItem")
            {
                var si = SelectedItem as DayViewModel;

                if (si != null)
                {
                    var idx = Pages.IndexOf(SelectedItem);
                    if (idx==0)
                    {
                        Pages.Insert(0, new DayViewModel(si.Day.AddDays(-1)));
                        SelectedItem = Pages[1];
                    }
                    else if (idx == (Pages.Count - 1))
                    {
                        Pages.Add(new DayViewModel(si.Day.AddDays(1)));
                    }
                }
            }
        };
    }
}

РЕДАКТИРОВАТЬ: Изменение, которое решило мою проблему:

        this.PropertyChanged += (s, e) =>
        {
            if (e.PropertyName == "SelectedItem")
            {
                var si = SelectedItem as DayViewModel;

                if (si != null)
                {
                    var idx = Pages.IndexOf(SelectedItem);

                    int nextIdx = (idx + 1) % 3;
                    int prevIdx = ((idx - 1)<0)  ? 2 : (idx-1);

                    Pages[nextIdx] = new DayViewModel(si.Day.AddDays(1));
                    Pages[prevIdx] = new DayViewModel(si.Day.AddDays(-1));
                }
            }
        };

Ответы [ 2 ]

5 голосов
/ 28 февраля 2011

Для этого я бы использовал элемент управления Pivot с 4 страницами.

В любое время предыдущая, текущая и следующая страницы будут содержать правильные данные - и у вас всегда будет одна (пустая) страница

Затем вы можете реагировать на события, когда ваша текущая страница изменяется и изменилась - используйте эти события, чтобы настроить текущую (пустую) страницу для правильного нового содержимого, а затем очистить новую (пустую) страницу.

1 голос
/ 28 февраля 2011

В рекомендациях по управлению Pivot говорится, что этого следует избегать, если у вас больше 6 страниц.

Использование его для неограниченного количества страниц вне вопроса.

Я бы порекомендовал использовать TransitioningContentControl с помощью сенсорных жестов для перемещения вперед и назад. TransitioningContentControl позволяет использовать анимацию во время изменения содержимого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...