Settings shell.

This commit is contained in:
Burak Kaan Köse
2026-03-12 19:04:47 +01:00
parent de5309ea56
commit 7f0b671b62
28 changed files with 615 additions and 224 deletions
@@ -81,7 +81,10 @@
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<controls:SettingsExpander Description="{x:Bind ViewModel.Address, Mode=OneWay}" Header="{x:Bind ViewModel.AccountName, Mode=OneWay}">
<controls:SettingsExpander
Description="{x:Bind ViewModel.Address, Mode=OneWay}"
Header="{x:Bind ViewModel.AccountName, Mode=OneWay}"
IsExpanded="True">
<controls:SettingsExpander.HeaderIcon>
<BitmapIcon ShowAsMonochrome="False" UriSource="{x:Bind ViewModel.ProviderIconPath, Mode=OneWay}" />
</controls:SettingsExpander.HeaderIcon>
+3 -134
View File
@@ -9,18 +9,17 @@
xmlns:enums="using:Wino.Core.Domain.Enums"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
x:Name="root"
Title="{x:Bind domain:Translator.SettingsOptions_Title}"
Title="{x:Bind domain:Translator.SettingsHome_Title}"
mc:Ignorable="d">
<ScrollViewer Padding="0,0,16,0" VerticalScrollBarVisibility="Auto">
<StackPanel Margin="0,8,0,24" Spacing="4">
<StackPanel Margin="0,8,0,24" Spacing="12">
<StackPanel.ChildrenTransitions>
<TransitionCollection>
<EntranceThemeTransition FromVerticalOffset="50" IsStaggeringEnabled="True" />
</TransitionCollection>
</StackPanel.ChildrenTransitions>
<!-- Hero Banner - Windows 11 style -->
<Grid
Margin="0,0,0,12"
Padding="24,28"
@@ -33,8 +32,6 @@
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<!-- App Info -->
<Grid
Grid.Column="1"
Margin="8,0,0,0"
@@ -43,6 +40,7 @@
<Grid.RowDefinitions>
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<StackPanel
VerticalAlignment="Center"
Orientation="Horizontal"
@@ -120,7 +118,6 @@
</Grid>
</Grid>
<!-- Account Management Card -->
<controls:SettingsCard
Margin="0,0,0,12"
Click="SettingOptionClicked"
@@ -141,134 +138,6 @@
</StackPanel>
</Button>
</controls:SettingsCard>
<!-- General Section -->
<TextBlock
Margin="1,8,0,4"
Style="{StaticResource BodyStrongTextBlockStyle}"
Text="{x:Bind domain:Translator.SettingsOptions_GeneralSection}" />
<controls:SettingsCard
Click="SettingOptionClicked"
Description="{x:Bind domain:Translator.SettingsAppPreferences_Description}"
Header="{x:Bind domain:Translator.SettingsAppPreferences_Title}"
IsClickEnabled="True"
Tag="{x:Bind enums:WinoPage.AppPreferencesPage}">
<controls:SettingsCard.HeaderIcon>
<FontIcon Foreground="{ThemeResource AccentTextFillColorPrimaryBrush}" Glyph="&#xE770;" />
</controls:SettingsCard.HeaderIcon>
</controls:SettingsCard>
<controls:SettingsCard
Click="SettingOptionClicked"
Description="{x:Bind domain:Translator.SettingsLanguageTime_Description}"
Header="{x:Bind domain:Translator.SettingsLanguageTime_Title}"
IsClickEnabled="True"
Tag="{x:Bind enums:WinoPage.LanguageTimePage}">
<controls:SettingsCard.HeaderIcon>
<FontIcon Foreground="{ThemeResource AccentTextFillColorPrimaryBrush}" Glyph="&#xE775;" />
</controls:SettingsCard.HeaderIcon>
</controls:SettingsCard>
<controls:SettingsCard
Click="SettingOptionClicked"
Description="{x:Bind domain:Translator.SettingsPersonalization_Description}"
Header="{x:Bind domain:Translator.SettingsPersonalization_Title}"
IsClickEnabled="True"
Tag="{x:Bind enums:WinoPage.PersonalizationPage}">
<controls:SettingsCard.HeaderIcon>
<FontIcon Foreground="{ThemeResource AccentTextFillColorPrimaryBrush}" Glyph="&#xE771;" />
</controls:SettingsCard.HeaderIcon>
</controls:SettingsCard>
<controls:SettingsCard
Click="SettingOptionClicked"
Description="{x:Bind domain:Translator.SettingsAbout_Description}"
Header="{x:Bind domain:Translator.SettingsAbout_Title}"
IsClickEnabled="True"
Tag="{x:Bind enums:WinoPage.AboutPage}">
<controls:SettingsCard.HeaderIcon>
<FontIcon Foreground="{ThemeResource AccentTextFillColorPrimaryBrush}" Glyph="&#xE946;" />
</controls:SettingsCard.HeaderIcon>
</controls:SettingsCard>
<!-- Mail Section -->
<TextBlock
Margin="1,16,0,4"
Style="{StaticResource BodyStrongTextBlockStyle}"
Text="{x:Bind domain:Translator.SettingsOptions_MailSection}" />
<controls:SettingsCard
Click="SettingOptionClicked"
Description="{x:Bind domain:Translator.Settings_KeyboardShortcuts_Description}"
Header="{x:Bind domain:Translator.Settings_KeyboardShortcuts_Title}"
IsClickEnabled="True"
Tag="{x:Bind enums:WinoPage.KeyboardShortcutsPage}">
<controls:SettingsCard.HeaderIcon>
<FontIcon Foreground="{ThemeResource AccentTextFillColorPrimaryBrush}" Glyph="&#xE765;" />
</controls:SettingsCard.HeaderIcon>
</controls:SettingsCard>
<controls:SettingsCard
Click="SettingOptionClicked"
Description="{x:Bind domain:Translator.SettingsMessageList_Description}"
Header="{x:Bind domain:Translator.SettingsMessageList_Title}"
IsClickEnabled="True"
Tag="{x:Bind enums:WinoPage.MessageListPage}">
<controls:SettingsCard.HeaderIcon>
<FontIcon Foreground="{ThemeResource AccentTextFillColorPrimaryBrush}" Glyph="&#xE8C4;" />
</controls:SettingsCard.HeaderIcon>
</controls:SettingsCard>
<controls:SettingsCard
Click="SettingOptionClicked"
Description="{x:Bind domain:Translator.SettingsReadComposePane_Description}"
Header="{x:Bind domain:Translator.SettingsReadComposePane_Title}"
IsClickEnabled="True"
Tag="{x:Bind enums:WinoPage.ReadComposePanePage}">
<controls:SettingsCard.HeaderIcon>
<FontIcon Foreground="{ThemeResource AccentTextFillColorPrimaryBrush}" Glyph="&#xE8BD;" />
</controls:SettingsCard.HeaderIcon>
</controls:SettingsCard>
<controls:SettingsCard
Click="SettingOptionClicked"
Description="{x:Bind domain:Translator.SettingsSignatureAndEncryption_Description}"
Header="{x:Bind domain:Translator.SettingsSignatureAndEncryption_Title}"
IsClickEnabled="True"
Tag="{x:Bind enums:WinoPage.SignatureAndEncryptionPage}">
<controls:SettingsCard.HeaderIcon>
<FontIcon Foreground="{ThemeResource AccentTextFillColorPrimaryBrush}" Glyph="&#xE8D7;" />
</controls:SettingsCard.HeaderIcon>
</controls:SettingsCard>
<controls:SettingsCard
Click="SettingOptionClicked"
Description="{x:Bind domain:Translator.SettingsStorage_Description}"
Header="{x:Bind domain:Translator.SettingsStorage_Title}"
IsClickEnabled="True"
Tag="{x:Bind enums:WinoPage.StoragePage}">
<controls:SettingsCard.HeaderIcon>
<FontIcon Foreground="{ThemeResource AccentTextFillColorPrimaryBrush}" Glyph="&#xE81C;" />
</controls:SettingsCard.HeaderIcon>
</controls:SettingsCard>
<!-- Calendar Section -->
<TextBlock
Margin="1,16,0,4"
Style="{StaticResource BodyStrongTextBlockStyle}"
Text="{x:Bind domain:Translator.SettingsOptions_CalendarSection}" />
<controls:SettingsCard
Click="SettingOptionClicked"
Description="{x:Bind domain:Translator.SettingsCalendarSettings_Description}"
Header="{x:Bind domain:Translator.SettingsCalendarSettings_Title}"
IsClickEnabled="True"
Tag="{x:Bind enums:WinoPage.CalendarSettingsPage}">
<controls:SettingsCard.HeaderIcon>
<FontIcon Foreground="{ThemeResource AccentTextFillColorPrimaryBrush}" Glyph="&#xE787;" />
</controls:SettingsCard.HeaderIcon>
</controls:SettingsCard>
</StackPanel>
</ScrollViewer>
</abstract:SettingOptionsPageAbstract>
+10 -1
View File
@@ -18,6 +18,7 @@
HorizontalAlignment="Stretch"
RowSpacing="20">
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
@@ -43,7 +44,15 @@
</winuiControls:BreadcrumbBar.ItemTemplate>
</winuiControls:BreadcrumbBar>
<Frame x:Name="SettingsFrame" Grid.Row="1" />
<TextBlock
Grid.Row="1"
Margin="0,-4,0,4"
Foreground="{ThemeResource TextFillColorSecondaryBrush}"
Style="{StaticResource BodyStrongTextBlockStyle}"
Text="{x:Bind ViewModel.CurrentDescription, Mode=OneWay}"
TextWrapping="WrapWholeWords" />
<Frame x:Name="SettingsFrame" Grid.Row="2" />
</Grid>
</Border>
</abstract:SettingsPageAbstract>
+59 -36
View File
@@ -1,10 +1,12 @@
using System.Collections.ObjectModel;
using System.Linq;
using System.Threading.Tasks;
using CommunityToolkit.Mvvm.Messaging;
using Microsoft.UI.Xaml.Media.Animation;
using Microsoft.UI.Xaml.Navigation;
using Wino.Core.Domain;
using Wino.Core.Domain.Enums;
using Wino.Core.Domain.Models.Settings;
using Wino.Helpers;
using Wino.Mail.ViewModels.Data;
using Wino.Messaging.Client.Navigation;
@@ -17,6 +19,7 @@ namespace Wino.Views;
public sealed partial class SettingsPage : SettingsPageAbstract,
IRecipient<BreadcrumbNavigationRequested>,
IRecipient<BackBreadcrumNavigationRequested>,
IRecipient<SettingsRootNavigationRequested>,
IRecipient<MergedInboxRenamed>,
IRecipient<AccountUpdatedMessage>
{
@@ -34,39 +37,9 @@ public sealed partial class SettingsPage : SettingsPageAbstract,
// Register for frame navigation events to track back button visibility
SettingsFrame.Navigated -= SettingsFrameNavigated;
SettingsFrame.Navigated += SettingsFrameNavigated;
PageHistory.Clear();
SettingsFrame.BackStack.Clear();
SettingsFrame.ForwardStack.Clear();
SettingsFrame.Navigate(typeof(SettingOptionsPage), null, new SuppressNavigationTransitionInfo());
var initialRequest = new BreadcrumbNavigationRequested(Translator.MenuSettings, WinoPage.SettingOptionsPage);
PageHistory.Add(new BreadcrumbNavigationItemViewModel(initialRequest, true, backStackDepth: SettingsFrame.BackStack.Count + 1));
if (e.Parameter is WinoPage parameterPage)
{
switch (parameterPage)
{
case WinoPage.AppPreferencesPage:
NavigateBreadcrumb(new BreadcrumbNavigationRequested(Translator.SettingsAppPreferences_Title, WinoPage.AppPreferencesPage));
break;
case WinoPage.PersonalizationPage:
NavigateBreadcrumb(new BreadcrumbNavigationRequested(Translator.SettingsPersonalization_Title, WinoPage.PersonalizationPage));
break;
case WinoPage.StoragePage:
NavigateBreadcrumb(new BreadcrumbNavigationRequested(Translator.SettingsStorage_Title, WinoPage.StoragePage));
break;
case WinoPage.EmailTemplatesPage:
NavigateBreadcrumb(new BreadcrumbNavigationRequested(Translator.SettingsEmailTemplates_Title, WinoPage.EmailTemplatesPage));
break;
case WinoPage.ManageAccountsPage:
case WinoPage.AccountManagementPage:
NavigateBreadcrumb(new BreadcrumbNavigationRequested(Translator.SettingsManageAccountSettings_Title, WinoPage.ManageAccountsPage));
break;
}
}
UpdateWindowTitle();
var initialPage = e.Parameter as WinoPage? ?? WinoPage.SettingOptionsPage;
NavigateToRootPage(initialPage);
}
public override void OnLanguageChanged()
@@ -88,6 +61,7 @@ public sealed partial class SettingsPage : SettingsPageAbstract,
manageAccountsEntry.Title = Translator.SettingsManageAccountSettings_Title;
}
_ = RefreshCurrentPageStateAsync();
UpdateWindowTitle();
}
@@ -108,6 +82,7 @@ public sealed partial class SettingsPage : SettingsPageAbstract,
WeakReferenceMessenger.Default.Register<BreadcrumbNavigationRequested>(this);
WeakReferenceMessenger.Default.Register<BackBreadcrumNavigationRequested>(this);
WeakReferenceMessenger.Default.Register<SettingsRootNavigationRequested>(this);
WeakReferenceMessenger.Default.Register<MergedInboxRenamed>(this);
WeakReferenceMessenger.Default.Register<AccountUpdatedMessage>(this);
}
@@ -118,6 +93,7 @@ public sealed partial class SettingsPage : SettingsPageAbstract,
WeakReferenceMessenger.Default.Unregister<BreadcrumbNavigationRequested>(this);
WeakReferenceMessenger.Default.Unregister<BackBreadcrumNavigationRequested>(this);
WeakReferenceMessenger.Default.Unregister<SettingsRootNavigationRequested>(this);
WeakReferenceMessenger.Default.Unregister<MergedInboxRenamed>(this);
WeakReferenceMessenger.Default.Unregister<AccountUpdatedMessage>(this);
}
@@ -129,8 +105,8 @@ public sealed partial class SettingsPage : SettingsPageAbstract,
private void SettingsFrameNavigated(object sender, NavigationEventArgs e)
{
// Update back button visibility based on whether we can go back within the frame
ViewModel.StatePersistenceService.IsSettingsNavigating = SettingsFrame.CanGoBack;
UpdateBackNavigationState();
_ = RefreshCurrentPageStateAsync();
}
private void GoBackFrame(Core.Domain.Enums.NavigationTransitionEffect slideEffect)
@@ -138,7 +114,8 @@ public sealed partial class SettingsPage : SettingsPageAbstract,
if (!BreadcrumbNavigationHelper.GoBack(SettingsFrame, PageHistory, slideEffect))
return;
ViewModel.StatePersistenceService.IsSettingsNavigating = SettingsFrame.CanGoBack;
UpdateBackNavigationState();
_ = RefreshCurrentPageStateAsync();
UpdateWindowTitle();
}
@@ -147,7 +124,8 @@ public sealed partial class SettingsPage : SettingsPageAbstract,
if (!BreadcrumbNavigationHelper.NavigateTo(SettingsFrame, PageHistory, args.Index))
return;
ViewModel.StatePersistenceService.IsSettingsNavigating = SettingsFrame.CanGoBack;
UpdateBackNavigationState();
_ = RefreshCurrentPageStateAsync();
UpdateWindowTitle();
}
@@ -156,6 +134,15 @@ public sealed partial class SettingsPage : SettingsPageAbstract,
GoBackFrame(message.SlideEffect);
}
public void Receive(SettingsRootNavigationRequested message)
{
var currentRootPage = SettingsNavigationInfoProvider.GetRootPage(PageHistory.LastOrDefault()?.Request.PageType ?? WinoPage.SettingOptionsPage);
if (message.PageType != WinoPage.SettingOptionsPage && currentRootPage == message.PageType)
return;
NavigateToRootPage(message.PageType);
}
public void Receive(AccountUpdatedMessage message)
{
var activePage = PageHistory.LastOrDefault(a => a.Request.PageType == WinoPage.AccountDetailsPage);
@@ -166,6 +153,7 @@ public sealed partial class SettingsPage : SettingsPageAbstract,
DispatcherQueue.TryEnqueue(() =>
{
activePage.Title = message.Account.Name;
_ = RefreshCurrentPageStateAsync();
UpdateWindowTitle();
});
}
@@ -180,6 +168,7 @@ public sealed partial class SettingsPage : SettingsPageAbstract,
DispatcherQueue.TryEnqueue(() =>
{
activePage.Title = message.NewName;
_ = RefreshCurrentPageStateAsync();
UpdateWindowTitle();
});
}
@@ -189,9 +178,43 @@ public sealed partial class SettingsPage : SettingsPageAbstract,
if (!BreadcrumbNavigationHelper.Navigate(SettingsFrame, PageHistory, message, ViewModel.NavigationService.GetPageType))
return;
UpdateBackNavigationState();
_ = RefreshCurrentPageStateAsync();
UpdateWindowTitle();
}
private void NavigateToRootPage(WinoPage targetPage)
{
PageHistory.Clear();
SettingsFrame.BackStack.Clear();
SettingsFrame.ForwardStack.Clear();
NavigateBreadcrumb(new BreadcrumbNavigationRequested(Translator.MenuSettings, WinoPage.SettingOptionsPage));
if (targetPage != WinoPage.SettingOptionsPage)
{
NavigateBreadcrumb(new BreadcrumbNavigationRequested(
SettingsNavigationInfoProvider.GetPageTitle(targetPage),
targetPage));
return;
}
UpdateWindowTitle();
}
private void UpdateBackNavigationState()
{
ViewModel.StatePersistenceService.IsSettingsNavigating = PageHistory.Count > 1 && SettingsFrame.CanGoBack;
}
private async Task RefreshCurrentPageStateAsync()
{
var activePage = PageHistory.LastOrDefault()?.Request.PageType ?? WinoPage.SettingOptionsPage;
var rootPage = SettingsNavigationInfoProvider.GetRootPage(activePage);
await ViewModel.UpdateActivePageAsync(rootPage);
WeakReferenceMessenger.Default.Send(new ActiveSettingsPageChanged(rootPage));
}
private void UpdateWindowTitle()
{
var activeTitle = PageHistory.LastOrDefault()?.Title;
+2
View File
@@ -425,6 +425,8 @@
NewMailTemplate="{StaticResource CreateNewMailTemplate}"
RatingItemTemplate="{StaticResource RatingItemTemplate}"
SeperatorTemplate="{StaticResource SeperatorTemplate}"
SettingsShellPageItemTemplate="{StaticResource SettingsShellPageItemTemplate}"
SettingsShellSectionItemTemplate="{StaticResource SettingsShellSectionItemTemplate}"
StoreUpdateItemTemplate="{StaticResource StoreUpdateItemTemplate}" />
<Style
+47 -14
View File
@@ -50,6 +50,7 @@ public sealed partial class WinoAppShell : Views.Abstract.WinoAppShellAbstract,
private const string StateDefaultShellContent = "DefaultShellContentState";
private const string StateEventDetailsContent = "EventDetailsContentState";
private WinoApplicationMode? _activeMode;
private bool _isSyncingNavigationViewSelection;
public WinoAppShell()
{
@@ -59,9 +60,11 @@ public sealed partial class WinoAppShell : Views.Abstract.WinoAppShellAbstract,
ViewModel.MailClient.Dispatcher = pageDispatcher;
ViewModel.CalendarClient.Dispatcher = pageDispatcher;
ViewModel.GetClient(WinoApplicationMode.Contacts).Dispatcher = pageDispatcher;
ViewModel.GetClient(WinoApplicationMode.Settings).Dispatcher = pageDispatcher;
ViewModel.MailClient.PropertyChanged += MailClientPropertyChanged;
ViewModel.CalendarClient.PropertyChanged += CalendarClientPropertyChanged;
ViewModel.PropertyChanged += ViewModelPropertyChanged;
ViewModel.StatePersistenceService.StatePropertyChanged += StatePersistenceServiceChanged;
CalendarTypeSelector.RegisterPropertyChangedCallback(WinoCalendarTypeSelectorControl.SelectedTypeProperty, CalendarTypeSelectorSelectedTypeChanged);
@@ -151,6 +154,10 @@ public sealed partial class WinoAppShell : Views.Abstract.WinoAppShellAbstract,
{
ViewModel.CurrentClient.Deactivate();
}
else if (_activeMode == WinoApplicationMode.Settings)
{
ViewModel.CurrentClient.Deactivate();
}
DynamicPageShellContentPresenter.Content = null;
}
@@ -229,12 +236,9 @@ public sealed partial class WinoAppShell : Views.Abstract.WinoAppShellAbstract,
private void RefreshNavigationViewBindings(bool syncMailSelection = true)
{
navigationView.MenuItemsSource = ViewModel.CurrentMenuItems;
navigationView.SelectionChanged -= MenuSelectionChanged;
navigationView.SelectedItem = ViewModel.CurrentClient.HandlesNavigationSelection && syncMailSelection
SetNavigationViewSelectedItem(ViewModel.CurrentClient.HandlesNavigationSelection && syncMailSelection
? ViewModel.SelectedMenuItem
: null;
navigationView.SelectionChanged += MenuSelectionChanged;
: null);
}
private void UpdateEventDetailsVisualState()
@@ -262,6 +266,9 @@ public sealed partial class WinoAppShell : Views.Abstract.WinoAppShellAbstract,
private async void NavigationViewItemInvoked(NavigationView sender, NavigationViewItemInvokedEventArgs args)
{
if (_isSyncingNavigationViewSelection)
return;
if (ViewModel.IsCalendarMode)
{
if (args.InvokedItemContainer is FrameworkElement { DataContext: IMenuItem menuItem })
@@ -283,7 +290,13 @@ public sealed partial class WinoAppShell : Views.Abstract.WinoAppShellAbstract,
private async void MenuSelectionChanged(NavigationView sender, NavigationViewSelectionChangedEventArgs args)
{
if (!ViewModel.IsMailMode)
if (_isSyncingNavigationViewSelection)
return;
if (!ViewModel.CurrentClient.HandlesNavigationSelection)
return;
if (ReferenceEquals(args.SelectedItem, ViewModel.SelectedMenuItem))
return;
if (args.SelectedItem is IMenuItem invokedMenuItem)
@@ -306,7 +319,7 @@ public sealed partial class WinoAppShell : Views.Abstract.WinoAppShellAbstract,
{
foundMenuItem.Expand();
await ViewModel.MailClient.NavigateFolderAsync(foundMenuItem);
navigationView.SelectedItem = foundMenuItem;
SetNavigationViewSelectedItem(foundMenuItem);
if (message.NavigateMailItem != null)
{
@@ -327,7 +340,7 @@ public sealed partial class WinoAppShell : Views.Abstract.WinoAppShellAbstract,
{
accountFolderMenuItem.Expand();
await ViewModel.MailClient.NavigateFolderAsync(accountFolderMenuItem);
navigationView.SelectedItem = accountFolderMenuItem;
SetNavigationViewSelectedItem(accountFolderMenuItem);
WeakReferenceMessenger.Default.Send(new MailItemNavigationRequested(message.NavigateMailItem.UniqueId, ScrollToItem: true));
}
}
@@ -345,9 +358,7 @@ public sealed partial class WinoAppShell : Views.Abstract.WinoAppShellAbstract,
ViewModel.NavigationService.Navigate(WinoPage.MailListPage, navigateFolderArgs, NavigationReferenceFrame.InnerShellFrame);
navigationView.SelectionChanged -= MenuSelectionChanged;
navigationView.SelectedItem = message.BaseFolderMenuItem;
navigationView.SelectionChanged += MenuSelectionChanged;
SetNavigationViewSelectedItem(message.BaseFolderMenuItem);
}
else
{
@@ -430,9 +441,7 @@ public sealed partial class WinoAppShell : Views.Abstract.WinoAppShellAbstract,
{
if (e.PropertyName == nameof(IShellClient.SelectedMenuItem) && ViewModel.IsMailMode)
{
navigationView.SelectionChanged -= MenuSelectionChanged;
navigationView.SelectedItem = ViewModel.MailClient.SelectedMenuItem;
navigationView.SelectionChanged += MenuSelectionChanged;
SetNavigationViewSelectedItem(ViewModel.MailClient.SelectedMenuItem);
}
}
@@ -467,6 +476,30 @@ public sealed partial class WinoAppShell : Views.Abstract.WinoAppShellAbstract,
}
}
private void ViewModelPropertyChanged(object? sender, PropertyChangedEventArgs e)
{
if (e.PropertyName != nameof(ViewModel.SelectedMenuItem) || !ViewModel.CurrentClient.HandlesNavigationSelection)
return;
SetNavigationViewSelectedItem(ViewModel.SelectedMenuItem);
}
private void SetNavigationViewSelectedItem(object? item)
{
if (ReferenceEquals(navigationView.SelectedItem, item))
return;
_isSyncingNavigationViewSelection = true;
try
{
navigationView.SelectedItem = item;
}
finally
{
_isSyncingNavigationViewSelection = false;
}
}
private void StatePersistenceServiceChanged(object? sender, string propertyName)
{
if (propertyName == nameof(IStatePersistanceService.CalendarDisplayType))