объект не содержит определения для Navigated - PullRequest
1 голос
/ 06 февраля 2020

я пытаюсь заставить работать навигацию по острову xaml в моем основном wpf-приложении и получить ошибку для:

            ContentFrame.Content.Navigated += On_Navigated;

вот мой mainwindow.cs:

public partial class MainWindow
{
    private NavigationView NavView;

    public MainWindow()
    {
        InitializeComponent();
    }

    // List of ValueTuple holding the Navigation Tag and the relative Navigation Page
    private readonly List<(string Tag, Type Page)> _pages = new List<(string Tag, Type Page)>
    {
        ("home", typeof(startPage)),
        ("other", typeof(otherPage)),
    };

    private void NavView_Loaded(object sender, Windows.UI.Xaml.RoutedEventArgs e)
    {
        NavView = MyNavView.Child as NavigationView;

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

        // NavView doesn't load any page by default, so load home page.
        NavView.SelectedItem = NavView.MenuItems[0];

        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;
        }

        var preNavPageType = ContentFrame.Content?.GetType();

        // Only navigate if the selected page isn't currently loaded.
        if (!(_page is null) && !Type.Equals(preNavPageType, _page))
        {
            //ContentFrame.Navigate(_page, null, transitionInfo);
        }
    }



    private void On_Navigated(object sender, NavigationEventArgs e)
    {

        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.SourcePageType);

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

            NavView.Header =
                ((NavigationViewItem)NavView.SelectedItem)?.Content?.ToString();
        }
    }



}

вот это xaml :

<Window x:Class="GUI_Test.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:GUI_Test"
    mc:Ignorable="d"
    xmlns:xamlHost="clr-namespace:Microsoft.Toolkit.Wpf.UI.XamlHost;assembly=Microsoft.Toolkit.Wpf.UI.XamlHost"  
    Title="MainWindow" Height="450" Width="800">
<Grid>
    <xamlHost:WindowsXamlHost x:Name="MyNavView" InitialTypeName="Windows.UI.Xaml.Controls.NavigationView" />
    <ScrollViewer>
        <Frame x:Name="ContentFrame" Padding="12,0,12,24" IsTabStop="True"/>
    </ScrollViewer>
</Grid>

Большая часть кода взята из: https://docs.microsoft.com/en-us/windows/uwp/design/controls-and-patterns/navigationview, все, что я делал, это выбрасывал такие вещи, как навигация с помощью клавиатуры и использование в MainWindow.xaml

        <xamlHost:WindowsXamlHost x:Name="MyNavView" InitialTypeName="Windows.UI.Xaml.Controls.NavigationView" />

Надеюсь, у кого-то уже есть такие вещи, которые могут помочь мне запустить навигацию в ядре WPF.

спасибо

Обновил код и получил сейчас ошибок больше нет.

           private void On_Navigated(object sender, System.Windows.Navigation.NavigationEventArgs e)
    {
        NavView.IsBackEnabled = ContentFrame.CanGoBack;

        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?.GetType());

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

            NavView.Header =
                ((NavigationViewItem)NavView.SelectedItem)?.Content?.ToString();
        }
    }

1 Ответ

1 голос
/ 06 февраля 2020

Событие Navigated относится к Frame, а не к его Content:

ContentFrame.Navigated += On_Navigated;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...