Есть ли возможность сделать дополнительную навигацию внутри заголовка UWP
Хочу сделать для приложения дополнительную навигацию через заголовок. Суть в том чтобы при навигации на вкладу Accounts можно было перейти на страницу Your Microsoft account через кнопку расположенную внутри страницы Accounts. Есть ли уже готовый способ сделать такую же навигацию в заголовке как показано на картинке? То бишь при нажатии на кнопку Accounts я бы мог перейти на эту страницу.
Пока в голове есть вариант для создания для каждой страницы своего заголовка, где было бы уже заранее прописаны пути.
Вопрос 1 Как перейти на другую страницу через кнопку расположенную внутри страницу (не NavigationView);
Вопрос 2 Можно ли как-то забиндить навигационный заголовок через скрипт (с кнопками навигации)
Ответы (1 шт):
Готового решения пока нет но я смог написать свой вариант для такого:
Для начала внутрь muxc:NavigationView нужно добавить поле для заголовка:
<muxc:NavigationView.Header>
<StackPanel x:Name="navigationHeader" Orientation="Horizontal"/>
</muxc:NavigationView.Header>
Далее я создал простой класс с помощью которого можно легко составить иерархию, то бишь чтобы страница Your Microsoft account была дочерней для другой категории Accounts и так можно продолжать ряд:
public class HierachicalItem
{
public string tag;
public Type page;
public HierachicalItem parentPage;
public HierachicalItem(string tag, Type page, HierachicalItem parentPage)
{
this.tag = tag;
this.page = page;
this.parentPage = parentPage;
}
}
И на основе это класа создать список:
private readonly List<HierachicalItem> pages = new List<HierachicalItem>()
{
new HierachicalItem("accounts", typeof(Accounts), null),
new HierachicalItem("yourMicrosoftAccount", typeof(YourMicrosoftAccount), new HierachicalItem("accounts", typeof(Accounts), null)),
};
Далее сам метод для заполнения navigationHeader:
private void SetNavigationHeader(HierachicalItem item)
{
List<Button> buttons = new List<Button>();
navigationHeader.Children.Clear();
if (item.parentPage == null)
{
Button button = new Button();
button.Content = "buttonName";
button.Tag = item.tag;
button.Click += NavView_ButtonInvoked;
button.IsEnabled = false;
buttons.Add(button);
navigationHeader.Children.Add(button);
}
else
{
var _item = item;
var resourceLoader = ResourceLoader.GetForCurrentView();
while (true)
{
Button button = new Button();
button.Content = "buttonName";
button.Tag = _item.tag;
button.Click += NavView_ButtonInvoked;
buttons.Add(button);
if (_item.parentPage == null) break;
_item = _item.parentPage;
}
for (int i = buttons.Count - 1; i >= 0; i--)
{
if (i == 0)
{
buttons[i].IsEnabled = false;
navigationHeader.Children.Add(buttons[i]);
}
else
{
buttons[i].IsEnabled = true;
FontIcon icon = new FontIcon();
icon.FontFamily = new FontFamily("Segoe MDL2 Assets");
icon.Glyph = "\uE970";
icon.FontSize = 12;
icon.FontWeight = Windows.UI.Text.FontWeights.Black;
icon.VerticalAlignment = VerticalAlignment.Center;
icon.Margin = new Thickness(20, 0, 20, 0);
navigationHeader.Children.Add(buttons[i]);
navigationHeader.Children.Add(icon);
}
}
}
}
Сам метод будет вызываться методами On_Navigated(object sender, NavigationEventArgs e) привязанным к NavigationView.ItemInvoked а также методом который был привязан к Button.Click:
private void NavView_ButtonInvoked(object sender, RoutedEventArgs e)
{
Button button = sender as Button;
string tag = button.Tag.ToString();
NavView_Navigate(tag, new muxc.NavigationViewItemInvokedEventArgs().RecommendedNavigationTransitionInfo);
NavView.SelectedItem = NavView.MenuItems.OfType<muxc.NavigationViewItem>().First(n => n.Tag.Equals(tag));
HierachicalItem tem = new HierachicalItem(null, null, null);
foreach (var item in pages)
{
if (item.tag == tag)
{
tem = item;
break;
}
}
SetNavigationHeader(tem);
}
