diff --git a/api/Avalonia.Skia.nupkg.xml b/api/Avalonia.Skia.nupkg.xml
new file mode 100644
index 0000000000..eda59fc334
--- /dev/null
+++ b/api/Avalonia.Skia.nupkg.xml
@@ -0,0 +1,28 @@
+
+
+
+
+ CP0008
+ T:Avalonia.Skia.ISkiaGpu
+ baseline/Avalonia.Skia/lib/net10.0/Avalonia.Skia.dll
+ current/Avalonia.Skia/lib/net10.0/Avalonia.Skia.dll
+
+
+ CP0008
+ T:Avalonia.Skia.ISkiaGpuWithPlatformGraphicsContext
+ baseline/Avalonia.Skia/lib/net10.0/Avalonia.Skia.dll
+ current/Avalonia.Skia/lib/net10.0/Avalonia.Skia.dll
+
+
+ CP0008
+ T:Avalonia.Skia.ISkiaGpu
+ baseline/Avalonia.Skia/lib/net8.0/Avalonia.Skia.dll
+ current/Avalonia.Skia/lib/net8.0/Avalonia.Skia.dll
+
+
+ CP0008
+ T:Avalonia.Skia.ISkiaGpuWithPlatformGraphicsContext
+ baseline/Avalonia.Skia/lib/net8.0/Avalonia.Skia.dll
+ current/Avalonia.Skia/lib/net8.0/Avalonia.Skia.dll
+
+
diff --git a/api/Avalonia.nupkg.xml b/api/Avalonia.nupkg.xml
index 3858eaa6ff..5a424cb8ee 100644
--- a/api/Avalonia.nupkg.xml
+++ b/api/Avalonia.nupkg.xml
@@ -19,24 +19,54 @@
baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
+ CP0001
+ T:Avalonia.Platform.IOptionalFeatureProvider
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
CP0001
T:Avalonia.Platform.IReadableBitmapWithAlphaImpl
baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
+ CP0001
+ T:Avalonia.Platform.OptionalFeatureProviderExtensions
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
CP0001
T:Avalonia.Utilities.StringTokenizer
baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
+ CP0001
+ T:Avalonia.Controls.AutoCompleteBox.BindingEvaluator`1
+ baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net10.0/Avalonia.Controls.dll
+
+
+ CP0001
+ T:Avalonia.Controls.NativeMenuItemToggleType
+ baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net10.0/Avalonia.Controls.dll
+
CP0001
T:Avalonia.Controls.Primitives.IScrollable
baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll
current/Avalonia/lib/net10.0/Avalonia.Controls.dll
+
+ CP0001
+ T:Avalonia.Markup.Xaml.ConstructorArgumentAttribute
+ baseline/Avalonia/lib/net10.0/Avalonia.Markup.Xaml.dll
+ current/Avalonia/lib/net10.0/Avalonia.Markup.Xaml.dll
+
CP0001
T:Avalonia.Media.Fonts.FontFamilyLoader
@@ -61,30 +91,66 @@
baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
current/Avalonia/lib/net8.0/Avalonia.Base.dll
+
+ CP0001
+ T:Avalonia.Platform.IOptionalFeatureProvider
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
+
CP0001
T:Avalonia.Platform.IReadableBitmapWithAlphaImpl
baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
current/Avalonia/lib/net8.0/Avalonia.Base.dll
+
+ CP0001
+ T:Avalonia.Platform.OptionalFeatureProviderExtensions
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
+
CP0001
T:Avalonia.Utilities.StringTokenizer
baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
current/Avalonia/lib/net8.0/Avalonia.Base.dll
+
+ CP0001
+ T:Avalonia.Controls.AutoCompleteBox.BindingEvaluator`1
+ baseline/Avalonia/lib/net8.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net8.0/Avalonia.Controls.dll
+
+
+ CP0001
+ T:Avalonia.Controls.NativeMenuItemToggleType
+ baseline/Avalonia/lib/net8.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net8.0/Avalonia.Controls.dll
+
CP0001
T:Avalonia.Controls.Primitives.IScrollable
baseline/Avalonia/lib/net8.0/Avalonia.Controls.dll
current/Avalonia/lib/net8.0/Avalonia.Controls.dll
+
+ CP0001
+ T:Avalonia.Markup.Xaml.ConstructorArgumentAttribute
+ baseline/Avalonia/lib/net8.0/Avalonia.Markup.Xaml.dll
+ current/Avalonia/lib/net8.0/Avalonia.Markup.Xaml.dll
+
CP0001
T:Avalonia.Media.Fonts.FontFamilyLoader
baseline/Avalonia/lib/netstandard2.0/Avalonia.Base.dll
current/Avalonia/lib/netstandard2.0/Avalonia.Base.dll
+
+ CP0002
+ F:Avalonia.Controls.ResourcesChangedEventArgs.Empty
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
CP0002
F:Avalonia.Media.DrawingImage.ViewboxProperty
@@ -97,6 +163,18 @@
baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
+ CP0002
+ M:Avalonia.Controls.ResourcesChangedEventArgs.#ctor
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
+
+ CP0002
+ M:Avalonia.Data.ReflectionBinding.#ctor(System.String,Avalonia.Data.BindingMode)
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
CP0002
M:Avalonia.Input.IKeyboardNavigationHandler.Move(Avalonia.Input.IInputElement,Avalonia.Input.NavigationDirection,Avalonia.Input.KeyModifiers)
@@ -283,6 +361,18 @@
baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll
current/Avalonia/lib/net10.0/Avalonia.Controls.dll
+
+ CP0002
+ F:Avalonia.Controls.NativeMenuBar.EnableMenuItemClickForwardingProperty
+ baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net10.0/Avalonia.Controls.dll
+
+
+ CP0002
+ F:Avalonia.Controls.NativeMenuItem.ToggleTypeProperty
+ baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net10.0/Avalonia.Controls.dll
+
CP0002
F:Avalonia.Controls.TextBlock.LetterSpacingProperty
@@ -367,6 +457,36 @@
baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll
current/Avalonia/lib/net10.0/Avalonia.Controls.dll
+
+ CP0002
+ M:Avalonia.Controls.NativeMenuBar.SetEnableMenuItemClickForwarding(Avalonia.Controls.MenuItem,System.Boolean)
+ baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net10.0/Avalonia.Controls.dll
+
+
+ CP0002
+ M:Avalonia.Controls.NativeMenuItem.get_ToggleType
+ baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net10.0/Avalonia.Controls.dll
+
+
+ CP0002
+ M:Avalonia.Controls.Primitives.OverlayPopupHost.ConfigurePosition(Avalonia.Visual,Avalonia.Controls.PlacementMode,Avalonia.Point,Avalonia.Controls.Primitives.PopupPositioning.PopupAnchor,Avalonia.Controls.Primitives.PopupPositioning.PopupGravity,Avalonia.Controls.Primitives.PopupPositioning.PopupPositionerConstraintAdjustment,System.Nullable{Avalonia.Rect})
+ baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net10.0/Avalonia.Controls.dll
+
+
+ CP0002
+ M:Avalonia.Controls.Primitives.OverlayPopupHost.CreatePopupHost(Avalonia.Visual,Avalonia.IAvaloniaDependencyResolver)
+ baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net10.0/Avalonia.Controls.dll
+
+
+ CP0002
+ M:Avalonia.Controls.Primitives.PopupRoot.ConfigurePosition(Avalonia.Visual,Avalonia.Controls.PlacementMode,Avalonia.Point,Avalonia.Controls.Primitives.PopupPositioning.PopupAnchor,Avalonia.Controls.Primitives.PopupPositioning.PopupGravity,Avalonia.Controls.Primitives.PopupPositioning.PopupPositionerConstraintAdjustment,System.Nullable{Avalonia.Rect})
+ baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net10.0/Avalonia.Controls.dll
+
CP0002
M:Avalonia.Controls.Primitives.TextSearch.GetText(Avalonia.Controls.Control)
@@ -421,6 +541,18 @@
baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll
current/Avalonia/lib/net10.0/Avalonia.Controls.dll
+
+ CP0002
+ M:Avalonia.Data.Binding.#ctor(System.String,Avalonia.Data.BindingMode)
+ baseline/Avalonia/lib/net10.0/Avalonia.Markup.dll
+ current/Avalonia/lib/net10.0/Avalonia.Markup.dll
+
+
+ CP0002
+ M:Avalonia.Markup.Xaml.MarkupExtensions.ReflectionBindingExtension.#ctor(System.String,Avalonia.Data.BindingMode)
+ baseline/Avalonia/lib/net10.0/Avalonia.Markup.Xaml.dll
+ current/Avalonia/lib/net10.0/Avalonia.Markup.Xaml.dll
+
CP0002
F:Avalonia.Media.Fonts.FontCollectionBase._glyphTypefaceCache
@@ -451,6 +583,12 @@
baseline/Avalonia/lib/net6.0/Avalonia.Dialogs.dll
current/Avalonia/lib/net6.0/Avalonia.Dialogs.dll
+
+ CP0002
+ F:Avalonia.Controls.ResourcesChangedEventArgs.Empty
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
+
CP0002
F:Avalonia.Media.DrawingImage.ViewboxProperty
@@ -463,6 +601,18 @@
baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
current/Avalonia/lib/net8.0/Avalonia.Base.dll
+
+ CP0002
+ M:Avalonia.Controls.ResourcesChangedEventArgs.#ctor
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
+
+
+ CP0002
+ M:Avalonia.Data.ReflectionBinding.#ctor(System.String,Avalonia.Data.BindingMode)
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
+
CP0002
M:Avalonia.Input.IKeyboardNavigationHandler.Move(Avalonia.Input.IInputElement,Avalonia.Input.NavigationDirection,Avalonia.Input.KeyModifiers)
@@ -649,6 +799,18 @@
baseline/Avalonia/lib/net8.0/Avalonia.Controls.dll
current/Avalonia/lib/net8.0/Avalonia.Controls.dll
+
+ CP0002
+ F:Avalonia.Controls.NativeMenuBar.EnableMenuItemClickForwardingProperty
+ baseline/Avalonia/lib/net8.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net8.0/Avalonia.Controls.dll
+
+
+ CP0002
+ F:Avalonia.Controls.NativeMenuItem.ToggleTypeProperty
+ baseline/Avalonia/lib/net8.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net8.0/Avalonia.Controls.dll
+
CP0002
F:Avalonia.Controls.TextBlock.LetterSpacingProperty
@@ -733,6 +895,36 @@
baseline/Avalonia/lib/net8.0/Avalonia.Controls.dll
current/Avalonia/lib/net8.0/Avalonia.Controls.dll
+
+ CP0002
+ M:Avalonia.Controls.NativeMenuBar.SetEnableMenuItemClickForwarding(Avalonia.Controls.MenuItem,System.Boolean)
+ baseline/Avalonia/lib/net8.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net8.0/Avalonia.Controls.dll
+
+
+ CP0002
+ M:Avalonia.Controls.NativeMenuItem.get_ToggleType
+ baseline/Avalonia/lib/net8.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net8.0/Avalonia.Controls.dll
+
+
+ CP0002
+ M:Avalonia.Controls.Primitives.OverlayPopupHost.ConfigurePosition(Avalonia.Visual,Avalonia.Controls.PlacementMode,Avalonia.Point,Avalonia.Controls.Primitives.PopupPositioning.PopupAnchor,Avalonia.Controls.Primitives.PopupPositioning.PopupGravity,Avalonia.Controls.Primitives.PopupPositioning.PopupPositionerConstraintAdjustment,System.Nullable{Avalonia.Rect})
+ baseline/Avalonia/lib/net8.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net8.0/Avalonia.Controls.dll
+
+
+ CP0002
+ M:Avalonia.Controls.Primitives.OverlayPopupHost.CreatePopupHost(Avalonia.Visual,Avalonia.IAvaloniaDependencyResolver)
+ baseline/Avalonia/lib/net8.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net8.0/Avalonia.Controls.dll
+
+
+ CP0002
+ M:Avalonia.Controls.Primitives.PopupRoot.ConfigurePosition(Avalonia.Visual,Avalonia.Controls.PlacementMode,Avalonia.Point,Avalonia.Controls.Primitives.PopupPositioning.PopupAnchor,Avalonia.Controls.Primitives.PopupPositioning.PopupGravity,Avalonia.Controls.Primitives.PopupPositioning.PopupPositionerConstraintAdjustment,System.Nullable{Avalonia.Rect})
+ baseline/Avalonia/lib/net8.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net8.0/Avalonia.Controls.dll
+
CP0002
M:Avalonia.Controls.Primitives.TextSearch.GetText(Avalonia.Controls.Control)
@@ -793,6 +985,18 @@
baseline/Avalonia/lib/net8.0/Avalonia.Dialogs.dll
current/Avalonia/lib/net8.0/Avalonia.Dialogs.dll
+
+ CP0002
+ M:Avalonia.Data.Binding.#ctor(System.String,Avalonia.Data.BindingMode)
+ baseline/Avalonia/lib/net8.0/Avalonia.Markup.dll
+ current/Avalonia/lib/net8.0/Avalonia.Markup.dll
+
+
+ CP0002
+ M:Avalonia.Markup.Xaml.MarkupExtensions.ReflectionBindingExtension.#ctor(System.String,Avalonia.Data.BindingMode)
+ baseline/Avalonia/lib/net8.0/Avalonia.Markup.Xaml.dll
+ current/Avalonia/lib/net8.0/Avalonia.Markup.Xaml.dll
+
CP0002
F:Avalonia.Media.Fonts.FontCollectionBase._glyphTypefaceCache
@@ -1141,36 +1345,252 @@
baseline/Avalonia/lib/netstandard2.0/Avalonia.OpenGL.dll
current/Avalonia/lib/netstandard2.0/Avalonia.OpenGL.dll
+
+ CP0007
+ T:Avalonia.Controls.ResourcesChangedEventArgs
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
+
+ CP0007
+ T:Avalonia.Controls.ResourcesChangedEventArgs
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
+
+
+ CP0008
+ T:Avalonia.Media.ImmediateDrawingContext
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
CP0008
T:Avalonia.Media.StreamGeometryContext
baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
+ CP0008
+ T:Avalonia.Platform.IPlatformGraphicsContext
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
+
+ CP0008
+ T:Avalonia.Platform.IPlatformGraphicsWithFeatures
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
+
+ CP0008
+ T:Avalonia.Platform.IPlatformRenderInterfaceContext
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
CP0008
T:Avalonia.Platform.IWriteableBitmapImpl
baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
+ CP0008
+ T:Avalonia.Application
+ baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net10.0/Avalonia.Controls.dll
+
+
+ CP0008
+ T:Avalonia.Controls.Embedding.Offscreen.OffscreenTopLevelImplBase
+ baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net10.0/Avalonia.Controls.dll
+
+
+ CP0008
+ T:Avalonia.Controls.Platform.IWin32OptionsTopLevelImpl
+ baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net10.0/Avalonia.Controls.dll
+
+
+ CP0008
+ T:Avalonia.Platform.IPopupImpl
+ baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net10.0/Avalonia.Controls.dll
+
+
+ CP0008
+ T:Avalonia.Platform.ITopLevelImpl
+ baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net10.0/Avalonia.Controls.dll
+
+
+ CP0008
+ T:Avalonia.Platform.IWindowBaseImpl
+ baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net10.0/Avalonia.Controls.dll
+
+
+ CP0008
+ T:Avalonia.Platform.IWindowImpl
+ baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net10.0/Avalonia.Controls.dll
+
+
+ CP0008
+ T:Avalonia.Metal.IMetalDevice
+ baseline/Avalonia/lib/net10.0/Avalonia.Metal.dll
+ current/Avalonia/lib/net10.0/Avalonia.Metal.dll
+
+
+ CP0008
+ T:Avalonia.OpenGL.Egl.EglContext
+ baseline/Avalonia/lib/net10.0/Avalonia.OpenGL.dll
+ current/Avalonia/lib/net10.0/Avalonia.OpenGL.dll
+
+
+ CP0008
+ T:Avalonia.OpenGL.IGlContext
+ baseline/Avalonia/lib/net10.0/Avalonia.OpenGL.dll
+ current/Avalonia/lib/net10.0/Avalonia.OpenGL.dll
+
+
+ CP0008
+ T:Avalonia.Vulkan.IVulkanDevice
+ baseline/Avalonia/lib/net10.0/Avalonia.Vulkan.dll
+ current/Avalonia/lib/net10.0/Avalonia.Vulkan.dll
+
+
+ CP0008
+ T:Avalonia.Vulkan.IVulkanPlatformGraphicsContext
+ baseline/Avalonia/lib/net10.0/Avalonia.Vulkan.dll
+ current/Avalonia/lib/net10.0/Avalonia.Vulkan.dll
+
+
+ CP0008
+ T:Avalonia.Media.ImmediateDrawingContext
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
+
CP0008
T:Avalonia.Media.StreamGeometryContext
baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
current/Avalonia/lib/net8.0/Avalonia.Base.dll
+
+ CP0008
+ T:Avalonia.Platform.IPlatformGraphicsContext
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
+
+
+ CP0008
+ T:Avalonia.Platform.IPlatformGraphicsWithFeatures
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
+
+
+ CP0008
+ T:Avalonia.Platform.IPlatformRenderInterfaceContext
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
+
CP0008
T:Avalonia.Platform.IWriteableBitmapImpl
baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
current/Avalonia/lib/net8.0/Avalonia.Base.dll
+
+ CP0008
+ T:Avalonia.Application
+ baseline/Avalonia/lib/net8.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net8.0/Avalonia.Controls.dll
+
+
+ CP0008
+ T:Avalonia.Controls.Embedding.Offscreen.OffscreenTopLevelImplBase
+ baseline/Avalonia/lib/net8.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net8.0/Avalonia.Controls.dll
+
+
+ CP0008
+ T:Avalonia.Controls.Platform.IWin32OptionsTopLevelImpl
+ baseline/Avalonia/lib/net8.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net8.0/Avalonia.Controls.dll
+
+
+ CP0008
+ T:Avalonia.Platform.IPopupImpl
+ baseline/Avalonia/lib/net8.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net8.0/Avalonia.Controls.dll
+
+
+ CP0008
+ T:Avalonia.Platform.ITopLevelImpl
+ baseline/Avalonia/lib/net8.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net8.0/Avalonia.Controls.dll
+
+
+ CP0008
+ T:Avalonia.Platform.IWindowBaseImpl
+ baseline/Avalonia/lib/net8.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net8.0/Avalonia.Controls.dll
+
+
+ CP0008
+ T:Avalonia.Platform.IWindowImpl
+ baseline/Avalonia/lib/net8.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net8.0/Avalonia.Controls.dll
+
+
+ CP0008
+ T:Avalonia.Metal.IMetalDevice
+ baseline/Avalonia/lib/net8.0/Avalonia.Metal.dll
+ current/Avalonia/lib/net8.0/Avalonia.Metal.dll
+
+
+ CP0008
+ T:Avalonia.OpenGL.Egl.EglContext
+ baseline/Avalonia/lib/net8.0/Avalonia.OpenGL.dll
+ current/Avalonia/lib/net8.0/Avalonia.OpenGL.dll
+
+
+ CP0008
+ T:Avalonia.OpenGL.IGlContext
+ baseline/Avalonia/lib/net8.0/Avalonia.OpenGL.dll
+ current/Avalonia/lib/net8.0/Avalonia.OpenGL.dll
+
+
+ CP0008
+ T:Avalonia.Vulkan.IVulkanDevice
+ baseline/Avalonia/lib/net8.0/Avalonia.Vulkan.dll
+ current/Avalonia/lib/net8.0/Avalonia.Vulkan.dll
+
+
+ CP0008
+ T:Avalonia.Vulkan.IVulkanPlatformGraphicsContext
+ baseline/Avalonia/lib/net8.0/Avalonia.Vulkan.dll
+ current/Avalonia/lib/net8.0/Avalonia.Vulkan.dll
+
+
+ CP0009
+ T:Avalonia.Controls.ResourcesChangedEventArgs
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
CP0009
T:Avalonia.Platform.Screen
baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll
current/Avalonia/lib/net10.0/Avalonia.Controls.dll
+
+ CP0009
+ T:Avalonia.Controls.ResourcesChangedEventArgs
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
+
CP0009
T:Avalonia.Platform.Screen
diff --git a/samples/ControlCatalog.Desktop/Program.cs b/samples/ControlCatalog.Desktop/Program.cs
index c4c42a7311..819072db18 100644
--- a/samples/ControlCatalog.Desktop/Program.cs
+++ b/samples/ControlCatalog.Desktop/Program.cs
@@ -8,8 +8,10 @@ using Avalonia;
using Avalonia.Controls;
using Avalonia.Controls.ApplicationLifetimes;
using Avalonia.Headless;
+using Avalonia.LinuxFramebuffer;
using Avalonia.LinuxFramebuffer.Output;
using Avalonia.LogicalTree;
+using Avalonia.Platform;
using Avalonia.Rendering.Composition;
using Avalonia.Threading;
using Avalonia.Vulkan;
@@ -19,16 +21,9 @@ namespace ControlCatalog.Desktop
{
static class Program
{
- private static bool s_useFramebuffer;
-
[STAThread]
static int Main(string[] args)
{
- if (args.Contains("--fbdev"))
- {
- s_useFramebuffer = true;
- }
-
if (args.Contains("--wait-for-attach"))
{
Console.WriteLine("Attach debugger and use 'Set next statement'");
@@ -45,12 +40,27 @@ namespace ControlCatalog.Desktop
double GetScaling()
{
var idx = Array.IndexOf(args, "--scaling");
- if (idx != 0 && args.Length > idx + 1 &&
+ if (idx >= 0 && args.Length > idx + 1 &&
double.TryParse(args[idx + 1], NumberStyles.Any, CultureInfo.InvariantCulture, out var scaling))
return scaling;
return 1;
}
- if (s_useFramebuffer)
+ SurfaceOrientation GetOrientation()
+ {
+ var idx = Array.IndexOf(args, "--orientation");
+ if (idx >= 0 && args.Length > idx + 1 &&
+ Enum.TryParse(args[idx + 1], true, out var orientation))
+ return orientation;
+ return SurfaceOrientation.Rotation0;
+ }
+ string? GetCard()
+ {
+ var idx = Array.IndexOf(args, "--card");
+ if (idx >= 0 && args.Length > idx + 1)
+ return args[idx + 1];
+ return null;
+ }
+ if (args.Contains("--fbdev"))
{
SilenceConsole();
return builder.StartLinuxFbDev(args, new FbDevOutputOptions()
@@ -108,13 +118,17 @@ namespace ControlCatalog.Desktop
else if (args.Contains("--drm"))
{
SilenceConsole();
- return builder.StartLinuxDrm(args, scaling: GetScaling());
+ return builder.StartLinuxDrm(args, card: GetCard(), options: new DrmOutputOptions()
+ {
+ Scaling = GetScaling(),
+ Orientation = GetOrientation(),
+ });
}
else if (args.Contains("--dxgi"))
{
builder.With(new Win32PlatformOptions()
{
- CompositionMode = new [] { Win32CompositionMode.LowLatencyDxgiSwapChain }
+ CompositionMode = [Win32CompositionMode.LowLatencyDxgiSwapChain]
});
return builder.StartWithClassicDesktopLifetime(args);
}
@@ -151,14 +165,14 @@ namespace ControlCatalog.Desktop
.WithDeveloperTools()
.AfterSetup(builder =>
{
- EmbedSample.Implementation = OperatingSystem.IsWindows() ? (INativeDemoControl)new EmbedSampleWin()
+ EmbedSample.Implementation = OperatingSystem.IsWindows() ? new EmbedSampleWin()
: OperatingSystem.IsMacOS() ? new EmbedSampleMac()
: OperatingSystem.IsLinux() ? new EmbedSampleGtk()
: null;
})
.LogToTrace();
- static void SilenceConsole()
+ private static void SilenceConsole()
{
new Thread(() =>
{
diff --git a/samples/ControlCatalog/Pages/AutoCompleteBoxPage.xaml.cs b/samples/ControlCatalog/Pages/AutoCompleteBoxPage.xaml.cs
index d9e64ecee0..47b6eb7f4a 100644
--- a/samples/ControlCatalog/Pages/AutoCompleteBoxPage.xaml.cs
+++ b/samples/ControlCatalog/Pages/AutoCompleteBoxPage.xaml.cs
@@ -7,30 +7,12 @@ using Avalonia.Controls;
using Avalonia.Data;
using Avalonia.Data.Converters;
using Avalonia.LogicalTree;
+using ControlCatalog.Models;
namespace ControlCatalog.Pages
{
public partial class AutoCompleteBoxPage : UserControl
{
- public class StateData
- {
- public string Name { get; private set; }
- public string Abbreviation { get; private set; }
- public string Capital { get; private set; }
-
- public StateData(string name, string abbreviatoin, string capital)
- {
- Name = name;
- Abbreviation = abbreviatoin;
- Capital = capital;
- }
-
- public override string ToString()
- {
- return Name;
- }
- }
-
private static StateData[] BuildAllStates()
{
return new StateData[]
diff --git a/samples/IntegrationTestApp/MainWindow.axaml.cs b/samples/IntegrationTestApp/MainWindow.axaml.cs
index be552201c0..894c052d6c 100644
--- a/samples/IntegrationTestApp/MainWindow.axaml.cs
+++ b/samples/IntegrationTestApp/MainWindow.axaml.cs
@@ -37,7 +37,7 @@ namespace IntegrationTestApp
{
Header = (string?)page.Name,
ToolTip = $"Tip:{(string?)page.Name}",
- ToggleType = NativeMenuItemToggleType.Radio,
+ ToggleType = MenuItemToggleType.Radio
};
menuItem.Click += (_, _) =>
diff --git a/samples/IntegrationTestApp/Pages/EmbeddingPage.axaml b/samples/IntegrationTestApp/Pages/EmbeddingPage.axaml
index 632893bcd0..4d6bc24b47 100644
--- a/samples/IntegrationTestApp/Pages/EmbeddingPage.axaml
+++ b/samples/IntegrationTestApp/Pages/EmbeddingPage.axaml
@@ -16,5 +16,7 @@
+
+
diff --git a/samples/IntegrationTestApp/Pages/EmbeddingPage.axaml.cs b/samples/IntegrationTestApp/Pages/EmbeddingPage.axaml.cs
index 93855cd13d..465743afbf 100644
--- a/samples/IntegrationTestApp/Pages/EmbeddingPage.axaml.cs
+++ b/samples/IntegrationTestApp/Pages/EmbeddingPage.axaml.cs
@@ -1,10 +1,19 @@
+using System;
+using Avalonia.Automation;
using Avalonia.Controls;
+using Avalonia.Controls.Embedding;
using Avalonia.Interactivity;
+using IntegrationTestApp.Embedding;
+using MonoMac.AppKit;
+using MonoMac.CoreGraphics;
+using MonoMac.ObjCRuntime;
namespace IntegrationTestApp;
public partial class EmbeddingPage : UserControl
{
+ private const long NSModalResponseContinue = -1002;
+
public EmbeddingPage()
{
InitializeComponent();
@@ -19,5 +28,65 @@ public partial class EmbeddingPage : UserControl
private void Reset_Click(object? sender, RoutedEventArgs e)
{
ResetText();
+ ModalResultTextBox.Text = "";
+ }
+
+ private void RunNativeModalSession_OnClick(object? sender, RoutedEventArgs e)
+ {
+ MacHelper.EnsureInitialized();
+
+ var app = NSApplication.SharedApplication;
+ var modalWindow = CreateNativeWindow();
+ var session = app.BeginModalSession(modalWindow);
+
+ while (true)
+ {
+ if (app.RunModalSession(session) != NSModalResponseContinue)
+ break;
+ }
+
+ app.EndModalSession(session);
+ }
+
+ private NSWindow CreateNativeWindow()
+ {
+ var button = new Button
+ {
+ Name = "ButtonInModal",
+ Content = "Button"
+ };
+
+ AutomationProperties.SetAutomationId(button, "ButtonInModal");
+
+ var root = new EmbeddableControlRoot
+ {
+ Width = 200,
+ Height = 200,
+ Content = button
+ };
+ root.Prepare();
+
+ var window = new NSWindow(
+ new CGRect(0, 0, root.Width, root.Height),
+ NSWindowStyle.Titled | NSWindowStyle.Closable,
+ NSBackingStore.Buffered,
+ false);
+
+ window.Identifier = "ModalNativeWindow";
+ window.WillClose += (_, _) => NSApplication.SharedApplication.StopModal();
+
+ button.Click += (_, _) =>
+ {
+ ModalResultTextBox.Text = "Clicked";
+ window.Close();
+ };
+
+ if (root.TryGetPlatformHandle() is not { } handle)
+ throw new InvalidOperationException("Could not get platform handle");
+
+ window.ContentView = (NSView)Runtime.GetNSObject(handle.Handle)!;
+ root.StartRendering();
+
+ return window;
}
}
diff --git a/src/Android/Avalonia.Android/AvaloniaActivity.cs b/src/Android/Avalonia.Android/AvaloniaActivity.cs
index 6841f5ba92..60345e0a50 100644
--- a/src/Android/Avalonia.Android/AvaloniaActivity.cs
+++ b/src/Android/Avalonia.Android/AvaloniaActivity.cs
@@ -119,22 +119,14 @@ public class AvaloniaActivity : AppCompatActivity, IAvaloniaActivity
activatableLifetime.CurrentIntendActivity = this;
}
- if (Intent?.Data is { } androidUri
- && androidUri.IsAbsolute
- && Uri.TryCreate(androidUri.ToString(), UriKind.Absolute, out var uri))
- {
- if (uri.Scheme == Uri.UriSchemeFile)
- {
- if (AndroidStorageItem.CreateItem(this, androidUri) is { } item)
- {
- _onActivated?.Invoke(this, new FileActivatedEventArgs(new [] { item }));
- }
- }
- else
- {
- _onActivated?.Invoke(this, new ProtocolActivatedEventArgs(uri));
- }
- }
+ HandleIntent(Intent);
+ }
+
+ protected override void OnNewIntent(Intent? intent)
+ {
+ base.OnNewIntent(intent);
+
+ HandleIntent(intent);
}
protected override void OnStop()
@@ -218,6 +210,26 @@ public class AvaloniaActivity : AppCompatActivity, IAvaloniaActivity
_view = new AvaloniaView(this) { Content = initialContent };
}
+ private void HandleIntent(Intent? intent)
+ {
+ if (intent?.Data is { } androidUri
+ && androidUri.IsAbsolute
+ && Uri.TryCreate(androidUri.ToString(), UriKind.Absolute, out var uri))
+ {
+ if (uri.Scheme == Uri.UriSchemeFile || uri.Scheme == "content")
+ {
+ if (AndroidStorageItem.CreateItem(this, androidUri) is { } item)
+ {
+ _onActivated?.Invoke(this, new FileActivatedEventArgs(new[] { item }));
+ }
+ }
+ else
+ {
+ _onActivated?.Invoke(this, new ProtocolActivatedEventArgs(uri));
+ }
+ }
+ }
+
public void OnBackInvoked()
{
var eventArgs = new AndroidBackRequestedEventArgs();
diff --git a/src/Android/Avalonia.Android/Platform/AndroidScreens.cs b/src/Android/Avalonia.Android/Platform/AndroidScreens.cs
index 3f1f9bf44e..9b0f1bee38 100644
--- a/src/Android/Avalonia.Android/Platform/AndroidScreens.cs
+++ b/src/Android/Avalonia.Android/Platform/AndroidScreens.cs
@@ -10,6 +10,7 @@ using AndroidX.Window.Layout;
using Avalonia.Android.Platform.SkiaPlatform;
using Avalonia.Platform;
using AndroidOrientation = global::Android.Content.Res.Orientation;
+using AndroidRotation = global::Android.Views.SurfaceOrientation;
namespace Avalonia.Android.Platform;
@@ -53,7 +54,7 @@ internal class AndroidScreen(Display display) : PlatformScreen(new PlatformHandl
var orientation = displayContext.Resources?.Configuration?.Orientation;
if (orientation == AndroidOrientation.Square)
naturalOrientation = ScreenOrientation.None;
- else if (rotation is SurfaceOrientation.Rotation0 or SurfaceOrientation.Rotation180)
+ else if (rotation is AndroidRotation.Rotation0 or AndroidRotation.Rotation180)
naturalOrientation = orientation == AndroidOrientation.Landscape ?
ScreenOrientation.Landscape :
ScreenOrientation.Portrait;
@@ -73,14 +74,14 @@ internal class AndroidScreen(Display display) : PlatformScreen(new PlatformHandl
CurrentOrientation = (display.Rotation, naturalOrientation) switch
{
(_, ScreenOrientation.None) => ScreenOrientation.None,
- (SurfaceOrientation.Rotation0, ScreenOrientation.Landscape) => ScreenOrientation.Landscape,
- (SurfaceOrientation.Rotation90, ScreenOrientation.Landscape) => ScreenOrientation.Portrait,
- (SurfaceOrientation.Rotation180, ScreenOrientation.Landscape) => ScreenOrientation.LandscapeFlipped,
- (SurfaceOrientation.Rotation270, ScreenOrientation.Landscape) => ScreenOrientation.PortraitFlipped,
- (SurfaceOrientation.Rotation0, _) => ScreenOrientation.Portrait,
- (SurfaceOrientation.Rotation90, _) => ScreenOrientation.Landscape,
- (SurfaceOrientation.Rotation180, _) => ScreenOrientation.PortraitFlipped,
- (SurfaceOrientation.Rotation270, _) => ScreenOrientation.LandscapeFlipped,
+ (AndroidRotation.Rotation0, ScreenOrientation.Landscape) => ScreenOrientation.Landscape,
+ (AndroidRotation.Rotation90, ScreenOrientation.Landscape) => ScreenOrientation.Portrait,
+ (AndroidRotation.Rotation180, ScreenOrientation.Landscape) => ScreenOrientation.LandscapeFlipped,
+ (AndroidRotation.Rotation270, ScreenOrientation.Landscape) => ScreenOrientation.PortraitFlipped,
+ (AndroidRotation.Rotation0, _) => ScreenOrientation.Portrait,
+ (AndroidRotation.Rotation90, _) => ScreenOrientation.Landscape,
+ (AndroidRotation.Rotation180, _) => ScreenOrientation.PortraitFlipped,
+ (AndroidRotation.Rotation270, _) => ScreenOrientation.LandscapeFlipped,
_ => ScreenOrientation.Portrait
};
}
diff --git a/src/Avalonia.Base/Controls/IResourceHost.cs b/src/Avalonia.Base/Controls/IResourceHost.cs
index 361e3562ec..286f0e36ef 100644
--- a/src/Avalonia.Base/Controls/IResourceHost.cs
+++ b/src/Avalonia.Base/Controls/IResourceHost.cs
@@ -29,12 +29,4 @@ namespace Avalonia.Controls
///
void NotifyHostedResourcesChanged(ResourcesChangedEventArgs e);
}
-
- // TODO12: merge with IResourceHost
- internal interface IResourceHost2 : IResourceHost
- {
- event EventHandler ResourcesChanged2;
-
- void NotifyHostedResourcesChanged(ResourcesChangedToken token);
- }
}
diff --git a/src/Avalonia.Base/Controls/ResourceDictionary.cs b/src/Avalonia.Base/Controls/ResourceDictionary.cs
index e0944a5708..f8f6267e7b 100644
--- a/src/Avalonia.Base/Controls/ResourceDictionary.cs
+++ b/src/Avalonia.Base/Controls/ResourceDictionary.cs
@@ -358,7 +358,7 @@ namespace Avalonia.Controls
if (hasResources)
{
- owner.NotifyHostedResourcesChanged(ResourcesChangedToken.Create());
+ owner.NotifyHostedResourcesChanged(ResourcesChangedEventArgs.Create());
}
}
@@ -385,7 +385,7 @@ namespace Avalonia.Controls
if (hasResources)
{
- owner.NotifyHostedResourcesChanged(ResourcesChangedToken.Create());
+ owner.NotifyHostedResourcesChanged(ResourcesChangedEventArgs.Create());
}
}
diff --git a/src/Avalonia.Base/Controls/ResourceNodeExtensions.cs b/src/Avalonia.Base/Controls/ResourceNodeExtensions.cs
index 36cc00d245..07c1c8d654 100644
--- a/src/Avalonia.Base/Controls/ResourceNodeExtensions.cs
+++ b/src/Avalonia.Base/Controls/ResourceNodeExtensions.cs
@@ -158,7 +158,7 @@ namespace Avalonia.Controls
protected override void Initialize()
{
- _target.SubscribeToResourcesChanged(ResourcesChanged, ResourcesChanged2);
+ _target.ResourcesChanged += ResourcesChanged;
if (_target is IThemeVariantHost themeVariantHost)
{
@@ -168,7 +168,7 @@ namespace Avalonia.Controls
protected override void Deinitialize()
{
- _target.UnsubscribeFromResourcesChanged(ResourcesChanged, ResourcesChanged2);
+ _target.ResourcesChanged -= ResourcesChanged;
if (_target is IThemeVariantHost themeVariantHost)
{
@@ -186,11 +186,6 @@ namespace Avalonia.Controls
PublishNext(GetValue());
}
- private void ResourcesChanged2(object? sender, ResourcesChangedToken token)
- {
- PublishNext(GetValue());
- }
-
private void ActualThemeVariantChanged(object? sender, EventArgs e)
{
PublishNext(GetValue());
@@ -230,7 +225,7 @@ namespace Avalonia.Controls
_target.OwnerChanged += OwnerChanged;
_owner = _target.Owner;
- _owner?.SubscribeToResourcesChanged(ResourcesChanged, ResourcesChanged2);
+ _owner?.ResourcesChanged += ResourcesChanged;
if (_overrideThemeVariant is null && _owner is IThemeVariantHost themeVariantHost)
{
@@ -242,7 +237,7 @@ namespace Avalonia.Controls
{
_target.OwnerChanged -= OwnerChanged;
- _owner?.UnsubscribeFromResourcesChanged(ResourcesChanged, ResourcesChanged2);
+ _owner?.ResourcesChanged -= ResourcesChanged;
if (_overrideThemeVariant is null && _owner is IThemeVariantHost themeVariantHost)
{
@@ -270,7 +265,7 @@ namespace Avalonia.Controls
private void OwnerChanged(object? sender, EventArgs e)
{
- _owner?.UnsubscribeFromResourcesChanged(ResourcesChanged, ResourcesChanged2);
+ _owner?.ResourcesChanged -= ResourcesChanged;
if (_overrideThemeVariant is null && _owner is IThemeVariantHost themeVariantHost)
{
@@ -279,7 +274,7 @@ namespace Avalonia.Controls
_owner = _target.Owner;
- _owner?.SubscribeToResourcesChanged(ResourcesChanged, ResourcesChanged2);
+ _owner?.ResourcesChanged += ResourcesChanged;
if (_overrideThemeVariant is null && _owner is IThemeVariantHost themeVariantHost2)
{
@@ -299,11 +294,6 @@ namespace Avalonia.Controls
PublishNext();
}
- private void ResourcesChanged2(object? sender, ResourcesChangedToken token)
- {
- PublishNext();
- }
-
private object? GetValue()
{
var theme = _overrideThemeVariant ?? (_target.Owner as IThemeVariantHost)?.ActualThemeVariant;
diff --git a/src/Avalonia.Base/Controls/ResourceProvider.cs b/src/Avalonia.Base/Controls/ResourceProvider.cs
index f0ab42a4a8..f73f11e713 100644
--- a/src/Avalonia.Base/Controls/ResourceProvider.cs
+++ b/src/Avalonia.Base/Controls/ResourceProvider.cs
@@ -45,7 +45,7 @@ public abstract class ResourceProvider : AvaloniaObject, IResourceProvider
protected void RaiseResourcesChanged()
{
- Owner?.NotifyHostedResourcesChanged(ResourcesChangedToken.Create());
+ Owner?.NotifyHostedResourcesChanged(ResourcesChangedEventArgs.Create());
}
///
@@ -57,7 +57,7 @@ public abstract class ResourceProvider : AvaloniaObject, IResourceProvider
{
if (HasResources)
{
- owner.NotifyHostedResourcesChanged(ResourcesChangedToken.Create());
+ owner.NotifyHostedResourcesChanged(ResourcesChangedEventArgs.Create());
}
}
@@ -70,7 +70,7 @@ public abstract class ResourceProvider : AvaloniaObject, IResourceProvider
{
if (HasResources)
{
- owner.NotifyHostedResourcesChanged(ResourcesChangedToken.Create());
+ owner.NotifyHostedResourcesChanged(ResourcesChangedEventArgs.Create());
}
}
diff --git a/src/Avalonia.Base/Controls/ResourcesChangedEventArgs.cs b/src/Avalonia.Base/Controls/ResourcesChangedEventArgs.cs
index a60c95a2e0..f78910b003 100644
--- a/src/Avalonia.Base/Controls/ResourcesChangedEventArgs.cs
+++ b/src/Avalonia.Base/Controls/ResourcesChangedEventArgs.cs
@@ -1,10 +1,24 @@
-using System;
+using System.Threading;
-namespace Avalonia.Controls
+namespace Avalonia.Controls;
+
+///
+/// Represents the event arguments of .
+/// The identifies the changes.
+///
+/// The sequence number used to identify the changes.
+///
+/// For performance reasons, this type is a struct.
+/// Avoid using a default instance of this type or its default constructor, call instead.
+///
+public readonly record struct ResourcesChangedEventArgs(int SequenceNumber)
{
- // TODO12: change this to be a struct, remove ResourcesChangedToken
- public class ResourcesChangedEventArgs : EventArgs
- {
- public static new readonly ResourcesChangedEventArgs Empty = new ResourcesChangedEventArgs();
- }
+ private static int s_lastSequenceNumber;
+
+ ///
+ /// Creates a new instance of with an auto-incremented sequence number.
+ ///
+ ///
+ public static ResourcesChangedEventArgs Create()
+ => new(Interlocked.Increment(ref s_lastSequenceNumber));
}
diff --git a/src/Avalonia.Base/Controls/ResourcesChangedHelper.cs b/src/Avalonia.Base/Controls/ResourcesChangedHelper.cs
deleted file mode 100644
index 8ad121ad3a..0000000000
--- a/src/Avalonia.Base/Controls/ResourcesChangedHelper.cs
+++ /dev/null
@@ -1,45 +0,0 @@
-using System;
-using Avalonia.LogicalTree;
-
-namespace Avalonia.Controls;
-
-internal static class ResourcesChangedHelper
-{
- internal static void NotifyHostedResourcesChanged(this IResourceHost host, ResourcesChangedToken token)
- {
- if (host is IResourceHost2 host2)
- host2.NotifyHostedResourcesChanged(token);
- else
- host.NotifyHostedResourcesChanged(ResourcesChangedEventArgs.Empty);
- }
-
- internal static void NotifyResourcesChanged(this ILogical logical, ResourcesChangedToken token)
- {
- if (logical is StyledElement styledElement)
- styledElement.NotifyResourcesChanged(token);
- else
- logical.NotifyResourcesChanged(ResourcesChangedEventArgs.Empty);
- }
-
- internal static void SubscribeToResourcesChanged(
- this IResourceHost host,
- EventHandler handler,
- EventHandler handler2)
- {
- if (host is IResourceHost2 host2)
- host2.ResourcesChanged2 += handler2;
- else
- host.ResourcesChanged += handler;
- }
-
- internal static void UnsubscribeFromResourcesChanged(
- this IResourceHost host,
- EventHandler handler,
- EventHandler handler2)
- {
- if (host is IResourceHost2 host2)
- host2.ResourcesChanged2 -= handler2;
- else
- host.ResourcesChanged -= handler;
- }
-}
diff --git a/src/Avalonia.Base/Controls/ResourcesChangedToken.cs b/src/Avalonia.Base/Controls/ResourcesChangedToken.cs
deleted file mode 100644
index 8de692e729..0000000000
--- a/src/Avalonia.Base/Controls/ResourcesChangedToken.cs
+++ /dev/null
@@ -1,11 +0,0 @@
-using System.Threading;
-
-namespace Avalonia.Controls;
-
-internal record struct ResourcesChangedToken(int SequenceNumber)
-{
- private static int s_lastSequenceNumber;
-
- public static ResourcesChangedToken Create()
- => new(Interlocked.Increment(ref s_lastSequenceNumber));
-}
diff --git a/src/Avalonia.Base/Data/CompiledBinding.cs b/src/Avalonia.Base/Data/CompiledBinding.cs
index 764b04957e..952a5cddc4 100644
--- a/src/Avalonia.Base/Data/CompiledBinding.cs
+++ b/src/Avalonia.Base/Data/CompiledBinding.cs
@@ -7,6 +7,7 @@ using Avalonia.Data.Converters;
using Avalonia.Data.Core;
using Avalonia.Data.Core.ExpressionNodes;
using Avalonia.Data.Core.Parsers;
+using Avalonia.Metadata;
namespace Avalonia.Data;
@@ -70,6 +71,7 @@ public class CompiledBinding : BindingBase
///
/// Gets or sets the binding path.
///
+ [ConstructorArgument("path")]
public CompiledBindingPath? Path { get; set; }
///
diff --git a/src/Avalonia.Base/Data/ReflectionBinding.cs b/src/Avalonia.Base/Data/ReflectionBinding.cs
index 1209d47a2e..299f6317b4 100644
--- a/src/Avalonia.Base/Data/ReflectionBinding.cs
+++ b/src/Avalonia.Base/Data/ReflectionBinding.cs
@@ -8,6 +8,7 @@ using Avalonia.Data.Converters;
using Avalonia.Data.Core;
using Avalonia.Data.Core.ExpressionNodes;
using Avalonia.Data.Core.Parsers;
+using Avalonia.Metadata;
using Avalonia.Utilities;
namespace Avalonia.Data
@@ -34,17 +35,6 @@ namespace Avalonia.Data
{
Path = path;
}
-
- ///
- /// Initializes a new instance of the class.
- ///
- /// The binding path.
- /// The binding mode.
- public ReflectionBinding(string path, BindingMode mode)
- {
- Path = path;
- Mode = mode;
- }
///
/// Gets or sets the amount of time, in milliseconds, to wait before updating the binding
@@ -95,6 +85,7 @@ namespace Avalonia.Data
///
/// Gets or sets the binding path.
///
+ [ConstructorArgument("path")]
public string Path { get; set; } = "";
///
diff --git a/src/Avalonia.Base/Data/TemplateBinding.cs b/src/Avalonia.Base/Data/TemplateBinding.cs
index 428f9c4a11..55b3e74ce5 100644
--- a/src/Avalonia.Base/Data/TemplateBinding.cs
+++ b/src/Avalonia.Base/Data/TemplateBinding.cs
@@ -48,6 +48,7 @@ namespace Avalonia.Data
///
/// Gets or sets the name of the source property on the templated parent.
///
+ [ConstructorArgument("property")]
[InheritDataTypeFrom(InheritDataTypeFromScopeKind.ControlTemplate)]
public AvaloniaProperty? Property { get; set; }
diff --git a/src/Avalonia.Base/Diagnostics/ObsoletionMessages.cs b/src/Avalonia.Base/Diagnostics/ObsoletionMessages.cs
deleted file mode 100644
index bfada91abe..0000000000
--- a/src/Avalonia.Base/Diagnostics/ObsoletionMessages.cs
+++ /dev/null
@@ -1,12 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-
-namespace Avalonia.Diagnostics;
-
-internal static class ObsoletionMessages
-{
- public const string MayBeRemovedInAvalonia12 = "This API may be removed in Avalonia 12. If you depend on this API, please open an issue with details of your use-case.";
-}
diff --git a/src/Avalonia.Base/Platform/IOptionalFeatureProvider.cs b/src/Avalonia.Base/IOptionalFeatureProvider.cs
similarity index 92%
rename from src/Avalonia.Base/Platform/IOptionalFeatureProvider.cs
rename to src/Avalonia.Base/IOptionalFeatureProvider.cs
index 27c2243791..55c3ef7984 100644
--- a/src/Avalonia.Base/Platform/IOptionalFeatureProvider.cs
+++ b/src/Avalonia.Base/IOptionalFeatureProvider.cs
@@ -1,8 +1,7 @@
using System;
using System.Diagnostics.CodeAnalysis;
-// TODO12: move to Avalonia namespace.
-namespace Avalonia.Platform;
+namespace Avalonia;
public interface IOptionalFeatureProvider
{
diff --git a/src/Avalonia.Base/Input/MouseDevice.cs b/src/Avalonia.Base/Input/MouseDevice.cs
index 5a0cdad755..62105c7deb 100644
--- a/src/Avalonia.Base/Input/MouseDevice.cs
+++ b/src/Avalonia.Base/Input/MouseDevice.cs
@@ -34,6 +34,8 @@ namespace Avalonia.Input
_pointer = pointer ?? new Pointer(Pointer.GetNextFreeId(), PointerType.Mouse, true);
}
+ internal Pointer Pointer => _pointer;
+
internal static TMouseDevice GetOrCreatePrimary() where TMouseDevice : MouseDevice, new()
{
if (_primary is TMouseDevice device)
diff --git a/src/Avalonia.Base/Input/Pointer.cs b/src/Avalonia.Base/Input/Pointer.cs
index f243a2e382..94643fa91e 100644
--- a/src/Avalonia.Base/Input/Pointer.cs
+++ b/src/Avalonia.Base/Input/Pointer.cs
@@ -77,6 +77,7 @@ namespace Avalonia.Input
if (oldVisual != null)
oldVisual.DetachedFromVisualTree -= OnCaptureDetached;
Captured = control;
+ CaptureSource = source;
if (source != CaptureSource.Platform)
PlatformCapture(control);
@@ -115,6 +116,7 @@ namespace Avalonia.Input
public IInputElement? Captured { get; private set; }
public PointerType Type { get; }
+
public bool IsPrimary { get; }
///
@@ -124,6 +126,8 @@ namespace Avalonia.Input
public bool IsGestureRecognitionSkipped { get; set; }
+ internal CaptureSource CaptureSource { get; private set; } = CaptureSource.Platform;
+
public void Dispose()
{
if (Captured != null)
diff --git a/src/Avalonia.Base/Media/Imaging/Bitmap.cs b/src/Avalonia.Base/Media/Imaging/Bitmap.cs
index 9c0c20d170..63ec02737f 100644
--- a/src/Avalonia.Base/Media/Imaging/Bitmap.cs
+++ b/src/Avalonia.Base/Media/Imaging/Bitmap.cs
@@ -291,9 +291,7 @@ namespace Avalonia.Media.Imaging
{
get
{
- // TODO12: We should probably make PlatformImpl to be nullable or make it possible to check
- // and fix IRef in general (right now Item is not nullable while it internally is)
- if (PlatformImpl.Item == null!)
+ if (!PlatformImpl.IsAlive)
return null;
return PlatformImpl;
}
diff --git a/src/Avalonia.Base/Metadata/ConstructorArgumentAttribute.cs b/src/Avalonia.Base/Metadata/ConstructorArgumentAttribute.cs
new file mode 100644
index 0000000000..5c0021655b
--- /dev/null
+++ b/src/Avalonia.Base/Metadata/ConstructorArgumentAttribute.cs
@@ -0,0 +1,17 @@
+using System;
+
+namespace Avalonia.Metadata;
+
+///
+/// Indicates that a property corresponds to a named parameter in the constructor.
+///
+/// The name of the parameter in the constructor.
+/// This attribute is used for XAML.
+[AttributeUsage(AttributeTargets.Property)]
+public sealed class ConstructorArgumentAttribute(string name) : Attribute
+{
+ ///
+ /// Gets the name of the parameter in the constructor.
+ ///
+ public string Name { get; } = name;
+}
diff --git a/src/Avalonia.Base/Platform/ISurfaceOrientation.cs b/src/Avalonia.Base/Platform/ISurfaceOrientation.cs
new file mode 100644
index 0000000000..2f4f2d3241
--- /dev/null
+++ b/src/Avalonia.Base/Platform/ISurfaceOrientation.cs
@@ -0,0 +1,6 @@
+namespace Avalonia.Platform;
+
+internal interface ISurfaceOrientation
+{
+ SurfaceOrientation Orientation { get; }
+}
diff --git a/src/Avalonia.Base/Platform/SurfaceOrientation.cs b/src/Avalonia.Base/Platform/SurfaceOrientation.cs
new file mode 100644
index 0000000000..71835fb6ff
--- /dev/null
+++ b/src/Avalonia.Base/Platform/SurfaceOrientation.cs
@@ -0,0 +1,9 @@
+namespace Avalonia.Platform;
+
+public enum SurfaceOrientation
+{
+ Rotation0,
+ Rotation90,
+ Rotation180,
+ Rotation270,
+}
diff --git a/src/Avalonia.Base/StyledElement.cs b/src/Avalonia.Base/StyledElement.cs
index b7f6262d9f..711d17d014 100644
--- a/src/Avalonia.Base/StyledElement.cs
+++ b/src/Avalonia.Base/StyledElement.cs
@@ -29,7 +29,7 @@ namespace Avalonia
IDataContextProvider,
ILogical,
IThemeVariantHost,
- IResourceHost2,
+ IResourceHost,
IStyleHost,
ISetLogicalParent,
ISetInheritanceParent,
@@ -94,8 +94,7 @@ namespace Avalonia
private AvaloniaObject? _templatedParent;
private bool _dataContextUpdating;
private ControlTheme? _implicitTheme;
- private EventHandler? _resourcesChanged2;
- private ResourcesChangedToken _lastResourcesChangedToken;
+ private ResourcesChangedEventArgs _lastResourcesChangedEventArgs;
///
/// Initializes static members of the class.
@@ -150,12 +149,6 @@ namespace Avalonia
///
public event EventHandler? ResourcesChanged;
- event EventHandler? IResourceHost2.ResourcesChanged2
- {
- add => _resourcesChanged2 += value;
- remove => _resourcesChanged2 -= value;
- }
-
///
public event EventHandler? ActualThemeVariantChanged;
@@ -437,14 +430,11 @@ namespace Avalonia
///
void ILogical.NotifyResourcesChanged(ResourcesChangedEventArgs e)
- => NotifyResourcesChanged(ResourcesChangedToken.Create());
+ => NotifyResourcesChanged(e);
///
void IResourceHost.NotifyHostedResourcesChanged(ResourcesChangedEventArgs e)
- => NotifyResourcesChanged(ResourcesChangedToken.Create());
-
- void IResourceHost2.NotifyHostedResourcesChanged(ResourcesChangedToken token)
- => NotifyResourcesChanged(token);
+ => NotifyResourcesChanged(e);
///
public bool TryGetResource(object key, ThemeVariant? theme, out object? value)
@@ -499,7 +489,7 @@ namespace Avalonia
// non-rooted control beacuse it's unlikely that dynamic resources need to be
// correct until the control is added to the tree, and it causes a *lot* of
// notifications.
- NotifyResourcesChanged(ResourcesChangedToken.Create());
+ NotifyResourcesChanged(ResourcesChangedEventArgs.Create());
}
RaisePropertyChanged(ParentProperty, old, Parent);
@@ -552,8 +542,8 @@ namespace Avalonia
///
/// Notifies child controls that a change has been made to resources that apply to them.
///
- /// The change token.
- internal virtual void NotifyChildResourcesChanged(ResourcesChangedToken token)
+ /// The change token.
+ internal virtual void NotifyChildResourcesChanged(ResourcesChangedEventArgs e)
{
if (_logicalChildren is object)
{
@@ -563,7 +553,7 @@ namespace Avalonia
{
for (var i = 0; i < count; ++i)
{
- _logicalChildren[i].NotifyResourcesChanged(token);
+ _logicalChildren[i].NotifyResourcesChanged(e);
}
}
}
@@ -895,7 +885,7 @@ namespace Avalonia
ReevaluateImplicitTheme();
ApplyStyling();
- NotifyResourcesChanged(ResourcesChangedToken.Create(), propagate: false);
+ NotifyResourcesChanged(ResourcesChangedEventArgs.Create(), propagate: false);
OnAttachedToLogicalTree(e);
AttachedToLogicalTree?.Invoke(this, e);
@@ -999,23 +989,22 @@ namespace Avalonia
}
internal void NotifyResourcesChanged(
- ResourcesChangedToken token,
+ ResourcesChangedEventArgs e,
bool propagate = true)
{
// We already got a notification for this element, ignore.
- if (token.Equals(_lastResourcesChangedToken))
+ if (e.Equals(_lastResourcesChangedEventArgs))
{
return;
}
- _lastResourcesChangedToken = token;
+ _lastResourcesChangedEventArgs = e;
- _resourcesChanged2?.Invoke(this, token);
- ResourcesChanged?.Invoke(this, ResourcesChangedEventArgs.Empty);
+ ResourcesChanged?.Invoke(this, e);
if (propagate)
{
- NotifyChildResourcesChanged(token);
+ NotifyChildResourcesChanged(e);
}
}
diff --git a/src/Avalonia.Base/Styling/StyleBase.cs b/src/Avalonia.Base/Styling/StyleBase.cs
index 038fc7c5c3..7dbdb22e9c 100644
--- a/src/Avalonia.Base/Styling/StyleBase.cs
+++ b/src/Avalonia.Base/Styling/StyleBase.cs
@@ -54,7 +54,7 @@ namespace Avalonia.Styling
if (hadResources || _resources.HasResources)
{
- Owner.NotifyHostedResourcesChanged(ResourcesChangedToken.Create());
+ Owner.NotifyHostedResourcesChanged(ResourcesChangedEventArgs.Create());
}
}
}
diff --git a/src/Avalonia.Base/Utilities/Ref.cs b/src/Avalonia.Base/Utilities/Ref.cs
index 0b6abe5189..49a7a42710 100644
--- a/src/Avalonia.Base/Utilities/Ref.cs
+++ b/src/Avalonia.Base/Utilities/Ref.cs
@@ -28,6 +28,10 @@ namespace Avalonia.Utilities
/// A reference to the value as the new type but sharing the refcount.
IRef CloneAs() where TResult : class;
+ ///
+ /// Gets whether the reference still tracks a valid item.
+ ///
+ bool IsAlive { get; }
///
/// The current refcount of the object tracked in this reference. For debugging/unit test use only.
@@ -172,6 +176,8 @@ namespace Avalonia.Utilities
return new Ref(item, counter);
}
+ public bool IsAlive => _item is not null;
+
public int RefCount => _counter?.RefCount ?? throw new ObjectDisposedException("Ref<" + typeof(T) + ">");
}
}
diff --git a/src/Avalonia.Controls/Application.cs b/src/Avalonia.Controls/Application.cs
index 0bad04bb23..ff04499c42 100644
--- a/src/Avalonia.Controls/Application.cs
+++ b/src/Avalonia.Controls/Application.cs
@@ -30,7 +30,7 @@ namespace Avalonia
/// method.
/// - Tracks the lifetime of the application.
///
- public class Application : AvaloniaObject, IDataContextProvider, IGlobalDataTemplates, IGlobalStyles, IThemeVariantHost, IResourceHost2, IApplicationPlatformEvents, IOptionalFeatureProvider
+ public class Application : AvaloniaObject, IDataContextProvider, IGlobalDataTemplates, IGlobalStyles, IThemeVariantHost, IResourceHost, IApplicationPlatformEvents, IOptionalFeatureProvider
{
///
/// The application-global data templates.
@@ -43,7 +43,6 @@ namespace Avalonia
private Action>? _stylesRemoved;
private IApplicationLifetime? _applicationLifetime;
private bool _setupCompleted;
- private EventHandler? _resourcesChanged2;
///
/// Defines the property.
@@ -62,12 +61,6 @@ namespace Avalonia
///
public event EventHandler? ResourcesChanged;
- event EventHandler? IResourceHost2.ResourcesChanged2
- {
- add => _resourcesChanged2 += value;
- remove => _resourcesChanged2 -= value;
- }
-
[Obsolete("Use Application.Current.TryGetFeature() instead.")]
public event EventHandler? UrlsOpened;
@@ -239,16 +232,9 @@ namespace Avalonia
void IResourceHost.NotifyHostedResourcesChanged(ResourcesChangedEventArgs e)
{
- _resourcesChanged2?.Invoke(this, ResourcesChangedToken.Create());
ResourcesChanged?.Invoke(this, e);
}
- void IResourceHost2.NotifyHostedResourcesChanged(ResourcesChangedToken token)
- {
- _resourcesChanged2?.Invoke(this, token);
- ResourcesChanged?.Invoke(this, ResourcesChangedEventArgs.Empty);
- }
-
void IStyleHost.StylesAdded(IReadOnlyList styles)
{
_stylesAdded?.Invoke(styles);
diff --git a/src/Avalonia.Controls/AutoCompleteBox/AutoCompleteBox.Properties.cs b/src/Avalonia.Controls/AutoCompleteBox/AutoCompleteBox.Properties.cs
index 90cedbce8c..ae009636af 100644
--- a/src/Avalonia.Controls/AutoCompleteBox/AutoCompleteBox.Properties.cs
+++ b/src/Avalonia.Controls/AutoCompleteBox/AutoCompleteBox.Properties.cs
@@ -212,6 +212,12 @@ namespace Avalonia.Controls
public static readonly StyledProperty