Я разрабатываю приложение WinUI 3, и одну вещь, которую я не могу найти или понять, это то, как я могу открыть (NavigationViewItem, в основном вкладку «Главная», homePage
) при запуске приложения. У меня есть App.xaml и MainWindow.xaml. Я нашел еще один вопрос в Stackoverflow, в основном здесь, однако он использует ViewModel, но я не использую ViewModel. Как я могу добиться такого поведения?
Вот MainWindow.xaml
<Window
x:Class = "Ankara_Online.MainWindow"
xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x = "http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local = "using:Ankara_Online"
xmlns:d = "http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc = "http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable = "d">
<StackPanel>
<NavigationView x:Name = "_navigationView"
IsSettingsVisible = "False"
IsBackButtonVisible = "Collapsed"
IsBackEnabled = "False"
Header = "Home Page"
AlwaysShowHeader = "False"
PaneTitle = "navigationPane"
PaneDisplayMode = "Top"
ExpandedModeThresholdWidth = "500"
SelectionFollowsFocus = "Disabled"
IsTabStop = "False">
<NavigationView.Resources>
<SolidColorBrush x:Key = "NavigationViewTopPaneBackground" Color = "#195caa" />
</NavigationView.Resources>
<NavigationView.MenuItems>
<NavigationViewItem Content = "Home" Tag = "homePage" x:Name = "homePageItem">
<NavigationViewItem.Icon>
<SymbolIcon Symbol = "Play" />
</NavigationViewItem.Icon>
</NavigationViewItem>
<NavigationViewItem Content = "Applications and Sector Files" Tag = "softwareSectorFilePage" x:Name = "softwareSectorFilePageItem">
<NavigationViewItem.Icon>
<SymbolIcon Symbol = "Save" />
</NavigationViewItem.Icon>
</NavigationViewItem>
<NavigationViewItem Content = "Documentation" Tag = "DocumentationPage" x:Name = "DocumentationPageItem">
<NavigationViewItem.Icon>
<SymbolIcon Symbol = "Refresh" />
</NavigationViewItem.Icon>
</NavigationViewItem>
<NavigationViewItem Content = "Settings" Tag = "SettingsPage" x:Name = "SettingsPageItem">
<NavigationViewItem.Icon>
<SymbolIcon Symbol = "Refresh" />
</NavigationViewItem.Icon>
</NavigationViewItem>
</NavigationView.MenuItems>
<NavigationView.PaneCustomContent>
<HyperlinkButton x:Name = "PaneHyperlink" Content = "More info" Margin = "12,0" Visibility = "Collapsed" />
</NavigationView.PaneCustomContent>
<NavigationView.PaneFooter>
<StackPanel x:Name = "FooterStackPanel" Orientation = "Vertical" Visibility = "Visible">
<NavigationViewItem Icon = "Download" AutomationProperties.Name = "download" />
</StackPanel>
</NavigationView.PaneFooter>
<Frame x:Name = "contentFrame" />
</NavigationView>
</StackPanel>
</Window>
Редактирование и добавление XAML. Этот код очень простой, поскольку я только начал. Раньше я работал с WinForms, но WinUI 3 ощущается совсем по-другому.
Предполагая, что у вас есть HomePage.xaml
, вы можете сделать это следующим образом:
MainWindow.xaml
<Window
x:Class = "NavigationViewTest.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"
mc:Ignorable = "d">
<Grid>
<NavigationView x:Name = "NavigationViewControl">
<NavigationView.MenuItems>
<NavigationViewItem
Content = "Home"
Tag = "NavigationViewTest.HomePage" />
<NavigationViewItem
Content = "Page A"
Tag = "NavigationViewTest.PageA" />
</NavigationView.MenuItems>
<Frame x:Name = "ContentFrame" />
</NavigationView>
</Grid>
</Window>
MainWindow.xaml.cs
using Microsoft.UI.Xaml;
using Microsoft.UI.Xaml.Controls;
using System;
using System.Linq;
namespace NavigationViewTest;
public sealed partial class MainWindow : Window
{
public MainWindow()
{
this.InitializeComponent();
NavigateByTag("NavigationViewTest.HomePage");
this.NavigationViewControl.SelectionChanged += NavigationViewControl_SelectionChanged;
}
private void NavigationViewControl_SelectionChanged(NavigationView sender, NavigationViewSelectionChangedEventArgs args)
{
if (args.SelectedItem is NavigationViewItem item &&
item.Tag is string tag)
{
NavigateByTag(tag);
}
}
private void NavigateByTag(string tag)
{
if (this.NavigationViewControl.MenuItems
.OfType<NavigationViewItem>()
.Where(x => x.Tag.Equals(tag) is true)
.FirstOrDefault() is NavigationViewItem item)
{
this.NavigationViewControl.SelectedItem = item;
this.ContentFrame.Navigate(Type.GetType($"{item.Tag}"));
}
}
}
Это не сработало. Я пробовал несколько разных способов добиться этого: MainWindow_Activated, NavigationView_Loaded, запуск события HomePageItem_PointerPressed вручную, ни один из них не привел к отображению HomePage.xaml. Кроме того, дом также не выбирается заранее.
Это также вызвало исключение «Ссылка на объект не указывает на экземпляр объекта».
Я исправил ссылку на объект, не установленную на экземпляр ошибки объекта. Я думаю, что у меня здесь более серьезная проблема, поскольку ни одна из навигаций, похоже, не работает, поскольку contentframe ничего не отображает/не показывает.
Я обновил свой ответ минимальным рабочим примером. Надеюсь это поможет.
Было бы легче помочь, если бы вы делились кодом XAML со своим
NavigationView
.