Browse Source

Move native control samples to the control catalog

Max Katz 3 years ago
parent
commit
57e852dfc1
57 changed files with 211 additions and 825 deletions
  1. 1 110
      Avalonia.sln
  2. 9 14
      samples/ControlCatalog.Android/EmbedSample.Android.cs
  3. 5 1
      samples/ControlCatalog.Android/MainActivity.cs
  4. 13 0
      samples/ControlCatalog.NetCore/ControlCatalog.NetCore.csproj
  5. 8 14
      samples/ControlCatalog.NetCore/NativeControls/Gtk/EmbedSample.Gtk.cs
  6. 2 6
      samples/ControlCatalog.NetCore/NativeControls/Gtk/GtkHelper.cs
  7. 0 0
      samples/ControlCatalog.NetCore/NativeControls/Gtk/nodes-license.md
  8. 0 0
      samples/ControlCatalog.NetCore/NativeControls/Gtk/nodes.mp4
  9. 9 12
      samples/ControlCatalog.NetCore/NativeControls/Mac/EmbedSample.Mac.cs
  10. 5 6
      samples/ControlCatalog.NetCore/NativeControls/Mac/MacHelper.cs
  11. 17 9
      samples/ControlCatalog.NetCore/NativeControls/Win/EmbedSample.Win.cs
  12. 1 3
      samples/ControlCatalog.NetCore/NativeControls/Win/WinApi.cs
  13. 7 1
      samples/ControlCatalog.NetCore/Program.cs
  14. 8 1
      samples/ControlCatalog.iOS/AppDelegate.cs
  15. 6 11
      samples/ControlCatalog.iOS/EmbedSample.iOS.cs
  16. 15 0
      samples/ControlCatalog/ControlCatalog.csproj
  17. 5 2
      samples/ControlCatalog/MainView.xaml
  18. 13 9
      samples/ControlCatalog/Pages/NativeEmbedPage.xaml
  19. 84 0
      samples/ControlCatalog/Pages/NativeEmbedPage.xaml.cs
  20. 0 12
      samples/interop/NativeEmbedSample.Android/MainActivity.cs
  21. 0 50
      samples/interop/NativeEmbedSample.Android/NativeEmbedSample.Android.csproj
  22. 0 4
      samples/interop/NativeEmbedSample.Android/Properties/AndroidManifest.xml
  23. 0 44
      samples/interop/NativeEmbedSample.Android/Resources/AboutResources.txt
  24. 0 13
      samples/interop/NativeEmbedSample.Android/Resources/drawable/splash_screen.xml
  25. 0 4
      samples/interop/NativeEmbedSample.Android/Resources/values/colors.xml
  26. 0 17
      samples/interop/NativeEmbedSample.Android/Resources/values/styles.xml
  27. 0 16
      samples/interop/NativeEmbedSample.Android/SplashActivity.cs
  28. 0 15
      samples/interop/NativeEmbedSample.Desktop/NativeEmbedSample.Desktop.csproj
  29. 0 17
      samples/interop/NativeEmbedSample.Desktop/Program.cs
  30. 0 9
      samples/interop/NativeEmbedSample.iOS/AppDelegate.cs
  31. 0 117
      samples/interop/NativeEmbedSample.iOS/Assets.xcassets/AppIcon.appiconset/Contents.json
  32. BIN
      samples/interop/NativeEmbedSample.iOS/Assets.xcassets/AppIcon.appiconset/Icon1024.png
  33. BIN
      samples/interop/NativeEmbedSample.iOS/Assets.xcassets/AppIcon.appiconset/Icon120.png
  34. BIN
      samples/interop/NativeEmbedSample.iOS/Assets.xcassets/AppIcon.appiconset/Icon152.png
  35. BIN
      samples/interop/NativeEmbedSample.iOS/Assets.xcassets/AppIcon.appiconset/Icon167.png
  36. BIN
      samples/interop/NativeEmbedSample.iOS/Assets.xcassets/AppIcon.appiconset/Icon180.png
  37. BIN
      samples/interop/NativeEmbedSample.iOS/Assets.xcassets/AppIcon.appiconset/Icon20.png
  38. BIN
      samples/interop/NativeEmbedSample.iOS/Assets.xcassets/AppIcon.appiconset/Icon29.png
  39. BIN
      samples/interop/NativeEmbedSample.iOS/Assets.xcassets/AppIcon.appiconset/Icon40.png
  40. BIN
      samples/interop/NativeEmbedSample.iOS/Assets.xcassets/AppIcon.appiconset/Icon58.png
  41. BIN
      samples/interop/NativeEmbedSample.iOS/Assets.xcassets/AppIcon.appiconset/Icon60.png
  42. BIN
      samples/interop/NativeEmbedSample.iOS/Assets.xcassets/AppIcon.appiconset/Icon76.png
  43. BIN
      samples/interop/NativeEmbedSample.iOS/Assets.xcassets/AppIcon.appiconset/Icon80.png
  44. BIN
      samples/interop/NativeEmbedSample.iOS/Assets.xcassets/AppIcon.appiconset/Icon87.png
  45. 0 6
      samples/interop/NativeEmbedSample.iOS/Entitlements.plist
  46. 0 42
      samples/interop/NativeEmbedSample.iOS/Info.plist
  47. 0 6
      samples/interop/NativeEmbedSample.iOS/Main.cs
  48. 0 16
      samples/interop/NativeEmbedSample.iOS/NativeEmbedSample.iOS.csproj
  49. 0 43
      samples/interop/NativeEmbedSample.iOS/Resources/LaunchScreen.xib
  50. 0 7
      samples/interop/NativeEmbedSample/App.axaml
  51. 0 23
      samples/interop/NativeEmbedSample/App.axaml.cs
  52. 0 54
      samples/interop/NativeEmbedSample/EmbedSample.cs
  53. 0 45
      samples/interop/NativeEmbedSample/MainView.axaml.cs
  54. 0 10
      samples/interop/NativeEmbedSample/MainWindow.axaml
  55. 0 17
      samples/interop/NativeEmbedSample/MainWindow.axaml.cs
  56. 0 38
      samples/interop/NativeEmbedSample/NativeEmbedSample.csproj
  57. 3 1
      src/Android/Avalonia.Android/Platform/AndroidNativeControlHostImpl.cs

+ 1 - 110
Avalonia.sln

