
Если вы захотите вынести настройки своего приложения UWP в «летающую панельку» Flyout, то я вас огорчу. Летающие панельки точно так же как и «волшебные Charm панельки» ушли в прошлое и теперь вместо них необходимо использовать другой способ отображения информации – навигацию. Про то, что и как читайте дальше
Сейчас в Windows 10 все еще можно увидеть «летающую панельку» даже в интерфейсе самой системы. Взять, к примеру, «Центр уведомлений»:

Однако, при разработке нового универсального приложения контрол «из коробки» уже отсутствует. Вот такой элемент управления можно было добавить в приложение Windows 8.1
Сейчас, в связи с тем, что приложения Windows 10 стали универсальными и аналог «летающей панельки» Flyout для мобильных устройств отсутствует, нам предлагается замена в виде навигации и меню гамбургера
При этом всплывающие уведомления в виде контрола FlyOut в универсальных приложениях есть. Но это не вылетающая справа панель, а просто всплывающие уведомления. Для сравнения на следующем скриншоте над кнопкой отображен всплывающий элемент типа FlyOut:
Для тех, кому любопытно, XAML код примера скрыт под спойлером:
Открыть код
<Button HorizontalAlignment="Center" Margin="0,125,0,0" x:Name="buttonWithFlyout" Content="Открыть FlyOut"> <Button.Flyout> <Flyout> <StackPanel> <TextBlock>Текст Текст Текст Текст и что-нибудь полезное</TextBlock> <Button Click="VeryImportantButton_Click" Margin="0,5,0,0"> Очень полезная кнопка </Button> <TextBlock>и еще какой-нибудь текст</TextBlock> </StackPanel> </Flyout> </Button.Flyout> </Button>
Для того чтобы FlyOut был отображен после клика не нужно реализовывать событие Click и добавлять какой-то код C#. Достаточно того, что FlyOut привязан к кнопке (является дочерним элементом).
Но речь пойдет не о нем, а о том как сделать навигацию на страницу настроек и добавить кнопку «Назад». Сначала создадим страницу с настройками: Меню «Проект» — «Добавить новый элемент»:
Выбираем элемент типа «Пустая страница». Я решил назвать страницу именем SettingsPage.xaml.
Теперь нам нужно добавить кнопку перехода на эту страницу с настройками. Я решил для этого создать TopAppBar и добавить в него CommandBar с кнопочкой. Код XAML такой:
<Page.TopAppBar> <CommandBar IsOpen="False" ClosedDisplayMode="Minimal"> <CommandBar.PrimaryCommands> <AppBarButton x:Name="btnSettings" Label="Настройки" Click="btnSettings_Click" Icon="Setting" > </AppBarButton> </CommandBar.PrimaryCommands> </CommandBar> </Page.TopAppBar>
В закрытом виде AppTopBar с кнопкой будет таким:

А в открытом виде:

Теперь нужно реализовать событие btnSettings_Click. Оно довольно простое:
private void btnSettings_Click(object sender, RoutedEventArgs e) { this.Frame.Navigate(typeof(SettingsPage)); }
Бамс… И после нажатия кнопки мы переходим на страницу SettingsPage.xaml. Но вот вернуться назад у нас не получится.
Для того чтобы была возможность возвратится на последнюю страницу, можно добавить кнопку «Назад». Предлагаю воспользоваться следующим сниппетом, который я опишу далее. Открываем App.xaml.cs и добавляем ссылку на пространство имен:
using Windows.UI.Core;
В конец метода void OnLaunched после объявления и инициализации rootFrame и всякого другого кода добавляем регистрацию двух событий:
rootFrame.Navigated += OnNavigated; SystemNavigationManager.GetForCurrentView().BackRequested += OnBackRequested;
Это событие перехода на текущую страницу и событие запроса перехода на предыдущую страницу. В событии OnNavigated мы, используя conditional operator, отобразим кнопку «Назад» или скроем ее в зависимости от того есть ли возможность перейти на страницу назад или нет:
private void OnNavigated(object sender, NavigationEventArgs e) { // каждый раз когда загружаем страницу мы отображаем или скрываем кнопку SystemNavigationManager.GetForCurrentView().AppViewBackButtonVisibility = ((Frame)sender).CanGoBack ? AppViewBackButtonVisibility.Visible : AppViewBackButtonVisibility.Collapsed; }
В событии запроса перехода назад, которое возникает при нажатии на BackButton мы вернемся на последнюю страницу с помощью rootFrame.GoBack();
private void OnBackRequested(object sender, BackRequestedEventArgs e) { Frame rootFrame = Window.Current.Content as Frame; if (rootFrame.CanGoBack) { e.Handled = true; rootFrame.GoBack(); } }
Казалось бы, проверка на if (rootFrame.CanGoBack) здесь не совсем обязательна, так как мы отображаем кнопку «Назад» только в случае, если есть возможность перейти назад. Но еще может быть нажата и аппаратная кнопка на телефоне, так что пусть остается.
В результате при переходе на страницу настроек получим такую вот кнопку в верхнем левом углу:

Исходный код примера доступен на GitHub.
UPDATE: Отличной альтернативой для отображения настроек приложения может стать PopUp или окошко ContentDialog:
Но об этом уже в другой статье.