Переход к определенному ContentFrame при обновлении NavigationView - PullRequest
0 голосов
/ 11 июня 2018

У меня есть приложение, которое использует NavigationView в качестве UI-элемента управления.

Теперь у меня есть SettingsPage, где я могу изменить язык своего интерфейса между немецким и английским.

Я меняю язык с помощью этого кода:

public static void German()
    {
        Log.Logger.Information("Language = German")

        ApplicationLanguages.PrimaryLanguageOverride = "de-DE";
        DataCollection.Current.LanguageChangedEvent.LanguageChanged();
    }

Последняя строка вызывает EventHandler, который, в свою очередь, вызывает следующее событие в MainPage.xaml.cs, где расположен NavigationView.

public void ChangedLanguage(object source, EventHandlerBase e)
    {
        if (e.GetStatus())
        {

            Windows.ApplicationModel.Resources.Core.ResourceContext.GetForCurrentView().Reset();
            Windows.ApplicationModel.Resources.Core.ResourceContext.GetForViewIndependentUse().Reset();

            Frame.Navigate(this.GetType());

            ContentFrame.Navigate(typeof(SettingsPage));
        }
    }

Как можно видеть, я просто хочу вернуть пользователя на SettingsPage после смены языка.Но я всегда возвращаюсь к исходному HomePage, который я использую при запуске приложения.

Код, который я использую для NavigationView, взят из официального NavigationView , предоставленного Microsoft.

Есть ли способ сделать это?Единственное, что я могу себе представить, это установить флаг после первой загрузки страницы, а затем всегда проверять, установлен ли этот флаг.Но тогда у меня проблема в том, что я все еще мог приземлиться только на SettingsPage, потому что мне нужно было бы сделать это else пунктом назначения для проверки флага.

Был бы действительно более динамичным способом, если бы этодаже возможно: /

Приветствие, Даниил

1 Ответ

0 голосов
/ 13 июня 2018

Образец NavigationView - это простой пример кода для справки.Вам нужно внести некоторые изменения в соответствии с вашими требованиями.

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

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

Во-первых, в обработчике события NavView_Loaded он всегда устанавливает домашнюю страницу в качестве выбранного элемента.Но когда вы меняете язык, вы переходите к «MainPage» и заставляете «ContentFrame» переходить к «SettingsPage».В это время сначала будет вызван обработчик события On_Navigated.Затем будет вызван обработчик события NavView_Loaded.По этой причине ваше приложение всегда будет возвращаться на домашнюю страницу.

Второе событие, если установлен SelectedItem в NavigationView.Но событие ItemInvoked NavigationView не будет запущено.Итак, на самом деле вы видите не домашнюю страницу, а пустой элемент управления Frame.Вы можете использовать событие SelectionChanged вместо события ItemInvoked.Событие SelectionChanged будет запущено, когда вы установите новое значение для SelectedItem в NavigationView.Смотрите следующий пример:

private void NavView_SelectionChanged(NavigationView sender, NavigationViewSelectionChangedEventArgs args)
{
    if (args.IsSettingsSelected)
    {
        ContentFrame.Navigate(typeof(SettingsPage));
    }
    else
    {
        NavView_Navigate(args.SelectedItem as NavigationViewItem);
    }
}

Затем вернемся к исходному вопросу:

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

По моему мнению, флаг не повлияет на васделать другие вещи.Вы можете полностью определить несколько флагов.Пожалуйста, посмотрите мой следующий фрагмент кода для справки:

public static void German()
{
    Log.Logger.Information("Language = German")
    ApplicationLanguages.PrimaryLanguageOverride = "de-DE";
    ApplicationData.Current.LocalSettings.Values["IsSwitchingLanguage"] = true;
    DataCollection.Current.LanguageChangedEvent.LanguageChanged();
}

В вашем MainPage.xaml.cs:

public void ChangedLanguage(object source, EventHandlerBase e)
{
        if (e.GetStatus())
        {
            Windows.ApplicationModel.Resources.Core.ResourceContext.GetForCurrentView().Reset();
            Windows.ApplicationModel.Resources.Core.ResourceContext.GetForViewIndependentUse().Reset();
            Frame.Navigate(this.GetType());

        }
}

В NavView_Loaded обработчике событий я внес некоторые изменения:

private void NavView_Loaded(object sender, RoutedEventArgs e)
{
        ...... 
        foreach (NavigationViewItemBase item in NavView.MenuItems)
        {
            var IsSwitchingLanguage = ApplicationData.Current.LocalSettings.Values["IsSwitchingLanguage"];
            if (IsSwitchingLanguage != null)
            {
                if ((bool)IsSwitchingLanguage)
                {
                    NavView.SelectedItem = NavView.SettingsItem as NavigationViewItem;
                    ApplicationData.Current.LocalSettings.Values["IsSwitchingLanguage"] = false;
                    break;
                }

            }
            if (item is NavigationViewItem && item.Tag.ToString() == "home")
            {
                NavView.SelectedItem = item;
                break;
            }
        }

        ......
}
...