@@ -97,6 +97,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Props", "Props", "{F3AC8BC1
 		build\DevAnalyzers.props = build\DevAnalyzers.props
 		build\EmbedXaml.props = build\EmbedXaml.props
 		build\HarfBuzzSharp.props = build\HarfBuzzSharp.props
+		build\ImageSharp.props = build\ImageSharp.props
 		build\JetBrains.Annotations.props = build\JetBrains.Annotations.props
 		build\JetBrains.dotMemoryUnit.props = build\JetBrains.dotMemoryUnit.props
 		build\Microsoft.CSharp.props = build\Microsoft.CSharp.props
@@ -117,7 +118,6 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Props", "Props", "{F3AC8BC1
 		build\System.Memory.props = build\System.Memory.props
 		build\UnitTests.NetFX.props = build\UnitTests.NetFX.props
 		build\XUnit.props = build\XUnit.props
-		build\ImageSharp.props = build\ImageSharp.props
 	EndProjectSection
 EndProject
 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Targets", "Targets", "{4D6FAF79-58B4-482F-9122-0668C346364C}"
@@ -179,8 +179,6 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Avalonia.FreeDesktop", "src
 EndProject
 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Avalonia.Controls.DataGrid.UnitTests", "tests\Avalonia.Controls.DataGrid.UnitTests\Avalonia.Controls.DataGrid.UnitTests.csproj", "{351337F5-D66F-461B-A957-4EF60BDB4BA6}"
 EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NativeEmbedSample", "samples\interop\NativeEmbedSample\NativeEmbedSample.csproj", "{3C84E04B-36CF-4D0D-B965-C26DD649D1F3}"
-EndProject
 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Avalonia.Themes.Fluent", "src\Avalonia.Themes.Fluent\Avalonia.Themes.Fluent.csproj", "{C42D2FC1-A531-4ED4-84B9-89AEC7C962FC}"
 EndProject
 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Avalonia.Headless", "src\Avalonia.Headless\Avalonia.Headless.csproj", "{8C89950F-F5D9-47FC-8066-CBC1EC3DF8FC}"
@@ -219,12 +217,6 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Avalonia.SourceGenerator",
 EndProject
 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DevAnalyzers", "src\tools\DevAnalyzers\DevAnalyzers.csproj", "{2B390431-288C-435C-BB6B-A374033BD8D1}"
 EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NativeEmbedSample.Android", "samples\interop\NativeEmbedSample.Android\NativeEmbedSample.Android.csproj", "{7D287579-7DB4-4415-A52A-46A5CD6FE30F}"
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NativeEmbedSample.Desktop", "samples\interop\NativeEmbedSample.Desktop\NativeEmbedSample.Desktop.csproj", "{F2389463-DDB4-4317-B894-D4DF9FF6B763}"
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NativeEmbedSample.iOS", "samples\interop\NativeEmbedSample.iOS\NativeEmbedSample.iOS.csproj", "{28DB5AD1-656D-4619-BE0B-5B475E138DF8}"
-EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
 		Ad-Hoc|Any CPU = Ad-Hoc|Any CPU
@@ -1539,30 +1531,6 @@ Global
 		{351337F5-D66F-461B-A957-4EF60BDB4BA6}.Release|iPhone.Build.0 = Release|Any CPU
 		{351337F5-D66F-461B-A957-4EF60BDB4BA6}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
 		{351337F5-D66F-461B-A957-4EF60BDB4BA6}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
-		{3C84E04B-36CF-4D0D-B965-C26DD649D1F3}.Ad-Hoc|Any CPU.ActiveCfg = Debug|Any CPU
-		{3C84E04B-36CF-4D0D-B965-C26DD649D1F3}.Ad-Hoc|Any CPU.Build.0 = Debug|Any CPU
-		{3C84E04B-36CF-4D0D-B965-C26DD649D1F3}.Ad-Hoc|iPhone.ActiveCfg = Debug|Any CPU
-		{3C84E04B-36CF-4D0D-B965-C26DD649D1F3}.Ad-Hoc|iPhone.Build.0 = Debug|Any CPU
-		{3C84E04B-36CF-4D0D-B965-C26DD649D1F3}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Debug|Any CPU
-		{3C84E04B-36CF-4D0D-B965-C26DD649D1F3}.Ad-Hoc|iPhoneSimulator.Build.0 = Debug|Any CPU
-		{3C84E04B-36CF-4D0D-B965-C26DD649D1F3}.AppStore|Any CPU.ActiveCfg = Debug|Any CPU
-		{3C84E04B-36CF-4D0D-B965-C26DD649D1F3}.AppStore|Any CPU.Build.0 = Debug|Any CPU
-		{3C84E04B-36CF-4D0D-B965-C26DD649D1F3}.AppStore|iPhone.ActiveCfg = Debug|Any CPU
-		{3C84E04B-36CF-4D0D-B965-C26DD649D1F3}.AppStore|iPhone.Build.0 = Debug|Any CPU
-		{3C84E04B-36CF-4D0D-B965-C26DD649D1F3}.AppStore|iPhoneSimulator.ActiveCfg = Debug|Any CPU
-		{3C84E04B-36CF-4D0D-B965-C26DD649D1F3}.AppStore|iPhoneSimulator.Build.0 = Debug|Any CPU
-		{3C84E04B-36CF-4D0D-B965-C26DD649D1F3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{3C84E04B-36CF-4D0D-B965-C26DD649D1F3}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{3C84E04B-36CF-4D0D-B965-C26DD649D1F3}.Debug|iPhone.ActiveCfg = Debug|Any CPU
-		{3C84E04B-36CF-4D0D-B965-C26DD649D1F3}.Debug|iPhone.Build.0 = Debug|Any CPU
-		{3C84E04B-36CF-4D0D-B965-C26DD649D1F3}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
-		{3C84E04B-36CF-4D0D-B965-C26DD649D1F3}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
-		{3C84E04B-36CF-4D0D-B965-C26DD649D1F3}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{3C84E04B-36CF-4D0D-B965-C26DD649D1F3}.Release|Any CPU.Build.0 = Release|Any CPU
-		{3C84E04B-36CF-4D0D-B965-C26DD649D1F3}.Release|iPhone.ActiveCfg = Release|Any CPU
-		{3C84E04B-36CF-4D0D-B965-C26DD649D1F3}.Release|iPhone.Build.0 = Release|Any CPU
-		{3C84E04B-36CF-4D0D-B965-C26DD649D1F3}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
-		{3C84E04B-36CF-4D0D-B965-C26DD649D1F3}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
 		{C42D2FC1-A531-4ED4-84B9-89AEC7C962FC}.Ad-Hoc|Any CPU.ActiveCfg = Debug|Any CPU
 		{C42D2FC1-A531-4ED4-84B9-89AEC7C962FC}.Ad-Hoc|Any CPU.Build.0 = Debug|Any CPU
 		{C42D2FC1-A531-4ED4-84B9-89AEC7C962FC}.Ad-Hoc|iPhone.ActiveCfg = Debug|Any CPU
@@ -1995,79 +1963,6 @@ Global
 		{2B390431-288C-435C-BB6B-A374033BD8D1}.Release|iPhone.Build.0 = Release|Any CPU
 		{2B390431-288C-435C-BB6B-A374033BD8D1}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
 		{2B390431-288C-435C-BB6B-A374033BD8D1}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
-		{7D287579-7DB4-4415-A52A-46A5CD6FE30F}.Ad-Hoc|Any CPU.ActiveCfg = Debug|Any CPU
-		{7D287579-7DB4-4415-A52A-46A5CD6FE30F}.Ad-Hoc|Any CPU.Build.0 = Debug|Any CPU
-		{7D287579-7DB4-4415-A52A-46A5CD6FE30F}.Ad-Hoc|iPhone.ActiveCfg = Debug|Any CPU
-		{7D287579-7DB4-4415-A52A-46A5CD6FE30F}.Ad-Hoc|iPhone.Build.0 = Debug|Any CPU
-		{7D287579-7DB4-4415-A52A-46A5CD6FE30F}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Debug|Any CPU
-		{7D287579-7DB4-4415-A52A-46A5CD6FE30F}.Ad-Hoc|iPhoneSimulator.Build.0 = Debug|Any CPU
-		{7D287579-7DB4-4415-A52A-46A5CD6FE30F}.AppStore|Any CPU.ActiveCfg = Debug|Any CPU
-		{7D287579-7DB4-4415-A52A-46A5CD6FE30F}.AppStore|Any CPU.Build.0 = Debug|Any CPU
-		{7D287579-7DB4-4415-A52A-46A5CD6FE30F}.AppStore|iPhone.ActiveCfg = Debug|Any CPU
-		{7D287579-7DB4-4415-A52A-46A5CD6FE30F}.AppStore|iPhone.Build.0 = Debug|Any CPU
-		{7D287579-7DB4-4415-A52A-46A5CD6FE30F}.AppStore|iPhoneSimulator.ActiveCfg = Debug|Any CPU
-		{7D287579-7DB4-4415-A52A-46A5CD6FE30F}.AppStore|iPhoneSimulator.Build.0 = Debug|Any CPU
-		{7D287579-7DB4-4415-A52A-46A5CD6FE30F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{7D287579-7DB4-4415-A52A-46A5CD6FE30F}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{7D287579-7DB4-4415-A52A-46A5CD6FE30F}.Debug|Any CPU.Deploy.0 = Debug|Any CPU
-		{7D287579-7DB4-4415-A52A-46A5CD6FE30F}.Debug|iPhone.ActiveCfg = Debug|Any CPU
-		{7D287579-7DB4-4415-A52A-46A5CD6FE30F}.Debug|iPhone.Build.0 = Debug|Any CPU
-		{7D287579-7DB4-4415-A52A-46A5CD6FE30F}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
-		{7D287579-7DB4-4415-A52A-46A5CD6FE30F}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
-		{7D287579-7DB4-4415-A52A-46A5CD6FE30F}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{7D287579-7DB4-4415-A52A-46A5CD6FE30F}.Release|Any CPU.Build.0 = Release|Any CPU
-		{7D287579-7DB4-4415-A52A-46A5CD6FE30F}.Release|iPhone.ActiveCfg = Release|Any CPU
-		{7D287579-7DB4-4415-A52A-46A5CD6FE30F}.Release|iPhone.Build.0 = Release|Any CPU
-		{7D287579-7DB4-4415-A52A-46A5CD6FE30F}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
-		{7D287579-7DB4-4415-A52A-46A5CD6FE30F}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
-		{F2389463-DDB4-4317-B894-D4DF9FF6B763}.Ad-Hoc|Any CPU.ActiveCfg = Debug|Any CPU
-		{F2389463-DDB4-4317-B894-D4DF9FF6B763}.Ad-Hoc|Any CPU.Build.0 = Debug|Any CPU
-		{F2389463-DDB4-4317-B894-D4DF9FF6B763}.Ad-Hoc|iPhone.ActiveCfg = Debug|Any CPU
-		{F2389463-DDB4-4317-B894-D4DF9FF6B763}.Ad-Hoc|iPhone.Build.0 = Debug|Any CPU
-		{F2389463-DDB4-4317-B894-D4DF9FF6B763}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Debug|Any CPU
-		{F2389463-DDB4-4317-B894-D4DF9FF6B763}.Ad-Hoc|iPhoneSimulator.Build.0 = Debug|Any CPU
-		{F2389463-DDB4-4317-B894-D4DF9FF6B763}.AppStore|Any CPU.ActiveCfg = Debug|Any CPU
-		{F2389463-DDB4-4317-B894-D4DF9FF6B763}.AppStore|Any CPU.Build.0 = Debug|Any CPU
-		{F2389463-DDB4-4317-B894-D4DF9FF6B763}.AppStore|iPhone.ActiveCfg = Debug|Any CPU
-		{F2389463-DDB4-4317-B894-D4DF9FF6B763}.AppStore|iPhone.Build.0 = Debug|Any CPU
-		{F2389463-DDB4-4317-B894-D4DF9FF6B763}.AppStore|iPhoneSimulator.ActiveCfg = Debug|Any CPU
-		{F2389463-DDB4-4317-B894-D4DF9FF6B763}.AppStore|iPhoneSimulator.Build.0 = Debug|Any CPU
-		{F2389463-DDB4-4317-B894-D4DF9FF6B763}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{F2389463-DDB4-4317-B894-D4DF9FF6B763}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{F2389463-DDB4-4317-B894-D4DF9FF6B763}.Debug|iPhone.ActiveCfg = Debug|Any CPU
-		{F2389463-DDB4-4317-B894-D4DF9FF6B763}.Debug|iPhone.Build.0 = Debug|Any CPU
-		{F2389463-DDB4-4317-B894-D4DF9FF6B763}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
-		{F2389463-DDB4-4317-B894-D4DF9FF6B763}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
-		{F2389463-DDB4-4317-B894-D4DF9FF6B763}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{F2389463-DDB4-4317-B894-D4DF9FF6B763}.Release|Any CPU.Build.0 = Release|Any CPU
-		{F2389463-DDB4-4317-B894-D4DF9FF6B763}.Release|iPhone.ActiveCfg = Release|Any CPU
-		{F2389463-DDB4-4317-B894-D4DF9FF6B763}.Release|iPhone.Build.0 = Release|Any CPU
-		{F2389463-DDB4-4317-B894-D4DF9FF6B763}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
-		{F2389463-DDB4-4317-B894-D4DF9FF6B763}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
-		{28DB5AD1-656D-4619-BE0B-5B475E138DF8}.Ad-Hoc|Any CPU.ActiveCfg = Debug|Any CPU
-		{28DB5AD1-656D-4619-BE0B-5B475E138DF8}.Ad-Hoc|Any CPU.Build.0 = Debug|Any CPU
-		{28DB5AD1-656D-4619-BE0B-5B475E138DF8}.Ad-Hoc|iPhone.ActiveCfg = Debug|Any CPU
-		{28DB5AD1-656D-4619-BE0B-5B475E138DF8}.Ad-Hoc|iPhone.Build.0 = Debug|Any CPU
-		{28DB5AD1-656D-4619-BE0B-5B475E138DF8}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Debug|Any CPU
-		{28DB5AD1-656D-4619-BE0B-5B475E138DF8}.Ad-Hoc|iPhoneSimulator.Build.0 = Debug|Any CPU
-		{28DB5AD1-656D-4619-BE0B-5B475E138DF8}.AppStore|Any CPU.ActiveCfg = Debug|Any CPU
-		{28DB5AD1-656D-4619-BE0B-5B475E138DF8}.AppStore|Any CPU.Build.0 = Debug|Any CPU
-		{28DB5AD1-656D-4619-BE0B-5B475E138DF8}.AppStore|iPhone.ActiveCfg = Debug|Any CPU
-		{28DB5AD1-656D-4619-BE0B-5B475E138DF8}.AppStore|iPhone.Build.0 = Debug|Any CPU
-		{28DB5AD1-656D-4619-BE0B-5B475E138DF8}.AppStore|iPhoneSimulator.ActiveCfg = Debug|Any CPU
-		{28DB5AD1-656D-4619-BE0B-5B475E138DF8}.AppStore|iPhoneSimulator.Build.0 = Debug|Any CPU
-		{28DB5AD1-656D-4619-BE0B-5B475E138DF8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{28DB5AD1-656D-4619-BE0B-5B475E138DF8}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{28DB5AD1-656D-4619-BE0B-5B475E138DF8}.Debug|iPhone.ActiveCfg = Debug|Any CPU
-		{28DB5AD1-656D-4619-BE0B-5B475E138DF8}.Debug|iPhone.Build.0 = Debug|Any CPU
-		{28DB5AD1-656D-4619-BE0B-5B475E138DF8}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
-		{28DB5AD1-656D-4619-BE0B-5B475E138DF8}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
-		{28DB5AD1-656D-4619-BE0B-5B475E138DF8}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{28DB5AD1-656D-4619-BE0B-5B475E138DF8}.Release|Any CPU.Build.0 = Release|Any CPU
-		{28DB5AD1-656D-4619-BE0B-5B475E138DF8}.Release|iPhone.ActiveCfg = Release|Any CPU
-		{28DB5AD1-656D-4619-BE0B-5B475E138DF8}.Release|iPhone.Build.0 = Release|Any CPU
-		{28DB5AD1-656D-4619-BE0B-5B475E138DF8}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
-		{28DB5AD1-656D-4619-BE0B-5B475E138DF8}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE
@@ -2114,7 +2009,6 @@ Global
 		{D775DECB-4E00-4ED5-A75A-5FCE58ADFF0B} = {9B9E3891-2366-4253-A952-D08BCEB71098}
 		{AF915D5C-AB00-4EA0-B5E6-001F4AE84E68} = {C5A00AC3-B34C-4564-9BDD-2DA473EF4D8B}
 		{351337F5-D66F-461B-A957-4EF60BDB4BA6} = {C5A00AC3-B34C-4564-9BDD-2DA473EF4D8B}
-		{3C84E04B-36CF-4D0D-B965-C26DD649D1F3} = {A0CC0258-D18C-4AB3-854F-7101680FC3F9}
 		{909A8CBD-7D0E-42FD-B841-022AD8925820} = {8B6A8209-894F-4BA1-B880-965FD453982C}
 		{11BE52AF-E2DD-4CF0-B19A-05285ACAF571} = {9B9E3891-2366-4253-A952-D08BCEB71098}
 		{BC594FD5-4AF2-409E-A1E6-04123F54D7C5} = {9B9E3891-2366-4253-A952-D08BCEB71098}
@@ -2127,9 +2021,6 @@ Global
 		{70B9F5CC-E2F9-4314-9514-EDE762ACCC4B} = {9B9E3891-2366-4253-A952-D08BCEB71098}
 		{CE910927-CE5A-456F-BC92-E4C757354A5C} = {C5A00AC3-B34C-4564-9BDD-2DA473EF4D8B}
 		{2B390431-288C-435C-BB6B-A374033BD8D1} = {4ED8B739-6F4E-4CD4-B993-545E6B5CE637}
-		{7D287579-7DB4-4415-A52A-46A5CD6FE30F} = {A0CC0258-D18C-4AB3-854F-7101680FC3F9}
-		{F2389463-DDB4-4317-B894-D4DF9FF6B763} = {A0CC0258-D18C-4AB3-854F-7101680FC3F9}
-		{28DB5AD1-656D-4619-BE0B-5B475E138DF8} = {A0CC0258-D18C-4AB3-854F-7101680FC3F9}
 	EndGlobalSection
 	GlobalSection(ExtensibilityGlobals) = postSolution
 		SolutionGuid = {87366D66-1391-4D90-8999-95A620AD786A}

+ 9 - 14
samples/interop/NativeEmbedSample/Android/EmbedSample.Android.cs → samples/ControlCatalog.Android/EmbedSample.Android.cs

@@ -1,26 +1,27 @@
-#if __ANDROID__ || ANDROID
+using System;
 using Avalonia.Platform;
 using Avalonia.Android;
+using ControlCatalog.Pages;
 
-namespace NativeEmbedSample;
+namespace ControlCatalog.Android;
 
-public partial class EmbedSample
+public class EmbedSampleAndroid : INativeDemoControl
 {
-    private IPlatformHandle CreateAndroid(IPlatformHandle parent)
+    public IPlatformHandle CreateControl(bool isSecond, IPlatformHandle parent, Func<IPlatformHandle> createDefault)
     {
         var parentContext = (parent as AndroidViewControlHandle)?.View.Context
-            ?? Android.App.Application.Context;
+            ?? global::Android.App.Application.Context;
 
-        if (IsSecond)
+        if (isSecond)
         {
-            var webView = new Android.Webkit.WebView(parentContext);
+            var webView = new global::Android.Webkit.WebView(parentContext);
             webView.LoadUrl("https://www.android.com/");
 
             return new AndroidViewControlHandle(webView);
         }
         else
         {
-            var button = new Android.Widget.Button(parentContext) { Text = "Hello world" };
+            var button = new global::Android.Widget.Button(parentContext) { Text = "Hello world" };
             var clickCount = 0;
             button.Click += (sender, args) =>
             {
@@ -31,10 +32,4 @@ public partial class EmbedSample
             return new AndroidViewControlHandle(button);
         }
     }
-
-    private void DestroyAndroid(IPlatformHandle control)
-    {
-        base.DestroyNativeControlCore(control);
-    }
 }
-#endif

+ 5 - 1
samples/ControlCatalog.Android/MainActivity.cs

@@ -10,7 +10,11 @@ namespace ControlCatalog.Android
     {
         protected override AppBuilder CustomizeAppBuilder(AppBuilder builder)
         {
-            return base.CustomizeAppBuilder(builder);
+            return base.CustomizeAppBuilder(builder)
+                .AfterSetup(_ =>
+                {
+                    Pages.EmbedSample.Implementation = new EmbedSampleAndroid();
+                });
         }
     }
 }

+ 13 - 0
samples/ControlCatalog.NetCore/ControlCatalog.NetCore.csproj

@@ -4,6 +4,7 @@
     <OutputType>WinExe</OutputType>
     <TargetFramework>net6.0</TargetFramework>
     <TargetLatestRuntimePatch>true</TargetLatestRuntimePatch>
+    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
   </PropertyGroup>
 
   <PropertyGroup Condition="'$(RunNativeAotCompilation)' == 'true'">
@@ -12,6 +13,16 @@
     <NativeAotCompilerVersion>7.0.0-*</NativeAotCompilerVersion>
   </PropertyGroup>
 
+  <ItemGroup>
+    <Compile Include="..\..\src\Avalonia.X11\NativeDialogs\Gtk.cs" Link="NativeControls\Gtk\Gtk.cs" />
+  </ItemGroup>
+
+  <ItemGroup>
+    <Content Include="NativeControls\Gtk\nodes.mp4">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </Content>
+  </ItemGroup>
+
   <ItemGroup>
     <ProjectReference Include="..\..\src\Avalonia.Diagnostics\Avalonia.Diagnostics.csproj" />
     <ProjectReference Include="..\..\src\Avalonia.Headless.Vnc\Avalonia.Headless.Vnc.csproj" />
@@ -20,6 +31,8 @@
     <ProjectReference Include="..\ControlCatalog\ControlCatalog.csproj" />
     <ProjectReference Include="..\..\src\Avalonia.X11\Avalonia.X11.csproj" />
     <PackageReference Include="Avalonia.Angle.Windows.Natives" Version="2.1.0.2020091801" />
+    <!-- For native controls test -->
+    <PackageReference Include="MonoMac.NetStandard" Version="0.0.4" />
   </ItemGroup>
 
   <ItemGroup Condition="'$(RunNativeAotCompilation)' == 'true'">

+ 8 - 14
samples/interop/NativeEmbedSample/Gtk/EmbedSample.Gtk.cs → samples/ControlCatalog.NetCore/NativeControls/Gtk/EmbedSample.Gtk.cs

@@ -1,24 +1,26 @@
-#if DESKTOP
 using System.IO;
 using System.Diagnostics;
 using Avalonia.Platform;
+using Avalonia.Controls.Platform;
+using System;
+using ControlCatalog.Pages;
 
-namespace NativeEmbedSample;
+namespace ControlCatalog.NetCore;
 
-public partial class EmbedSample
+public class EmbedSampleGtk : INativeDemoControl
 {
     private Process _mplayer;
 
-    IPlatformHandle CreateLinux(IPlatformHandle parent)
+    public IPlatformHandle CreateControl(bool isSecond, IPlatformHandle parent, Func<IPlatformHandle> createDefault)
     {
-        if (IsSecond)
+        if (isSecond)
         {
             var chooser = GtkHelper.CreateGtkFileChooser(parent.Handle);
             if (chooser != null)
                 return chooser;
         }
 
-        var control = base.CreateNativeControlCore(parent);
+        var control = createDefault();
         var nodes = Path.GetFullPath(Path.Combine(typeof(EmbedSample).Assembly.GetModules()[0].FullyQualifiedName,
             "..",
             "nodes.mp4"));
@@ -30,12 +32,4 @@ public partial class EmbedSample
         });
         return control;
     }
-
-    void DestroyLinux(IPlatformHandle handle)
-    {
-        _mplayer?.Kill();
-        _mplayer = null;
-        base.DestroyNativeControlCore(handle);
-    }
 }
-#endif

+ 2 - 6
samples/interop/NativeEmbedSample/Gtk/GtkHelper.cs → samples/ControlCatalog.NetCore/NativeControls/Gtk/GtkHelper.cs

@@ -1,15 +1,12 @@
-#if DESKTOP
-
 using System;
 using System.Threading.Tasks;
 using Avalonia.Controls.Platform;
-using Avalonia.Platform;
 using Avalonia.Platform.Interop;
 using Avalonia.X11.NativeDialogs;
 using static Avalonia.X11.NativeDialogs.Gtk;
 using static Avalonia.X11.NativeDialogs.Glib;
 
-namespace NativeEmbedSample;
+namespace ControlCatalog.NetCore;
 
 internal class GtkHelper
 {
@@ -39,7 +36,7 @@ internal class GtkHelper
     }
 
 
-    public static IPlatformHandle CreateGtkFileChooser(IntPtr parentXid)
+    public static INativeControlHostDestroyableControlHandle CreateGtkFileChooser(IntPtr parentXid)
     {
         if (s_gtkTask == null)
             s_gtkTask = StartGtk();
@@ -59,4 +56,3 @@ internal class GtkHelper
         }).Result;
     }
 }
