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 0000000..d8a3ef3 Binary files /dev/null and b/hiro.keystore differ