浏览代码

Update control catalog to support insets samples

Max Katz 2 年之前
父节点
当前提交
a28aa6e04a

+ 2 - 2
samples/ControlCatalog.iOS/ControlCatalog.iOS.csproj

@@ -3,7 +3,7 @@
     <OutputType>Exe</OutputType>
     <ProvisioningType>manual</ProvisioningType>
     <TargetFramework>net6.0-ios</TargetFramework>
-    <SupportedOSPlatformVersion>10.0</SupportedOSPlatformVersion>
+    <SupportedOSPlatformVersion>13.0</SupportedOSPlatformVersion>
     <!-- temporal workaround for our GL interface backend -->
     <UseInterpreter>True</UseInterpreter>
     <RuntimeIdentifier>iossimulator-x64</RuntimeIdentifier>
@@ -16,4 +16,4 @@
     <ProjectReference Include="..\..\src\iOS\Avalonia.iOS\Avalonia.iOS.csproj" />
     <ProjectReference Include="..\ControlCatalog\ControlCatalog.csproj" />
   </ItemGroup>
-</Project>
+</Project>

+ 1 - 5
samples/ControlCatalog.iOS/Info.plist

@@ -13,7 +13,7 @@
 	<key>LSRequiresIPhoneOS</key>
 	<true/>
 	<key>MinimumOSVersion</key>
-	<string>10.0</string>
+	<string>13.0</string>
 	<key>UIDeviceFamily</key>
 	<array>
 		<integer>1</integer>
@@ -39,9 +39,5 @@
 		<string>UIInterfaceOrientationLandscapeLeft</string>
 		<string>UIInterfaceOrientationLandscapeRight</string>
 	</array>
-	<key>UIStatusBarHidden</key>
-	<true/>
-	<key>UIViewControllerBasedStatusBarAppearance</key>
-	<false/>
 </dict>
 </plist>

+ 2 - 2
samples/ControlCatalog/App.xaml.cs

@@ -44,11 +44,11 @@ namespace ControlCatalog
         {
             if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktopLifetime)
             {
-                desktopLifetime.MainWindow = new MainWindow();
+                desktopLifetime.MainWindow = new MainWindow { DataContext = new MainWindowViewModel() };
             }
             else if (ApplicationLifetime is ISingleViewApplicationLifetime singleViewLifetime)
             {
-                singleViewLifetime.MainView = new MainView();
+                singleViewLifetime.MainView = new MainView { DataContext = new MainWindowViewModel() };
             }
 
             base.OnFrameworkInitializationCompleted();

+ 37 - 1
samples/ControlCatalog/MainView.xaml.cs

@@ -1,5 +1,6 @@
 using System;
 using System.Collections;
+using System.Threading.Tasks;
 using Avalonia;
 using Avalonia.Controls;
 using Avalonia.Controls.ApplicationLifetimes;
@@ -12,6 +13,7 @@ using Avalonia.VisualTree;
 using Avalonia.Styling;
 using ControlCatalog.Models;
 using ControlCatalog.Pages;
+using ControlCatalog.ViewModels;
 
 namespace ControlCatalog
 {
@@ -99,13 +101,47 @@ namespace ControlCatalog
             };
         }
 
+        internal MainWindowViewModel ViewModel => (MainWindowViewModel)DataContext!;
+        
         protected override void OnAttachedToVisualTree(VisualTreeAttachmentEventArgs e)
         {
             base.OnAttachedToVisualTree(e);
+
             var decorations = this.Get<ComboBox>("Decorations");
             if (VisualRoot is Window window)
                 decorations.SelectedIndex = (int)window.SystemDecorations;
-            
+
+            var insets = TopLevel.GetTopLevel(this)!.InsetsManager;
+            if (insets != null)
+            {
+                // In real life application these events should be unsubscribed to avoid memory leaks.
+                ViewModel.SafeAreaPadding = insets.SafeAreaPadding;
+                insets.SafeAreaChanged += (sender, args) =>
+                {
+                    ViewModel.SafeAreaPadding = insets.SafeAreaPadding;
+                };
+
+                ViewModel.DisplayEdgeToEdge = insets.DisplayEdgeToEdge;
+                ViewModel.IsSystemBarVisible = insets.IsSystemBarVisible ?? false;
+
+                ViewModel.PropertyChanged += async (sender, args) =>
+                {
+                    if (args.PropertyName == nameof(ViewModel.DisplayEdgeToEdge))
+                    {
+                        insets.DisplayEdgeToEdge = ViewModel.DisplayEdgeToEdge;
+                    }
+                    else if (args.PropertyName == nameof(ViewModel.IsSystemBarVisible))
+                    {
+                        insets.IsSystemBarVisible = ViewModel.IsSystemBarVisible;
+                    }
+
+                    // Give the OS some time to apply new values and refresh the view model.
+                    await Task.Delay(100);
+                    ViewModel.DisplayEdgeToEdge = insets.DisplayEdgeToEdge;
+                    ViewModel.IsSystemBarVisible = insets.IsSystemBarVisible ?? false;
+                };
+            }
+
             _platformSettings.ColorValuesChanged += PlatformSettingsOnColorValuesChanged;
             PlatformSettingsOnColorValuesChanged(_platformSettings, _platformSettings.GetColorValues());
         }