-#endif

+ 0 - 0
samples/interop/NativeEmbedSample/Gtk/nodes-license.md → samples/ControlCatalog.NetCore/NativeControls/Gtk/nodes-license.md


+ 0 - 0
samples/interop/NativeEmbedSample/Gtk/nodes.mp4 → samples/ControlCatalog.NetCore/NativeControls/Gtk/nodes.mp4


+ 9 - 12
samples/interop/NativeEmbedSample/Mac/EmbedSample.Mac.cs → samples/ControlCatalog.NetCore/NativeControls/Mac/EmbedSample.Mac.cs

@@ -1,14 +1,18 @@
-#if DESKTOP
+using System;
+
 using Avalonia.Platform;
 using Avalonia.Threading;
+
+using ControlCatalog.Pages;
+
 using MonoMac.Foundation;
 using MonoMac.WebKit;
 
-namespace NativeEmbedSample;
+namespace ControlCatalog.NetCore;
 
-public partial class EmbedSample
+public class EmbedSampleMac : INativeDemoControl
 {
-    IPlatformHandle CreateOSX(IPlatformHandle parent)
+    public IPlatformHandle CreateControl(bool isSecond, IPlatformHandle parent, Func<IPlatformHandle> createDefault)
     {
         // Note: We are using MonoMac for example purposes
         // It shouldn't be used in production apps
@@ -18,15 +22,8 @@ public partial class EmbedSample
         Dispatcher.UIThread.Post(() =>
         {
             webView.MainFrame.LoadRequest(new NSUrlRequest(new NSUrl(
-                IsSecond ? "https://bing.com": "https://google.com/")));
+                isSecond ? "https://bing.com" : "https://google.com/")));
         });
         return new MacOSViewHandle(webView);
