0

Im trying to getting a xaml island control working, it looks nice and seems to work except that I cant navigate between the views:

one exception I get is "NavigationView doesnt contain a definition for Child" for

            navView.SelectedItem = navView.Child.MenuItems[0];

But I think thats not all to get it done.

Thats my MainWindow.cs

    private readonly List<(string Tag, Type Page)> _pages = new List<(string Tag, Type Page)>
    {
        ("home", typeof(StartPage)),
        ("logs", typeof(Logs)),
    };
    private NavigationView navView;

    private void NavView_Loaded(object sender, RoutedEventArgs e)
    {

        // Add handler for ContentFrame navigation.
        ContentFrame.Navigated += On_Navigated;

        // NavView doesn't load any page by default, so load home page.
        navView.SelectedItem = navView.Child.MenuItems[0];
        // If navigation occurs on SelectionChanged, this isn't needed.
        // Because we use ItemInvoked to navigate, we need to call Navigate
        // here to load the home page.
        NavView_Navigate("home", new EntranceNavigationTransitionInfo());
    }

    private void NavView_ItemInvoked(NavigationView sender,
                                     NavigationViewItemInvokedEventArgs args)
    {
        if (args.IsSettingsInvoked == true)
        {
            NavView_Navigate("settings", args.RecommendedNavigationTransitionInfo);
        }
        else if (args.InvokedItemContainer != null)
        {
            var navItemTag = args.InvokedItemContainer.Tag.ToString();
            NavView_Navigate(navItemTag, args.RecommendedNavigationTransitionInfo);
        }
    }

    private void NavView_SelectionChanged(NavigationView sender,
                                          NavigationViewSelectionChangedEventArgs args)
    {
        if (args.IsSettingsSelected == true)
        {
            NavView_Navigate("settings", args.RecommendedNavigationTransitionInfo);
        }
        else if (args.SelectedItemContainer != null)
        {
            var navItemTag = args.SelectedItemContainer.Tag.ToString();
            NavView_Navigate(navItemTag, args.RecommendedNavigationTransitionInfo);
        }
    }

    private void NavView_Navigate(string navItemTag, NavigationTransitionInfo transitionInfo)
    {
        Type _page = null;
        if (navItemTag == "settings")
        {
            _page = typeof(SettingsPage);
        }
        else
        {
            var item = _pages.FirstOrDefault(p => p.Tag.Equals(navItemTag));
            _page = item.Page;
        }
    }


    private void On_Navigated(object sender, NavigationEventArgs e)
    {
        if (NavView.Child is NavigationView navigationView) {
            // NavView.IsBackEnabled = ContentFrame.CanGoBack;
            navView = navigationView;
            if (ContentFrame.Content?.GetType() == typeof(SettingsPage))
            {
                // SettingsItem is not part of NavView.MenuItems, and doesn't have a Tag.
                navView.SelectedItem = (NavigationViewItem)navView.SettingsItem;
                navView.Header = "Settings";
            }
            else if (ContentFrame.Content != null)
            {
                var item = _pages.FirstOrDefault(p => p.Page == e.Content);

                navView.SelectedItem = navView.MenuItems
                    .OfType<NavigationViewItem>()
                    .First(n => n.Tag.Equals(item.Tag));

                navView.Header =
                    ((NavigationViewItem)navView.Content)?.Content?.ToString();
            }
    } 

and here is my xaml:

    <xamlHost:WindowsXamlHost x:Name="NavView" InitialTypeName="Windows.UI.Xaml.Controls.NavigationView" Loaded="NavView_Loaded" />
<ScrollViewer>
  <Frame x:Name="ContentFrame" Padding="12,0,12,24" IsTabStop="True" />
</ScrollViewer>

thank you

mm8
  • 163,881
  • 10
  • 57
  • 88
  • Did you try `navView.SelectedItem = navView.MenuItems[0];`? A `NavigationView` has no `Child` property. – mm8 Feb 05 '20 at 13:55
  • Hi mm8 and thanks, that gives me: System.NullReferenceException: 'Object reference not set to an instance of an object.' navView was null. –  Feb 05 '20 at 14:05

1 Answers1

0

A Windows.UI.Xaml.Controls.NavigationView has no Child property so for your code to compile you should remove it from the following line:

navView.SelectedItem = navView.Child.MenuItems[0];

You also need to initialize your navView field to the instance of the UWP control:

private void NavView_Loaded(object sender, RoutedEventArgs e)
{
    navView = NavView.Child as NavigationView;
    ...
mm8
  • 163,881
  • 10
  • 57
  • 88
  • Ive removed the child and added the code from you: navView = NavView.Child as NavigationView; Then I get the following error: System.ArgumentOutOfRangeException: 'Specified argument was out of the range of valid values. ' –  Feb 05 '20 at 14:40
  • Then there are probably no menu items in the NavigationView. Your original question should have been answered though. But your code doesn't seem to work. – mm8 Feb 05 '20 at 14:42
  • The Menu Items are in a List at the top of the code, there 3 together with my settingspage. –  Feb 05 '20 at 15:00
  • What's the value of `navView.Child.MenuItems.Count` when you get the exception? Probably 0. – mm8 Feb 05 '20 at 15:01
  • Ive changed that line now to 'Type _page = null; _page = typeof(StartPage);' and errors are gone. But navigate is still not possible. I will start a rewrite and thank you for your time, it helps me a lot. –  Feb 05 '20 at 15:35