+ 0 - 1
samples/ControlCatalog/MainWindow.xaml.cs

@@ -17,7 +17,6 @@ namespace ControlCatalog
         {
             this.InitializeComponent();
 
-            DataContext = new MainWindowViewModel();
             _recentMenu = ((NativeMenu.GetMenu(this)?.Items[0] as NativeMenuItem)?.Menu?.Items[2] as NativeMenuItem)?.Menu;
         }
 

+ 16 - 6
samples/ControlCatalog/Pages/WindowCustomizationsPage.xaml

@@ -5,11 +5,21 @@
              xmlns:viewModels="using:ControlCatalog.ViewModels"
              mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
              x:Class="ControlCatalog.Pages.WindowCustomizationsPage"
-             x:DataType="viewModels:MainWindowViewModel">
-  <StackPanel Spacing="10"  Margin="25">
-    <CheckBox Content="Extend Client Area to Decorations" IsChecked="{Binding ExtendClientAreaEnabled}" />
-    <CheckBox Content="Title Bar" IsChecked="{Binding SystemTitleBarEnabled}" />    
-    <CheckBox Content="Prefer System Chrome" IsChecked="{Binding PreferSystemChromeEnabled}" />
-    <Slider Minimum="-1" Maximum="200" Value="{Binding TitleBarHeight}" />
+             x:DataType="viewModels:MainWindowViewModel"
+             x:CompileBindings="True">
+  <StackPanel>
+    <StackPanel Spacing="10" Margin="25" IsEnabled="{OnFormFactor false, Desktop=true}">
+      <TextBlock Classes="h2" Text="Desktop properties" Margin="4" />
+      <CheckBox Content="Extend Client Area to Decorations" IsChecked="{Binding ExtendClientAreaEnabled}" />
+      <CheckBox Content="Title Bar" IsChecked="{Binding SystemTitleBarEnabled}" />
+      <CheckBox Content="Prefer System Chrome" IsChecked="{Binding PreferSystemChromeEnabled}" />
+      <Slider Minimum="-1" Maximum="200" Value="{Binding TitleBarHeight}" />
+    </StackPanel>
+    <StackPanel Spacing="10" Margin="25" IsEnabled="{OnFormFactor false, Mobile=true}">
+      <TextBlock Classes="h2" Text="Mobile properties" Margin="4" />
+      <CheckBox Content="Is System Bar Visible" IsChecked="{Binding IsSystemBarVisible}" />
+      <CheckBox Content="Display Edge To Edge" IsChecked="{Binding DisplayEdgeToEdge}" />
+      <TextBlock Text="{Binding SafeAreaPadding, StringFormat='Safe Area Padding: {0}'}" />
+    </StackPanel>
   </StackPanel>
 </UserControl>

+ 26 - 4
samples/ControlCatalog/ViewModels/MainWindowViewModel.cs

@@ -6,6 +6,7 @@ using Avalonia.Platform;
 using Avalonia.Reactive;
 using System;
 using System.ComponentModel.DataAnnotations;
+using Avalonia;
 using MiniMvvm;
 
 namespace ControlCatalog.ViewModels
@@ -20,6 +21,9 @@ namespace ControlCatalog.ViewModels
         private bool _systemTitleBarEnabled;
         private bool _preferSystemChromeEnabled;
         private double _titleBarHeight;
+        private bool _isSystemBarVisible;
+        private bool _displayEdgeToEdge;
+        private Thickness _safeAreaPadding;
 
         public MainWindowViewModel()
         {
@@ -78,25 +82,25 @@ namespace ControlCatalog.ViewModels
         {
             get { return _chromeHints; }
             set { this.RaiseAndSetIfChanged(ref _chromeHints, value); }
-        }        
+        }
 
         public bool ExtendClientAreaEnabled
         {
             get { return _extendClientAreaEnabled; }
             set { this.RaiseAndSetIfChanged(ref _extendClientAreaEnabled, value); }
-        }        
+        }
 
         public bool SystemTitleBarEnabled
         {
             get { return _systemTitleBarEnabled; }
             set { this.RaiseAndSetIfChanged(ref _systemTitleBarEnabled, value); }
-        }        
+        }
 
         public bool PreferSystemChromeEnabled
         {
             get { return _preferSystemChromeEnabled; }
             set { this.RaiseAndSetIfChanged(ref _preferSystemChromeEnabled, value); }
-        }        
+        }
 
         public double TitleBarHeight
         {
@@ -122,6 +126,24 @@ namespace ControlCatalog.ViewModels
             set { this.RaiseAndSetIfChanged(ref _isMenuItemChecked, value); }
         }
 
+        public bool IsSystemBarVisible
+        {
+            get { return _isSystemBarVisible; }
+            set { this.RaiseAndSetIfChanged(ref _isSystemBarVisible, value); }
+        }
+
+        public bool DisplayEdgeToEdge
+        {
+            get { return _displayEdgeToEdge; }
+            set { this.RaiseAndSetIfChanged(ref _displayEdgeToEdge, value); }
+        }
+        
+        public Thickness SafeAreaPadding
+        {
+            get { return _safeAreaPadding; }
+            set { this.RaiseAndSetIfChanged(ref _safeAreaPadding, value); }
+        }
+
         public MiniCommand AboutCommand { get; }
 
         public MiniCommand ExitCommand { get; }