-
-    }
-
-    void DestroyOSX(IPlatformHandle handle)
-    {
-        ((MacOSViewHandle)handle).Dispose();
     }
 }
-#endif

+ 5 - 6
samples/interop/NativeEmbedSample/Mac/MacHelper.cs → samples/ControlCatalog.NetCore/NativeControls/Mac/MacHelper.cs

@@ -1,9 +1,9 @@
-#if DESKTOP
 using System;
-using Avalonia.Platform;
+
+using Avalonia.Controls.Platform;
 using MonoMac.AppKit;
 
-namespace NativeEmbedSample;
+namespace ControlCatalog.NetCore;
 
 internal class MacHelper
 {
@@ -18,7 +18,7 @@ internal class MacHelper
     }
 }
 
-internal class MacOSViewHandle : IPlatformHandle, IDisposable
+internal class MacOSViewHandle : INativeControlHostDestroyableControlHandle
 {
     private NSView _view;
 
@@ -30,10 +30,9 @@ internal class MacOSViewHandle : IPlatformHandle, IDisposable
     public IntPtr Handle => _view?.Handle ?? IntPtr.Zero;
     public string HandleDescriptor => "NSView";
 
-    public void Dispose()
+    public void Destroy()
     {
         _view.Dispose();
         _view = null;
     }
 }
-#endif

+ 17 - 9
samples/interop/NativeEmbedSample/Win/EmbedSample.Win.cs → samples/ControlCatalog.NetCore/NativeControls/Win/EmbedSample.Win.cs

@@ -1,11 +1,14 @@
-#if DESKTOP
 using System;
 using System.Text;
+
+using Avalonia.Controls.Platform;
 using Avalonia.Platform;
 
-namespace NativeEmbedSample;
+using ControlCatalog.Pages;
+
+namespace ControlCatalog.NetCore;
 
-public partial class EmbedSample
+public class EmbedSampleWin : INativeDemoControl
 {
     private const string RichText =
         @"{\rtf1\ansi\ansicpg1251\deff0\nouicompat\deflang1049{\fonttbl{\f0\fnil\fcharset0 Calibri;}}
@@ -14,7 +17,7 @@ public partial class EmbedSample
 \pard\sa200\sl276\slmult1\f0\fs22\lang9 <PREFIX>I \i am\i0  a \cf1\b Rich Text \cf0\b0\fs24 control\cf2\fs28 !\cf3\fs32 !\cf4\fs36 !\cf1\fs40 !\cf5\fs44 !\cf6\fs48 !\cf0\fs44\par
 }";
 
