From 293179b3c019d38e4bfc6ec26717594332eb5a17 Mon Sep 17 00:00:00 2001 From: Danil Iarosh Date: Tue, 20 Jan 2026 10:37:41 +0300 Subject: [PATCH] Refactor AppShell layout: Implement responsive design for desktop and mobile modes, update application title and identifier, and add global.json for SDK versioning --- CORP-MAUI/AppShell.xaml | 25 ++++++--- CORP-MAUI/AppShell.xaml.cs | 107 +++++++++++++++++++++++++++++-------- CORP-MAUI/CORP-MAUI.csproj | 6 +-- global.json | 6 +++ hiro.keystore | Bin 0 -> 2756 bytes 5 files changed, 112 insertions(+), 32 deletions(-) create mode 100644 global.json create mode 100644 hiro.keystore diff --git a/CORP-MAUI/AppShell.xaml b/CORP-MAUI/AppShell.xaml index 4581b27..2f5acfa 100644 --- a/CORP-MAUI/AppShell.xaml +++ b/CORP-MAUI/AppShell.xaml @@ -13,9 +13,9 @@ FlyoutWidth="220" Shell.NavBarIsVisible="False" x:Name="MainShell" - FlyoutBehavior="Flyout"> + FlyoutBehavior="Disabled"> - + @@ -58,24 +58,33 @@ - - + + + + + + + + + + + - + - + - + - + diff --git a/CORP-MAUI/AppShell.xaml.cs b/CORP-MAUI/AppShell.xaml.cs index b02da94..b308f2a 100644 --- a/CORP-MAUI/AppShell.xaml.cs +++ b/CORP-MAUI/AppShell.xaml.cs @@ -7,6 +7,7 @@ public partial class AppShell : Shell { // Порог ширины для переключения на вертикальное меню (в пикселях) private const double WideScreenThreshold = 768; + private bool _isDesktopMode; public AppShell() { @@ -29,7 +30,7 @@ public partial class AppShell : Shell Trace.WriteLine("=== APPSHELL CONSTRUCTOR END ==="); // Устанавливаем начальный режим меню - UpdateFlyoutBehavior(); + UpdateLayoutMode(); // Инициализация без ожидания (так await нельзя из синхронного конструктора) _ = InitializeAsync(); @@ -116,13 +117,15 @@ public partial class AppShell : Shell protected override void OnSizeAllocated(double width, double height) { base.OnSizeAllocated(width, height); - UpdateFlyoutBehavior(width); + UpdateLayoutMode(width); } /// - /// Обновляет режим меню в зависимости от ширины экрана + /// Обновляет режим макета в зависимости от ширины экрана + /// На широких экранах: Flyout (вертикальное меню слева) + /// На узких экранах: TabBar (нижняя панель) /// - private void UpdateFlyoutBehavior(double? width = null) + private void UpdateLayoutMode(double? width = null) { try { @@ -135,32 +138,94 @@ public partial class AppShell : Shell currentWidth = DeviceDisplay.MainDisplayInfo.Width / DeviceDisplay.MainDisplayInfo.Density; } - Trace.WriteLine($"[AppShell] UpdateFlyoutBehavior: width={currentWidth}, threshold={WideScreenThreshold}"); + bool shouldBeDesktop = currentWidth >= WideScreenThreshold; - if (currentWidth >= WideScreenThreshold) + Trace.WriteLine($"[AppShell] UpdateLayoutMode: width={currentWidth}, threshold={WideScreenThreshold}, shouldBeDesktop={shouldBeDesktop}, currentMode={_isDesktopMode}"); + + // Проверяем, нужно ли менять режим + if (shouldBeDesktop == _isDesktopMode) { - // Широкий экран - Flyout всегда открыт (Locked) - if (FlyoutBehavior != FlyoutBehavior.Locked) - { - FlyoutBehavior = FlyoutBehavior.Locked; - FlyoutIsPresented = true; - Trace.WriteLine("[AppShell] ✅ Режим: Locked (вертикальное меню слева)"); - } + return; // Режим не изменился + } + + _isDesktopMode = shouldBeDesktop; + + if (_isDesktopMode) + { + // Десктопный режим - показываем Flyout, скрываем TabBar + SwitchToDesktopMode(); } else { - // Узкий экран - Flyout выдвигается по кнопке/свайпу - if (FlyoutBehavior != FlyoutBehavior.Flyout) - { - FlyoutBehavior = FlyoutBehavior.Flyout; - FlyoutIsPresented = false; - Trace.WriteLine("[AppShell] ✅ Режим: Flyout (выдвижное меню)"); - } + // Мобильный режим - показываем TabBar, скрываем Flyout + SwitchToMobileMode(); } } catch (Exception ex) { - Trace.WriteLine($"[AppShell] ⚠️ Ошибка UpdateFlyoutBehavior: {ex.Message}"); + Trace.WriteLine($"[AppShell] ⚠️ Ошибка UpdateLayoutMode: {ex.Message}"); + } + } + + private void SwitchToDesktopMode() + { + try + { + Trace.WriteLine("[AppShell] >>> Переключение на десктопный режим (Flyout)"); + + // Скрываем TabBar + MobileTabBar.IsVisible = false; + + // Показываем FlyoutItems + DesktopFlyoutNews.IsVisible = true; + DesktopFlyoutEmployees.IsVisible = true; + DesktopFlyoutDepartments.IsVisible = true; + DesktopFlyoutRequests.IsVisible = true; + DesktopFlyoutProfile.IsVisible = true; + + // Включаем Flyout в режим Locked (всегда видим) + FlyoutBehavior = FlyoutBehavior.Locked; + FlyoutIsPresented = true; + + // Переходим на первый FlyoutItem + CurrentItem = DesktopFlyoutNews; + + Trace.WriteLine("[AppShell] ✅ Десктопный режим активирован"); + } + catch (Exception ex) + { + Trace.WriteLine($"[AppShell] ❌ Ошибка SwitchToDesktopMode: {ex.Message}"); + } + } + + private void SwitchToMobileMode() + { + try + { + Trace.WriteLine("[AppShell] >>> Переключение на мобильный режим (TabBar)"); + + // Скрываем FlyoutItems + DesktopFlyoutNews.IsVisible = false; + DesktopFlyoutEmployees.IsVisible = false; + DesktopFlyoutDepartments.IsVisible = false; + DesktopFlyoutRequests.IsVisible = false; + DesktopFlyoutProfile.IsVisible = false; + + // Отключаем Flyout + FlyoutBehavior = FlyoutBehavior.Disabled; + FlyoutIsPresented = false; + + // Показываем TabBar + MobileTabBar.IsVisible = true; + + // Переходим на TabBar + CurrentItem = MobileTabBar; + + Trace.WriteLine("[AppShell] ✅ Мобильный режим активирован"); + } + catch (Exception ex) + { + Trace.WriteLine($"[AppShell] ❌ Ошибка SwitchToMobileMode: {ex.Message}"); } } } diff --git a/CORP-MAUI/CORP-MAUI.csproj b/CORP-MAUI/CORP-MAUI.csproj index 789c68e..119b159 100644 --- a/CORP-MAUI/CORP-MAUI.csproj +++ b/CORP-MAUI/CORP-MAUI.csproj @@ -21,10 +21,10 @@ enable - CORP-MAUI + HiRo - com.companyname.corpmaui + com.robotail.hiro 1.0 @@ -50,7 +50,7 @@ - + diff --git a/global.json b/global.json new file mode 100644 index 0000000..99e8a93 --- /dev/null +++ b/global.json @@ -0,0 +1,6 @@ +{ + "sdk": { + "version": "9.0.306", + "rollForward": "latestMinor" + } +} diff --git a/hiro.keystore b/hiro.keystore new file mode 100644 index 0000000000000000000000000000000000000000..d8a3ef326a643c3248d51777154cc73a65034441 GIT binary patch literal 2756 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