28 changed files with 672 additions and 5 deletions
|
After Width: | Height: | Size: 14 KiB |
@ -0,0 +1,11 @@ |
|||||
|
using Android.App; |
||||
|
using Android.Content.PM; |
||||
|
using Avalonia.Android; |
||||
|
|
||||
|
namespace SafeAreaDemo.Android |
||||
|
{ |
||||
|
[Activity(Label = "SafeAreaDemo.Android", Theme = "@style/MyTheme.NoActionBar", Icon = "@drawable/icon", LaunchMode = LaunchMode.SingleTop, ConfigurationChanges = ConfigChanges.Orientation | ConfigChanges.ScreenSize | ConfigChanges.UiMode)] |
||||
|
public class MainActivity : AvaloniaMainActivity |
||||
|
{ |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,5 @@ |
|||||
|
<?xml version="1.0" encoding="utf-8"?> |
||||
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:installLocation="auto"> |
||||
|
<uses-permission android:name="android.permission.INTERNET" /> |
||||
|
<application android:label="SafeAreaDemo" android:icon="@drawable/Icon" /> |
||||
|
</manifest> |
||||
@ -0,0 +1,13 @@ |
|||||
|
<?xml version="1.0" encoding="utf-8"?> |
||||
|
<layer-list xmlns:android="http://schemas.android.com/apk/res/android"> |
||||
|
|
||||
|
<item> |
||||
|
<color android:color="@color/splash_background"/> |
||||
|
</item> |
||||
|
|
||||
|
<item android:drawable="@drawable/icon" |
||||
|
android:width="120dp" |
||||
|
android:height="120dp" |
||||
|
android:gravity="center" /> |
||||
|
|
||||
|
</layer-list> |
||||
@ -0,0 +1,4 @@ |
|||||
|
<?xml version="1.0" encoding="utf-8"?> |
||||
|
<resources> |
||||
|
<color name="splash_background">#FFFFFF</color> |
||||
|
</resources> |
||||
@ -0,0 +1,17 @@ |
|||||
|
<?xml version="1.0" encoding="utf-8" ?> |
||||
|
<resources> |
||||
|
|
||||
|
<style name="MyTheme"> |
||||
|
</style> |
||||
|
|
||||
|
<style name="MyTheme.NoActionBar" parent="@style/Theme.AppCompat.NoActionBar"> |
||||
|
<item name="android:windowActionBar">false</item> |
||||
|
<item name="android:windowNoTitle">true</item> |
||||
|
</style> |
||||
|
|
||||
|
<style name="MyTheme.Splash" parent ="MyTheme.NoActionBar"> |
||||
|
<item name="android:windowBackground">@drawable/splash_screen</item> |
||||
|
<item name="android:windowContentOverlay">@null</item> |
||||
|
</style> |
||||
|
|
||||
|
</resources> |
||||
@ -0,0 +1,24 @@ |
|||||
|
<Project Sdk="Microsoft.NET.Sdk"> |
||||
|
<PropertyGroup> |
||||
|
<OutputType>Exe</OutputType> |
||||
|
<TargetFramework>net7.0-android</TargetFramework> |
||||
|
<SupportedOSPlatformVersion>21</SupportedOSPlatformVersion> |
||||
|
<Nullable>enable</Nullable> |
||||
|
<ApplicationId>com.avalonia.safeareademo</ApplicationId> |
||||
|
<ApplicationVersion>1</ApplicationVersion> |
||||
|
<ApplicationDisplayVersion>1.0</ApplicationDisplayVersion> |
||||
|
<AndroidPackageFormat>apk</AndroidPackageFormat> |
||||
|
<AndroidEnableProfiledAot>False</AndroidEnableProfiledAot> |
||||
|
</PropertyGroup> |
||||
|
|
||||
|
<ItemGroup> |
||||
|
<AndroidResource Include="Icon.png"> |
||||
|
<Link>Resources\drawable\Icon.png</Link> |
||||
|
</AndroidResource> |
||||
|
</ItemGroup> |
||||
|
|
||||
|
<ItemGroup> |
||||
|
<ProjectReference Include="..\SafeAreaDemo\SafeAreaDemo.csproj" /> |
||||
|
<ProjectReference Include="..\..\src\Android\Avalonia.Android\Avalonia.Android.csproj" /> |
||||
|
</ItemGroup> |
||||
|
</Project> |
||||
@ -0,0 +1,30 @@ |
|||||
|
using Android.App; |
||||
|
using Android.Content; |
||||
|
using Android.OS; |
||||
|
using Avalonia; |
||||
|
using Avalonia.Android; |
||||
|
using Application = Android.App.Application; |
||||
|
|
||||
|
namespace SafeAreaDemo.Android |
||||
|
{ |
||||
|
[Activity(Theme = "@style/MyTheme.Splash", MainLauncher = true, NoHistory = true)] |
||||
|
public class SplashActivity : AvaloniaSplashActivity<App> |
||||
|
{ |
||||
|
protected override AppBuilder CustomizeAppBuilder(AppBuilder builder) |
||||
|
{ |
||||
|
return base.CustomizeAppBuilder(builder); |
||||
|
} |
||||
|
|
||||
|
protected override void OnCreate(Bundle? savedInstanceState) |
||||
|
{ |
||||
|
base.OnCreate(savedInstanceState); |
||||
|
} |
||||
|
|
||||
|
protected override void OnResume() |
||||
|
{ |
||||
|
base.OnResume(); |
||||
|
|
||||
|
StartActivity(new Intent(Application.Context, typeof(MainActivity))); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,21 @@ |
|||||
|
using Avalonia; |
||||
|
using System; |
||||
|
|
||||
|
namespace SafeAreaDemo.Desktop |
||||
|
{ |
||||
|
internal class Program |
||||
|
{ |
||||
|
// Initialization code. Don't use any Avalonia, third-party APIs or any
|
||||
|
// SynchronizationContext-reliant code before AppMain is called: things aren't initialized
|
||||
|
// yet and stuff might break.
|
||||
|
[STAThread] |
||||
|
public static void Main(string[] args) => BuildAvaloniaApp() |
||||
|
.StartWithClassicDesktopLifetime(args); |
||||
|
|
||||
|
// Avalonia configuration, don't remove; also used by visual designer.
|
||||
|
public static AppBuilder BuildAvaloniaApp() |
||||
|
=> AppBuilder.Configure<App>() |
||||
|
.UsePlatformDetect() |
||||
|
.LogToTrace(); |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,24 @@ |
|||||
|
<Project Sdk="Microsoft.NET.Sdk"> |
||||
|
<PropertyGroup> |
||||
|
<OutputType>WinExe</OutputType> |
||||
|
<!--If you are willing to use Windows/MacOS native APIs you will need to create 3 projects. |
||||
|
One for Windows with net7.0-windows TFM, one for MacOS with net7.0-macos and one with net7.0 TFM for Linux.--> |
||||
|
<TargetFramework>net7.0</TargetFramework> |
||||
|
<Nullable>enable</Nullable> |
||||
|
<BuiltInComInteropSupport>true</BuiltInComInteropSupport> |
||||
|
</PropertyGroup> |
||||
|
|
||||
|
<PropertyGroup> |
||||
|
<ApplicationManifest>app.manifest</ApplicationManifest> |
||||
|
</PropertyGroup> |
||||
|
|
||||
|
<ItemGroup> |
||||
|
<ProjectReference Include="..\..\src\Avalonia.Diagnostics\Avalonia.Diagnostics.csproj" /> |
||||
|
<ProjectReference Include="..\..\src\Avalonia.Headless.Vnc\Avalonia.Headless.Vnc.csproj" /> |
||||
|
<ProjectReference Include="..\..\src\Linux\Avalonia.LinuxFramebuffer\Avalonia.LinuxFramebuffer.csproj" /> |
||||
|
<ProjectReference Include="..\..\src\Avalonia.X11\Avalonia.X11.csproj" /> |
||||
|
<ProjectReference Include="..\SafeAreaDemo\SafeAreaDemo.csproj" /> |
||||
|
</ItemGroup> |
||||
|
<Import Project="..\..\build\SampleApp.props" /> |
||||
|
<Import Project="..\..\build\ReferenceCoreLibraries.props" /> |
||||
|
</Project> |
||||
@ -0,0 +1,18 @@ |
|||||
|
<?xml version="1.0" encoding="utf-8"?> |
||||
|
<assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1"> |
||||
|
<!-- This manifest is used on Windows only. |
||||
|
Don't remove it as it might cause problems with window transparency and embeded controls. |
||||
|
For more details visit https://learn.microsoft.com/en-us/windows/win32/sbscs/application-manifests --> |
||||
|
<assemblyIdentity version="1.0.0.0" name="SafeAreaDemo.Desktop"/> |
||||
|
|
||||
|
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1"> |
||||
|
<application> |
||||
|
<!-- A list of the Windows versions that this application has been tested on |
||||
|
and is designed to work with. Uncomment the appropriate elements |
||||
|
and Windows will automatically select the most compatible environment. --> |
||||
|
|
||||
|
<!-- Windows 10 --> |
||||
|
<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}" /> |
||||
|
</application> |
||||
|
</compatibility> |
||||
|
</assembly> |
||||
@ -0,0 +1,17 @@ |
|||||
|
using Avalonia; |
||||
|
using Avalonia.Controls; |
||||
|
using Avalonia.iOS; |
||||
|
using Avalonia.Media; |
||||
|
using Foundation; |
||||
|
using UIKit; |
||||
|
|
||||
|
namespace SafeAreaDemo.iOS |
||||
|
{ |
||||
|
// The UIApplicationDelegate for the application. This class is responsible for launching the
|
||||
|
// User Interface of the application, as well as listening (and optionally responding) to
|
||||
|
// application events from iOS.
|
||||
|
[Register("AppDelegate")] |
||||
|
public partial class AppDelegate : AvaloniaAppDelegate<App> |
||||
|
{ |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,5 @@ |
|||||
|
<?xml version="1.0" encoding="UTF-8"?> |
||||
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> |
||||
|
<plist version="1.0"> |
||||
|
<dict/> |
||||
|
</plist> |
||||
@ -0,0 +1,47 @@ |
|||||
|
<?xml version="1.0" encoding="UTF-8"?> |
||||
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> |
||||
|
<plist version="1.0"> |
||||
|
<dict> |
||||
|
<key>CFBundleDisplayName</key> |
||||
|
<string>SafeAreaDemo</string> |
||||
|
<key>CFBundleIdentifier</key> |
||||
|
<string>companyName.SafeAreaDemo</string> |
||||
|
<key>CFBundleShortVersionString</key> |
||||
|
<string>1.0</string> |
||||
|
<key>CFBundleVersion</key> |
||||
|
<string>1.0</string> |
||||
|
<key>LSRequiresIPhoneOS</key> |
||||
|
<true/> |
||||
|
<key>MinimumOSVersion</key> |
||||
|
<string>10.0</string> |
||||
|
<key>UIDeviceFamily</key> |
||||
|
<array> |
||||
|
<integer>1</integer> |
||||
|
<integer>2</integer> |
||||
|
</array> |
||||
|
<key>UILaunchStoryboardName</key> |
||||
|
<string>LaunchScreen</string> |
||||
|
<key>UIRequiredDeviceCapabilities</key> |
||||
|
<array> |
||||
|
<string>armv7</string> |
||||
|
</array> |
||||
|
<key>UISupportedInterfaceOrientations</key> |
||||
|
<array> |
||||
|
<string>UIInterfaceOrientationPortrait</string> |
||||
|
<string>UIInterfaceOrientationPortraitUpsideDown</string> |
||||
|
<string>UIInterfaceOrientationLandscapeLeft</string> |
||||
|
<string>UIInterfaceOrientationLandscapeRight</string> |
||||
|
</array> |
||||
|
<key>UISupportedInterfaceOrientations~ipad</key> |
||||
|
<array> |
||||
|
<string>UIInterfaceOrientationPortrait</string> |
||||
|
<string>UIInterfaceOrientationPortraitUpsideDown</string> |
||||
|
<string>UIInterfaceOrientationLandscapeLeft</string> |
||||
|
<string>UIInterfaceOrientationLandscapeRight</string> |
||||
|
</array> |
||||
|
<key>UIStatusBarHidden</key> |
||||
|
<true/> |
||||
|
<key>UIViewControllerBasedStatusBarAppearance</key> |
||||
|
<false/> |
||||
|
</dict> |
||||
|
</plist> |
||||
@ -0,0 +1,15 @@ |
|||||
|
using UIKit; |
||||
|
|
||||
|
namespace SafeAreaDemo.iOS |
||||
|
{ |
||||
|
public class Application |
||||
|
{ |
||||
|
// This is the main entry point of the application.
|
||||
|
static void Main(string[] args) |
||||
|
{ |
||||
|
// if you want to use a different Application Delegate class from "AppDelegate"
|
||||
|
// you can specify it here.
|
||||
|
UIApplication.Main(args, null, typeof(AppDelegate)); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,43 @@ |
|||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?> |
||||
|
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="6214" systemVersion="14A314h" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES"> |
||||
|
<dependencies> |
||||
|
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="6207" /> |
||||
|
<capability name="Constraints with non-1.0 multipliers" minToolsVersion="5.1" /> |
||||
|
</dependencies> |
||||
|
<objects> |
||||
|
<placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" /> |
||||
|
<placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder" /> |
||||
|
<view contentMode="scaleToFill" id="iN0-l3-epB"> |
||||
|
<rect key="frame" x="0.0" y="0.0" width="480" height="480" /> |
||||
|
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES" /> |
||||
|
<subviews> |
||||
|
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text=" Copyright (c) 2022 " textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" |
||||
|
minimumFontSize="9" translatesAutoresizingMaskIntoConstraints="NO" id="8ie-xW-0ye"> |
||||
|
<rect key="frame" x="20" y="439" width="441" height="21" /> |
||||
|
<fontDescription key="fontDescription" type="system" pointSize="17" /> |
||||
|
<color key="textColor" cocoaTouchSystemColor="darkTextColor" /> |
||||
|
<nil key="highlightedColor" /> |
||||
|
</label> |
||||
|
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="SafeAreaDemo" textAlignment="center" lineBreakMode="middleTruncation" baselineAdjustment="alignBaselines" |
||||
|
minimumFontSize="18" translatesAutoresizingMaskIntoConstraints="NO" id="kId-c2-rCX"> |
||||
|
<rect key="frame" x="20" y="140" width="441" height="43" /> |
||||
|
<fontDescription key="fontDescription" type="boldSystem" pointSize="36" /> |
||||
|
<color key="textColor" cocoaTouchSystemColor="darkTextColor" /> |
||||
|
<nil key="highlightedColor" /> |
||||
|
</label> |
||||
|
</subviews> |
||||
|
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite" /> |
||||
|
<constraints> |
||||
|
<constraint firstItem="kId-c2-rCX" firstAttribute="centerY" secondItem="iN0-l3-epB" secondAttribute="bottom" multiplier="1/3" constant="1" id="5cJ-9S-tgC" /> |
||||
|
<constraint firstAttribute="centerX" secondItem="kId-c2-rCX" secondAttribute="centerX" id="Koa-jz-hwk" /> |
||||
|
<constraint firstAttribute="bottom" secondItem="8ie-xW-0ye" secondAttribute="bottom" constant="20" id="Kzo-t9-V3l" /> |
||||
|
<constraint firstItem="8ie-xW-0ye" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" constant="20" symbolic="YES" id="MfP-vx-nX0" /> |
||||
|
<constraint firstAttribute="centerX" secondItem="8ie-xW-0ye" secondAttribute="centerX" id="ZEH-qu-HZ9" /> |
||||
|
<constraint firstItem="kId-c2-rCX" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" constant="20" symbolic="YES" id="fvb-Df-36g" /> |
||||
|
</constraints> |
||||
|
<nil key="simulatedStatusBarMetrics" /> |
||||
|
<freeformSimulatedSizeMetrics key="simulatedDestinationMetrics" /> |
||||
|
<point key="canvasLocation" x="548" y="455" /> |
||||
|
</view> |
||||
|
</objects> |
||||
|
</document> |
||||
@ -0,0 +1,18 @@ |
|||||
|
<Project Sdk="Microsoft.NET.Sdk"> |
||||
|
<PropertyGroup> |
||||
|
<OutputType>Exe</OutputType> |
||||
|
<TargetFramework>net7.0-ios</TargetFramework> |
||||
|
<SupportedOSPlatformVersion>10.0</SupportedOSPlatformVersion> |
||||
|
<ProvisioningType>manual</ProvisioningType> |
||||
|
<Nullable>enable</Nullable> |
||||
|
<RuntimeIdentifier>iossimulator-x64</RuntimeIdentifier> |
||||
|
|
||||
|
<!-- These properties need to be set in order to run on a real iDevice --> |
||||
|
<!--<RuntimeIdentifier>ios-arm64</RuntimeIdentifier>--> |
||||
|
<!--<CodesignKey></CodesignKey>--> |
||||
|
</PropertyGroup> |
||||
|
<ItemGroup> |
||||
|
<ProjectReference Include="..\SafeAreaDemo\SafeAreaDemo.csproj" /> |
||||
|
<ProjectReference Include="..\..\src\iOS\Avalonia.iOS\Avalonia.iOS.csproj" /> |
||||
|
</ItemGroup> |
||||
|
</Project> |
||||
@ -0,0 +1,15 @@ |
|||||
|
<Application xmlns="https://github.com/avaloniaui" |
||||
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" |
||||
|
xmlns:local="using:SafeAreaDemo" |
||||
|
x:Class="SafeAreaDemo.App" |
||||
|
RequestedThemeVariant="Default"> |
||||
|
<!-- "Default" ThemeVariant follows system theme variant. "Dark" or "Light" are other available options. --> |
||||
|
|
||||
|
<Application.DataTemplates> |
||||
|
<local:ViewLocator/> |
||||
|
</Application.DataTemplates> |
||||
|
|
||||
|
<Application.Styles> |
||||
|
<FluentTheme /> |
||||
|
</Application.Styles> |
||||
|
</Application> |
||||
@ -0,0 +1,36 @@ |
|||||
|
using Avalonia; |
||||
|
using Avalonia.Controls.ApplicationLifetimes; |
||||
|
using Avalonia.Markup.Xaml; |
||||
|
using SafeAreaDemo.ViewModels; |
||||
|
using SafeAreaDemo.Views; |
||||
|
|
||||
|
namespace SafeAreaDemo |
||||
|
{ |
||||
|
public partial class App : Application |
||||
|
{ |
||||
|
public override void Initialize() |
||||
|
{ |
||||
|
AvaloniaXamlLoader.Load(this); |
||||
|
} |
||||
|
|
||||
|
public override void OnFrameworkInitializationCompleted() |
||||
|
{ |
||||
|
if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop) |
||||
|
{ |
||||
|
desktop.MainWindow = new MainWindow |
||||
|
{ |
||||
|
DataContext = new MainViewModel() |
||||
|
}; |
||||
|
} |
||||
|
else if (ApplicationLifetime is ISingleViewApplicationLifetime singleViewPlatform) |
||||
|
{ |
||||
|
singleViewPlatform.MainView = new MainView |
||||
|
{ |
||||
|
DataContext = new MainViewModel() |
||||
|
}; |
||||
|
} |
||||
|
|
||||
|
base.OnFrameworkInitializationCompleted(); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
After Width: | Height: | Size: 172 KiB |
@ -0,0 +1,27 @@ |
|||||
|
<Project Sdk="Microsoft.NET.Sdk"> |
||||
|
<PropertyGroup> |
||||
|
<TargetFramework>net7.0</TargetFramework> |
||||
|
<Nullable>enable</Nullable> |
||||
|
<LangVersion>latest</LangVersion> |
||||
|
<AvaloniaUseCompiledBindingsByDefault>true</AvaloniaUseCompiledBindingsByDefault> |
||||
|
</PropertyGroup> |
||||
|
|
||||
|
|
||||
|
<ItemGroup> |
||||
|
<Compile Update="**\*.xaml.cs"> |
||||
|
<DependentUpon>%(Filename)</DependentUpon> |
||||
|
</Compile> |
||||
|
<AvaloniaResource Include="**\*.xaml"> |
||||
|
<SubType>Designer</SubType> |
||||
|
</AvaloniaResource> |
||||
|
<AvaloniaResource Include="Assets\**" /> |
||||
|
</ItemGroup> |
||||
|
|
||||
|
<ItemGroup> |
||||
|
<ProjectReference Include="..\..\packages\Avalonia\Avalonia.csproj" /> |
||||
|
<ProjectReference Include="..\..\src\Avalonia.Themes.Fluent\Avalonia.Themes.Fluent.csproj" /> |
||||
|
<ProjectReference Include="..\MiniMvvm\MiniMvvm.csproj" /> |
||||
|
</ItemGroup> |
||||
|
|
||||
|
<Import Project="..\..\build\BuildTargets.targets" /> |
||||
|
</Project> |
||||
@ -0,0 +1,31 @@ |
|||||
|
using System; |
||||
|
using Avalonia.Controls; |
||||
|
using Avalonia.Controls.Templates; |
||||
|
using MiniMvvm; |
||||
|
|
||||
|
namespace SafeAreaDemo |
||||
|
{ |
||||
|
public class ViewLocator : IDataTemplate |
||||
|
{ |
||||
|
public Control Build(object data) |
||||
|
{ |
||||
|
if (data is null) |
||||
|
return null; |
||||
|
|
||||
|
var name = data.GetType().FullName!.Replace("ViewModel", "View"); |
||||
|
var type = Type.GetType(name); |
||||
|
|
||||
|
if (type != null) |
||||
|
{ |
||||
|
return (Control)Activator.CreateInstance(type)!; |
||||
|
} |
||||
|
|
||||
|
return new TextBlock { Text = name }; |
||||
|
} |
||||
|
|
||||
|
public bool Match(object? data) |
||||
|
{ |
||||
|
return data is ViewModelBase; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,112 @@ |
|||||
|
using Avalonia; |
||||
|
using Avalonia.Controls.Platform; |
||||
|
using MiniMvvm; |
||||
|
|
||||
|
namespace SafeAreaDemo.ViewModels |
||||
|
{ |
||||
|
public class MainViewModel : ViewModelBase |
||||
|
{ |
||||
|
private bool _useSafeArea = true; |
||||
|
private bool _fullscreen; |
||||
|
private IInsetsManager? _insetsManager; |
||||
|
private bool _hideSystemBars; |
||||
|
|
||||
|
public Thickness SafeAreaPadding |
||||
|
{ |
||||
|
get |
||||
|
{ |
||||
|
return _insetsManager?.SafeAreaPadding ?? default; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
public Thickness ViewPadding |
||||
|
{ |
||||
|
get |
||||
|
{ |
||||
|
return _useSafeArea ? SafeAreaPadding : default; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
public bool UseSafeArea |
||||
|
{ |
||||
|
get => _useSafeArea; |
||||
|
set |
||||
|
{ |
||||
|
_useSafeArea = value; |
||||
|
|
||||
|
this.RaisePropertyChanged(); |
||||
|
|
||||
|
RaiseSafeAreaChanged(); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
public bool Fullscreen |
||||
|
{ |
||||
|
get => _fullscreen; |
||||
|
set |
||||
|
{ |
||||
|
_fullscreen = value; |
||||
|
|
||||
|
if (_insetsManager != null) |
||||
|
{ |
||||
|
_insetsManager.DisplayEdgeToEdge = value; |
||||
|
} |
||||
|
|
||||
|
this.RaisePropertyChanged(); |
||||
|
|
||||
|
RaiseSafeAreaChanged(); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
public bool HideSystemBars |
||||
|
{ |
||||
|
get => _hideSystemBars; |
||||
|
set |
||||
|
{ |
||||
|
_hideSystemBars = value; |
||||
|
|
||||
|
if (_insetsManager != null) |
||||
|
{ |
||||
|
_insetsManager.IsSystemBarVisible = !value; |
||||
|
} |
||||
|
|
||||
|
this.RaisePropertyChanged(); |
||||
|
|
||||
|
RaiseSafeAreaChanged(); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
internal IInsetsManager? InsetsManager |
||||
|
{ |
||||
|
get => _insetsManager; |
||||
|
set |
||||
|
{ |
||||
|
if (_insetsManager != null) |
||||
|
{ |
||||
|
_insetsManager.SafeAreaChanged -= InsetsManager_SafeAreaChanged; |
||||
|
} |
||||
|
|
||||
|
_insetsManager = value; |
||||
|
|
||||
|
if (_insetsManager != null) |
||||
|
{ |
||||
|
_insetsManager.SafeAreaChanged += InsetsManager_SafeAreaChanged; |
||||
|
|
||||
|
_insetsManager.DisplayEdgeToEdge = _fullscreen; |
||||
|
_insetsManager.IsSystemBarVisible = !_hideSystemBars; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
private void InsetsManager_SafeAreaChanged(object? sender, SafeAreaChangedArgs e) |
||||
|
{ |
||||
|
RaiseSafeAreaChanged(); |
||||
|
} |
||||
|
|
||||
|
private void RaiseSafeAreaChanged() |
||||
|
{ |
||||
|
this.RaisePropertyChanged(nameof(SafeAreaPadding)); |
||||
|
this.RaisePropertyChanged(nameof(ViewPadding)); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,52 @@ |
|||||
|
<UserControl xmlns="https://github.com/avaloniaui" |
||||
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" |
||||
|
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" |
||||
|
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" |
||||
|
xmlns:vm="clr-namespace:SafeAreaDemo.ViewModels" |
||||
|
mc:Ignorable="d" |
||||
|
d:DesignWidth="800" |
||||
|
d:DesignHeight="450" |
||||
|
x:Class="SafeAreaDemo.Views.MainView" |
||||
|
x:DataType="vm:MainViewModel"> |
||||
|
<Grid HorizontalAlignment="Stretch" |
||||
|
VerticalAlignment="Stretch"> |
||||
|
<Border BorderBrush="Red" |
||||
|
Margin="{Binding ViewPadding}" |
||||
|
BorderThickness="1"> |
||||
|
<Grid> |
||||
|
<Label Margin="5" |
||||
|
Foreground="Red" |
||||
|
HorizontalAlignment="Stretch" |
||||
|
HorizontalContentAlignment="Right">View Bounds</Label> |
||||
|
<Label Margin="5" |
||||
|
Foreground="Red" |
||||
|
VerticalAlignment="Bottom" |
||||
|
HorizontalContentAlignment="Right">View Bounds</Label> |
||||
|
</Grid> |
||||
|
</Border> |
||||
|
<Border BorderBrush="LimeGreen" |
||||
|
Margin="{Binding SafeAreaPadding}" |
||||
|
BorderThickness="1"> |
||||
|
<DockPanel> |
||||
|
<Label Margin="5" |
||||
|
Foreground="LimeGreen" |
||||
|
DockPanel.Dock="Bottom" |
||||
|
HorizontalAlignment="Stretch" |
||||
|
HorizontalContentAlignment="Left" >Safe Area</Label> |
||||
|
<Grid DockPanel.Dock="Bottom" |
||||
|
HorizontalAlignment="Stretch" |
||||
|
VerticalAlignment="Stretch"> |
||||
|
<StackPanel Orientation="Vertical" |
||||
|
HorizontalAlignment="Center" |
||||
|
VerticalAlignment="Center"> |
||||
|
<Label HorizontalAlignment="Left">Options:</Label> |
||||
|
<CheckBox IsChecked="{Binding Fullscreen}">Fullscreen</CheckBox> |
||||
|
<CheckBox IsChecked="{Binding UseSafeArea}">Use Safe Area</CheckBox> |
||||
|
<CheckBox IsChecked="{Binding HideSystemBars}">Hide System Bars</CheckBox> |
||||
|
<TextBox Width="200" Watermark="Tap to Show Keyboard"/> |
||||
|
</StackPanel> |
||||
|
</Grid> |
||||
|
</DockPanel> |
||||
|
</Border> |
||||
|
</Grid> |
||||
|
</UserControl> |
||||
@ -0,0 +1,25 @@ |
|||||
|
using Avalonia.Controls; |
||||
|
using Avalonia.Markup.Xaml; |
||||
|
using SafeAreaDemo.ViewModels; |
||||
|
|
||||
|
namespace SafeAreaDemo.Views |
||||
|
{ |
||||
|
public partial class MainView : UserControl |
||||
|
{ |
||||
|
public MainView() |
||||
|
{ |
||||
|
AvaloniaXamlLoader.Load(this); |
||||
|
} |
||||
|
|
||||
|
protected override void OnLoaded() |
||||
|
{ |
||||
|
base.OnLoaded(); |
||||
|
|
||||
|
var insetsManager = TopLevel.GetTopLevel(this)?.InsetsManager; |
||||
|
if (insetsManager != null && DataContext is MainViewModel viewModel) |
||||
|
{ |
||||
|
viewModel.InsetsManager = insetsManager; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,12 @@ |
|||||
|
<Window xmlns="https://github.com/avaloniaui" |
||||
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" |
||||
|
xmlns:vm="using:SafeAreaDemo.ViewModels" |
||||
|
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" |
||||
|
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" |
||||
|
xmlns:views="clr-namespace:SafeAreaDemo.Views" |
||||
|
mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450" |
||||
|
x:Class="SafeAreaDemo.Views.MainWindow" |
||||
|
Icon="/Assets/avalonia-logo.ico" |
||||
|
Title="SafeAreaDemo"> |
||||
|
<views:MainView /> |
||||
|
</Window> |
||||
@ -0,0 +1,13 @@ |
|||||
|
using Avalonia.Controls; |
||||
|
using Avalonia.Markup.Xaml; |
||||
|
|
||||
|
namespace SafeAreaDemo.Views |
||||
|
{ |
||||
|
public partial class MainWindow : Window |
||||
|
{ |
||||
|
public MainWindow() |
||||
|
{ |
||||
|
AvaloniaXamlLoader.Load(this); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
Loading…
Reference in new issue