-    IPlatformHandle CreateWin32(IPlatformHandle parent)
+    public IPlatformHandle CreateControl(bool isSecond, IPlatformHandle parent, Func<IPlatformHandle> createDefault)
     {
         WinApi.LoadLibrary("Msftedit.dll");
         var handle = WinApi.CreateWindowEx(0, "RICHEDIT50W",
@@ -22,16 +25,21 @@ public partial class EmbedSample
             0x800000 | 0x10000000 | 0x40000000 | 0x800000 | 0x10000 | 0x0004, 0, 0, 1, 1, parent.Handle,
             IntPtr.Zero, WinApi.GetModuleHandle(null), IntPtr.Zero);
         var st = new WinApi.SETTEXTEX { Codepage = 65001, Flags = 0x00000008 };
-        var text = RichText.Replace("<PREFIX>", IsSecond ? "\\qr " : "");
+        var text = RichText.Replace("<PREFIX>", isSecond ? "\\qr " : "");
         var bytes = Encoding.UTF8.GetBytes(text);
         WinApi.SendMessage(handle, 0x0400 + 97, ref st, bytes);
-        return new PlatformHandle(handle, "HWND");
+        return new Win32WindowControlHandle(handle, "HWND");
+    }
+}
 
+internal class Win32WindowControlHandle : PlatformHandle, INativeControlHostDestroyableControlHandle
+{
+    public Win32WindowControlHandle(IntPtr handle, string descriptor) : base(handle, descriptor)
+    {
     }
 
-    void DestroyWin32(IPlatformHandle handle)
+    public void Destroy()
     {
-        WinApi.DestroyWindow(handle.Handle);
+        _ = WinApi.DestroyWindow(Handle);
     }
 }
-#endif

+ 1 - 3
samples/interop/NativeEmbedSample/Win/WinApi.cs → samples/ControlCatalog.NetCore/NativeControls/Win/WinApi.cs

@@ -1,8 +1,7 @@
-#if DESKTOP
 using System;
 using System.Runtime.InteropServices;
 
-namespace NativeEmbedSample;
+namespace ControlCatalog.NetCore;
 
 internal unsafe class WinApi
 {
@@ -72,4 +71,3 @@ internal unsafe class WinApi
     [DllImport("user32.dll", CharSet = CharSet.Unicode, EntryPoint = "SendMessageW")]
     public static extern IntPtr SendMessage(IntPtr hWnd, int Msg, ref SETTEXTEX wParam, byte[] lParam);
 }
-#endif

+ 7 - 1
samples/ControlCatalog.NetCore/Program.cs

@@ -7,11 +7,12 @@ using System.Threading.Tasks;
 using Avalonia;
 using Avalonia.Controls;
 using Avalonia.Controls.ApplicationLifetimes;
-using Avalonia.Dialogs;
 using Avalonia.Headless;
 using Avalonia.LogicalTree;
 using Avalonia.Threading;
 
+using ControlCatalog.Pages;
+
 namespace ControlCatalog.NetCore
 {
     static class Program
@@ -123,6 +124,11 @@ namespace ControlCatalog.NetCore
                     {
                         StartupScreenIndex = 1,
                     });
+
+                    EmbedSample.Implementation = OperatingSystem.IsWindows() ? (INativeDemoControl)new EmbedSampleWin()
+                        : OperatingSystem.IsMacOS() ? new EmbedSampleMac()
+                        : OperatingSystem.IsLinux() ? new EmbedSampleGtk()
+                        : null;
                 })
                 .LogToTrace();
 

+ 8 - 1
samples/ControlCatalog.iOS/AppDelegate.cs

@@ -13,6 +13,13 @@ namespace ControlCatalog
     [Register("AppDelegate")]
     public partial class AppDelegate : AvaloniaAppDelegate<App>
     {
-        
+        protected override AppBuilder CustomizeAppBuilder(AppBuilder builder)
+        {
+            return base.CustomizeAppBuilder(builder)
+                .AfterSetup(_ =>
+                {
+                    Pages.EmbedSample.Implementation = new EmbedSampleIOS();
+                });
+        }
     }
 }

+ 6 - 11
samples/interop/NativeEmbedSample/iOS/EmbedSample.iOS.cs → samples/ControlCatalog.iOS/EmbedSample.iOS.cs

@@ -1,18 +1,19 @@
-#if IOS
+using System;
 using Avalonia.Platform;
 using CoreGraphics;
 using Foundation;
 using UIKit;
 using WebKit;
 using Avalonia.iOS;
+using ControlCatalog.Pages;
 
-namespace NativeEmbedSample;
+namespace ControlCatalog;
 
-public partial class EmbedSample
+public class EmbedSampleIOS : INativeDemoControl
 {
-    private IPlatformHandle CreateIOS(IPlatformHandle parent)
+    public IPlatformHandle CreateControl(bool isSecond, IPlatformHandle parent, Func<IPlatformHandle> createDefault)
     {
-        if (IsSecond)
+        if (isSecond)
         {
             var webView = new WKWebView(CGRect.Empty, new WKWebViewConfiguration());
             webView.LoadRequest(new NSUrlRequest(new NSUrl("https://www.apple.com/")));
@@ -34,10 +35,4 @@ public partial class EmbedSample
             return new UIViewControlHandle(button);
         }
     }
-
-    private void DestroyIOS(IPlatformHandle control)
-    {
-        base.DestroyNativeControlCore(control);
-    }
 }
-#endif

+ 15 - 0
samples/ControlCatalog/ControlCatalog.csproj

@@ -13,6 +13,9 @@
     <AvaloniaResource Include="Assets\*" />
     <AvaloniaResource Include="Assets\Fonts\*" />
   </ItemGroup>
+  <ItemGroup>
+    <None Remove="Pages\NativeEmbedPage.xaml" />
+  </ItemGroup>
   <ItemGroup>
     <EmbeddedResource Include="Assets\Fonts\SourceSansPro-Bold.ttf" />
     <EmbeddedResource Include="Assets\Fonts\SourceSansPro-BoldItalic.ttf" />
@@ -29,5 +32,17 @@
     <ProjectReference Include="..\SampleControls\ControlSamples.csproj" />
   </ItemGroup>
 
+  <ItemGroup>
+    <AvaloniaResource Update="Pages\NativeEmbedPage.xaml">
+      <Generator>MSBuild:Compile</Generator>
+    </AvaloniaResource>
+  </ItemGroup>
+
+  <ItemGroup>
+    <Compile Update="Pages\NativeEmbedPage.xaml.cs">
+      <DependentUpon>%(Filename)</DependentUpon>
+    </Compile>
+  </ItemGroup>
+
   <Import Project="..\..\build\BuildTargets.targets" />
 </Project>

+ 5 - 2
samples/ControlCatalog/MainView.xaml

@@ -2,8 +2,8 @@
              xmlns="https://github.com/avaloniaui"
              xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
              xmlns:controls="clr-namespace:ControlSamples;assembly=ControlSamples"
-             xmlns:pages="clr-namespace:ControlCatalog.Pages"
-             xmlns:models="clr-namespace:ControlCatalog.Models">
+             xmlns:models="clr-namespace:ControlCatalog.Models"
+             xmlns:pages="clr-namespace:ControlCatalog.Pages">
   <Grid>
     <Grid.Styles>
       <Style Selector="TextBlock.h2">
@@ -157,6 +157,9 @@
       <TabItem Header="Viewbox">
         <pages:ViewboxPage />
       </TabItem>
+      <TabItem Header="Native Embed">
+        <pages:NativeEmbedPage />
+      </TabItem>
       <TabItem Header="Window Customizations">
         <pages:WindowCustomizationsPage />
       </TabItem>

+ 13 - 9
samples/interop/NativeEmbedSample/MainView.axaml → samples/ControlCatalog/Pages/NativeEmbedPage.xaml

@@ -1,18 +1,22 @@
-<UserControl xmlns="https://github.com/avaloniaui"
-             xmlns:local="clr-namespace:NativeEmbedSample"
+<UserControl xmlns="https://github.com/avaloniaui"
              xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
-             x:Class="NativeEmbedSample.MainView">
+             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
+             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
+             xmlns:local="using:ControlCatalog.Pages"
+             d:DesignHeight="800"
+             d:DesignWidth="400"
+             x:Class="ControlCatalog.Pages.NativeEmbedPage">
   <DockPanel>
     <Menu DockPanel.Dock="Top">
       <MenuItem Header="Test">
         <MenuItem Header="SubMenu">
           <MenuItem Header="Item 1"/>
           <MenuItem Header="Item 2"/>
-          <MenuItem Header="Item 3"/>  
+          <MenuItem Header="Item 3"/>
         </MenuItem>
         <MenuItem Header="Item 1"/>
         <MenuItem Header="Item 2"/>
-        <MenuItem Header="Item 3"/>  
+        <MenuItem Header="Item 3"/>
       </MenuItem>
     </Menu>
     <DockPanel DockPanel.Dock="Top">
@@ -21,13 +25,13 @@
       <Border DockPanel.Dock="Right" Background="#c0c0c0">
         <ToolTip.Tip>
           <ToolTip>
