Xamarin Forms: сохранить выбранную вкладку поверх перезапусков активности - PullRequest
0 голосов
/ 29 мая 2019

Моя главная страница использует TabbedPage для группировки существующих новостей в разные списки. Вкладки не исправлены; они построены из операций привязки данных к коллекции, которая повторяется через вызов веб-службы.

Я бы хотел сохранить выбранную вкладку при перезапуске активности, но, похоже, я что-то упустил. Поскольку нет свойства выбранной вкладки (которое можно установить с помощью привязки данных), я попытался обработать события PageChanged и CurrentPageChangedCommand. Я использую PageChanged, чтобы установить выбранную вкладку на предыдущую выбранную вкладку, а CurrentPageChangedCommand используется для обновления сохраняемой выбранной вкладки (я использую Application.Properties, чтобы убедиться, что выбранная вкладка сохраняется, перезапускает приложение. ).

К сожалению, события, генерируемые вкладкой, всегда будут устанавливать вкладку 0 в качестве выбранной вкладки! Вот что я вижу (предположим, что мое приложение было убито, белая вкладка 3 была активна):

  1. Когда данные связаны со свойством TabbedPage.ItemsSource, вкладка автоматически запускает CurrentPageChangedCommand, пропуская первую вкладку (вкладка в позиции 0).
  2. Мой код обрабатывает событие и обновляет текущую сохраненную выбранную вкладку, изменяя выбранную вкладку в словаре Properties. Так что теперь вместо 3 (значение, которое сохранялось при удалении моего приложения), оно будет равно 0.
  3. Тогда на вкладке сработает PagesChanged
  4. Когда мой код обрабатывает это событие, он пытается обновить выбранную вкладку. Однако, когда он получает доступ к выбранной вкладке из словаря Properties, он получает вкладку по умолчанию (0), а не 3. Это происходит потому, что CurrentPageChangedCommand был запущен до события PagesChanged (шаг 2), полностью переопределяя ранее сохраненный индекс табуляции.

Это поведение по умолчанию также даст плохой пользовательский опыт, когда пользователь обновляет текущий список (тянуть, чтобы обновить), потому что он всегда заканчивает тем, что видел список с табуляцией 0.

Итак, есть какие-нибудь подсказки, как это решить? Как вы, ребята, решили это?

Спасибо.

Ответы [ 2 ]

0 голосов
/ 30 мая 2019

Кажется, что этого нельзя достичь с помощью MVVM, поскольку CurrentPage не является привязываемым свойством, а CurrentPageChanged является событием.

Однако нет необходимости обрабатывать событие PagesChanged.Вы можете записать индекс в измененном событии, например:

private void MyTabbedPage_CurrentPageChanged(object sender, EventArgs e)
{
    Application.Current.Properties["index"] = this.Children.IndexOf(CurrentPage);
    Application.Current.SavePropertiesAsync();
}

Затем вы можете установить текущую страницу вашей вкладки после загрузки всех вкладок:

object index;
Application.Current.Properties.TryGetValue("index", out index);
if (index != null)
{
    CurrentPage = Children[int.Parse(index.ToString())];
}
// Subscribe the event
CurrentPageChanged += MyTabbedPage_CurrentPageChanged;

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

Обновление:

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

bool shouldChangeIndex = true;

private void MyTabbedPage_CurrentPageChanged(object sender, EventArgs e)
{
    if (shouldChangeIndex)
    {
        var index = this.Children.IndexOf(CurrentPage);
        Application.Current.Properties["index"] = index;
        Application.Current.SavePropertiesAsync();
    }            
}

// Simulate the adjusting
shouldChangeIndex = false;
Children.Clear();           
Children.Add(new MainPage());
Children.Add(new SecondPage());
shouldChangeIndex = true;

object index;
Application.Current.Properties.TryGetValue("index", out index);
if (index != null)
{
    CurrentPage = Children[int.Parse(index.ToString())];
}
0 голосов
/ 30 мая 2019

К сожалению, мне пришлось отказаться от подхода MVVM ... В конце концов, мне пришлось прибегнуть к коду и паре флагов, чтобы контролировать, когда должны обрабатываться сгенерированные события табуляции.

...