я пытаюсь заставить работать навигацию по острову 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();
}
}