-              <TextBlock>Text</TextBlock>
+            <TextBlock>Text</TextBlock>
           </ToolTip>
         </ToolTip.Tip>
         <TextBlock VerticalAlignment="Center">Tooltip</TextBlock>
       </Border>
       <TextBox Text="Lorem ipsum dolor sit amet"/>
-      
+
     </DockPanel>
     <Grid ColumnDefinitions="*,5,*"
           RowDefinitions="*,5,*">
@@ -38,7 +42,7 @@
         <Style Selector="DockPanel#SecondPanel:not(.mobile)">
           <Setter Property="Grid.Column" Value="2" />
         </Style>
-        
+
         <Style Selector="DockPanel#FirstPanel.mobile, DockPanel#SecondPanel.mobile">
           <Setter Property="Grid.ColumnSpan" Value="3" />
         </Style>
@@ -46,7 +50,7 @@
           <Setter Property="Grid.Row" Value="2" />
         </Style>
       </Grid.Styles>
-      
+
       <DockPanel x:Name="FirstPanel">
         <CheckBox x:Name="firstVisible" DockPanel.Dock="Top"
                   IsChecked="True" Content="Visible" />

+ 84 - 0
samples/ControlCatalog/Pages/NativeEmbedPage.xaml.cs

@@ -0,0 +1,84 @@
+using System;
+using System.Collections.Generic;
+using System.Threading.Tasks;
+
+using Avalonia.Platform;
+using Avalonia.Interactivity;
+using Avalonia.Controls;
+using Avalonia.Controls.Platform;
+using Avalonia.Markup.Xaml;
+using Avalonia;
+
+namespace ControlCatalog.Pages
+{
+    public class NativeEmbedPage : UserControl
+    {
+        public NativeEmbedPage()
+        {
+            this.InitializeComponent();
+        }
+
+        private void InitializeComponent()
+        {
+            AvaloniaXamlLoader.Load(this);
+        }
+
+        public async void ShowPopupDelay(object sender, RoutedEventArgs args)
+        {
+            await Task.Delay(3000);
+            ShowPopup(sender, args);
+        }
+
+        public void ShowPopup(object sender, RoutedEventArgs args)
+        {
+            new ContextMenu()
+            {
+                Items = new List<MenuItem>
+            {
+                new MenuItem() { Header = "Test" }, new MenuItem() { Header = "Test" }
+            }
+            }.Open((Control)sender);
+        }
+
+        protected override void OnPropertyChanged(AvaloniaPropertyChangedEventArgs change)
+        {
+            base.OnPropertyChanged(change);
+
+            if (change.Property == BoundsProperty)
+            {
+                var isMobile = change.GetNewValue<Rect>().Width < 1200;
+                this.Find<DockPanel>("FirstPanel")!.Classes.Set("mobile", isMobile);
+                this.Find<DockPanel>("SecondPanel")!.Classes.Set("mobile", isMobile);
+            }
+        }
+    }
+
+    public class EmbedSample : NativeControlHost
+    {
+        public static INativeDemoControl? Implementation { get; set; }
+
+        static EmbedSample()
+        {
+
+        }
+
+        public bool IsSecond { get; set; }
+
+        protected override IPlatformHandle CreateNativeControlCore(IPlatformHandle parent)
+        {
+            return Implementation?.CreateControl(IsSecond, parent, () => base.CreateNativeControlCore(parent))
+                ?? base.CreateNativeControlCore(parent);
+        }
+
+        protected override void DestroyNativeControlCore(IPlatformHandle control)
+        {
+            base.DestroyNativeControlCore(control);
+        }
+    }
+
+    public interface INativeDemoControl
+    {
+        /// <param name="isSecond">Used to specify which control should be displayed as a demo</param>
+        IPlatformHandle CreateControl(bool isSecond, IPlatformHandle parent, Func<IPlatformHandle> createDefault);
+    }
+}

+ 0 - 12
samples/interop/NativeEmbedSample.Android/MainActivity.cs

@@ -1,12 +0,0 @@
-using Android.App;
-using Android.Content.PM;
-
-using Avalonia;
-using Avalonia.Android;
-
-namespace NativeEmbedSample.Android;
-
-[Activity(Label = "NativeEmbedSample", Theme = "@style/MyTheme.NoActionBar", Icon = "@drawable/icon", LaunchMode = LaunchMode.SingleInstance, ConfigurationChanges = ConfigChanges.Orientation | ConfigChanges.ScreenSize)]
-public class MainActivity : AvaloniaActivity<App>
-{
-}

+ 0 - 50
samples/interop/NativeEmbedSample.Android/NativeEmbedSample.Android.csproj

@@ -1,50 +0,0 @@
-<Project Sdk="Microsoft.NET.Sdk">
-  <PropertyGroup>
-    <TargetFramework>net6.0-android</TargetFramework>
-    <SupportedOSPlatformVersion>21</SupportedOSPlatformVersion>
-    <OutputType>Exe</OutputType>
-    <Nullable>enable</Nullable>
-    <ApplicationId>com.Avalonia.NativeEmbedSample</ApplicationId>
-    <ApplicationVersion>1</ApplicationVersion>
-    <ApplicationDisplayVersion>1.0</ApplicationDisplayVersion>
-    <AndroidPackageFormat>apk</AndroidPackageFormat>
-    <MSBuildEnableWorkloadResolver>true</MSBuildEnableWorkloadResolver>
-  </PropertyGroup>
-  <ItemGroup>
-    <None Remove="Assets\AboutAssets.txt" />
-  </ItemGroup>
-  <ItemGroup>
-    <AndroidResource Include="..\..\..\build\Assets\Icon.png">
-      <Link>Resources\drawable\Icon.png</Link>
-    </AndroidResource>
-  </ItemGroup>
-
-  <PropertyGroup Condition="'$(Configuration)'=='Release' and '$(TF_BUILD)' == ''">
-    <DebugSymbols>True</DebugSymbols>
-    <RunAOTCompilation>True</RunAOTCompilation>
-    <EnableLLVM>True</EnableLLVM>
-    <AndroidEnableProfiledAot>True</AndroidEnableProfiledAot>
-  </PropertyGroup>
-
-  <PropertyGroup Condition="'$(Configuration)'=='Debug'">
-    <EmbedAssembliesIntoApk>False</EmbedAssembliesIntoApk>
-    <RunAOTCompilation>False</RunAOTCompilation>
-  </PropertyGroup>
-
-  <PropertyGroup Condition="'$(Configuration)'=='Release'">
-    <EmbedAssembliesIntoApk>True</EmbedAssembliesIntoApk>
-  </PropertyGroup>
-
-  <ItemGroup>
-    <PackageReference Include="Xamarin.AndroidX.AppCompat" Version="1.3.1.3" />
-    <PackageReference Include="Xamarin.AndroidX.Lifecycle.ViewModel" Version="2.3.1.3" />
-  </ItemGroup>
-
-  <ItemGroup>
-    <ProjectReference Include="..\..\..\src\Android\Avalonia.Android\Avalonia.Android.csproj" />
-    <ProjectReference Include="..\..\..\packages\Avalonia\Avalonia.csproj" />
-    <ProjectReference Include="..\NativeEmbedSample\NativeEmbedSample.csproj" />
-  </ItemGroup>
-
-  <Import Project="..\..\..\build\BuildTargets.targets" />
-</Project>

+ 0 - 4
samples/interop/NativeEmbedSample.Android/Properties/AndroidManifest.xml

@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:installLocation="auto">
-	<application android:label="ControlCatalog.Android" android:icon="@drawable/Icon"></application>
-</manifest>

+ 0 - 44
samples/interop/NativeEmbedSample.Android/Resources/AboutResources.txt

@@ -1,44 +0,0 @@
-Images, layout descriptions, binary blobs and string dictionaries can be included 
-in your application as resource files.  Various Android APIs are designed to 
-operate on the resource IDs instead of dealing with images, strings or binary blobs 
-directly.
-
-For example, a sample Android app that contains a user interface layout (main.axml),
-an internationalization string table (strings.xml) and some icons (drawable-XXX/icon.png) 
-would keep its resources in the "Resources" directory of the application:
-
-Resources/
-    drawable/
-        icon.png
-
-    layout/
-        main.axml
-
-    values/
-        strings.xml
-
-In order to get the build system to recognize Android resources, set the build action to
-"AndroidResource".  The native Android APIs do not operate directly with filenames, but 
-instead operate on resource IDs.  When you compile an Android application that uses resources, 
-the build system will package the resources for distribution and generate a class called "R" 
-(this is an Android convention) that contains the tokens for each one of the resources 
-included. For example, for the above Resources layout, this is what the R class would expose:
-
-public class R {
-    public class drawable {
-        public const int icon = 0x123;
-    }
-
-    public class layout {
-        public const int main = 0x456;
-    }
-
-    public class strings {
-        public const int first_string = 0xabc;
-        public const int second_string = 0xbcd;
-    }
-}
-
-You would then use R.drawable.icon to reference the drawable/icon.png file, or R.layout.main 
-to reference the layout/main.axml file, or R.strings.first_string to reference the first 
-string in the dictionary file values/strings.xml.

+ 0 - 13
samples/interop/NativeEmbedSample.Android/Resources/drawable/splash_screen.xml

