Есть ли возможность сделать дополнительную навигацию внутри заголовка UWP

введите сюда описание изображения

Хочу сделать для приложения дополнительную навигацию через заголовок. Суть в том чтобы при навигации на вкладу Accounts можно было перейти на страницу Your Microsoft account через кнопку расположенную внутри страницы Accounts. Есть ли уже готовый способ сделать такую же навигацию в заголовке как показано на картинке? То бишь при нажатии на кнопку Accounts я бы мог перейти на эту страницу.

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

Вопрос 1 Как перейти на другую страницу через кнопку расположенную внутри страницу (не NavigationView);

Вопрос 2 Можно ли как-то забиндить навигационный заголовок через скрипт (с кнопками навигации)


Ответы (1 шт):

Автор решения: Cobret

Готового решения пока нет но я смог написать свой вариант для такого:

Для начала внутрь 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);
    }
→ Ссылка