diff --git a/api/Avalonia.Headless.nupkg.xml b/api/Avalonia.Headless.nupkg.xml
new file mode 100644
index 0000000000..df64d3d757
--- /dev/null
+++ b/api/Avalonia.Headless.nupkg.xml
@@ -0,0 +1,16 @@
+
+
+
+
+ CP0002
+ M:Avalonia.Headless.HeadlessWindowExtensions.DragDrop(Avalonia.Controls.TopLevel,Avalonia.Point,Avalonia.Input.Raw.RawDragEventType,Avalonia.Input.IDataObject,Avalonia.Input.DragDropEffects,Avalonia.Input.RawInputModifiers)
+ baseline/Avalonia.Headless/lib/net10.0/Avalonia.Headless.dll
+ current/Avalonia.Headless/lib/net10.0/Avalonia.Headless.dll
+
+
+ CP0002
+ M:Avalonia.Headless.HeadlessWindowExtensions.DragDrop(Avalonia.Controls.TopLevel,Avalonia.Point,Avalonia.Input.Raw.RawDragEventType,Avalonia.Input.IDataObject,Avalonia.Input.DragDropEffects,Avalonia.Input.RawInputModifiers)
+ baseline/Avalonia.Headless/lib/net8.0/Avalonia.Headless.dll
+ current/Avalonia.Headless/lib/net8.0/Avalonia.Headless.dll
+
+
diff --git a/api/Avalonia.nupkg.xml b/api/Avalonia.nupkg.xml
index 5a424cb8ee..75154ef969 100644
--- a/api/Avalonia.nupkg.xml
+++ b/api/Avalonia.nupkg.xml
@@ -1,12 +1,60 @@
+
+ CP0001
+ T:Avalonia.Animation.CustomAnimatorBase
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
+
+ CP0001
+ T:Avalonia.Animation.CustomAnimatorBase`1
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
+
+ CP0001
+ T:Avalonia.Animation.Easings.CubicBezierEasing
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
CP0001
T:Avalonia.Controls.Primitives.IScrollable
baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
+ CP0001
+ T:Avalonia.Diagnostics.AppliedStyle
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
+
+ CP0001
+ T:Avalonia.Diagnostics.StyledElementExtensions
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
+
+ CP0001
+ T:Avalonia.Diagnostics.StyleDiagnostics
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
+
+ CP0001
+ T:Avalonia.Input.DataObjectExtensions
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
+
+ CP0001
+ T:Avalonia.Input.IDataObject
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
CP0001
T:Avalonia.Media.Fonts.FontFamilyLoader
@@ -37,6 +85,12 @@
baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
+ CP0001
+ T:Avalonia.Styling.IStyleable
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
CP0001
T:Avalonia.Utilities.StringTokenizer
@@ -73,12 +127,60 @@
baseline/Avalonia/lib/net6.0/Avalonia.Base.dll
current/Avalonia/lib/net6.0/Avalonia.Base.dll
+
+ CP0001
+ T:Avalonia.Animation.CustomAnimatorBase
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
+
+
+ CP0001
+ T:Avalonia.Animation.CustomAnimatorBase`1
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
+
+
+ CP0001
+ T:Avalonia.Animation.Easings.CubicBezierEasing
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
+
CP0001
T:Avalonia.Controls.Primitives.IScrollable
baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
current/Avalonia/lib/net8.0/Avalonia.Base.dll
+
+ CP0001
+ T:Avalonia.Diagnostics.AppliedStyle
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
+
+
+ CP0001
+ T:Avalonia.Diagnostics.StyledElementExtensions
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
+
+
+ CP0001
+ T:Avalonia.Diagnostics.StyleDiagnostics
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
+
+
+ CP0001
+ T:Avalonia.Input.DataObjectExtensions
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
+
+
+ CP0001
+ T:Avalonia.Input.IDataObject
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
+
CP0001
T:Avalonia.Media.Fonts.FontFamilyLoader
@@ -109,6 +211,12 @@
baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
current/Avalonia/lib/net8.0/Avalonia.Base.dll
+
+ CP0001
+ T:Avalonia.Styling.IStyleable
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
+
CP0001
T:Avalonia.Utilities.StringTokenizer
@@ -151,6 +259,30 @@
baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
+ CP0002
+ F:Avalonia.Data.BindingPriority.TemplatedParent
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
+
+ CP0002
+ F:Avalonia.Input.DataFormats.FileNames
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
+
+ CP0002
+ F:Avalonia.Input.DataFormats.Files
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
+
+ CP0002
+ F:Avalonia.Input.DataFormats.Text
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
CP0002
F:Avalonia.Media.DrawingImage.ViewboxProperty
@@ -163,18 +295,84 @@
baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
+ CP0002
+ F:Avalonia.Media.RadialGradientBrush.RadiusProperty
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
+
+ CP0002
+ M:Avalonia.Animation.Animation.SetAnimator(Avalonia.Animation.IAnimationSetter,Avalonia.Animation.CustomAnimatorBase)
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
+
+ CP0002
+ M:Avalonia.AvaloniaObjectExtensions.Bind(Avalonia.AvaloniaObject,Avalonia.AvaloniaProperty,Avalonia.Data.BindingBase,System.Object)
+ 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.CompiledBindingPathBuilder.SetRawSource(System.Object)
+ 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.DataObject.Contains(System.String)
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
+
+ CP0002
+ M:Avalonia.Input.DataObject.Get(System.String)
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
+
+ CP0002
+ M:Avalonia.Input.DataObject.GetDataFormats
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
+
+ CP0002
+ M:Avalonia.Input.DataObject.Set(System.String,System.Object)
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
+
+ CP0002
+ M:Avalonia.Input.DragDrop.DoDragDrop(Avalonia.Input.PointerEventArgs,Avalonia.Input.IDataObject,Avalonia.Input.DragDropEffects)
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
+
+ CP0002
+ M:Avalonia.Input.DragEventArgs.#ctor(Avalonia.Interactivity.RoutedEvent{Avalonia.Input.DragEventArgs},Avalonia.Input.IDataObject,Avalonia.Interactivity.Interactive,Avalonia.Point,Avalonia.Input.KeyModifiers)
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
+
+ CP0002
+ M:Avalonia.Input.DragEventArgs.get_Data
+ 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)
@@ -187,12 +385,90 @@
baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
+ CP0002
+ M:Avalonia.Input.Platform.IClipboard.GetDataAsync(System.String)
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
+
+ CP0002
+ M:Avalonia.Input.Platform.IClipboard.GetFormatsAsync
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
+
+ CP0002
+ M:Avalonia.Input.Platform.IClipboard.GetTextAsync
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
+
+ CP0002
+ M:Avalonia.Input.Platform.IClipboard.SetDataObjectAsync(Avalonia.Input.IDataObject)
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
+
+ CP0002
+ M:Avalonia.Input.Platform.IClipboard.SetTextAsync(System.String)
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
+
+ CP0002
+ M:Avalonia.Input.Platform.IClipboard.TryGetInProcessDataObjectAsync
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
+
+ CP0002
+ M:Avalonia.Input.Platform.IPlatformDragSource.DoDragDrop(Avalonia.Input.PointerEventArgs,Avalonia.Input.IDataObject,Avalonia.Input.DragDropEffects)
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
+
+ CP0002
+ M:Avalonia.Input.Raw.RawDragEvent.#ctor(Avalonia.Input.Raw.IDragDropDevice,Avalonia.Input.Raw.RawDragEventType,Avalonia.Input.IInputRoot,Avalonia.Point,Avalonia.Input.IDataObject,Avalonia.Input.DragDropEffects,Avalonia.Input.RawInputModifiers)
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
+
+ CP0002
+ M:Avalonia.Input.Raw.RawDragEvent.get_Data
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
CP0002
M:Avalonia.Input.TextInput.TextInputMethodClient.ShowInputPanel
baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
+ CP0002
+ M:Avalonia.Media.Color.ToUint32
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
+
+ CP0002
+ M:Avalonia.Media.DrawingContext.PushPostTransform(Avalonia.Matrix)
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
+
+ CP0002
+ M:Avalonia.Media.DrawingContext.PushPreTransform(Avalonia.Matrix)
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
+
+ CP0002
+ M:Avalonia.Media.DrawingContext.PushTransformContainer
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
CP0002
M:Avalonia.Media.DrawingImage.get_Viewbox
@@ -223,6 +499,30 @@
baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
+ CP0002
+ M:Avalonia.Media.Immutable.ImmutableRadialGradientBrush.get_Radius
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
+
+ CP0002
+ M:Avalonia.Media.IRadialGradientBrush.get_Radius
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
+
+ CP0002
+ M:Avalonia.Media.RadialGradientBrush.get_Radius
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
+
+ CP0002
+ M:Avalonia.Media.RadialGradientBrush.set_Radius(System.Double)
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
CP0002
M:Avalonia.Media.StreamGeometryContext.ArcTo(Avalonia.Point,Avalonia.Size,System.Double,System.Boolean,Avalonia.Media.SweepDirection)
@@ -331,6 +631,18 @@
baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
+ CP0002
+ M:Avalonia.Rendering.Composition.ICompositionGpuImportedObject.get_ImportCompeted
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
+
+ CP0002
+ M:Avalonia.Utilities.AvaloniaResourcesIndexReaderWriter.WriteResources(System.IO.Stream,System.Collections.Generic.List{System.ValueTuple{System.String,System.Int32,System.Func{System.IO.Stream}}})
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
CP0002
M:Avalonia.Visuals.Platform.PathGeometryContext.ArcTo(Avalonia.Point,Avalonia.Size,System.Double,System.Boolean,Avalonia.Media.SweepDirection)
@@ -589,6 +901,30 @@
baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
current/Avalonia/lib/net8.0/Avalonia.Base.dll
+
+ CP0002
+ F:Avalonia.Data.BindingPriority.TemplatedParent
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
+
+
+ CP0002
+ F:Avalonia.Input.DataFormats.FileNames
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
+
+
+ CP0002
+ F:Avalonia.Input.DataFormats.Files
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
+
+
+ CP0002
+ F:Avalonia.Input.DataFormats.Text
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
+
CP0002
F:Avalonia.Media.DrawingImage.ViewboxProperty
@@ -601,18 +937,84 @@
baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
current/Avalonia/lib/net8.0/Avalonia.Base.dll
+
+ CP0002
+ F:Avalonia.Media.RadialGradientBrush.RadiusProperty
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
+
+
+ CP0002
+ M:Avalonia.Animation.Animation.SetAnimator(Avalonia.Animation.IAnimationSetter,Avalonia.Animation.CustomAnimatorBase)
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
+
+
+ CP0002
+ M:Avalonia.AvaloniaObjectExtensions.Bind(Avalonia.AvaloniaObject,Avalonia.AvaloniaProperty,Avalonia.Data.BindingBase,System.Object)
+ 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.CompiledBindingPathBuilder.SetRawSource(System.Object)
+ 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.DataObject.Contains(System.String)
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
+
+
+ CP0002
+ M:Avalonia.Input.DataObject.Get(System.String)
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
+
+
+ CP0002
+ M:Avalonia.Input.DataObject.GetDataFormats
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
+
+
+ CP0002
+ M:Avalonia.Input.DataObject.Set(System.String,System.Object)
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
+
+
+ CP0002
+ M:Avalonia.Input.DragDrop.DoDragDrop(Avalonia.Input.PointerEventArgs,Avalonia.Input.IDataObject,Avalonia.Input.DragDropEffects)
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
+
+
+ CP0002
+ M:Avalonia.Input.DragEventArgs.#ctor(Avalonia.Interactivity.RoutedEvent{Avalonia.Input.DragEventArgs},Avalonia.Input.IDataObject,Avalonia.Interactivity.Interactive,Avalonia.Point,Avalonia.Input.KeyModifiers)
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
+
+
+ CP0002
+ M:Avalonia.Input.DragEventArgs.get_Data
+ 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)
@@ -625,12 +1027,90 @@
baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
current/Avalonia/lib/net8.0/Avalonia.Base.dll
+
+ CP0002
+ M:Avalonia.Input.Platform.IClipboard.GetDataAsync(System.String)
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
+
+
+ CP0002
+ M:Avalonia.Input.Platform.IClipboard.GetFormatsAsync
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
+
+
+ CP0002
+ M:Avalonia.Input.Platform.IClipboard.GetTextAsync
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
+
+
+ CP0002
+ M:Avalonia.Input.Platform.IClipboard.SetDataObjectAsync(Avalonia.Input.IDataObject)
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
+
+
+ CP0002
+ M:Avalonia.Input.Platform.IClipboard.SetTextAsync(System.String)
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
+
+
+ CP0002
+ M:Avalonia.Input.Platform.IClipboard.TryGetInProcessDataObjectAsync
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
+
+
+ CP0002
+ M:Avalonia.Input.Platform.IPlatformDragSource.DoDragDrop(Avalonia.Input.PointerEventArgs,Avalonia.Input.IDataObject,Avalonia.Input.DragDropEffects)
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
+
+
+ CP0002
+ M:Avalonia.Input.Raw.RawDragEvent.#ctor(Avalonia.Input.Raw.IDragDropDevice,Avalonia.Input.Raw.RawDragEventType,Avalonia.Input.IInputRoot,Avalonia.Point,Avalonia.Input.IDataObject,Avalonia.Input.DragDropEffects,Avalonia.Input.RawInputModifiers)
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
+
+
+ CP0002
+ M:Avalonia.Input.Raw.RawDragEvent.get_Data
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
+
CP0002
M:Avalonia.Input.TextInput.TextInputMethodClient.ShowInputPanel
baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
current/Avalonia/lib/net8.0/Avalonia.Base.dll
+
+ CP0002
+ M:Avalonia.Media.Color.ToUint32
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
+
+
+ CP0002
+ M:Avalonia.Media.DrawingContext.PushPostTransform(Avalonia.Matrix)
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
+
+
+ CP0002
+ M:Avalonia.Media.DrawingContext.PushPreTransform(Avalonia.Matrix)
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
+
+
+ CP0002
+ M:Avalonia.Media.DrawingContext.PushTransformContainer
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
+
CP0002
M:Avalonia.Media.DrawingImage.get_Viewbox
@@ -661,6 +1141,30 @@
baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
current/Avalonia/lib/net8.0/Avalonia.Base.dll
+
+ CP0002
+ M:Avalonia.Media.Immutable.ImmutableRadialGradientBrush.get_Radius
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
+
+
+ CP0002
+ M:Avalonia.Media.IRadialGradientBrush.get_Radius
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
+
+
+ CP0002
+ M:Avalonia.Media.RadialGradientBrush.get_Radius
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
+
+
+ CP0002
+ M:Avalonia.Media.RadialGradientBrush.set_Radius(System.Double)
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
+
CP0002
M:Avalonia.Media.StreamGeometryContext.ArcTo(Avalonia.Point,Avalonia.Size,System.Double,System.Boolean,Avalonia.Media.SweepDirection)
@@ -769,6 +1273,18 @@
baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
current/Avalonia/lib/net8.0/Avalonia.Base.dll
+
+ CP0002
+ M:Avalonia.Rendering.Composition.ICompositionGpuImportedObject.get_ImportCompeted
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
+
+
+ CP0002
+ M:Avalonia.Utilities.AvaloniaResourcesIndexReaderWriter.WriteResources(System.IO.Stream,System.Collections.Generic.List{System.ValueTuple{System.String,System.Int32,System.Func{System.IO.Stream}}})
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
+
CP0002
M:Avalonia.Visuals.Platform.PathGeometryContext.ArcTo(Avalonia.Point,Avalonia.Size,System.Double,System.Boolean,Avalonia.Media.SweepDirection)
@@ -1357,6 +1873,12 @@
baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
current/Avalonia/lib/net8.0/Avalonia.Base.dll
+
+ CP0008
+ T:Avalonia.Input.DataObject
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
CP0008
T:Avalonia.Media.ImmediateDrawingContext
@@ -1465,6 +1987,12 @@
baseline/Avalonia/lib/net10.0/Avalonia.Vulkan.dll
current/Avalonia/lib/net10.0/Avalonia.Vulkan.dll
+
+ CP0008
+ T:Avalonia.Input.DataObject
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
+
CP0008
T:Avalonia.Media.ImmediateDrawingContext
@@ -1579,6 +2107,12 @@
baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
+ CP0009
+ T:Avalonia.Input.DataObject
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
CP0009
T:Avalonia.Platform.Screen
@@ -1591,6 +2125,12 @@
baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
current/Avalonia/lib/net8.0/Avalonia.Base.dll
+
+ CP0009
+ T:Avalonia.Input.DataObject
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
+
CP0009
T:Avalonia.Platform.Screen
diff --git a/native/Avalonia.Native/src/OSX/AvnView.mm b/native/Avalonia.Native/src/OSX/AvnView.mm
index 0da6f43bf4..600dca865f 100644
--- a/native/Avalonia.Native/src/OSX/AvnView.mm
+++ b/native/Avalonia.Native/src/OSX/AvnView.mm
@@ -42,7 +42,8 @@
- (void) updateRenderTarget
{
if(_currentRenderTarget) {
- [_currentRenderTarget resize:_lastPixelSize withScale:static_cast([[self window] backingScaleFactor])];
+ AvnPixelSize size { MAX(_lastPixelSize.Width, 1), MAX(_lastPixelSize.Height, 1) };
+ [_currentRenderTarget resize:size withScale:static_cast([[self window] backingScaleFactor])];
[self setNeedsDisplayInRect:[self frame]];
}
}
diff --git a/src/Avalonia.Base/Animation/Animation.AnimatorRegistry.cs b/src/Avalonia.Base/Animation/Animation.AnimatorRegistry.cs
index b07bd686b8..da3c4cb8e6 100644
--- a/src/Avalonia.Base/Animation/Animation.AnimatorRegistry.cs
+++ b/src/Avalonia.Base/Animation/Animation.AnimatorRegistry.cs
@@ -7,17 +7,6 @@ namespace Avalonia.Animation;
partial class Animation
{
- ///
- /// Sets the value of the Animator attached property for a setter.
- ///
- /// The animation setter.
- /// The property animator value.
- [Obsolete("CustomAnimatorBase will be removed before 11.0, use InterpolatingAnimator", true)]
- public static void SetAnimator(IAnimationSetter setter, CustomAnimatorBase value)
- {
- s_animators[setter] = (value.WrapperType, value.CreateWrapper);
- }
-
///
/// Sets the value of the Animator attached property for a setter.
///
@@ -92,4 +81,4 @@ partial class Animation
return null;
}
-}
\ No newline at end of file
+}
diff --git a/src/Avalonia.Base/Animation/Easings/CubicBezierEasing.cs b/src/Avalonia.Base/Animation/Easings/CubicBezierEasing.cs
deleted file mode 100644
index 2e43e97da2..0000000000
--- a/src/Avalonia.Base/Animation/Easings/CubicBezierEasing.cs
+++ /dev/null
@@ -1,17 +0,0 @@
-using System;
-
-namespace Avalonia.Animation.Easings;
-
-[Obsolete("Use SplineEasing instead")]
-public sealed class CubicBezierEasing : IEasing
-{
- private CubicBezierEasing()
- {
- }
-
- public Point ControlPoint2 { get; set; }
- public Point ControlPoint1 { get; set; }
-
- double IEasing.Ease(double progress)
- => throw new NotSupportedException();
-}
diff --git a/src/Avalonia.Base/Animation/ICustomAnimator.cs b/src/Avalonia.Base/Animation/ICustomAnimator.cs
index 119a6115da..7155af1223 100644
--- a/src/Avalonia.Base/Animation/ICustomAnimator.cs
+++ b/src/Avalonia.Base/Animation/ICustomAnimator.cs
@@ -2,34 +2,6 @@ using System;
using Avalonia.Animation.Animators;
namespace Avalonia.Animation;
-[Obsolete("This class will be removed before 11.0, use InterpolatingAnimator", true)]
-public abstract class CustomAnimatorBase
-{
- internal abstract IAnimator CreateWrapper();
- internal abstract Type WrapperType { get; }
-}
-
-[Obsolete("This class will be removed before 11.0, use InterpolatingAnimator", true)]
-public abstract class CustomAnimatorBase : CustomAnimatorBase
-{
- public abstract T Interpolate(double progress, T oldValue, T newValue);
-
- internal override Type WrapperType => typeof(AnimatorWrapper);
- internal override IAnimator CreateWrapper() => new AnimatorWrapper(this);
-
- internal class AnimatorWrapper : Animator
- {
- private readonly CustomAnimatorBase _parent;
-
- public AnimatorWrapper(CustomAnimatorBase parent)
- {
- _parent = parent;
- }
-
- public override T Interpolate(double progress, T oldValue, T newValue) => _parent.Interpolate(progress, oldValue, newValue);
- }
-}
-
public interface ICustomAnimator
{
internal IAnimator CreateWrapper();
@@ -55,4 +27,4 @@ public abstract class InterpolatingAnimator : ICustomAnimator
public override T Interpolate(double progress, T oldValue, T newValue) => _parent.Interpolate(progress, oldValue, newValue);
}
-}
\ No newline at end of file
+}
diff --git a/src/Avalonia.Base/AvaloniaObjectExtensions.cs b/src/Avalonia.Base/AvaloniaObjectExtensions.cs
index 7c4e67b5cc..3c9c047684 100644
--- a/src/Avalonia.Base/AvaloniaObjectExtensions.cs
+++ b/src/Avalonia.Base/AvaloniaObjectExtensions.cs
@@ -227,33 +227,6 @@ namespace Avalonia
};
}
- ///
- /// Binds a property on an to an .
- ///
- /// The object.
- /// The property to bind.
- /// The binding.
- ///
- /// An optional anchor from which to locate required context. When binding to objects that
- /// are not in the logical tree, certain types of binding need an anchor into the tree in
- /// order to locate named controls or resources. The parameter
- /// can be used to provide this context.
- ///
- /// An which can be used to cancel the binding.
- [Obsolete("Use AvaloniaObject.Bind(AvaloniaProperty, IBinding")]
- public static IDisposable Bind(
- this AvaloniaObject target,
- AvaloniaProperty property,
- BindingBase binding,
- object? anchor = null)
- {
- target = target ?? throw new ArgumentNullException(nameof(target));
- property = property ?? throw new ArgumentNullException(nameof(property));
- binding = binding ?? throw new ArgumentNullException(nameof(binding));
-
- return target.Bind(property, binding);
- }
-
///
/// Gets a value.
///
diff --git a/src/Avalonia.Base/Data/BindingPriority.cs b/src/Avalonia.Base/Data/BindingPriority.cs
index cb7f559e0a..b817c89f7b 100644
--- a/src/Avalonia.Base/Data/BindingPriority.cs
+++ b/src/Avalonia.Base/Data/BindingPriority.cs
@@ -46,9 +46,6 @@ namespace Avalonia.Data
///
/// The value is uninitialized.
///
- Unset = int.MaxValue,
-
- [Obsolete("Use Template priority"), EditorBrowsable(EditorBrowsableState.Never)]
- TemplatedParent = Template,
+ Unset = int.MaxValue
}
}
diff --git a/src/Avalonia.Base/Data/CompiledBindingPath.cs b/src/Avalonia.Base/Data/CompiledBindingPath.cs
index aea320702e..886d89df43 100644
--- a/src/Avalonia.Base/Data/CompiledBindingPath.cs
+++ b/src/Avalonia.Base/Data/CompiledBindingPath.cs
@@ -203,12 +203,6 @@ namespace Avalonia.Data
return this;
}
- [Obsolete("This method doesn't do anything anymore. Use Binding.Source instead.")]
- public CompiledBindingPathBuilder SetRawSource(object? rawSource)
- {
- return this;
- }
-
public CompiledBindingPath Build() => new CompiledBindingPath(_elements.ToArray());
}
diff --git a/src/Avalonia.Base/Diagnostics/StyleDiagnostics.cs b/src/Avalonia.Base/Diagnostics/StyleDiagnostics.cs
deleted file mode 100644
index 3db48cd69c..0000000000
--- a/src/Avalonia.Base/Diagnostics/StyleDiagnostics.cs
+++ /dev/null
@@ -1,37 +0,0 @@
-using System;
-using System.Collections.Generic;
-using Avalonia.Metadata;
-using Avalonia.Styling;
-
-namespace Avalonia.Diagnostics;
-
-[PrivateApi]
-[Unstable("Use StyledElementExtensions.GetValueStoreDiagnostic() instead")]
-public class StyleDiagnostics
-{
- ///
- /// Currently applied styles.
- ///
- public IReadOnlyList AppliedStyles { get; }
-
- public StyleDiagnostics(IReadOnlyList appliedStyles)
- {
- AppliedStyles = appliedStyles;
- }
-}
-
-[PrivateApi]
-[Unstable("Use StyledElementExtensions.GetValueStoreDiagnostic() instead")]
-public sealed class AppliedStyle
-{
- private readonly StyleInstance _instance;
-
- internal AppliedStyle(StyleInstance instance)
- {
- _instance = instance;
- }
-
- public bool HasActivator => _instance.HasActivator;
- public bool IsActive => _instance.IsActive();
- public StyleBase Style => (StyleBase)_instance.Source;
-}
diff --git a/src/Avalonia.Base/Diagnostics/StyleValueFrameDiagnostic.cs b/src/Avalonia.Base/Diagnostics/StyleValueFrameDiagnostic.cs
index 2b0d6c3c64..27683dbe72 100644
--- a/src/Avalonia.Base/Diagnostics/StyleValueFrameDiagnostic.cs
+++ b/src/Avalonia.Base/Diagnostics/StyleValueFrameDiagnostic.cs
@@ -39,7 +39,4 @@ internal class StyleValueFrameDiagnostic : IValueFrameDiagnostic
}
}
}
-
- [Unstable("Compatibility with 11.x")]
- public AppliedStyle AsAppliedStyle() => new AppliedStyle(_styleInstance);
}
diff --git a/src/Avalonia.Base/Diagnostics/StyledElementExtensions.cs b/src/Avalonia.Base/Diagnostics/StyledElementExtensions.cs
deleted file mode 100644
index 78ab52a6bc..0000000000
--- a/src/Avalonia.Base/Diagnostics/StyledElementExtensions.cs
+++ /dev/null
@@ -1,24 +0,0 @@
-using System;
-using System.Linq;
-using Avalonia.Metadata;
-using Avalonia.Styling;
-
-namespace Avalonia.Diagnostics;
-
-///
-/// Defines diagnostic extensions on s.
-///
-[PrivateApi]
-public static class StyledElementExtensions
-{
- [Obsolete("Use AvaloniaObjectExtensions.GetValueStoreDiagnostic instead", true)]
- public static StyleDiagnostics GetStyleDiagnostics(this StyledElement styledElement)
- {
- var diagnostics = styledElement.GetValueStore().GetStoreDiagnostic();
- return new StyleDiagnostics(diagnostics.AppliedFrames
- .OfType()
- .Select(f => f.AsAppliedStyle())
- .ToArray());
- }
-}
-
diff --git a/src/Avalonia.Base/Input/DataFormats.cs b/src/Avalonia.Base/Input/DataFormats.cs
index 2fe818f20d..935f03de25 100644
--- a/src/Avalonia.Base/Input/DataFormats.cs
+++ b/src/Avalonia.Base/Input/DataFormats.cs
@@ -1,56 +1,11 @@
using System;
-using System.ComponentModel;
-using Avalonia.Input.Platform;
-namespace Avalonia.Input
-{
- public static class DataFormats
- {
- ///
- /// Dataformat for plaintext
- ///
- [Obsolete($"Use {nameof(DataFormat)}.{nameof(DataFormat.Text)} instead.")]
- public static readonly string Text = nameof(Text);
+namespace Avalonia.Input;
- ///
- /// Dataformat for one or more files.
- ///
- [Obsolete($"Use {nameof(DataFormat)}.{nameof(DataFormat.File)} instead.")]
- public static readonly string Files = nameof(Files);
-
- ///
- /// Dataformat for one or more filenames
- ///
- ///
- /// This data format is supported only on desktop platforms.
- ///
- [Obsolete($"Use {nameof(DataFormat)}.{nameof(DataFormat.File)} instead."), EditorBrowsable(EditorBrowsableState.Never)]
- public static readonly string FileNames = nameof(FileNames);
-
-#pragma warning disable CS0618 // Type or member is obsolete
-
- internal static DataFormat ToDataFormat(string format)
- {
- if (format == Text)
- return DataFormat.Text;
-
- if (format == Files || format == FileNames)
- return DataFormat.File;
-
- return DataFormat.CreateBytesPlatformFormat(format);
- }
-
- internal static string ToString(DataFormat format)
- {
- if (DataFormat.Text.Equals(format))
- return Text;
-
- if (DataFormat.File.Equals(format))
- return Files;
-
- return format.Identifier;
- }
-
-#pragma warning restore CS0618 // Type or member is obsolete
- }
-}
+// TODO13: remove
+///
+/// This class does not do anything anymore.
+/// Use instead.
+///
+[Obsolete($"Use {nameof(DataFormat)} instead", true)]
+public static class DataFormats;
diff --git a/src/Avalonia.Base/Input/DataObject.cs b/src/Avalonia.Base/Input/DataObject.cs
index dc9e2a29af..708ac61e16 100644
--- a/src/Avalonia.Base/Input/DataObject.cs
+++ b/src/Avalonia.Base/Input/DataObject.cs
@@ -1,40 +1,11 @@
using System;
-using System.Collections.Generic;
-namespace Avalonia.Input
-{
- ///
- /// Specific and mutable implementation of the IDataObject interface.
- ///
- [Obsolete($"Use {nameof(DataTransfer)} instead")]
- public class DataObject : IDataObject
- {
- private readonly Dictionary _items = new();
+namespace Avalonia.Input;
- ///
- public bool Contains(string dataFormat)
- {
- return _items.ContainsKey(dataFormat);
- }
-
- ///
- public object? Get(string dataFormat)
- {
- return _items.TryGetValue(dataFormat, out var item) ? item : null;
- }
-
- ///
- public IEnumerable GetDataFormats()
- {
- return _items.Keys;
- }
-
- ///
- /// Sets a value to the internal store of the data object with as a key.
- ///
- public void Set(string dataFormat, object value)
- {
- _items[dataFormat] = value;
- }
- }
-}
+// TODO13: remove
+///
+/// This class does not do anything anymore.
+/// Use instead.
+///
+[Obsolete($"Use {nameof(DataTransfer)} instead", true)]
+public sealed class DataObject;
diff --git a/src/Avalonia.Base/Input/DataObjectExtensions.cs b/src/Avalonia.Base/Input/DataObjectExtensions.cs
deleted file mode 100644
index f361485404..0000000000
--- a/src/Avalonia.Base/Input/DataObjectExtensions.cs
+++ /dev/null
@@ -1,54 +0,0 @@
-using System.Collections.Generic;
-using System.ComponentModel;
-using System.Linq;
-using Avalonia.Platform.Storage;
-
-#pragma warning disable CS0618 // Type or member is obsolete
-
-namespace Avalonia.Input
-{
- // TODO12: remove
- public static class DataObjectExtensions
- {
- ///
- /// Returns a list of files if the DataObject contains files or filenames.
- /// .
- ///
- ///
- /// Collection of storage items - files or folders. If format isn't available, returns null.
- ///
- public static IEnumerable? GetFiles(this IDataObject dataObject)
- {
- return dataObject.Get(DataFormats.Files) as IEnumerable;
- }
-
- ///
- /// Returns a list of filenames if the DataObject contains filenames.
- ///
- ///
- ///
- /// Collection of file names. If format isn't available, returns null.
- ///
- [System.Obsolete("Use GetFiles, this method is supported only on desktop platforms."), EditorBrowsable(EditorBrowsableState.Never)]
- public static IEnumerable? GetFileNames(this IDataObject dataObject)
- {
- return (dataObject.Get(DataFormats.FileNames) as IEnumerable)
- ?? dataObject.GetFiles()?
- .Select(f => f.TryGetLocalPath())
- .Where(p => !string.IsNullOrEmpty(p))
- .OfType();
- }
-
- ///
- /// Returns the dragged text if the DataObject contains any text.
- ///
- ///
- ///
- /// A text string. If format isn't available, returns null.
- ///
- public static string? GetText(this IDataObject dataObject)
- {
- return dataObject.Get(DataFormats.Text) as string;
- }
- }
-}
diff --git a/src/Avalonia.Base/Input/DataTransferExtensions.cs b/src/Avalonia.Base/Input/DataTransferExtensions.cs
index 517ca51719..a4f74bef3e 100644
--- a/src/Avalonia.Base/Input/DataTransferExtensions.cs
+++ b/src/Avalonia.Base/Input/DataTransferExtensions.cs
@@ -1,7 +1,5 @@
-using System;
-using System.Collections.Generic;
+using System.Collections.Generic;
using System.Linq;
-using Avalonia.Input.Platform;
using Avalonia.Media.Imaging;
using Avalonia.Platform.Storage;
@@ -14,11 +12,6 @@ namespace Avalonia.Input;
///
public static class DataTransferExtensions
{
- [Obsolete]
- internal static IDataObject ToLegacyDataObject(this IDataTransfer dataTransfer)
- => (dataTransfer as DataObjectToDataTransferWrapper)?.DataObject
- ?? new DataTransferToDataObjectWrapper(dataTransfer);
-
///
/// Gets whether a supports a specific format.
///
diff --git a/src/Avalonia.Base/Input/DragDrop.cs b/src/Avalonia.Base/Input/DragDrop.cs
index 551f436854..33f538c443 100644
--- a/src/Avalonia.Base/Input/DragDrop.cs
+++ b/src/Avalonia.Base/Input/DragDrop.cs
@@ -122,16 +122,6 @@ namespace Avalonia.Input
element.RemoveHandler(DropEvent, handler);
}
- ///
- /// Starts a dragging operation with the given and returns the applied drop effect from the target.
- ///
- ///
- [Obsolete($"Use {nameof(DoDragDropAsync)} instead.")]
- public static Task DoDragDrop(PointerEventArgs triggerEvent, IDataObject data, DragDropEffects allowedEffects)
- {
- return DoDragDropAsync(triggerEvent, new DataObjectToDataTransferWrapper(data), allowedEffects);
- }
-
///
/// Starts a dragging operation with the given and returns the applied drop effect from the target.
///
diff --git a/src/Avalonia.Base/Input/DragEventArgs.cs b/src/Avalonia.Base/Input/DragEventArgs.cs
index d4a058e5b6..e68a6138e0 100644
--- a/src/Avalonia.Base/Input/DragEventArgs.cs
+++ b/src/Avalonia.Base/Input/DragEventArgs.cs
@@ -1,5 +1,4 @@
using System;
-using Avalonia.Input.Platform;
using Avalonia.Interactivity;
using Avalonia.Metadata;
@@ -9,16 +8,11 @@ namespace Avalonia.Input
{
private readonly Interactive _target;
private readonly Point _targetLocation;
- [Obsolete] private IDataObject? _legacyDataObject;
public DragDropEffects DragEffects { get; set; }
public IDataTransfer DataTransfer { get; }
- [Obsolete($"Use {nameof(DataTransfer)} instead.")]
- public IDataObject Data
- => _legacyDataObject ??= DataTransfer.ToLegacyDataObject();
-
public KeyModifiers KeyModifiers { get; }
public Point GetPosition(Visual relativeTo)
@@ -31,17 +25,6 @@ namespace Avalonia.Input
return _target.TranslatePoint(_targetLocation, relativeTo) ?? new Point(0, 0);
}
- [Obsolete($"Use the constructor accepting a {nameof(IDataTransfer)} instance instead.")]
- public DragEventArgs(
- RoutedEvent routedEvent,
- IDataObject data,
- Interactive target,
- Point targetLocation,
- KeyModifiers keyModifiers)
- : this(routedEvent, new DataObjectToDataTransferWrapper(data), target, targetLocation, keyModifiers)
- {
- }
-
[Unstable("This constructor might be removed in 12.0. For unit testing, consider using DragDrop.DoDragDrop or IHeadlessWindow.DragDrop.")]
public DragEventArgs(
RoutedEvent routedEvent,
diff --git a/src/Avalonia.Base/Input/IDataObject.cs b/src/Avalonia.Base/Input/IDataObject.cs
deleted file mode 100644
index 560ffc0c02..0000000000
--- a/src/Avalonia.Base/Input/IDataObject.cs
+++ /dev/null
@@ -1,32 +0,0 @@
-using System;
-using System.Collections.Generic;
-
-namespace Avalonia.Input
-{
- ///
- /// Interface to access information about the data of a drag-and-drop operation.
- ///
- [Obsolete($"Use {nameof(IDataTransfer)} or {nameof(IAsyncDataTransfer)} instead")]
- public interface IDataObject
- {
- ///
- /// Lists all formats which are present in the DataObject.
- ///
- ///
- IEnumerable GetDataFormats();
-
- ///
- /// Checks whether a given DataFormat is present in this object
- ///
- ///
- bool Contains(string dataFormat);
-
- ///
- /// Tries to get the data of the given DataFormat.
- ///
- ///
- /// Object data. If format isn't available, returns null.
- ///
- object? Get(string dataFormat);
- }
-}
diff --git a/src/Avalonia.Base/Input/Platform/Clipboard.cs b/src/Avalonia.Base/Input/Platform/Clipboard.cs
index 0d961cde3e..c1ebf09196 100644
--- a/src/Avalonia.Base/Input/Platform/Clipboard.cs
+++ b/src/Avalonia.Base/Input/Platform/Clipboard.cs
@@ -1,9 +1,4 @@
-using System;
-using System.IO;
-using System.Linq;
-using System.Threading.Tasks;
-using Avalonia.Compatibility;
-using Avalonia.Platform.Storage;
+using System.Threading.Tasks;
namespace Avalonia.Input.Platform;
@@ -15,12 +10,6 @@ internal sealed class Clipboard(IClipboardImpl clipboardImpl) : IClipboard
private readonly IClipboardImpl _clipboardImpl = clipboardImpl;
private IAsyncDataTransfer? _lastDataTransfer;
- Task IClipboard.GetTextAsync()
- => this.TryGetTextAsync();
-
- Task IClipboard.SetTextAsync(string? text)
- => this.SetValueAsync(DataFormat.Text, text);
-
public Task ClearAsync()
{
_lastDataTransfer?.Dispose();
@@ -29,10 +18,6 @@ internal sealed class Clipboard(IClipboardImpl clipboardImpl) : IClipboard
return _clipboardImpl.ClearAsync();
}
- [Obsolete($"Use {nameof(SetDataAsync)} instead.")]
- Task IClipboard.SetDataObjectAsync(IDataObject data)
- => SetDataAsync(new DataObjectToDataTransferWrapper(data));
-
public Task SetDataAsync(IAsyncDataTransfer? dataTransfer)
{
if (dataTransfer is null)
@@ -47,47 +32,9 @@ internal sealed class Clipboard(IClipboardImpl clipboardImpl) : IClipboard
public Task FlushAsync()
=> _clipboardImpl is IFlushableClipboardImpl flushable ? flushable.FlushAsync() : Task.CompletedTask;
- async Task IClipboard.GetFormatsAsync()
- {
- var dataTransfer = await TryGetDataAsync();
- return dataTransfer is null ? [] : dataTransfer.Formats.Select(DataFormats.ToString).ToArray();
- }
-
- [Obsolete($"Use {nameof(TryGetDataAsync)} instead.")]
- async Task
Task ImportCompleted { get; }
- ///
- /// ImportCompleted (recommended replacement)
- [Obsolete("Please use ICompositionGpuImportedObject.ImportCompleted instead")]
- [EditorBrowsable(EditorBrowsableState.Never)]
- Task ImportCompeted { get; }
-
///
/// Indicates if the device context this instance is associated with is no longer available
///
diff --git a/src/Avalonia.Base/Rendering/Composition/CompositionInterop.cs b/src/Avalonia.Base/Rendering/Composition/CompositionInterop.cs
index 2cf6288c02..a66ab701a1 100644
--- a/src/Avalonia.Base/Rendering/Composition/CompositionInterop.cs
+++ b/src/Avalonia.Base/Rendering/Composition/CompositionInterop.cs
@@ -87,7 +87,6 @@ abstract class CompositionGpuImportedObjectBase : ICompositionGpuImportedObject
public Task ImportCompleted { get; }
- public Task ImportCompeted => ImportCompleted;
public bool IsLost => Context.IsLost;
public ValueTask DisposeAsync() => new(Compositor.InvokeServerJobAsync(() =>
diff --git a/src/Avalonia.Base/StyledElement.cs b/src/Avalonia.Base/StyledElement.cs
index 711d17d014..d1b960390c 100644
--- a/src/Avalonia.Base/StyledElement.cs
+++ b/src/Avalonia.Base/StyledElement.cs
@@ -21,7 +21,6 @@ namespace Avalonia
/// Extends an with the following features:
///
/// - An inherited .
- /// - Implements to allow styling to work on the styled element.
/// - Implements to form part of a logical tree.
/// - A collection of class strings for custom styling.
///
@@ -35,10 +34,7 @@ namespace Avalonia
ISetInheritanceParent,
ISupportInitialize,
INamed,
- IAvaloniaListItemValidator,
-#pragma warning disable CS0618 // Type or member is obsolete
- IStyleable
-#pragma warning restore CS0618 // Type or member is obsolete
+ IAvaloniaListItemValidator
{
///
/// Defines the property.
@@ -330,9 +326,6 @@ namespace Avalonia
bool IResourceNode.HasResources => (_resources?.HasResources ?? false) ||
(((IResourceNode?)_styles)?.HasResources ?? false);
- ///
- IAvaloniaReadOnlyList IStyleable.Classes => Classes;
-
///
bool IStyleHost.IsStylesInitialized => _styles != null;
@@ -668,7 +661,7 @@ namespace Avalonia
// If the Theme property is not set, try to find a ControlTheme resource with our StyleKey.
if (_implicitTheme is null)
{
- var key = GetStyleKey(this);
+ var key = StyleKey;
if (this.TryFindResource(key, out var value) && value is ControlTheme t)
_implicitTheme = t;
@@ -699,22 +692,6 @@ namespace Avalonia
}
}
- ///
- /// Internal getter for so that we only need to suppress the obsolete
- /// warning in one place.
- ///
- /// The element
- ///
- /// is obsolete and will be removed in a future version, but for backwards
- /// compatibility we need to support code which overrides .
- ///
- internal static Type GetStyleKey(StyledElement e)
- {
-#pragma warning disable CS0618 // Type or member is obsolete
- return ((IStyleable)e).StyleKey;
-#pragma warning restore CS0618 // Type or member is obsolete
- }
-
private static void DataContextNotifying(AvaloniaObject o, bool updateStarted)
{
if (o is StyledElement element)
diff --git a/src/Avalonia.Base/Styling/ControlTheme.cs b/src/Avalonia.Base/Styling/ControlTheme.cs
index fbd869a9a7..138c2f9de5 100644
--- a/src/Avalonia.Base/Styling/ControlTheme.cs
+++ b/src/Avalonia.Base/Styling/ControlTheme.cs
@@ -50,7 +50,7 @@ namespace Avalonia.Styling
using var activity = Diagnostic.AttachingStyle()?
.AddTag(Diagnostic.Tags.Style, this);
- if (HasSettersOrAnimations && TargetType.IsAssignableFrom(StyledElement.GetStyleKey(target)))
+ if (HasSettersOrAnimations && TargetType.IsAssignableFrom(target.StyleKey))
{
Attach(target, null, type, true);
activity?.AddTag(Diagnostic.Tags.SelectorResult, SelectorMatchResult.AlwaysThisType);
diff --git a/src/Avalonia.Base/Styling/IStyleable.cs b/src/Avalonia.Base/Styling/IStyleable.cs
deleted file mode 100644
index 0768669905..0000000000
--- a/src/Avalonia.Base/Styling/IStyleable.cs
+++ /dev/null
@@ -1,28 +0,0 @@
-using System;
-using Avalonia.Collections;
-
-namespace Avalonia.Styling
-{
- ///
- /// Interface for styleable elements.
- ///
- [Obsolete("This interface may be removed in 12.0. Use StyledElement, or override StyledElement.StyleKeyOverride to override the StyleKey for a class.")]
- public interface IStyleable : INamed
- {
- ///
- /// Gets the list of classes for the control.
- ///
- IAvaloniaReadOnlyList Classes { get; }
-
- ///
- /// Gets the type by which the control is styled.
- ///
- [Obsolete("Override StyledElement.StyleKeyOverride instead.")]
- Type StyleKey { get; }
-
- ///
- /// Gets the template parent of this element if the control comes from a template.
- ///
- AvaloniaObject? TemplatedParent { get; }
- }
-}
diff --git a/src/Avalonia.Base/Styling/NestingSelector.cs b/src/Avalonia.Base/Styling/NestingSelector.cs
index 4f6920c224..07fc24b644 100644
--- a/src/Avalonia.Base/Styling/NestingSelector.cs
+++ b/src/Avalonia.Base/Styling/NestingSelector.cs
@@ -23,7 +23,7 @@ namespace Avalonia.Styling
{
if (theme.TargetType is null)
throw new InvalidOperationException("ControlTheme has no TargetType.");
- return theme.TargetType.IsAssignableFrom(StyledElement.GetStyleKey(control)) ?
+ return theme.TargetType.IsAssignableFrom(control.StyleKey) ?
SelectorMatch.AlwaysThisType :
SelectorMatch.NeverThisType;
}
@@ -31,7 +31,7 @@ namespace Avalonia.Styling
{
if (queryTheme.TargetType is null)
throw new InvalidOperationException("ControlTheme has no TargetType.");
- return queryTheme.TargetType.IsAssignableFrom(StyledElement.GetStyleKey(control)) ?
+ return queryTheme.TargetType.IsAssignableFrom(control.StyleKey) ?
SelectorMatch.AlwaysThisType :
SelectorMatch.NeverThisType;
}
diff --git a/src/Avalonia.Base/Styling/TypeNameAndClassSelector.cs b/src/Avalonia.Base/Styling/TypeNameAndClassSelector.cs
index 4fba8c02c6..4f78d91a38 100644
--- a/src/Avalonia.Base/Styling/TypeNameAndClassSelector.cs
+++ b/src/Avalonia.Base/Styling/TypeNameAndClassSelector.cs
@@ -93,7 +93,7 @@ namespace Avalonia.Styling
{
if (TargetType != null)
{
- var controlType = StyledElement.GetStyleKey(control) ?? control.GetType();
+ var controlType = control.StyleKey ?? control.GetType();
if (IsConcreteType)
{
diff --git a/src/Avalonia.Base/Utilities/AvaloniaResourcesIndex.cs b/src/Avalonia.Base/Utilities/AvaloniaResourcesIndex.cs
index 452898937d..d84d9cf737 100644
--- a/src/Avalonia.Base/Utilities/AvaloniaResourcesIndex.cs
+++ b/src/Avalonia.Base/Utilities/AvaloniaResourcesIndex.cs
@@ -67,14 +67,6 @@ namespace Avalonia.Utilities
}
}
- [Obsolete]
- public static void WriteResources(Stream output, List<(string Path, int Size, Func Open)> resources)
- {
- WriteResources(output,
- resources.Select(r => new AvaloniaResourcesEntry { Path = r.Path, Open = r.Open, Size = r.Size })
- .ToList());
- }
-
public static void WriteResources(Stream output, IReadOnlyList resources)
{
var entries = new List();
diff --git a/src/Avalonia.Controls/ItemsControl.cs b/src/Avalonia.Controls/ItemsControl.cs
index 0c3e908bbf..a9cf4ca8d8 100644
--- a/src/Avalonia.Controls/ItemsControl.cs
+++ b/src/Avalonia.Controls/ItemsControl.cs
@@ -720,7 +720,7 @@ namespace Avalonia.Controls
{
var itemContainerTheme = ItemContainerTheme;
- if (itemContainerTheme?.TargetType?.IsAssignableFrom(GetStyleKey(container)) == true)
+ if (itemContainerTheme?.TargetType?.IsAssignableFrom(container.StyleKey) == true)
{
// We have an ItemContainerTheme and it matches the container. Set the Theme
// property, and mark the container as having had ItemContainerTheme applied.
diff --git a/src/Avalonia.Controls/Platform/InProcessDragSource.cs b/src/Avalonia.Controls/Platform/InProcessDragSource.cs
index aa8694b6ac..615decc753 100644
--- a/src/Avalonia.Controls/Platform/InProcessDragSource.cs
+++ b/src/Avalonia.Controls/Platform/InProcessDragSource.cs
@@ -1,5 +1,4 @@
-using System;
-using System.Linq;
+using System.Linq;
using Avalonia.Reactive;
using System.Threading.Tasks;
using Avalonia.Controls;
@@ -31,13 +30,6 @@ namespace Avalonia.Platform
_dragDrop = AvaloniaLocator.Current.GetRequiredService();
}
- [Obsolete($"Use {nameof(DoDragDropAsync)} instead.")]
- Task IPlatformDragSource.DoDragDrop(
- PointerEventArgs triggerEvent,
- IDataObject data,
- DragDropEffects allowedEffects)
- => DoDragDropAsync(triggerEvent, new DataObjectToDataTransferWrapper(data), allowedEffects);
-
public async Task DoDragDropAsync(
PointerEventArgs triggerEvent,
IDataTransfer dataTransfer,
diff --git a/src/Avalonia.DesignerSupport/Remote/Stubs.cs b/src/Avalonia.DesignerSupport/Remote/Stubs.cs
index a352b414fe..caa8bff00f 100644
--- a/src/Avalonia.DesignerSupport/Remote/Stubs.cs
+++ b/src/Avalonia.DesignerSupport/Remote/Stubs.cs
@@ -223,26 +223,12 @@ namespace Avalonia.DesignerSupport.Remote
class ClipboardStub : IClipboard
{
- public Task GetTextAsync() => Task.FromResult(null);
-
- public Task SetTextAsync(string? text) => Task.CompletedTask;
-
public Task ClearAsync() => Task.CompletedTask;
- [Obsolete($"Use {nameof(SetDataAsync)} instead.")]
- public Task SetDataObjectAsync(IDataObject data) => Task.CompletedTask;
-
public Task SetDataAsync(IAsyncDataTransfer? dataTransfer) => Task.CompletedTask;
- public Task GetFormatsAsync() => Task.FromResult([]);
-
- public Task GetDataAsync(string format) => Task.FromResult(null);
-
public Task TryGetDataAsync() => Task.FromResult(null);
- [Obsolete($"Use {nameof(TryGetInProcessDataAsync)} instead.")]
- public Task TryGetInProcessDataObjectAsync() => Task.FromResult(null);
-
public Task FlushAsync() => Task.CompletedTask;
public Task TryGetInProcessDataAsync() => Task.FromResult(null);
diff --git a/src/Avalonia.Native/AvaloniaNativeDragSource.cs b/src/Avalonia.Native/AvaloniaNativeDragSource.cs
index 3c9397f8cc..662d79d1b8 100644
--- a/src/Avalonia.Native/AvaloniaNativeDragSource.cs
+++ b/src/Avalonia.Native/AvaloniaNativeDragSource.cs
@@ -32,13 +32,6 @@ namespace Avalonia.Native
}
}
- [Obsolete($"Use {nameof(DoDragDropAsync)} instead.")]
- Task IPlatformDragSource.DoDragDrop(
- PointerEventArgs triggerEvent,
- IDataObject data,
- DragDropEffects allowedEffects)
- => DoDragDropAsync(triggerEvent, new DataObjectToDataTransferWrapper(data), allowedEffects);
-
public Task DoDragDropAsync(
PointerEventArgs triggerEvent,
IDataTransfer dataTransfer,
diff --git a/src/Avalonia.Native/TopLevelImpl.cs b/src/Avalonia.Native/TopLevelImpl.cs
index c707da379f..9ac24eb85a 100644
--- a/src/Avalonia.Native/TopLevelImpl.cs
+++ b/src/Avalonia.Native/TopLevelImpl.cs
@@ -566,8 +566,8 @@ internal class TopLevelImpl : ITopLevelImpl, IFramebufferPlatformSurface
{
ObjectDisposedException.ThrowIf(_target is null, this);
- var w = _parent._savedLogicalSize.Width * _parent._savedScaling;
- var h = _parent._savedLogicalSize.Height * _parent._savedScaling;
+ var w = Math.Max(_parent._savedLogicalSize.Width * _parent._savedScaling, 1);
+ var h = Math.Max(_parent._savedLogicalSize.Height * _parent._savedScaling, 1);
var dpi = _parent._savedScaling * 96;
return new DeferredFramebuffer(_target, cb =>
{
diff --git a/src/Headless/Avalonia.Headless.NUnit/AvaloniaTestMethodCommand.cs b/src/Headless/Avalonia.Headless.NUnit/AvaloniaTestMethodCommand.cs
index 96dfd701e9..515b9651e3 100644
--- a/src/Headless/Avalonia.Headless.NUnit/AvaloniaTestMethodCommand.cs
+++ b/src/Headless/Avalonia.Headless.NUnit/AvaloniaTestMethodCommand.cs
@@ -1,6 +1,5 @@
using System;
using System.Collections.Generic;
-using System.Reflection;
using System.Threading.Tasks;
using Avalonia.Threading;
using NUnit.Framework.Interfaces;
@@ -13,28 +12,14 @@ internal class AvaloniaTestMethodCommand : TestCommand
{
private readonly HeadlessUnitTestSession _session;
private readonly TestCommand _innerCommand;
- private readonly List _beforeTest;
- private readonly List _afterTest;
-
- // There are multiple problems with NUnit integration at the moment when we wrote this integration.
- // NUnit doesn't have extensibility API for running on custom dispatcher/sync-context.
- // See https://github.com/nunit/nunit/issues/2917 https://github.com/nunit/nunit/issues/2774
- // To workaround that we had to replace inner TestMethodCommand with our own implementation while keeping original hierarchy of commands.
- // Which will respect proper async/await awaiting code that works with our session and can be block-awaited to fit in NUnit.
- // Also, we need to push BeforeTest/AfterTest callbacks to the very same session call.
- // I hope there will be a better solution without reflection, but for now that's it.
- private static FieldInfo s_innerCommand = typeof(DelegatingTestCommand)
- .GetField("innerCommand", BindingFlags.Instance | BindingFlags.NonPublic)!;
- private static FieldInfo s_beforeTest = typeof(BeforeAndAfterTestCommand)
- .GetField("BeforeTest", BindingFlags.Instance | BindingFlags.NonPublic)!;
- private static FieldInfo s_afterTest = typeof(BeforeAndAfterTestCommand)
- .GetField("AfterTest", BindingFlags.Instance | BindingFlags.NonPublic)!;
+ private readonly List> _beforeTest;
+ private readonly List> _afterTest;
private AvaloniaTestMethodCommand(
HeadlessUnitTestSession session,
TestCommand innerCommand,
- List beforeTest,
- List afterTest)
+ List> beforeTest,
+ List> afterTest)
: base(innerCommand.Test)
{
_session = session;
@@ -45,61 +30,65 @@ internal class AvaloniaTestMethodCommand : TestCommand
public static TestCommand ProcessCommand(HeadlessUnitTestSession session, TestCommand command)
{
- return ProcessCommand(session, command, new List(), new List());
+ return ProcessCommand(session, command, [], []);
}
- private static TestCommand ProcessCommand(HeadlessUnitTestSession session, TestCommand command, List before, List after)
+ private static TestCommand ProcessCommand(
+ HeadlessUnitTestSession session,
+ TestCommand command,
+ List> before,
+ List> after)
{
- if (command is BeforeAndAfterTestCommand beforeAndAfterTestCommand)
+ var beforeAndAfterTestCommand = command as BeforeAndAfterTestCommand;
+ if (beforeAndAfterTestCommand is not null)
{
- if (s_beforeTest.GetValue(beforeAndAfterTestCommand) is Action beforeTest)
- {
- Action beforeAction = c => before.Add(() => beforeTest(c));
- s_beforeTest.SetValue(beforeAndAfterTestCommand, beforeAction);
- }
- if (s_afterTest.GetValue(beforeAndAfterTestCommand) is Action afterTest)
+ ref var beforeTest = ref beforeAndAfterTestCommand.BeforeTest();
+ if (beforeTest is not null)
{
- Action afterAction = c => after.Add(() => afterTest(c));
- s_afterTest.SetValue(beforeAndAfterTestCommand, afterAction);
+ AddBeforeOrAfterAction(beforeTest, before);
+ beforeTest = _ => { };
}
}
-
- if (command is DelegatingTestCommand delegatingTestCommand
- && s_innerCommand.GetValue(delegatingTestCommand) is TestCommand inner)
+
+ var delegatingTestCommand = command as DelegatingTestCommand;
+ if (delegatingTestCommand is not null)
{
- s_innerCommand.SetValue(delegatingTestCommand, ProcessCommand(session, inner, before, after));
+ ref var innerCommand = ref delegatingTestCommand.InnerCommand();
+ innerCommand = ProcessCommand(session, innerCommand, before, after);
}
- else if (command is TestMethodCommand methodCommand)
+
+ if (beforeAndAfterTestCommand is not null)
{
- return new AvaloniaTestMethodCommand(session, methodCommand, before, after);
+ ref var afterTest = ref beforeAndAfterTestCommand.AfterTest();
+ if (afterTest is not null)
+ {
+ AddBeforeOrAfterAction(afterTest, after);
+ afterTest = _ => { };
+ }
}
+
+ if (delegatingTestCommand is null && command is TestMethodCommand methodCommand)
+ return new AvaloniaTestMethodCommand(session, methodCommand, before, after);
return command;
}
public override TestResult Execute(TestExecutionContext context)
{
- return _session.DispatchCore(() => ExecuteTestMethod(context), true, default).GetAwaiter().GetResult();
+ return _session.DispatchCore(() => ExecuteTestMethod(context), true, context.CancellationToken).GetAwaiter().GetResult();
}
// Unfortunately, NUnit has issues with custom synchronization contexts, which means we need to add some hacks to make it work.
private async Task ExecuteTestMethod(TestExecutionContext context)
{
- _beforeTest.ForEach(a => a());
+ foreach (var beforeTest in _beforeTest)
+ await beforeTest(context);
var testMethod = _innerCommand.Test.Method;
var methodInfo = testMethod!.MethodInfo;
var result = methodInfo.Invoke(context.TestObject, _innerCommand.Test.Arguments);
- // Only Task, non generic ValueTask are supported in async context. No ValueTask<> nor F# tasks.
- if (result is Task task)
- {
- await task;
- }
- else if (result is ValueTask valueTask)
- {
- await valueTask;
- }
+ await ToTask(result);
context.CurrentResult.SetResult(ResultState.Success);
@@ -108,10 +97,55 @@ internal class AvaloniaTestMethodCommand : TestCommand
if (context.ExecutionStatus != TestExecutionStatus.AbortRequested)
{
- _afterTest.ForEach(a => a());
+ foreach (var afterTest in _afterTest)
+ await afterTest(context);
+
Dispatcher.UIThread.RunJobs();
}
return context.CurrentResult;
}
+
+ private static void AddBeforeOrAfterAction(Action action, List> targets)
+ {
+ // We need to extract the SetUp and TearDown methods to run them asynchronously on Avalonia's synchronization context.
+ if (action.Target is SetUpTearDownItem setUpTearDownItem)
+ {
+ var methods = action.Method.Name switch
+ {
+ nameof(SetUpTearDownItem.RunSetUp) => setUpTearDownItem.SetUpMethods(),
+ nameof(SetUpTearDownItem.RunTearDown) => setUpTearDownItem.TearDownMethods(),
+ _ => null
+ };
+
+ if (methods is not null)
+ {
+ foreach (var method in methods)
+ {
+ targets.Add(context =>
+ {
+ var result = method.Invoke(method.IsStatic ? null : context.TestObject, null);
+ return ToTask(result);
+ });
+ }
+
+ return;
+ }
+ }
+
+ targets.Add(context =>
+ {
+ action(context);
+ return Task.CompletedTask;
+ });
+ }
+
+ private static Task ToTask(object? result)
+ // Only Task, non generic ValueTask are supported in async context. No ValueTask<> nor F# tasks.
+ => result switch
+ {
+ Task task => task,
+ ValueTask valueTask => valueTask.AsTask(),
+ _ => Task.CompletedTask
+ };
}
diff --git a/src/Headless/Avalonia.Headless.NUnit/NUnitReflectionHelper.cs b/src/Headless/Avalonia.Headless.NUnit/NUnitReflectionHelper.cs
new file mode 100644
index 0000000000..cd24f49cfd
--- /dev/null
+++ b/src/Headless/Avalonia.Headless.NUnit/NUnitReflectionHelper.cs
@@ -0,0 +1,86 @@
+using System;
+using System.Collections.Generic;
+using System.Runtime.CompilerServices;
+using NUnit.Framework.Interfaces;
+using NUnit.Framework.Internal;
+using NUnit.Framework.Internal.Commands;
+
+namespace Avalonia.Headless.NUnit;
+
+///
+/// 2023-05-10, original comment from Max about NUnit 3:
+/// There are multiple problems with NUnit integration at the moment when we wrote this integration.
+/// NUnit doesn't have extensibility API for running on custom dispatcher/sync-context.
+/// See https://github.com/nunit/nunit/issues/2917 https://github.com/nunit/nunit/issues/2774
+/// To workaround that we had to replace inner TestMethodCommand with our own implementation while keeping original hierarchy of commands.
+/// Which will respect proper async/await awaiting code that works with our session and can be block-awaited to fit in NUnit.
+/// Also, we need to push BeforeTest/AfterTest callbacks to the very same session call.
+/// I hope there will be a better solution without reflection, but for now that's it.
+///
+/// 2026-02-04: the situation hasn't changed at all with NUnit 4.
+///
+internal static class NUnitReflectionHelper
+{
+ [UnsafeAccessor(UnsafeAccessorKind.Field, Name = ReflectionDelegatingTestCommand.InnerCommandFieldName)]
+ private static extern ref TestCommand DelegatingTestCommand_InnerCommand(DelegatingTestCommand instance);
+
+ [UnsafeAccessor(UnsafeAccessorKind.Field, Name = ReflectionBeforeAndAfterTestCommand.BeforeTestFieldName)]
+ private static extern ref Action? BeforeAndAfterTestCommand_BeforeTest(BeforeAndAfterTestCommand instance);
+
+ [UnsafeAccessor(UnsafeAccessorKind.Field, Name = ReflectionBeforeAndAfterTestCommand.AfterTestFieldName)]
+ private static extern ref Action? BeforeAndAfterTestCommand_AfterTest(BeforeAndAfterTestCommand instance);
+
+ [UnsafeAccessor(UnsafeAccessorKind.Field, Name = "_setUpMethods")]
+ private static extern ref IList SetUpTearDownItem_SetUpMethods(SetUpTearDownItem instance);
+
+ [UnsafeAccessor(UnsafeAccessorKind.Field, Name = "_tearDownMethods")]
+ private static extern ref IList SetUpTearDownItem_TearDownMethods(SetUpTearDownItem instance);
+
+ extension(DelegatingTestCommand instance)
+ {
+ public ref TestCommand InnerCommand()
+ => ref DelegatingTestCommand_InnerCommand(instance);
+ }
+
+ extension(BeforeAndAfterTestCommand instance)
+ {
+ public ref Action? BeforeTest()
+ => ref BeforeAndAfterTestCommand_BeforeTest(instance);
+
+ public ref Action? AfterTest()
+ => ref BeforeAndAfterTestCommand_AfterTest(instance);
+ }
+
+ extension(SetUpTearDownItem instance)
+ {
+ public ref IList SetUpMethods()
+ => ref SetUpTearDownItem_SetUpMethods(instance);
+
+ public ref IList TearDownMethods()
+ => ref SetUpTearDownItem_TearDownMethods(instance);
+ }
+
+ private sealed class ReflectionDelegatingTestCommand : DelegatingTestCommand
+ {
+ public ReflectionDelegatingTestCommand(TestCommand innerCommand)
+ : base(innerCommand)
+ {
+ }
+
+ public const string InnerCommandFieldName = nameof(innerCommand);
+
+ public override TestResult Execute(TestExecutionContext context)
+ => throw new NotSupportedException("Reflection-only type, this method should never be called");
+ }
+
+ private sealed class ReflectionBeforeAndAfterTestCommand : BeforeAndAfterTestCommand
+ {
+ public ReflectionBeforeAndAfterTestCommand(TestCommand innerCommand)
+ : base(innerCommand)
+ {
+ }
+
+ public const string BeforeTestFieldName = nameof(BeforeTest);
+ public const string AfterTestFieldName = nameof(AfterTest);
+ }
+}
diff --git a/src/Headless/Avalonia.Headless/HeadlessWindowExtensions.cs b/src/Headless/Avalonia.Headless/HeadlessWindowExtensions.cs
index b17a1150fc..7de2243f80 100644
--- a/src/Headless/Avalonia.Headless/HeadlessWindowExtensions.cs
+++ b/src/Headless/Avalonia.Headless/HeadlessWindowExtensions.cs
@@ -121,14 +121,6 @@ public static class HeadlessWindowExtensions
RawInputModifiers modifiers = RawInputModifiers.None) =>
RunJobsOnImpl(topLevel, w => w.MouseWheel(point, delta, modifiers));
- ///
- /// Simulates a drag and drop target event on the headless window/toplevel. This event simulates a user moving files from another app to the current app.
- ///
- [Obsolete($"Use the overload accepting a {nameof(IDataTransfer)} instance instead.")]
- public static void DragDrop(this TopLevel topLevel, Point point, RawDragEventType type, IDataObject data,
- DragDropEffects effects, RawInputModifiers modifiers = RawInputModifiers.None) =>
- RunJobsOnImpl(topLevel, w => w.DragDrop(point, type, data, effects, modifiers));
-
///
/// Simulates a drag and drop target event on the headless window/toplevel. This event simulates a user moving files from another app to the current app.
///
diff --git a/src/Headless/Avalonia.Headless/HeadlessWindowImpl.cs b/src/Headless/Avalonia.Headless/HeadlessWindowImpl.cs
index 8f80e22138..e3fc75eac4 100644
--- a/src/Headless/Avalonia.Headless/HeadlessWindowImpl.cs
+++ b/src/Headless/Avalonia.Headless/HeadlessWindowImpl.cs
@@ -349,13 +349,6 @@ namespace Avalonia.Headless
point, delta, modifiers));
}
- [Obsolete($"Use the overload accepting a {nameof(IDataTransfer)} instance instead.")]
- void IHeadlessWindow.DragDrop(Point point, RawDragEventType type, IDataObject data, DragDropEffects effects, RawInputModifiers modifiers)
- {
- var device = AvaloniaLocator.Current.GetRequiredService();
- Input?.Invoke(new RawDragEvent(device, type, InputRoot!, point, new DataObjectToDataTransferWrapper(data), effects, modifiers));
- }
-
void IHeadlessWindow.DragDrop(Point point, RawDragEventType type, IDataTransfer data, DragDropEffects effects, RawInputModifiers modifiers)
{
var device = AvaloniaLocator.Current.GetRequiredService();
diff --git a/src/Headless/Avalonia.Headless/IHeadlessWindow.cs b/src/Headless/Avalonia.Headless/IHeadlessWindow.cs
index 2fe11df2ca..30c2390f64 100644
--- a/src/Headless/Avalonia.Headless/IHeadlessWindow.cs
+++ b/src/Headless/Avalonia.Headless/IHeadlessWindow.cs
@@ -15,8 +15,6 @@ namespace Avalonia.Headless
void MouseMove(Point point, RawInputModifiers modifiers = RawInputModifiers.None);
void MouseUp(Point point, MouseButton button, RawInputModifiers modifiers = RawInputModifiers.None);
void MouseWheel(Point point, Vector delta, RawInputModifiers modifiers = RawInputModifiers.None);
- [Obsolete($"Use the overload accepting a {nameof(IDataTransfer)} instance instead.")]
- void DragDrop(Point point, RawDragEventType type, IDataObject data, DragDropEffects effects, RawInputModifiers modifiers = RawInputModifiers.None);
void DragDrop(Point point, RawDragEventType type, IDataTransfer data, DragDropEffects effects, RawInputModifiers modifiers = RawInputModifiers.None);
}
}
diff --git a/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/Transformers/AvaloniaXamlIlWellKnownTypes.cs b/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/Transformers/AvaloniaXamlIlWellKnownTypes.cs
index df54e71108..28ea193adf 100644
--- a/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/Transformers/AvaloniaXamlIlWellKnownTypes.cs
+++ b/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/Transformers/AvaloniaXamlIlWellKnownTypes.cs
@@ -22,6 +22,7 @@ namespace Avalonia.Markup.Xaml.XamlIl.CompilerExtensions.Transformers
public IXamlMethod AvaloniaObjectSetStyledPropertyValue { get; }
public IXamlType AvaloniaAttachedPropertyT { get; }
public IXamlType BindingBase { get; }
+ public IXamlType BindingExpressionBase { get; }
public IXamlType MultiBinding { get; }
public IXamlMethod AvaloniaObjectBindMethod { get; }
public IXamlMethod AvaloniaObjectSetValueMethod { get; }
@@ -200,6 +201,7 @@ namespace Avalonia.Markup.Xaml.XamlIl.CompilerExtensions.Transformers
&& m.Parameters[0].Name == "StyledProperty`1"
&& m.Parameters[2].Equals(BindingPriority));
BindingBase = cfg.TypeSystem.GetType("Avalonia.Data.BindingBase");
+ BindingExpressionBase = cfg.TypeSystem.GetType("Avalonia.Data.BindingExpressionBase");
MultiBinding = cfg.TypeSystem.GetType("Avalonia.Data.MultiBinding");
IDisposable = cfg.TypeSystem.GetType("System.IDisposable");
ICommand = cfg.TypeSystem.GetType("System.Windows.Input.ICommand");
@@ -215,9 +217,7 @@ namespace Avalonia.Markup.Xaml.XamlIl.CompilerExtensions.Transformers
AvaloniaListAttribute = cfg.TypeSystem.GetType("Avalonia.Metadata.AvaloniaListAttribute");
AvaloniaList = cfg.TypeSystem.GetType("Avalonia.Collections.AvaloniaList`1");
OnExtensionType = cfg.TypeSystem.GetType("Avalonia.Markup.Xaml.MarkupExtensions.On");
- AvaloniaObjectBindMethod = AvaloniaObjectExtensions.GetMethod("Bind", IDisposable, false, AvaloniaObject,
- AvaloniaProperty,
- BindingBase, cfg.WellKnownTypes.Object);
+ AvaloniaObjectBindMethod = AvaloniaObject.GetMethod("Bind", BindingExpressionBase, false, AvaloniaProperty, BindingBase);
UnsetValueType = cfg.TypeSystem.GetType("Avalonia.UnsetValueType");
StyledElement = cfg.TypeSystem.GetType("Avalonia.StyledElement");
INameScope = cfg.TypeSystem.GetType("Avalonia.Controls.INameScope");
diff --git a/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/XamlIlAvaloniaPropertyHelper.cs b/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/XamlIlAvaloniaPropertyHelper.cs
index 442c7dd495..1a72dcd9a5 100644
--- a/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/XamlIlAvaloniaPropertyHelper.cs
+++ b/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/XamlIlAvaloniaPropertyHelper.cs
@@ -297,8 +297,8 @@ namespace Avalonia.Markup.Xaml.XamlIl.CompilerExtensions
emitter
.Stloc(bloc.Local)
.Ldsfld(AvaloniaProperty)
- .Ldloc(bloc.Local);
- EmitAnchorAndBind(emitter);
+ .Ldloc(bloc.Local)
+ .EmitCall(Types.AvaloniaObjectBindMethod, true);
}
public override void EmitWithArguments(
@@ -308,14 +308,7 @@ namespace Avalonia.Markup.Xaml.XamlIl.CompilerExtensions
{
emitter.Ldsfld(AvaloniaProperty);
context.Emit(arguments[0], emitter, Parameters[0]);
- EmitAnchorAndBind(emitter);
- }
-
- private void EmitAnchorAndBind(IXamlILEmitter emitter)
- {
- emitter
- .Ldnull() // TODO: provide anchor?
- .EmitCall(Types.AvaloniaObjectBindMethod, true);
+ emitter.EmitCall(Types.AvaloniaObjectBindMethod, true);
}
}
@@ -336,8 +329,8 @@ namespace Avalonia.Markup.Xaml.XamlIl.CompilerExtensions
.Stloc(bloc.Local)
.Pop() // ignore priority
.Ldsfld(AvaloniaProperty)
- .Ldloc(bloc.Local);
- EmitAnchorAndBind(emitter);
+ .Ldloc(bloc.Local)
+ .EmitCall(Types.AvaloniaObjectBindMethod, true);
}
public override void EmitWithArguments(
@@ -347,14 +340,7 @@ namespace Avalonia.Markup.Xaml.XamlIl.CompilerExtensions
{
emitter.Ldsfld(AvaloniaProperty);
context.Emit(arguments[1], emitter, Parameters[1]);
- EmitAnchorAndBind(emitter);
- }
-
- private void EmitAnchorAndBind(IXamlILEmitter emitter)
- {
- emitter
- .Ldnull() // TODO: provide anchor?
- .EmitCall(Types.AvaloniaObjectBindMethod, true);
+ emitter.EmitCall(Types.AvaloniaObjectBindMethod, true);
}
}
diff --git a/src/Windows/Avalonia.Win32/DragSource.cs b/src/Windows/Avalonia.Win32/DragSource.cs
index 36d04a644e..f1cdfa440a 100644
--- a/src/Windows/Avalonia.Win32/DragSource.cs
+++ b/src/Windows/Avalonia.Win32/DragSource.cs
@@ -1,5 +1,4 @@
-using System;
-using System.Threading.Tasks;
+using System.Threading.Tasks;
using Avalonia.Input;
using Avalonia.Input.Platform;
using Avalonia.Threading;
@@ -10,13 +9,6 @@ namespace Avalonia.Win32
{
internal sealed class DragSource : IPlatformDragSource
{
- [Obsolete($"Use {nameof(DoDragDropAsync)} instead.")]
- Task IPlatformDragSource.DoDragDrop(
- PointerEventArgs triggerEvent,
- IDataObject data,
- DragDropEffects allowedEffects)
- => DoDragDropAsync(triggerEvent, new DataObjectToDataTransferWrapper(data), allowedEffects);
-
public Task DoDragDropAsync(
PointerEventArgs triggerEvent,
IDataTransfer dataTransfer,
diff --git a/tests/Avalonia.Headless.UnitTests/AsyncSetupTests.cs b/tests/Avalonia.Headless.UnitTests/AsyncSetupTests.cs
new file mode 100644
index 0000000000..3f23d661ed
--- /dev/null
+++ b/tests/Avalonia.Headless.UnitTests/AsyncSetupTests.cs
@@ -0,0 +1,32 @@
+#if NUNIT
+
+using System.Threading.Tasks;
+
+namespace Avalonia.Headless.UnitTests;
+
+public class AsyncSetupTests
+{
+ private static int s_instanceCount;
+
+ [SetUp]
+ public async Task SetUp()
+ {
+ await Task.Delay(100);
+ ++s_instanceCount;
+ }
+
+ [AvaloniaTest, TestCase(1), TestCase(2)]
+ public void Async_Setup_TearDown_Should_Work(int index)
+ {
+ AssertHelper.Equal(1, s_instanceCount);
+ }
+
+ [TearDown]
+ public async Task TearDown()
+ {
+ await Task.Delay(100);
+ --s_instanceCount;
+ }
+}
+
+#endif
diff --git a/tests/Avalonia.Headless.UnitTests/SetupTests.cs b/tests/Avalonia.Headless.UnitTests/SetupTests.cs
new file mode 100644
index 0000000000..77f8d25842
--- /dev/null
+++ b/tests/Avalonia.Headless.UnitTests/SetupTests.cs
@@ -0,0 +1,45 @@
+using System;
+
+namespace Avalonia.Headless.UnitTests;
+
+public class SetupTests
+#if XUNIT
+ : IDisposable
+#endif
+{
+ private static int s_instanceCount;
+
+#if NUNIT
+ [SetUp]
+ public void SetUp()
+#elif XUNIT
+ public SetupTests()
+#endif
+ {
+ ++s_instanceCount;
+ }
+
+#if NUNIT
+ [AvaloniaTest, TestCase(1), TestCase(2)]
+#elif XUNIT
+ [AvaloniaTheory, InlineData(1), InlineData(2)]
+ [System.Diagnostics.CodeAnalysis.UnconditionalSuppressMessage(
+ "Usage",
+ "xUnit1026:Theory methods should use all of their parameters",
+ Justification = "Used to run the test several times")]
+#endif
+ public void Setup_TearDown_Should_Work(int index)
+ {
+ AssertHelper.Equal(1, s_instanceCount);
+ }
+
+#if NUNIT
+ [TearDown]
+ public void TearDown()
+#elif XUNIT
+ public void Dispose()
+#endif
+ {
+ --s_instanceCount;
+ }
+}