@@ -1,13 +0,0 @@
-<?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 - 4
samples/interop/NativeEmbedSample.Android/Resources/values/colors.xml

@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<resources>
-  <color name="splash_background">#FFFFFF</color>
-</resources>

+ 0 - 17
samples/interop/NativeEmbedSample.Android/Resources/values/styles.xml

@@ -1,17 +0,0 @@
-<?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 - 16
samples/interop/NativeEmbedSample.Android/SplashActivity.cs

@@ -1,16 +0,0 @@
-using Android.App;
-using Android.Content;
-using Android.OS;
-
-namespace NativeEmbedSample.Android;
-
-[Activity(Theme = "@style/MyTheme.Splash", MainLauncher = true, NoHistory = true)]
-public class SplashActivity : Activity
-{
-    protected override void OnResume()
-    {
-        base.OnResume();
-
-        StartActivity(new Intent(Application.Context, typeof(MainActivity)));
-    }
-}

+ 0 - 15
samples/interop/NativeEmbedSample.Desktop/NativeEmbedSample.Desktop.csproj

@@ -1,15 +0,0 @@
-<Project Sdk="Microsoft.NET.Sdk">
-
-  <PropertyGroup>
-    <OutputType>Exe</OutputType>
-    <TargetFramework>net6.0</TargetFramework>
-  </PropertyGroup>
-
-  <ItemGroup>
-    <ProjectReference Include="..\NativeEmbedSample\NativeEmbedSample.csproj" />
-  </ItemGroup>
-
-  <Import Project="..\..\..\build\SampleApp.props" />
-  <Import Project="..\..\..\build\BuildTargets.targets" />
-  <Import Project="..\..\..\build\ReferenceCoreLibraries.props" />
-</Project>

+ 0 - 17
samples/interop/NativeEmbedSample.Desktop/Program.cs

@@ -1,17 +0,0 @@
-using Avalonia;
-using NativeEmbedSample;
-
-namespace NativeEmbedSample.Desktop;
-
-public class Program
-{
-    static int Main(string[] args) => BuildAvaloniaApp().StartWithClassicDesktopLifetime(args);
-
-    public static AppBuilder BuildAvaloniaApp()
-        => AppBuilder.Configure<App>()
-            .With(new AvaloniaNativePlatformOptions()
-            {
-            })
-            .UsePlatformDetect();
-
-}

+ 0 - 9
samples/interop/NativeEmbedSample.iOS/AppDelegate.cs

@@ -1,9 +0,0 @@
-using Avalonia.iOS;
-
-namespace NativeEmbedSample.iOS;
-
-[Register("AppDelegate")]
-public partial class AppDelegate : AvaloniaAppDelegate<App>
-{
-        
-}

+ 0 - 117
samples/interop/NativeEmbedSample.iOS/Assets.xcassets/AppIcon.appiconset/Contents.json

@@ -1,117 +0,0 @@
-{
-  "images": [
-    {
-      "scale": "2x",
-      "size": "20x20",
-      "idiom": "iphone",
-      "filename": "Icon40.png"
-    },
-    {
-      "scale": "3x",
-      "size": "20x20",
-      "idiom": "iphone",
-      "filename": "Icon60.png"
-    },
-    {
-      "scale": "2x",
-      "size": "29x29",
-      "idiom": "iphone",
-      "filename": "Icon58.png"
-    },
-    {
-      "scale": "3x",
-      "size": "29x29",
-      "idiom": "iphone",
-      "filename": "Icon87.png"
-    },
-    {
-      "scale": "2x",
-      "size": "40x40",
-      "idiom": "iphone",
-      "filename": "Icon80.png"
-    },
-    {
-      "scale": "3x",
-      "size": "40x40",
-      "idiom": "iphone",
-      "filename": "Icon120.png"
-    },
-    {
-      "scale": "2x",
-      "size": "60x60",
-      "idiom": "iphone",
-      "filename": "Icon120.png"
-    },
-    {
-      "scale": "3x",
-      "size": "60x60",
-      "idiom": "iphone",
-      "filename": "Icon180.png"
-    },
-    {
-      "scale": "1x",
-      "size": "20x20",
-      "idiom": "ipad",
-      "filename": "Icon20.png"
-    },
-    {
-      "scale": "2x",
-      "size": "20x20",
-      "idiom": "ipad",
-      "filename": "Icon40.png"
-    },
-    {
-      "scale": "1x",
-      "size": "29x29",
-      "idiom": "ipad",
-      "filename": "Icon29.png"
-    },
-    {
-      "scale": "2x",
-      "size": "29x29",
-      "idiom": "ipad",
-      "filename": "Icon58.png"
-    },
-    {
-      "scale": "1x",
-      "size": "40x40",
-      "idiom": "ipad",
-      "filename": "Icon40.png"
-    },
-    {
-      "scale": "2x",
-      "size": "40x40",
-      "idiom": "ipad",
-      "filename": "Icon80.png"
-    },
-    {
-      "scale": "1x",
-      "size": "76x76",
-      "idiom": "ipad",
-      "filename": "Icon76.png"
-    },
-    {
-      "scale": "2x",
-      "size": "76x76",
-      "idiom": "ipad",
-      "filename": "Icon152.png"
-    },
-    {
-      "scale": "2x",
-      "size": "83.5x83.5",
-      "idiom": "ipad",
-      "filename": "Icon167.png"
-    },
-    {
-      "scale": "1x",
-      "size": "1024x1024",
-      "idiom": "ios-marketing",
-      "filename": "Icon1024.png"
-    }
-  ],
-  "properties": {},
-  "info": {
-    "version": 1,
-    "author": "xcode"
-  }
-}

BIN
samples/interop/NativeEmbedSample.iOS/Assets.xcassets/AppIcon.appiconset/Icon1024.png


BIN
samples/interop/NativeEmbedSample.iOS/Assets.xcassets/AppIcon.appiconset/Icon120.png


BIN
samples/interop/NativeEmbedSample.iOS/Assets.xcassets/AppIcon.appiconset/Icon152.png


BIN
samples/interop/NativeEmbedSample.iOS/Assets.xcassets/AppIcon.appiconset/Icon167.png


BIN
samples/interop/NativeEmbedSample.iOS/Assets.xcassets/AppIcon.appiconset/Icon180.png


BIN
samples/interop/NativeEmbedSample.iOS/Assets.xcassets/AppIcon.appiconset/Icon20.png


BIN
samples/interop/NativeEmbedSample.iOS/Assets.xcassets/AppIcon.appiconset/Icon29.png


BIN
samples/interop/NativeEmbedSample.iOS/Assets.xcassets/AppIcon.appiconset/Icon40.png


BIN
samples/interop/NativeEmbedSample.iOS/Assets.xcassets/AppIcon.appiconset/Icon58.png


BIN
samples/interop/NativeEmbedSample.iOS/Assets.xcassets/AppIcon.appiconset/Icon60.png


BIN
samples/interop/NativeEmbedSample.iOS/Assets.xcassets/AppIcon.appiconset/Icon76.png


BIN
samples/interop/NativeEmbedSample.iOS/Assets.xcassets/AppIcon.appiconset/Icon80.png


BIN
samples/interop/NativeEmbedSample.iOS/Assets.xcassets/AppIcon.appiconset/Icon87.png


+ 0 - 6
samples/interop/NativeEmbedSample.iOS/Entitlements.plist

@@ -1,6 +0,0 @@
-<?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>
-    </dict>
-</plist>

+ 0 - 42
samples/interop/NativeEmbedSample.iOS/Info.plist

@@ -1,42 +0,0 @@
-<?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>AvaloniaNative</string>
-    <key>CFBundleIdentifier</key>
-    <string>Avalonia.Native.Sample</string>
-    <key>CFBundleShortVersionString</key>
-    <string>1.0</string>
-    <key>CFBundleVersion</key>
-    <string>1.0</string>
-    <key>LSRequiresIPhoneOS</key>
-    <true/>
-    <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>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>XSAppIconAssets</key>
-    <string>Assets.xcassets/AppIcon.appiconset</string>
-</dict>
-</plist>

+ 0 - 6
samples/interop/NativeEmbedSample.iOS/Main.cs

@@ -1,6 +0,0 @@
-using NativeEmbedSample.iOS;
-
-// This is the main entry point of the application.
-// If you want to use a different Application Delegate class from "AppDelegate"
-// you can specify it here.
-UIApplication.Main(args, null, typeof(AppDelegate));

+ 0 - 16
samples/interop/NativeEmbedSample.iOS/NativeEmbedSample.iOS.csproj

@@ -1,16 +0,0 @@
-<Project Sdk="Microsoft.NET.Sdk">
-    <PropertyGroup>
-        <TargetFramework>net6.0-ios</TargetFramework>
-        <ProvisioningType>manual</ProvisioningType>
-        <OutputType>Exe</OutputType>
-        <Nullable>enable</Nullable>
-        <ImplicitUsings>true</ImplicitUsings>
-        <SupportedOSPlatformVersion>11.2</SupportedOSPlatformVersion>
-        <RuntimeIdentifier>iossimulator-x64</RuntimeIdentifier>
-        <!--    <RuntimeIdentifier>ios-arm64</RuntimeIdentifier>-->
-    </PropertyGroup>
-    <ItemGroup>
-      <ProjectReference Include="..\..\..\src\iOS\Avalonia.iOS\Avalonia.iOS.csproj" />
-      <ProjectReference Include="..\NativeEmbedSample\NativeEmbedSample.csproj" />
-    </ItemGroup>
-</Project>

