New setting options.

This commit is contained in:
Burak Kaan Köse
2025-12-31 14:09:57 +01:00
parent 61fb10a951
commit f917e4a721
11 changed files with 487 additions and 163 deletions
-1
View File
@@ -65,7 +65,6 @@ public sealed partial class App : WinoApplication, IRecipient<NewCalendarSynchro
{
services.AddSingleton<INavigationService, NavigationService>();
services.AddSingleton<ICalendarDialogService, DialogService>();
services.AddTransient<ISettingsBuilderService, SettingsBuilderService>();
services.AddTransient<IProviderService, ProviderService>();
services.AddSingleton<IAuthenticatorConfig, CalendarAuthenticatorConfig>();
services.AddSingleton<IAccountCalendarStateService, AccountCalendarStateService>();
File diff suppressed because one or more lines are too long
@@ -1,8 +0,0 @@
namespace Wino.Core.Domain.Enums;
public enum SettingOptionCategory
{
General,
Mail,
Calendar
}
@@ -1,9 +0,0 @@
using System.Collections.Generic;
using Wino.Core.Domain.Models.Settings;
namespace Wino.Core.Domain.Interfaces;
public interface ISettingsBuilderService
{
List<SettingOption> GetSettingItems();
}
@@ -1,5 +0,0 @@
using Wino.Core.Domain.Enums;
namespace Wino.Core.Domain.Models.Settings;
public record SettingOption(string Title, string Description, WinoPage NavigationPage, SettingOptionCategory Category, string PathIcon);
@@ -63,6 +63,7 @@
"Buttons_Edit": "Edit",
"Buttons_EnableImageRendering": "Enable",
"Buttons_Multiselect": "Select Multiple",
"Buttons_Manage": "Manage",
"Buttons_No": "No",
"Buttons_Open": "Open",
"Buttons_Purchase": "Purchase",
@@ -623,6 +624,10 @@
"SettingsNotificationsAndTaskbar_Description": "Change whether notifications should be displayed and taskbar badge for this account.",
"SettingsNotificationsAndTaskbar_Title": "Notifications & Taskbar",
"SettingsOptions_Title": "Settings",
"SettingsOptions_GeneralSection": "General",
"SettingsOptions_MailSection": "Mail",
"SettingsOptions_CalendarSection": "Calendar",
"SettingsOptions_MoreComingSoon": "More options coming soon",
"SettingsPaneLengthReset_Description": "Reset the size of the mail list to original if you have issues with it.",
"SettingsPaneLengthReset_Title": "Reset Mail List Size",
"SettingsPaypal_Description": "Show much more love ❤️ All donations are appreciated.",
@@ -1,23 +1,14 @@
using System;
using System.Collections.Generic;
using System.Linq;
using CommunityToolkit.Mvvm.Collections;
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using CommunityToolkit.Mvvm.Messaging;
using Wino.Core.Domain;
using Wino.Core.Domain.Enums;
using Wino.Core.Domain.Interfaces;
using Wino.Core.Domain.Models.Settings;
using Wino.Messaging.Client.Navigation;
namespace Wino.Core.ViewModels;
public partial class SettingOptionsPageViewModel : CoreBaseViewModel
{
private readonly ISettingsBuilderService _settingsBuilderService;
private readonly ObservableGroupedCollection<SettingOptionCategory, SettingOption> _internalGroupedSettings;
[RelayCommand]
private void GoAccountSettings() => Messenger.Send<NavigateManageAccountsRequested>();
@@ -49,28 +40,4 @@ public partial class SettingOptionsPageViewModel : CoreBaseViewModel
Messenger.Send(new BreadcrumbNavigationRequested(pageTitle, pageType));
}
}
[ObservableProperty]
public partial ReadOnlyObservableGroupedCollection<SettingOptionCategory, SettingOption> SettingOptions { get; set; }
public SettingOptionsPageViewModel(ISettingsBuilderService settingsBuilderService)
{
_settingsBuilderService = settingsBuilderService;
_internalGroupedSettings = new ObservableGroupedCollection<SettingOptionCategory, SettingOption>();
SettingOptions = new ReadOnlyObservableGroupedCollection<SettingOptionCategory, SettingOption>(_internalGroupedSettings);
ReloadSettings();
}
private void ReloadSettings()
{
var settings = _settingsBuilderService.GetSettingItems();
var grouped = settings.GroupBy(x => x.Category);
_internalGroupedSettings.Clear();
foreach (var group in grouped)
{
_internalGroupedSettings.AddGroup(group.Key, group);
}
}
}
-1
View File
@@ -63,7 +63,6 @@ public partial class App : WinoApplication,
{
services.AddSingleton<INavigationService, NavigationService>();
services.AddSingleton<IMailDialogService, DialogService>();
services.AddTransient<ISettingsBuilderService, SettingsBuilderService>();
services.AddTransient<IProviderService, ProviderService>();
services.AddSingleton<IAuthenticatorConfig, MailAuthenticatorConfiguration>();
services.AddSingleton<IAccountCalendarStateService, AccountCalendarStateService>();
File diff suppressed because one or more lines are too long
+469 -58
View File
@@ -3,76 +3,487 @@
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:abstract="using:Wino.Views.Abstract"
xmlns:collections="using:CommunityToolkit.Mvvm.Collections"
xmlns:controls="using:CommunityToolkit.WinUI.Controls"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:domain="using:Wino.Core.Domain"
xmlns:enums="using:Wino.Core.Domain.Enums"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:settings="using:Wino.Core.Domain.Models.Settings"
xmlns:translations="using:Wino.Core.Domain.Models.Translations"
x:Name="root"
Title="{x:Bind domain:Translator.SettingsOptions_Title}"
mc:Ignorable="d">
<Page.Resources>
<CollectionViewSource
x:Name="GroupedSettingsSource"
IsSourceGrouped="True"
Source="{x:Bind ViewModel.SettingOptions, Mode=OneWay}" />
</Page.Resources>
<ScrollViewer Padding="0,0,16,0" VerticalScrollBarVisibility="Auto">
<StackPanel Margin="0,8,0,24" Spacing="16">
<StackPanel.ChildrenTransitions>
<TransitionCollection>
<EntranceThemeTransition FromVerticalOffset="50" IsStaggeringEnabled="True" />
</TransitionCollection>
</StackPanel.ChildrenTransitions>
<ListView
HorizontalAlignment="Stretch"
ItemsSource="{x:Bind GroupedSettingsSource.View, Mode=OneWay}"
SelectionMode="None">
<ListView.ItemTemplate>
<DataTemplate x:DataType="settings:SettingOption">
<controls:SettingsCard
Margin="0,2"
Click="SettingOptionClicked"
CommandParameter="{x:Bind NavigationPage}"
Description="{x:Bind Description}"
Header="{x:Bind Title}"
IsClickEnabled="True">
<controls:SettingsCard.HeaderIcon>
<PathIcon Data="{x:Bind PathIcon}" />
</controls:SettingsCard.HeaderIcon>
</controls:SettingsCard>
</DataTemplate>
</ListView.ItemTemplate>
<ListView.GroupStyle>
<GroupStyle>
<GroupStyle.HeaderTemplate>
<DataTemplate x:DataType="collections:IReadOnlyObservableGroup">
<!-- Hero Account Card - Prominent at top -->
<Grid
Padding="20"
Background="{ThemeResource CardBackgroundFillColorDefaultBrush}"
BorderBrush="{ThemeResource CardStrokeColorDefaultBrush}"
BorderThickness="1"
CornerRadius="8">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<Border
Width="56"
Height="56"
CornerRadius="28">
<FontIcon
HorizontalAlignment="Center"
VerticalAlignment="Center"
FontSize="24"
Foreground="{ThemeResource TextOnAccentAAFillColorDisabledBrush}"
Glyph="&#xE77B;" />
</Border>
<StackPanel
Grid.Column="1"
Margin="16,0,0,0"
VerticalAlignment="Center"
Spacing="2">
<TextBlock Style="{StaticResource SubtitleTextBlockStyle}" Text="{x:Bind domain:Translator.SettingsManageAccountSettings_Title}" />
<TextBlock
FontSize="14"
FontWeight="SemiBold"
Text="{x:Bind Key.ToString()}" />
</DataTemplate>
</GroupStyle.HeaderTemplate>
</GroupStyle>
</ListView.GroupStyle>
</ListView>
Foreground="{ThemeResource TextFillColorSecondaryBrush}"
Style="{StaticResource CaptionTextBlockStyle}"
Text="{x:Bind domain:Translator.SettingsManageAccountSettings_Description}" />
</StackPanel>
<!--<ScrollViewer VerticalScrollBarVisibility="Hidden">
<ItemsControl ItemsSource="{x:Bind ViewModel.SettingOptions, Mode=OneWay}">
<ItemsControl.ItemTemplate>
<DataTemplate x:DataType="settings:SettingOption">
<controls:SettingsCard
Margin="0,2"
<Button
Grid.Column="2"
VerticalAlignment="Center"
Click="SettingOptionClicked"
CommandParameter="{x:Bind NavigationPage}"
Description="{x:Bind Description}"
Header="{x:Bind Title}"
IsClickEnabled="True">
<controls:SettingsCard.HeaderIcon>
<PathIcon Data="{x:Bind PathIcon}" />
</controls:SettingsCard.HeaderIcon>
</controls:SettingsCard>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
Style="{StaticResource AccentButtonStyle}"
Tag="{x:Bind enums:WinoPage.AccountManagementPage}">
<StackPanel Orientation="Horizontal" Spacing="8">
<TextBlock Text="{x:Bind domain:Translator.Buttons_Manage}" />
<FontIcon FontSize="12" Glyph="&#xE76C;" />
</StackPanel>
</Button>
</Grid>
</ScrollViewer>-->
<!-- General Settings Card -->
<Grid
Padding="20"
Background="{ThemeResource CardBackgroundFillColorDefaultBrush}"
BorderBrush="{ThemeResource CardStrokeColorDefaultBrush}"
BorderThickness="1"
CornerRadius="8">
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<!-- General Header -->
<StackPanel
Margin="0,0,0,16"
Orientation="Horizontal"
Spacing="12">
<Border
Width="40"
Height="40"
Background="{ThemeResource SystemFillColorNeutralBackgroundBrush}"
CornerRadius="8">
<FontIcon
HorizontalAlignment="Center"
VerticalAlignment="Center"
FontSize="18"
Foreground="{ThemeResource AccentTextFillColorPrimaryBrush}"
Glyph="&#xE713;" />
</Border>
<TextBlock
VerticalAlignment="Center"
Style="{StaticResource SubtitleTextBlockStyle}"
Text="{x:Bind domain:Translator.SettingsOptions_GeneralSection}" />
</StackPanel>
<!-- General Options -->
<StackPanel Grid.Row="1" Spacing="2">
<Button
HorizontalAlignment="Stretch"
HorizontalContentAlignment="Stretch"
Background="Transparent"
BorderThickness="0"
Click="SettingOptionClicked"
CornerRadius="4"
Tag="{x:Bind enums:WinoPage.AppPreferencesPage}">
<Grid Padding="4,10" ColumnSpacing="12">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<FontIcon
VerticalAlignment="Center"
FontSize="16"
Foreground="{ThemeResource TextFillColorSecondaryBrush}"
Glyph="&#xE770;" />
<TextBlock
Grid.Column="1"
VerticalAlignment="Center"
Text="{x:Bind domain:Translator.SettingsAppPreferences_Title}" />
<FontIcon
Grid.Column="2"
VerticalAlignment="Center"
FontSize="12"
Foreground="{ThemeResource TextFillColorTertiaryBrush}"
Glyph="&#xE76C;" />
</Grid>
</Button>
<Button
HorizontalAlignment="Stretch"
HorizontalContentAlignment="Stretch"
Background="Transparent"
BorderThickness="0"
Click="SettingOptionClicked"
CornerRadius="4"
Tag="{x:Bind enums:WinoPage.LanguageTimePage}">
<Grid Padding="4,10" ColumnSpacing="12">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<FontIcon
VerticalAlignment="Center"
FontSize="16"
Foreground="{ThemeResource TextFillColorSecondaryBrush}"
Glyph="&#xE775;" />
<TextBlock
Grid.Column="1"
VerticalAlignment="Center"
Text="{x:Bind domain:Translator.SettingsLanguageTime_Title}" />
<FontIcon
Grid.Column="2"
VerticalAlignment="Center"
FontSize="12"
Foreground="{ThemeResource TextFillColorTertiaryBrush}"
Glyph="&#xE76C;" />
</Grid>
</Button>
<Button
HorizontalAlignment="Stretch"
HorizontalContentAlignment="Stretch"
Background="Transparent"
BorderThickness="0"
Click="SettingOptionClicked"
CornerRadius="4"
Tag="{x:Bind enums:WinoPage.PersonalizationPage}">
<Grid Padding="4,10" ColumnSpacing="12">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<FontIcon
VerticalAlignment="Center"
FontSize="16"
Foreground="{ThemeResource TextFillColorSecondaryBrush}"
Glyph="&#xE771;" />
<TextBlock
Grid.Column="1"
VerticalAlignment="Center"
Text="{x:Bind domain:Translator.SettingsPersonalization_Title}" />
<FontIcon
Grid.Column="2"
VerticalAlignment="Center"
FontSize="12"
Foreground="{ThemeResource TextFillColorTertiaryBrush}"
Glyph="&#xE76C;" />
</Grid>
</Button>
<Button
HorizontalAlignment="Stretch"
HorizontalContentAlignment="Stretch"
Background="Transparent"
BorderThickness="0"
Click="SettingOptionClicked"
CornerRadius="4"
Tag="{x:Bind enums:WinoPage.AboutPage}">
<Grid Padding="4,10" ColumnSpacing="12">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<FontIcon
VerticalAlignment="Center"
FontSize="16"
Foreground="{ThemeResource TextFillColorSecondaryBrush}"
Glyph="&#xE946;" />
<TextBlock
Grid.Column="1"
VerticalAlignment="Center"
Text="{x:Bind domain:Translator.SettingsAbout_Title}" />
<FontIcon
Grid.Column="2"
VerticalAlignment="Center"
FontSize="12"
Foreground="{ThemeResource TextFillColorTertiaryBrush}"
Glyph="&#xE76C;" />
</Grid>
</Button>
</StackPanel>
</Grid>
<!-- Two-Column Layout for Mail & Calendar -->
<Grid ColumnSpacing="16">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<!-- Mail Settings Card -->
<Grid
Grid.Column="0"
Padding="20"
Background="{ThemeResource CardBackgroundFillColorDefaultBrush}"
BorderBrush="{ThemeResource CardStrokeColorDefaultBrush}"
BorderThickness="1"
CornerRadius="8">
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<!-- Mail Header -->
<StackPanel
Margin="0,0,0,16"
Orientation="Horizontal"
Spacing="12">
<Border
Width="40"
Height="40"
Background="{ThemeResource SystemFillColorNeutralBackgroundBrush}"
CornerRadius="8">
<FontIcon
HorizontalAlignment="Center"
VerticalAlignment="Center"
FontSize="18"
Foreground="{ThemeResource AccentTextFillColorPrimaryBrush}"
Glyph="&#xE715;" />
</Border>
<TextBlock
VerticalAlignment="Center"
Style="{StaticResource SubtitleTextBlockStyle}"
Text="{x:Bind domain:Translator.SettingsOptions_MailSection}" />
</StackPanel>
<!-- Mail Options -->
<StackPanel Grid.Row="1" Spacing="2">
<Button
HorizontalAlignment="Stretch"
HorizontalContentAlignment="Stretch"
Background="Transparent"
BorderThickness="0"
Click="SettingOptionClicked"
CornerRadius="4"
Tag="{x:Bind enums:WinoPage.KeyboardShortcutsPage}">
<Grid Padding="4,10" ColumnSpacing="12">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<FontIcon
VerticalAlignment="Center"
FontSize="16"
Foreground="{ThemeResource TextFillColorSecondaryBrush}"
Glyph="&#xE765;" />
<TextBlock
Grid.Column="1"
VerticalAlignment="Center"
Text="{x:Bind domain:Translator.Settings_KeyboardShortcuts_Title}" />
<FontIcon
Grid.Column="2"
VerticalAlignment="Center"
FontSize="12"
Foreground="{ThemeResource TextFillColorTertiaryBrush}"
Glyph="&#xE76C;" />
</Grid>
</Button>
<Button
HorizontalAlignment="Stretch"
HorizontalContentAlignment="Stretch"
Background="Transparent"
BorderThickness="0"
Click="SettingOptionClicked"
CornerRadius="4"
Tag="{x:Bind enums:WinoPage.MessageListPage}">
<Grid Padding="4,10" ColumnSpacing="12">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<FontIcon
VerticalAlignment="Center"
FontSize="16"
Foreground="{ThemeResource TextFillColorSecondaryBrush}"
Glyph="&#xE8C4;" />
<TextBlock
Grid.Column="1"
VerticalAlignment="Center"
Text="{x:Bind domain:Translator.SettingsMessageList_Title}" />
<FontIcon
Grid.Column="2"
VerticalAlignment="Center"
FontSize="12"
Foreground="{ThemeResource TextFillColorTertiaryBrush}"
Glyph="&#xE76C;" />
</Grid>
</Button>
<Button
HorizontalAlignment="Stretch"
HorizontalContentAlignment="Stretch"
Background="Transparent"
BorderThickness="0"
Click="SettingOptionClicked"
CornerRadius="4"
Tag="{x:Bind enums:WinoPage.ReadComposePanePage}">
<Grid Padding="4,10" ColumnSpacing="12">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<FontIcon
VerticalAlignment="Center"
FontSize="16"
Foreground="{ThemeResource TextFillColorSecondaryBrush}"
Glyph="&#xE8BD;" />
<TextBlock
Grid.Column="1"
VerticalAlignment="Center"
Text="{x:Bind domain:Translator.SettingsReadComposePane_Title}" />
<FontIcon
Grid.Column="2"
VerticalAlignment="Center"
FontSize="12"
Foreground="{ThemeResource TextFillColorTertiaryBrush}"
Glyph="&#xE76C;" />
</Grid>
</Button>
<Button
HorizontalAlignment="Stretch"
HorizontalContentAlignment="Stretch"
Background="Transparent"
BorderThickness="0"
Click="SettingOptionClicked"
CornerRadius="4"
Tag="{x:Bind enums:WinoPage.SignatureAndEncryptionPage}">
<Grid Padding="4,10" ColumnSpacing="12">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<FontIcon
VerticalAlignment="Center"
FontSize="16"
Foreground="{ThemeResource TextFillColorSecondaryBrush}"
Glyph="&#xE8D7;" />
<TextBlock
Grid.Column="1"
VerticalAlignment="Center"
Text="{x:Bind domain:Translator.SettingsSignatureAndEncryption_Title}" />
<FontIcon
Grid.Column="2"
VerticalAlignment="Center"
FontSize="12"
Foreground="{ThemeResource TextFillColorTertiaryBrush}"
Glyph="&#xE76C;" />
</Grid>
</Button>
</StackPanel>
</Grid>
<!-- Calendar Settings Card -->
<Grid
Grid.Column="1"
Padding="20"
Background="{ThemeResource CardBackgroundFillColorDefaultBrush}"
BorderBrush="{ThemeResource CardStrokeColorDefaultBrush}"
BorderThickness="1"
CornerRadius="8">
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<!-- Calendar Header -->
<StackPanel
Margin="0,0,0,16"
Orientation="Horizontal"
Spacing="12">
<Border
Width="40"
Height="40"
Background="{ThemeResource SystemFillColorNeutralBackgroundBrush}"
CornerRadius="8">
<FontIcon
HorizontalAlignment="Center"
VerticalAlignment="Center"
FontSize="18"
Foreground="{ThemeResource AccentTextFillColorPrimaryBrush}"
Glyph="&#xE787;" />
</Border>
<TextBlock
VerticalAlignment="Center"
Style="{StaticResource SubtitleTextBlockStyle}"
Text="{x:Bind domain:Translator.SettingsOptions_CalendarSection}" />
</StackPanel>
<!-- Calendar Options -->
<StackPanel Grid.Row="1" Spacing="2">
<Button
HorizontalAlignment="Stretch"
HorizontalContentAlignment="Stretch"
Background="Transparent"
BorderThickness="0"
Click="SettingOptionClicked"
CornerRadius="4"
Tag="{x:Bind enums:WinoPage.CalendarSettingsPage}">
<Grid Padding="4,10" ColumnSpacing="12">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<FontIcon
VerticalAlignment="Center"
FontSize="16"
Foreground="{ThemeResource TextFillColorSecondaryBrush}"
Glyph="&#xE8BF;" />
<TextBlock
Grid.Column="1"
VerticalAlignment="Center"
Text="{x:Bind domain:Translator.SettingsCalendarSettings_Title}" />
<FontIcon
Grid.Column="2"
VerticalAlignment="Center"
FontSize="12"
Foreground="{ThemeResource TextFillColorTertiaryBrush}"
Glyph="&#xE76C;" />
</Grid>
</Button>
</StackPanel>
</Grid>
</Grid>
</StackPanel>
</ScrollViewer>
</abstract:SettingOptionsPageAbstract>
@@ -1,4 +1,5 @@
using CommunityToolkit.WinUI.Controls;
using Microsoft.UI.Xaml;
using Microsoft.UI.Xaml.Controls;
using Wino.Core.Domain.Enums;
using Wino.Views.Abstract;
@@ -11,8 +12,17 @@ public sealed partial class SettingOptionsPage : SettingOptionsPageAbstract
InitializeComponent();
}
private void SettingOptionClicked(object sender, Microsoft.UI.Xaml.RoutedEventArgs e)
private void SettingOptionClicked(object sender, RoutedEventArgs e)
{
if (sender is SettingsCard card && card.CommandParameter is WinoPage page) ViewModel.NavigateSubDetailCommand.Execute(page);
WinoPage? page = sender switch
{
Button button when button.Tag is WinoPage p => p,
_ => null
};
if (page.HasValue)
{
ViewModel.NavigateSubDetailCommand.Execute(page.Value);
}
}
}