Я использую WinUi 3, набор инструментов сообщества mvvm и Net 8.0, с C# в качестве языка. У меня есть страница обзора, на которой должна отображаться коллекция элементов двумя возможными способами. В App.xaml.cs я добавил следующие страницы для загрузки с помощью DI.
services.AddTransient<OverviewPage>();
// Subpages of OverviewPage
services.AddTransient<Page1>();
services.AddTransient<Page2>();
У вас должна быть возможность просматривать элементы в виде списка или DataGrid. Для этого я добавил элемент управления SelectorBar с событием SelectionChanged и фреймом.
ОбзорPage.xaml
<Grid x:Name = "ContentArea">
<Grid.RowDefinitions>
<RowDefinition Height = "Auto" />
<RowDefinition Height = "9*" />
</Grid.RowDefinitions>
<SelectorBar Grid.Row = "0" SelectionChanged = "SelectorBar_OnSelectionChanged">
<SelectorBarItem Text = "All" IsSelected = "True"/>
<SelectorBarItem Text = "Page1" />
<SelectorBarItem Text = "Page2" />
</SelectorBar>
<Frame Grid.Row = "1" IsNavigationStackEnabled = "False" x:Name = "ContentFrame"/>
</Grid>
ОбзорPage.xaml.cs
private void SelectorBar_OnSelectionChanged(...) {
var currentSelectedItem = sender.SelectedItem;
var currentSelectedIndex = sender.Items.IndexOf(currentSelectedItem);
var pageType = currentSelectedIndex switch {
0 => typeof(Page1),
1 => typeof(Page2),
_ => throw new("invalid page index")
};
var slideNavigationTransitionEffect = currentSelectedIndex - _previousHistorySelectorBarIndex > 0 ? SlideNavigationTransitionEffect.FromRight : SlideNavigationTransitionEffect.FromLeft;
HistoryContentFrame.Navigate(pageType, null, new SlideNavigationTransitionInfo() { Effect = slideNavigationTransitionEffect });
_previousHistorySelectorBarIndex = currentSelectedIndex;
}
Две страницы предназначены для запроса элементов через Messenger, когда они загружены, и это работает.
Моя проблема в том, что каждый раз, когда вы меняете выбор, страницы Page1 и Page2 создаются снова и снова. Но я не хочу этого, я хочу, чтобы страницы Page1 и Page2 создавались один раз и удалялись при удалении страницы обзора. Сначала я думал, что смогу добавить подстраницы с помощью AddScoped, но не знаю, как это сделать. Есть ли у кого-нибудь идеи, как это сделать? Возможно ли это вообще?
С наилучшими пожеланиями





Для этого вы можете использовать NavigationCacheMode:
Например:
<Page
x:Class = "SelectorBarExample.Page1"
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:local = "using:SelectorBarExample"
xmlns:mc = "http://schemas.openxmlformats.org/markup-compatibility/2006"
Background = "{ThemeResource ApplicationPageBackgroundThemeBrush}"
NavigationCacheMode = "Required"
mc:Ignorable = "d">
</Page>
Кстати, Frame.Navigate не использует внедрение зависимостей для навигации. Вы сможете удалить эти строки:
services.AddTransient<OverviewPage>();
services.AddTransient<Page1>();
services.AddTransient<Page2>();
Рад, что это помогло! Пожалуйста, примите это как ответ, чтобы мы могли закрыть эту сессию.
Эй, спасибо за ваш ответ. Кажется, это исправляет ситуацию. Изучив NavigationService, добавленный WinUi Template Studio, я теперь вижу. Если нет другого пути, я пойду этим. Спасибо