+ 0 - 43
samples/interop/NativeEmbedSample.iOS/Resources/LaunchScreen.xib

@@ -1,43 +0,0 @@
-<?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) 2017 " 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="NewApp" 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 - 7
samples/interop/NativeEmbedSample/App.axaml

@@ -1,7 +0,0 @@
-<Application xmlns="https://github.com/avaloniaui"
-             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
-             x:Class="NativeEmbedSample.App">
-  <Application.Styles>
-    <FluentTheme />
-  </Application.Styles>
-</Application>

+ 0 - 23
samples/interop/NativeEmbedSample/App.axaml.cs

@@ -1,23 +0,0 @@
-using Avalonia;
-using Avalonia.Controls.ApplicationLifetimes;
-using Avalonia.Markup.Xaml;
-
-namespace NativeEmbedSample;
-
-public class App : Application
-{
-    public override void Initialize()
-    {
-        AvaloniaXamlLoader.Load(this);
-    }
-
-    public override void OnFrameworkInitializationCompleted()
-    {
-        if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktopLifetime)
-            desktopLifetime.MainWindow = new MainWindow();
-        else if (ApplicationLifetime is ISingleViewApplicationLifetime singleViewLifetime)
-            singleViewLifetime.MainView = new MainView();
-
-        base.OnFrameworkInitializationCompleted();
-    }
-}

+ 0 - 54
samples/interop/NativeEmbedSample/EmbedSample.cs

@@ -1,54 +0,0 @@
-using System;
-using System.Diagnostics;
-using System.IO;
-using System.Runtime.InteropServices;
-using System.Text;
-using Avalonia.Controls;
-using Avalonia.Platform;
-using Avalonia.Threading;
-
-namespace NativeEmbedSample
-{
-    public partial class EmbedSample : NativeControlHost
-    {
-        public bool IsSecond { get; set; }
-
-        protected override IPlatformHandle CreateNativeControlCore(IPlatformHandle parent)
-        {
-#if DESKTOP
-            if (OperatingSystem.IsLinux())
-                return CreateLinux(parent);
-            if (OperatingSystem.IsWindows())
-                return CreateWin32(parent);
-            if (OperatingSystem.IsMacOS())
-                return CreateOSX(parent);
-#elif __ANDROID__ || ANDROID
-            if (OperatingSystem.IsAndroid())
-                return CreateAndroid(parent);
-#elif IOS
-            if (OperatingSystem.IsIOS())
-                return CreateIOS(parent);
-#endif
-            return base.CreateNativeControlCore(parent);
-        }
-
-        protected override void DestroyNativeControlCore(IPlatformHandle control)
-        {
-#if DESKTOP
-            if (OperatingSystem.IsLinux())
-                DestroyLinux(control);
-            else if (OperatingSystem.IsWindows())
-                DestroyWin32(control);
-            else if (OperatingSystem.IsMacOS())
-                DestroyOSX(control);
-#elif __ANDROID__ || ANDROID
-            if (OperatingSystem.IsAndroid())
-                DestroyAndroid(control);
-#elif IOS
-            if (OperatingSystem.IsIOS())
-                DestroyIOS(control);
-#endif
-            else base.DestroyNativeControlCore(control);
-        }
-    }
-}

+ 0 - 45
samples/interop/NativeEmbedSample/MainView.axaml.cs

@@ -1,45 +0,0 @@
-using System.Collections.Generic;
-using System.Threading.Tasks;
-using Avalonia;
-using Avalonia.Controls;
-using Avalonia.Interactivity;
-using Avalonia.Markup.Xaml;
-
-namespace NativeEmbedSample;
-
-public class MainView : UserControl
-{
-    public MainView()
-    {
-        AvaloniaXamlLoader.Load(this);
-    }
-
-    public async void ShowPopupDelay(object sender, RoutedEventArgs args)
-    {
-        await Task.Delay(3000);
-        ShowPopup(sender, args);
-    }
-
-    public void ShowPopup(object sender, RoutedEventArgs args)
-    {
-        new ContextMenu()
-        {
-            Items = new List<MenuItem>
-            {
-                new MenuItem() { Header = "Test" }, new MenuItem() { Header = "Test" }
-            }
-        }.Open((Control)sender);
-    }
-
-    protected override void OnPropertyChanged(AvaloniaPropertyChangedEventArgs change)
-    {
-        base.OnPropertyChanged(change);
-
-        if (change.Property == BoundsProperty)
-        {
-            var isMobile = change.GetNewValue<Rect>().Width < 1200;
-            this.Find<DockPanel>("FirstPanel")!.Classes.Set("mobile", isMobile);
-            this.Find<DockPanel>("SecondPanel")!.Classes.Set("mobile", isMobile);
-        }
-    }
-}

+ 0 - 10
samples/interop/NativeEmbedSample/MainWindow.axaml

@@ -1,10 +0,0 @@
-<Window xmlns="https://github.com/avaloniaui"
-        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
-        xmlns:nativeEmbedSample="clr-namespace:NativeEmbedSample"
-        x:Class="NativeEmbedSample.MainWindow"
-        MinWidth="500" MinHeight="300"
-        Width="1024" Height="800"
-        Title="Native embedding sample">
-  <nativeEmbedSample:MainView />
-</Window>
-

+ 0 - 17
samples/interop/NativeEmbedSample/MainWindow.axaml.cs

@@ -1,17 +0,0 @@
-using Avalonia;
-using Avalonia.Controls;
-using Avalonia.Markup.Xaml;
-
-namespace NativeEmbedSample;
-
-public class MainWindow : Window
-{
-    public MainWindow()
-    {
-        AvaloniaXamlLoader.Load(this);
-#if DEBUG && DESKTOP
-        this.AttachDevTools();
-#endif
-    }
-}
-

+ 0 - 38
samples/interop/NativeEmbedSample/NativeEmbedSample.csproj

@@ -1,38 +0,0 @@
-<Project Sdk="Microsoft.NET.Sdk">
-
-  <PropertyGroup>
-    <TargetFrameworks>net6.0;net6.0-android;net6.0-ios</TargetFrameworks>
-    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
-    
-    <DefineConstants Condition="'$(TargetFramework)' == 'net6.0'">$(DefineConstants);DESKTOP</DefineConstants>
-  </PropertyGroup>
-
-  <ItemGroup>
-    <ProjectReference Include="..\..\..\packages\Avalonia\Avalonia.csproj" />
-  </ItemGroup>
-  
-  <ItemGroup Condition="'$(TargetFramework)' == 'net6.0'">
-    <PackageReference Include="MonoMac.NetStandard" Version="0.0.4" />
-    <ProjectReference Include="..\..\..\src\Windows\Avalonia.Direct2D1\Avalonia.Direct2D1.csproj" />
-    <ProjectReference Include="..\..\..\src\Avalonia.Diagnostics\Avalonia.Diagnostics.csproj" />
-    <ProjectReference Include="..\..\..\src\Avalonia.X11\Avalonia.X11.csproj" />
-    <PackageReference Include="Avalonia.Angle.Windows.Natives" Version="2.1.0.2020091801" />
-    <None Remove="nodes.mp4" />
-    
-    <Compile Include="..\..\..\src\Avalonia.X11\NativeDialogs\Gtk.cs">
-      <Link>Gtk\Gtk.cs</Link>
-    </Compile>
-    
-    <Content Include="Gtk\nodes.mp4">
-      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
-    </Content>
-  </ItemGroup>
-  <ItemGroup Condition="'$(TargetFramework)' == 'net6.0-android'">
-    <ProjectReference Include="..\..\..\src\Android\Avalonia.Android\Avalonia.Android.csproj" />
-  </ItemGroup>
-  <ItemGroup Condition="'$(TargetFramework)' == 'net6.0-ios'">
-    <ProjectReference Include="..\..\..\src\iOS\Avalonia.iOS\Avalonia.iOS.csproj" />
-  </ItemGroup>
-
-  <Import Project="..\..\..\build\BuildTargets.targets" />
-</Project>

+ 3 - 1
src/Android/Avalonia.Android/Platform/AndroidNativeControlHostImpl.cs

@@ -110,8 +110,10 @@ namespace Avalonia.Android.Platform
             public void HideWithSize(Size size)
             {
                 CheckDisposed();
+                if (_attachedTo == null)
+                    return;
 
-                size *= _attachedTo?._avaloniaView.TopLevelImpl.RenderScaling ?? 1;
+                size *= _attachedTo._avaloniaView.TopLevelImpl.RenderScaling;
                 _view.Visibility = ViewStates.Gone;
                 _view.LayoutParameters = new FrameLayout.LayoutParams(Math.Max(1, (int)size.Width), Math.Max(1, (int)size.Height));
                 _view.RequestLayout();