Browse Source

Merge branch 'master' into fix-20173

pull/20303/head
Javier Suárez 1 day ago
committed by GitHub
parent
commit
3d19ff6a37
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 16
      api/Avalonia.Headless.nupkg.xml
  2. 540
      api/Avalonia.nupkg.xml
  3. 3
      native/Avalonia.Native/src/OSX/AvnView.mm
  4. 13
      src/Avalonia.Base/Animation/Animation.AnimatorRegistry.cs
  5. 17
      src/Avalonia.Base/Animation/Easings/CubicBezierEasing.cs
  6. 30
      src/Avalonia.Base/Animation/ICustomAnimator.cs
  7. 27
      src/Avalonia.Base/AvaloniaObjectExtensions.cs
  8. 5
      src/Avalonia.Base/Data/BindingPriority.cs
  9. 6
      src/Avalonia.Base/Data/CompiledBindingPath.cs
  10. 37
      src/Avalonia.Base/Diagnostics/StyleDiagnostics.cs
  11. 3
      src/Avalonia.Base/Diagnostics/StyleValueFrameDiagnostic.cs
  12. 24
      src/Avalonia.Base/Diagnostics/StyledElementExtensions.cs
  13. 61
      src/Avalonia.Base/Input/DataFormats.cs
  14. 45
      src/Avalonia.Base/Input/DataObject.cs
  15. 54
      src/Avalonia.Base/Input/DataObjectExtensions.cs
  16. 9
      src/Avalonia.Base/Input/DataTransferExtensions.cs
  17. 10
      src/Avalonia.Base/Input/DragDrop.cs
  18. 17
      src/Avalonia.Base/Input/DragEventArgs.cs
  19. 32
      src/Avalonia.Base/Input/IDataObject.cs
  20. 55
      src/Avalonia.Base/Input/Platform/Clipboard.cs
  21. 76
      src/Avalonia.Base/Input/Platform/DataObjectToDataTransferItemWrapper.cs
  22. 95
      src/Avalonia.Base/Input/Platform/DataObjectToDataTransferWrapper.cs
  23. 42
      src/Avalonia.Base/Input/Platform/DataTransferToDataObjectWrapper.cs
  24. 55
      src/Avalonia.Base/Input/Platform/IClipboard.cs
  25. 9
      src/Avalonia.Base/Input/Platform/IPlatformDragSource.cs
  26. 22
      src/Avalonia.Base/Input/Raw/RawDragEvent.cs
  27. 7
      src/Avalonia.Base/Media/Color.cs
  28. 9
      src/Avalonia.Base/Media/DrawingContext.cs
  29. 2
      src/Avalonia.Base/Media/IRadialGradientBrush.cs
  30. 2
      src/Avalonia.Base/Media/Immutable/ImmutableRadialGradientBrush.cs
  31. 40
      src/Avalonia.Base/Media/RadialGradientBrush.cs
  32. 2
      src/Avalonia.Base/Rendering/Composition/Brushes/ServerSimpleCompositionBrush.cs
  33. 6
      src/Avalonia.Base/Rendering/Composition/CompositionExternalMemory.cs
  34. 1
      src/Avalonia.Base/Rendering/Composition/CompositionInterop.cs
  35. 27
      src/Avalonia.Base/StyledElement.cs
  36. 2
      src/Avalonia.Base/Styling/ControlTheme.cs
  37. 28
      src/Avalonia.Base/Styling/IStyleable.cs
  38. 4
      src/Avalonia.Base/Styling/NestingSelector.cs
  39. 2
      src/Avalonia.Base/Styling/TypeNameAndClassSelector.cs
  40. 8
      src/Avalonia.Base/Utilities/AvaloniaResourcesIndex.cs
  41. 2
      src/Avalonia.Controls/ItemsControl.cs
  42. 10
      src/Avalonia.Controls/Platform/InProcessDragSource.cs
  43. 14
      src/Avalonia.DesignerSupport/Remote/Stubs.cs
  44. 7
      src/Avalonia.Native/AvaloniaNativeDragSource.cs
  45. 4
      src/Avalonia.Native/TopLevelImpl.cs
  46. 130
      src/Headless/Avalonia.Headless.NUnit/AvaloniaTestMethodCommand.cs
  47. 86
      src/Headless/Avalonia.Headless.NUnit/NUnitReflectionHelper.cs
  48. 8
      src/Headless/Avalonia.Headless/HeadlessWindowExtensions.cs
  49. 7
      src/Headless/Avalonia.Headless/HeadlessWindowImpl.cs
  50. 2
      src/Headless/Avalonia.Headless/IHeadlessWindow.cs
  51. 6
      src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/Transformers/AvaloniaXamlIlWellKnownTypes.cs
  52. 26
      src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/XamlIlAvaloniaPropertyHelper.cs
  53. 10
      src/Windows/Avalonia.Win32/DragSource.cs
  54. 32
      tests/Avalonia.Headless.UnitTests/AsyncSetupTests.cs
  55. 45
      tests/Avalonia.Headless.UnitTests/SetupTests.cs

16
api/Avalonia.Headless.nupkg.xml

@ -0,0 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- https://learn.microsoft.com/dotnet/fundamentals/package-validation/diagnostic-ids -->
<Suppressions xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>M:Avalonia.Headless.HeadlessWindowExtensions.DragDrop(Avalonia.Controls.TopLevel,Avalonia.Point,Avalonia.Input.Raw.RawDragEventType,Avalonia.Input.IDataObject,Avalonia.Input.DragDropEffects,Avalonia.Input.RawInputModifiers)</Target>
<Left>baseline/Avalonia.Headless/lib/net10.0/Avalonia.Headless.dll</Left>
<Right>current/Avalonia.Headless/lib/net10.0/Avalonia.Headless.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>M:Avalonia.Headless.HeadlessWindowExtensions.DragDrop(Avalonia.Controls.TopLevel,Avalonia.Point,Avalonia.Input.Raw.RawDragEventType,Avalonia.Input.IDataObject,Avalonia.Input.DragDropEffects,Avalonia.Input.RawInputModifiers)</Target>
<Left>baseline/Avalonia.Headless/lib/net8.0/Avalonia.Headless.dll</Left>
<Right>current/Avalonia.Headless/lib/net8.0/Avalonia.Headless.dll</Right>
</Suppression>
</Suppressions>

540
api/Avalonia.nupkg.xml

@ -1,12 +1,60 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- https://learn.microsoft.com/dotnet/fundamentals/package-validation/diagnostic-ids -->
<Suppressions xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Suppression>
<DiagnosticId>CP0001</DiagnosticId>
<Target>T:Avalonia.Animation.CustomAnimatorBase</Target>
<Left>baseline/Avalonia/lib/net10.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net10.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0001</DiagnosticId>
<Target>T:Avalonia.Animation.CustomAnimatorBase`1</Target>
<Left>baseline/Avalonia/lib/net10.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net10.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0001</DiagnosticId>
<Target>T:Avalonia.Animation.Easings.CubicBezierEasing</Target>
<Left>baseline/Avalonia/lib/net10.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net10.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0001</DiagnosticId>
<Target>T:Avalonia.Controls.Primitives.IScrollable</Target>
<Left>baseline/Avalonia/lib/net10.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net10.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0001</DiagnosticId>
<Target>T:Avalonia.Diagnostics.AppliedStyle</Target>
<Left>baseline/Avalonia/lib/net10.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net10.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0001</DiagnosticId>
<Target>T:Avalonia.Diagnostics.StyledElementExtensions</Target>
<Left>baseline/Avalonia/lib/net10.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net10.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0001</DiagnosticId>
<Target>T:Avalonia.Diagnostics.StyleDiagnostics</Target>
<Left>baseline/Avalonia/lib/net10.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net10.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0001</DiagnosticId>
<Target>T:Avalonia.Input.DataObjectExtensions</Target>
<Left>baseline/Avalonia/lib/net10.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net10.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0001</DiagnosticId>
<Target>T:Avalonia.Input.IDataObject</Target>
<Left>baseline/Avalonia/lib/net10.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net10.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0001</DiagnosticId>
<Target>T:Avalonia.Media.Fonts.FontFamilyLoader</Target>
@ -37,6 +85,12 @@
<Left>baseline/Avalonia/lib/net10.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net10.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0001</DiagnosticId>
<Target>T:Avalonia.Styling.IStyleable</Target>
<Left>baseline/Avalonia/lib/net10.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net10.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0001</DiagnosticId>
<Target>T:Avalonia.Utilities.StringTokenizer</Target>
@ -73,12 +127,60 @@
<Left>baseline/Avalonia/lib/net6.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net6.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0001</DiagnosticId>
<Target>T:Avalonia.Animation.CustomAnimatorBase</Target>
<Left>baseline/Avalonia/lib/net8.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net8.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0001</DiagnosticId>
<Target>T:Avalonia.Animation.CustomAnimatorBase`1</Target>
<Left>baseline/Avalonia/lib/net8.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net8.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0001</DiagnosticId>
<Target>T:Avalonia.Animation.Easings.CubicBezierEasing</Target>
<Left>baseline/Avalonia/lib/net8.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net8.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0001</DiagnosticId>
<Target>T:Avalonia.Controls.Primitives.IScrollable</Target>
<Left>baseline/Avalonia/lib/net8.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net8.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0001</DiagnosticId>
<Target>T:Avalonia.Diagnostics.AppliedStyle</Target>
<Left>baseline/Avalonia/lib/net8.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net8.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0001</DiagnosticId>
<Target>T:Avalonia.Diagnostics.StyledElementExtensions</Target>
<Left>baseline/Avalonia/lib/net8.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net8.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0001</DiagnosticId>
<Target>T:Avalonia.Diagnostics.StyleDiagnostics</Target>
<Left>baseline/Avalonia/lib/net8.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net8.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0001</DiagnosticId>
<Target>T:Avalonia.Input.DataObjectExtensions</Target>
<Left>baseline/Avalonia/lib/net8.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net8.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0001</DiagnosticId>
<Target>T:Avalonia.Input.IDataObject</Target>
<Left>baseline/Avalonia/lib/net8.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net8.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0001</DiagnosticId>
<Target>T:Avalonia.Media.Fonts.FontFamilyLoader</Target>
@ -109,6 +211,12 @@
<Left>baseline/Avalonia/lib/net8.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net8.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0001</DiagnosticId>
<Target>T:Avalonia.Styling.IStyleable</Target>
<Left>baseline/Avalonia/lib/net8.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net8.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0001</DiagnosticId>
<Target>T:Avalonia.Utilities.StringTokenizer</Target>
@ -151,6 +259,30 @@
<Left>baseline/Avalonia/lib/net10.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net10.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>F:Avalonia.Data.BindingPriority.TemplatedParent</Target>
<Left>baseline/Avalonia/lib/net10.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net10.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>F:Avalonia.Input.DataFormats.FileNames</Target>
<Left>baseline/Avalonia/lib/net10.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net10.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>F:Avalonia.Input.DataFormats.Files</Target>
<Left>baseline/Avalonia/lib/net10.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net10.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>F:Avalonia.Input.DataFormats.Text</Target>
<Left>baseline/Avalonia/lib/net10.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net10.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>F:Avalonia.Media.DrawingImage.ViewboxProperty</Target>
@ -163,18 +295,84 @@
<Left>baseline/Avalonia/lib/net10.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net10.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>F:Avalonia.Media.RadialGradientBrush.RadiusProperty</Target>
<Left>baseline/Avalonia/lib/net10.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net10.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>M:Avalonia.Animation.Animation.SetAnimator(Avalonia.Animation.IAnimationSetter,Avalonia.Animation.CustomAnimatorBase)</Target>
<Left>baseline/Avalonia/lib/net10.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net10.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>M:Avalonia.AvaloniaObjectExtensions.Bind(Avalonia.AvaloniaObject,Avalonia.AvaloniaProperty,Avalonia.Data.BindingBase,System.Object)</Target>
<Left>baseline/Avalonia/lib/net10.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net10.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>M:Avalonia.Controls.ResourcesChangedEventArgs.#ctor</Target>
<Left>baseline/Avalonia/lib/net10.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net10.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>M:Avalonia.Data.CompiledBindingPathBuilder.SetRawSource(System.Object)</Target>
<Left>baseline/Avalonia/lib/net10.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net10.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>M:Avalonia.Data.ReflectionBinding.#ctor(System.String,Avalonia.Data.BindingMode)</Target>
<Left>baseline/Avalonia/lib/net10.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net10.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>M:Avalonia.Input.DataObject.Contains(System.String)</Target>
<Left>baseline/Avalonia/lib/net10.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net10.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>M:Avalonia.Input.DataObject.Get(System.String)</Target>
<Left>baseline/Avalonia/lib/net10.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net10.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>M:Avalonia.Input.DataObject.GetDataFormats</Target>
<Left>baseline/Avalonia/lib/net10.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net10.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>M:Avalonia.Input.DataObject.Set(System.String,System.Object)</Target>
<Left>baseline/Avalonia/lib/net10.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net10.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>M:Avalonia.Input.DragDrop.DoDragDrop(Avalonia.Input.PointerEventArgs,Avalonia.Input.IDataObject,Avalonia.Input.DragDropEffects)</Target>
<Left>baseline/Avalonia/lib/net10.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net10.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>M:Avalonia.Input.DragEventArgs.#ctor(Avalonia.Interactivity.RoutedEvent{Avalonia.Input.DragEventArgs},Avalonia.Input.IDataObject,Avalonia.Interactivity.Interactive,Avalonia.Point,Avalonia.Input.KeyModifiers)</Target>
<Left>baseline/Avalonia/lib/net10.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net10.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>M:Avalonia.Input.DragEventArgs.get_Data</Target>
<Left>baseline/Avalonia/lib/net10.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net10.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>M:Avalonia.Input.IKeyboardNavigationHandler.Move(Avalonia.Input.IInputElement,Avalonia.Input.NavigationDirection,Avalonia.Input.KeyModifiers)</Target>
@ -187,12 +385,90 @@
<Left>baseline/Avalonia/lib/net10.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net10.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>M:Avalonia.Input.Platform.IClipboard.GetDataAsync(System.String)</Target>
<Left>baseline/Avalonia/lib/net10.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net10.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>M:Avalonia.Input.Platform.IClipboard.GetFormatsAsync</Target>
<Left>baseline/Avalonia/lib/net10.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net10.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>M:Avalonia.Input.Platform.IClipboard.GetTextAsync</Target>
<Left>baseline/Avalonia/lib/net10.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net10.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>M:Avalonia.Input.Platform.IClipboard.SetDataObjectAsync(Avalonia.Input.IDataObject)</Target>
<Left>baseline/Avalonia/lib/net10.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net10.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>M:Avalonia.Input.Platform.IClipboard.SetTextAsync(System.String)</Target>
<Left>baseline/Avalonia/lib/net10.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net10.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>M:Avalonia.Input.Platform.IClipboard.TryGetInProcessDataObjectAsync</Target>
<Left>baseline/Avalonia/lib/net10.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net10.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>M:Avalonia.Input.Platform.IPlatformDragSource.DoDragDrop(Avalonia.Input.PointerEventArgs,Avalonia.Input.IDataObject,Avalonia.Input.DragDropEffects)</Target>
<Left>baseline/Avalonia/lib/net10.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net10.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>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)</Target>
<Left>baseline/Avalonia/lib/net10.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net10.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>M:Avalonia.Input.Raw.RawDragEvent.get_Data</Target>
<Left>baseline/Avalonia/lib/net10.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net10.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>M:Avalonia.Input.TextInput.TextInputMethodClient.ShowInputPanel</Target>
<Left>baseline/Avalonia/lib/net10.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net10.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>M:Avalonia.Media.Color.ToUint32</Target>
<Left>baseline/Avalonia/lib/net10.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net10.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>M:Avalonia.Media.DrawingContext.PushPostTransform(Avalonia.Matrix)</Target>
<Left>baseline/Avalonia/lib/net10.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net10.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>M:Avalonia.Media.DrawingContext.PushPreTransform(Avalonia.Matrix)</Target>
<Left>baseline/Avalonia/lib/net10.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net10.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>M:Avalonia.Media.DrawingContext.PushTransformContainer</Target>
<Left>baseline/Avalonia/lib/net10.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net10.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>M:Avalonia.Media.DrawingImage.get_Viewbox</Target>
@ -223,6 +499,30 @@
<Left>baseline/Avalonia/lib/net10.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net10.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>M:Avalonia.Media.Immutable.ImmutableRadialGradientBrush.get_Radius</Target>
<Left>baseline/Avalonia/lib/net10.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net10.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>M:Avalonia.Media.IRadialGradientBrush.get_Radius</Target>
<Left>baseline/Avalonia/lib/net10.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net10.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>M:Avalonia.Media.RadialGradientBrush.get_Radius</Target>
<Left>baseline/Avalonia/lib/net10.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net10.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>M:Avalonia.Media.RadialGradientBrush.set_Radius(System.Double)</Target>
<Left>baseline/Avalonia/lib/net10.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net10.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>M:Avalonia.Media.StreamGeometryContext.ArcTo(Avalonia.Point,Avalonia.Size,System.Double,System.Boolean,Avalonia.Media.SweepDirection)</Target>
@ -331,6 +631,18 @@
<Left>baseline/Avalonia/lib/net10.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net10.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>M:Avalonia.Rendering.Composition.ICompositionGpuImportedObject.get_ImportCompeted</Target>
<Left>baseline/Avalonia/lib/net10.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net10.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>M:Avalonia.Utilities.AvaloniaResourcesIndexReaderWriter.WriteResources(System.IO.Stream,System.Collections.Generic.List{System.ValueTuple{System.String,System.Int32,System.Func{System.IO.Stream}}})</Target>
<Left>baseline/Avalonia/lib/net10.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net10.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>M:Avalonia.Visuals.Platform.PathGeometryContext.ArcTo(Avalonia.Point,Avalonia.Size,System.Double,System.Boolean,Avalonia.Media.SweepDirection)</Target>
@ -589,6 +901,30 @@
<Left>baseline/Avalonia/lib/net8.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net8.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>F:Avalonia.Data.BindingPriority.TemplatedParent</Target>
<Left>baseline/Avalonia/lib/net8.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net8.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>F:Avalonia.Input.DataFormats.FileNames</Target>
<Left>baseline/Avalonia/lib/net8.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net8.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>F:Avalonia.Input.DataFormats.Files</Target>
<Left>baseline/Avalonia/lib/net8.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net8.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>F:Avalonia.Input.DataFormats.Text</Target>
<Left>baseline/Avalonia/lib/net8.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net8.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>F:Avalonia.Media.DrawingImage.ViewboxProperty</Target>
@ -601,18 +937,84 @@
<Left>baseline/Avalonia/lib/net8.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net8.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>F:Avalonia.Media.RadialGradientBrush.RadiusProperty</Target>
<Left>baseline/Avalonia/lib/net8.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net8.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>M:Avalonia.Animation.Animation.SetAnimator(Avalonia.Animation.IAnimationSetter,Avalonia.Animation.CustomAnimatorBase)</Target>
<Left>baseline/Avalonia/lib/net8.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net8.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>M:Avalonia.AvaloniaObjectExtensions.Bind(Avalonia.AvaloniaObject,Avalonia.AvaloniaProperty,Avalonia.Data.BindingBase,System.Object)</Target>
<Left>baseline/Avalonia/lib/net8.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net8.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>M:Avalonia.Controls.ResourcesChangedEventArgs.#ctor</Target>
<Left>baseline/Avalonia/lib/net8.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net8.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>M:Avalonia.Data.CompiledBindingPathBuilder.SetRawSource(System.Object)</Target>
<Left>baseline/Avalonia/lib/net8.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net8.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>M:Avalonia.Data.ReflectionBinding.#ctor(System.String,Avalonia.Data.BindingMode)</Target>
<Left>baseline/Avalonia/lib/net8.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net8.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>M:Avalonia.Input.DataObject.Contains(System.String)</Target>
<Left>baseline/Avalonia/lib/net8.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net8.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>M:Avalonia.Input.DataObject.Get(System.String)</Target>
<Left>baseline/Avalonia/lib/net8.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net8.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>M:Avalonia.Input.DataObject.GetDataFormats</Target>
<Left>baseline/Avalonia/lib/net8.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net8.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>M:Avalonia.Input.DataObject.Set(System.String,System.Object)</Target>
<Left>baseline/Avalonia/lib/net8.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net8.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>M:Avalonia.Input.DragDrop.DoDragDrop(Avalonia.Input.PointerEventArgs,Avalonia.Input.IDataObject,Avalonia.Input.DragDropEffects)</Target>
<Left>baseline/Avalonia/lib/net8.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net8.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>M:Avalonia.Input.DragEventArgs.#ctor(Avalonia.Interactivity.RoutedEvent{Avalonia.Input.DragEventArgs},Avalonia.Input.IDataObject,Avalonia.Interactivity.Interactive,Avalonia.Point,Avalonia.Input.KeyModifiers)</Target>
<Left>baseline/Avalonia/lib/net8.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net8.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>M:Avalonia.Input.DragEventArgs.get_Data</Target>
<Left>baseline/Avalonia/lib/net8.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net8.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>M:Avalonia.Input.IKeyboardNavigationHandler.Move(Avalonia.Input.IInputElement,Avalonia.Input.NavigationDirection,Avalonia.Input.KeyModifiers)</Target>
@ -625,12 +1027,90 @@
<Left>baseline/Avalonia/lib/net8.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net8.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>M:Avalonia.Input.Platform.IClipboard.GetDataAsync(System.String)</Target>
<Left>baseline/Avalonia/lib/net8.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net8.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>M:Avalonia.Input.Platform.IClipboard.GetFormatsAsync</Target>
<Left>baseline/Avalonia/lib/net8.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net8.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>M:Avalonia.Input.Platform.IClipboard.GetTextAsync</Target>
<Left>baseline/Avalonia/lib/net8.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net8.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>M:Avalonia.Input.Platform.IClipboard.SetDataObjectAsync(Avalonia.Input.IDataObject)</Target>
<Left>baseline/Avalonia/lib/net8.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net8.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>M:Avalonia.Input.Platform.IClipboard.SetTextAsync(System.String)</Target>
<Left>baseline/Avalonia/lib/net8.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net8.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>M:Avalonia.Input.Platform.IClipboard.TryGetInProcessDataObjectAsync</Target>
<Left>baseline/Avalonia/lib/net8.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net8.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>M:Avalonia.Input.Platform.IPlatformDragSource.DoDragDrop(Avalonia.Input.PointerEventArgs,Avalonia.Input.IDataObject,Avalonia.Input.DragDropEffects)</Target>
<Left>baseline/Avalonia/lib/net8.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net8.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>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)</Target>
<Left>baseline/Avalonia/lib/net8.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net8.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>M:Avalonia.Input.Raw.RawDragEvent.get_Data</Target>
<Left>baseline/Avalonia/lib/net8.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net8.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>M:Avalonia.Input.TextInput.TextInputMethodClient.ShowInputPanel</Target>
<Left>baseline/Avalonia/lib/net8.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net8.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>M:Avalonia.Media.Color.ToUint32</Target>
<Left>baseline/Avalonia/lib/net8.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net8.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>M:Avalonia.Media.DrawingContext.PushPostTransform(Avalonia.Matrix)</Target>
<Left>baseline/Avalonia/lib/net8.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net8.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>M:Avalonia.Media.DrawingContext.PushPreTransform(Avalonia.Matrix)</Target>
<Left>baseline/Avalonia/lib/net8.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net8.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>M:Avalonia.Media.DrawingContext.PushTransformContainer</Target>
<Left>baseline/Avalonia/lib/net8.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net8.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>M:Avalonia.Media.DrawingImage.get_Viewbox</Target>
@ -661,6 +1141,30 @@
<Left>baseline/Avalonia/lib/net8.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net8.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>M:Avalonia.Media.Immutable.ImmutableRadialGradientBrush.get_Radius</Target>
<Left>baseline/Avalonia/lib/net8.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net8.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>M:Avalonia.Media.IRadialGradientBrush.get_Radius</Target>
<Left>baseline/Avalonia/lib/net8.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net8.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>M:Avalonia.Media.RadialGradientBrush.get_Radius</Target>
<Left>baseline/Avalonia/lib/net8.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net8.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>M:Avalonia.Media.RadialGradientBrush.set_Radius(System.Double)</Target>
<Left>baseline/Avalonia/lib/net8.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net8.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>M:Avalonia.Media.StreamGeometryContext.ArcTo(Avalonia.Point,Avalonia.Size,System.Double,System.Boolean,Avalonia.Media.SweepDirection)</Target>
@ -769,6 +1273,18 @@
<Left>baseline/Avalonia/lib/net8.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net8.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>M:Avalonia.Rendering.Composition.ICompositionGpuImportedObject.get_ImportCompeted</Target>
<Left>baseline/Avalonia/lib/net8.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net8.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>M:Avalonia.Utilities.AvaloniaResourcesIndexReaderWriter.WriteResources(System.IO.Stream,System.Collections.Generic.List{System.ValueTuple{System.String,System.Int32,System.Func{System.IO.Stream}}})</Target>
<Left>baseline/Avalonia/lib/net8.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net8.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0002</DiagnosticId>
<Target>M:Avalonia.Visuals.Platform.PathGeometryContext.ArcTo(Avalonia.Point,Avalonia.Size,System.Double,System.Boolean,Avalonia.Media.SweepDirection)</Target>
@ -1357,6 +1873,12 @@
<Left>baseline/Avalonia/lib/net8.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net8.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0008</DiagnosticId>
<Target>T:Avalonia.Input.DataObject</Target>
<Left>baseline/Avalonia/lib/net10.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net10.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0008</DiagnosticId>
<Target>T:Avalonia.Media.ImmediateDrawingContext</Target>
@ -1465,6 +1987,12 @@
<Left>baseline/Avalonia/lib/net10.0/Avalonia.Vulkan.dll</Left>
<Right>current/Avalonia/lib/net10.0/Avalonia.Vulkan.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0008</DiagnosticId>
<Target>T:Avalonia.Input.DataObject</Target>
<Left>baseline/Avalonia/lib/net8.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net8.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0008</DiagnosticId>
<Target>T:Avalonia.Media.ImmediateDrawingContext</Target>
@ -1579,6 +2107,12 @@
<Left>baseline/Avalonia/lib/net10.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net10.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0009</DiagnosticId>
<Target>T:Avalonia.Input.DataObject</Target>
<Left>baseline/Avalonia/lib/net10.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net10.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0009</DiagnosticId>
<Target>T:Avalonia.Platform.Screen</Target>
@ -1591,6 +2125,12 @@
<Left>baseline/Avalonia/lib/net8.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net8.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0009</DiagnosticId>
<Target>T:Avalonia.Input.DataObject</Target>
<Left>baseline/Avalonia/lib/net8.0/Avalonia.Base.dll</Left>
<Right>current/Avalonia/lib/net8.0/Avalonia.Base.dll</Right>
</Suppression>
<Suppression>
<DiagnosticId>CP0009</DiagnosticId>
<Target>T:Avalonia.Platform.Screen</Target>

3
native/Avalonia.Native/src/OSX/AvnView.mm

@ -42,7 +42,8 @@
- (void) updateRenderTarget
{
if(_currentRenderTarget) {
[_currentRenderTarget resize:_lastPixelSize withScale:static_cast<float>([[self window] backingScaleFactor])];
AvnPixelSize size { MAX(_lastPixelSize.Width, 1), MAX(_lastPixelSize.Height, 1) };
[_currentRenderTarget resize:size withScale:static_cast<float>([[self window] backingScaleFactor])];
[self setNeedsDisplayInRect:[self frame]];
}
}

13
src/Avalonia.Base/Animation/Animation.AnimatorRegistry.cs

@ -7,17 +7,6 @@ namespace Avalonia.Animation;
partial class Animation
{
/// <summary>
/// Sets the value of the Animator attached property for a setter.
/// </summary>
/// <param name="setter">The animation setter.</param>
/// <param name="value">The property animator value.</param>
[Obsolete("CustomAnimatorBase will be removed before 11.0, use InterpolatingAnimator<T>", true)]
public static void SetAnimator(IAnimationSetter setter, CustomAnimatorBase value)
{
s_animators[setter] = (value.WrapperType, value.CreateWrapper);
}
/// <summary>
/// Sets the value of the Animator attached property for a setter.
/// </summary>
@ -92,4 +81,4 @@ partial class Animation
return null;
}
}
}

17
src/Avalonia.Base/Animation/Easings/CubicBezierEasing.cs

@ -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();
}

30
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<T>", 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<T>", true)]
public abstract class CustomAnimatorBase<T> : 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<T>
{
private readonly CustomAnimatorBase<T> _parent;
public AnimatorWrapper(CustomAnimatorBase<T> 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<T> : ICustomAnimator
public override T Interpolate(double progress, T oldValue, T newValue) => _parent.Interpolate(progress, oldValue, newValue);
}
}
}

27
src/Avalonia.Base/AvaloniaObjectExtensions.cs

@ -227,33 +227,6 @@ namespace Avalonia
};
}
/// <summary>
/// Binds a property on an <see cref="AvaloniaObject"/> to an <see cref="BindingBase"/>.
/// </summary>
/// <param name="target">The object.</param>
/// <param name="property">The property to bind.</param>
/// <param name="binding">The binding.</param>
/// <param name="anchor">
/// 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 <paramref name="anchor"/> parameter
/// can be used to provide this context.
/// </param>
/// <returns>An <see cref="IDisposable"/> which can be used to cancel the binding.</returns>
[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);
}
/// <summary>
/// Gets a <see cref="AvaloniaProperty"/> value.
/// </summary>

5
src/Avalonia.Base/Data/BindingPriority.cs

@ -46,9 +46,6 @@ namespace Avalonia.Data
/// <summary>
/// The value is uninitialized.
/// </summary>
Unset = int.MaxValue,
[Obsolete("Use Template priority"), EditorBrowsable(EditorBrowsableState.Never)]
TemplatedParent = Template,
Unset = int.MaxValue
}
}

6
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());
}

37
src/Avalonia.Base/Diagnostics/StyleDiagnostics.cs

@ -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
{
/// <summary>
/// Currently applied styles.
/// </summary>
public IReadOnlyList<AppliedStyle> AppliedStyles { get; }
public StyleDiagnostics(IReadOnlyList<AppliedStyle> 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;
}

3
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);
}

24
src/Avalonia.Base/Diagnostics/StyledElementExtensions.cs

@ -1,24 +0,0 @@
using System;
using System.Linq;
using Avalonia.Metadata;
using Avalonia.Styling;
namespace Avalonia.Diagnostics;
/// <summary>
/// Defines diagnostic extensions on <see cref="StyledElement"/>s.
/// </summary>
[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<StyleValueFrameDiagnostic>()
.Select(f => f.AsAppliedStyle())
.ToArray());
}
}

61
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
{
/// <summary>
/// Dataformat for plaintext
/// </summary>
[Obsolete($"Use {nameof(DataFormat)}.{nameof(DataFormat.Text)} instead.")]
public static readonly string Text = nameof(Text);
namespace Avalonia.Input;
/// <summary>
/// Dataformat for one or more files.
/// </summary>
[Obsolete($"Use {nameof(DataFormat)}.{nameof(DataFormat.File)} instead.")]
public static readonly string Files = nameof(Files);
/// <summary>
/// Dataformat for one or more filenames
/// </summary>
/// <remarks>
/// This data format is supported only on desktop platforms.
/// </remarks>
[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
/// <summary>
/// This class does not do anything anymore.
/// Use <see cref="DataFormat"/> instead.
/// </summary>
[Obsolete($"Use {nameof(DataFormat)} instead", true)]
public static class DataFormats;

45
src/Avalonia.Base/Input/DataObject.cs

@ -1,40 +1,11 @@
using System;
using System.Collections.Generic;
namespace Avalonia.Input
{
/// <summary>
/// Specific and mutable implementation of the IDataObject interface.
/// </summary>
[Obsolete($"Use {nameof(DataTransfer)} instead")]
public class DataObject : IDataObject
{
private readonly Dictionary<string, object> _items = new();
namespace Avalonia.Input;
/// <inheritdoc />
public bool Contains(string dataFormat)
{
return _items.ContainsKey(dataFormat);
}
/// <inheritdoc />
public object? Get(string dataFormat)
{
return _items.TryGetValue(dataFormat, out var item) ? item : null;
}
/// <inheritdoc />
public IEnumerable<string> GetDataFormats()
{
return _items.Keys;
}
/// <summary>
/// Sets a value to the internal store of the data object with <see cref="DataFormats"/> as a key.
/// </summary>
public void Set(string dataFormat, object value)
{
_items[dataFormat] = value;
}
}
}
// TODO13: remove
/// <summary>
/// This class does not do anything anymore.
/// Use <see cref="DataTransfer"/> instead.
/// </summary>
[Obsolete($"Use {nameof(DataTransfer)} instead", true)]
public sealed class DataObject;

54
src/Avalonia.Base/Input/DataObjectExtensions.cs

@ -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
{
/// <summary>
/// Returns a list of files if the DataObject contains files or filenames.
/// <seealso cref="DataFormats.Files"/>.
/// </summary>
/// <returns>
/// Collection of storage items - files or folders. If format isn't available, returns null.
/// </returns>
public static IEnumerable<IStorageItem>? GetFiles(this IDataObject dataObject)
{
return dataObject.Get(DataFormats.Files) as IEnumerable<IStorageItem>;
}
/// <summary>
/// Returns a list of filenames if the DataObject contains filenames.
/// <seealso cref="DataFormats.FileNames"/>
/// </summary>
/// <returns>
/// Collection of file names. If format isn't available, returns null.
/// </returns>
[System.Obsolete("Use GetFiles, this method is supported only on desktop platforms."), EditorBrowsable(EditorBrowsableState.Never)]
public static IEnumerable<string>? GetFileNames(this IDataObject dataObject)
{
return (dataObject.Get(DataFormats.FileNames) as IEnumerable<string>)
?? dataObject.GetFiles()?
.Select(f => f.TryGetLocalPath())
.Where(p => !string.IsNullOrEmpty(p))
.OfType<string>();
}
/// <summary>
/// Returns the dragged text if the DataObject contains any text.
/// <seealso cref="DataFormats.Text"/>
/// </summary>
/// <returns>
/// A text string. If format isn't available, returns null.
/// </returns>
public static string? GetText(this IDataObject dataObject)
{
return dataObject.Get(DataFormats.Text) as string;
}
}
}

9
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;
/// </summary>
public static class DataTransferExtensions
{
[Obsolete]
internal static IDataObject ToLegacyDataObject(this IDataTransfer dataTransfer)
=> (dataTransfer as DataObjectToDataTransferWrapper)?.DataObject
?? new DataTransferToDataObjectWrapper(dataTransfer);
/// <summary>
/// Gets whether a <see cref="IDataTransfer"/> supports a specific format.
/// </summary>

10
src/Avalonia.Base/Input/DragDrop.cs

@ -122,16 +122,6 @@ namespace Avalonia.Input
element.RemoveHandler(DropEvent, handler);
}
/// <summary>
/// Starts a dragging operation with the given <see cref="IDataObject"/> and returns the applied drop effect from the target.
/// <seealso cref="DataObject"/>
/// </summary>
[Obsolete($"Use {nameof(DoDragDropAsync)} instead.")]
public static Task<DragDropEffects> DoDragDrop(PointerEventArgs triggerEvent, IDataObject data, DragDropEffects allowedEffects)
{
return DoDragDropAsync(triggerEvent, new DataObjectToDataTransferWrapper(data), allowedEffects);
}
/// <summary>
/// Starts a dragging operation with the given <see cref="IDataTransfer"/> and returns the applied drop effect from the target.
/// <seealso cref="DataTransfer"/>

17
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<DragEventArgs> 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<DragEventArgs> routedEvent,

32
src/Avalonia.Base/Input/IDataObject.cs

@ -1,32 +0,0 @@
using System;
using System.Collections.Generic;
namespace Avalonia.Input
{
/// <summary>
/// Interface to access information about the data of a drag-and-drop operation.
/// </summary>
[Obsolete($"Use {nameof(IDataTransfer)} or {nameof(IAsyncDataTransfer)} instead")]
public interface IDataObject
{
/// <summary>
/// Lists all formats which are present in the DataObject.
/// <seealso cref="DataFormats"/>
/// </summary>
IEnumerable<string> GetDataFormats();
/// <summary>
/// Checks whether a given DataFormat is present in this object
/// <seealso cref="DataFormats"/>
/// </summary>
bool Contains(string dataFormat);
/// <summary>
/// Tries to get the data of the given DataFormat.
/// </summary>
/// <returns>
/// Object data. If format isn't available, returns null.
/// </returns>
object? Get(string dataFormat);
}
}

55
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<string?> 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<string[]> IClipboard.GetFormatsAsync()
{
var dataTransfer = await TryGetDataAsync();
return dataTransfer is null ? [] : dataTransfer.Formats.Select(DataFormats.ToString).ToArray();
}
[Obsolete($"Use {nameof(TryGetDataAsync)} instead.")]
async Task<object?> IClipboard.GetDataAsync(string format)
{
// No ConfigureAwait(false) here: we want TryGetXxxAsync() below to be called on the initial thread.
using var dataTransfer = await TryGetDataAsync();
if (dataTransfer is null)
return null;
if (format == DataFormats.Text)
return await dataTransfer.TryGetTextAsync().ConfigureAwait(false);
if (format == DataFormats.Files)
return await dataTransfer.TryGetFilesAsync().ConfigureAwait(false);
if (format == DataFormats.FileNames)
{
return (await dataTransfer.TryGetFilesAsync().ConfigureAwait(false))
?.Select(file => file.TryGetLocalPath())
.Where(path => path is not null)
.ToArray();
}
return null;
}
public Task<IAsyncDataTransfer?> TryGetDataAsync()
=> _clipboardImpl.TryGetDataAsync();
[Obsolete($"Use {nameof(TryGetInProcessDataAsync)} instead.")]
async Task<IDataObject?> IClipboard.TryGetInProcessDataObjectAsync()
{
var dataTransfer = await TryGetInProcessDataAsync().ConfigureAwait(false);
return (dataTransfer as DataObjectToDataTransferWrapper)?.DataObject;
}
public async Task<IAsyncDataTransfer?> TryGetInProcessDataAsync()
{
if (_lastDataTransfer is null || _clipboardImpl is not IOwnedClipboardImpl ownedClipboardImpl)

76
src/Avalonia.Base/Input/Platform/DataObjectToDataTransferItemWrapper.cs

@ -1,76 +0,0 @@
using System;
using System.Diagnostics;
using System.IO;
using System.Text;
using Avalonia.Compatibility;
namespace Avalonia.Input.Platform;
/// <summary>
/// Wraps a legacy <see cref="IDataObject"/> into a <see cref="IDataTransferItem"/>.
/// </summary>
[Obsolete]
internal sealed class DataObjectToDataTransferItemWrapper(
IDataObject dataObject,
DataFormat[] formats,
string[] formatStrings)
: PlatformDataTransferItem
{
private readonly IDataObject _dataObject = dataObject;
private readonly DataFormat[] _formats = formats;
private readonly string[] _formatStrings = formatStrings;
protected override DataFormat[] ProvideFormats()
=> _formats;
protected override object? TryGetRawCore(DataFormat format)
{
var index = Array.IndexOf(Formats, format);
if (index < 0)
return null;
// We should never have DataFormat.File here, it's been handled by DataObjectToDataTransferWrapper.
Debug.Assert(!DataFormat.File.Equals(format));
var formatString = _formatStrings[index];
var data = _dataObject.Get(formatString);
if (DataFormat.Text.Equals(format))
return Convert.ToString(data) ?? string.Empty;
if (format is DataFormat<string>)
return Convert.ToString(data);
if (format is DataFormat<byte[]>)
return ConvertLegacyDataToBytes(format, data);
return null;
}
private static byte[]? ConvertLegacyDataToBytes(DataFormat format, object? data)
{
switch (data)
{
case null:
return null;
case byte[] bytes:
return bytes;
case string str:
return OperatingSystemEx.IsWindows() || OperatingSystemEx.IsMacOS() || OperatingSystemEx.IsIOS() ?
Encoding.Unicode.GetBytes(str) :
Encoding.UTF8.GetBytes(str);
case Stream stream:
var length = (int)(stream.Length - stream.Position);
var buffer = new byte[length];
stream.ReadExactly(buffer, 0, length);
return buffer;
default:
return null;
}
}
}

95
src/Avalonia.Base/Input/Platform/DataObjectToDataTransferWrapper.cs

@ -1,95 +0,0 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Diagnostics.CodeAnalysis;
using System.Linq;
using Avalonia.Platform.Storage;
using Avalonia.Platform.Storage.FileIO;
namespace Avalonia.Input.Platform;
#pragma warning disable CS0618 // Type or member is obsolete: usages of IDataObject and DataFormats
// TODO12: remove
/// <summary>
/// Wraps a legacy <see cref="IDataObject"/> into a <see cref="IDataTransfer"/>.
/// </summary>
[Obsolete]
internal sealed class DataObjectToDataTransferWrapper(IDataObject dataObject)
: PlatformDataTransfer
{
public IDataObject DataObject { get; } = dataObject;
protected override DataFormat[] ProvideFormats()
=> DataObject.GetDataFormats().Select(DataFormats.ToDataFormat).Distinct().ToArray();
protected override PlatformDataTransferItem[] ProvideItems()
{
var items = new List<PlatformDataTransferItem>();
var nonFileFormats = new List<DataFormat>();
var nonFileFormatStrings = new List<string>();
var hasFiles = false;
foreach (var formatString in DataObject.GetDataFormats())
{
var format = DataFormats.ToDataFormat(formatString);
if (formatString == DataFormats.Files)
{
if (hasFiles)
continue;
// This is not ideal as we're reading the filenames ahead of time to generate the appropriate items.
// We don't really care about that for this legacy wrapper.
if (DataObject.Get(formatString) is IEnumerable<IStorageItem> storageItems)
{
hasFiles = true;
foreach (var storageItem in storageItems)
items.Add(PlatformDataTransferItem.Create(DataFormat.File, storageItem));
}
}
else if (formatString == DataFormats.FileNames)
{
if (hasFiles)
continue;
if (DataObject.Get(formatString) is IEnumerable<string> fileNames)
{
hasFiles = true;
foreach (var fileName in fileNames)
{
if (StorageProviderHelpers.TryCreateBclStorageItem(fileName) is { } storageItem)
items.Add(PlatformDataTransferItem.Create(DataFormat.File, storageItem));
}
}
}
else
{
nonFileFormats.Add(format);
nonFileFormatStrings.Add(formatString);
}
}
if (nonFileFormats.Count > 0)
{
Debug.Assert(nonFileFormats.Count == nonFileFormatStrings.Count);
// Single item containing all formats except for DataFormat.File.
items.Add(new DataObjectToDataTransferItemWrapper(
DataObject,
nonFileFormats.ToArray(),
nonFileFormatStrings.ToArray()));
}
return items.ToArray();
}
[SuppressMessage(
"ReSharper",
"SuspiciousTypeConversion.Global",
Justification = "IDisposable may be implemented externally by the IDataObject instance.")]
public override void Dispose()
=> (DataObject as IDisposable)?.Dispose();
}

42
src/Avalonia.Base/Input/Platform/DataTransferToDataObjectWrapper.cs

@ -1,42 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using Avalonia.Platform.Storage;
namespace Avalonia.Input.Platform;
/// <summary>
/// Wraps a <see cref="IDataTransfer"/> into a legacy <see cref="IDataObject"/>.
/// </summary>
[Obsolete]
internal sealed class DataTransferToDataObjectWrapper(IDataTransfer dataTransfer) : IDataObject
{
public IDataTransfer DataTransfer { get; } = dataTransfer;
public IEnumerable<string> GetDataFormats()
=> DataTransfer.Formats.Select(DataFormats.ToString);
public bool Contains(string dataFormat)
=> DataTransfer.Contains(DataFormats.ToDataFormat(dataFormat));
public object? Get(string dataFormat)
{
if (dataFormat == DataFormats.Text)
return DataTransfer.TryGetText();
if (dataFormat == DataFormats.Files)
return DataTransfer.TryGetFiles();
if (dataFormat == DataFormats.FileNames)
{
return DataTransfer
.TryGetFiles()
?.Select(file => file.TryGetLocalPath())
.Where(path => path is not null)
.ToArray();
}
return null;
}
}

55
src/Avalonia.Base/Input/Platform/IClipboard.cs

@ -1,4 +1,3 @@
using System;
using System.Threading.Tasks;
using Avalonia.Metadata;
@ -10,41 +9,11 @@ namespace Avalonia.Input.Platform
[NotClientImplementable]
public interface IClipboard
{
// TODO12: remove, ClipboardExtensions.TryGetTextAsync exists
/// <summary>
/// Returns a string containing the text data on the clipboard.
/// </summary>
/// <returns>A string containing text data, or null if no corresponding text data is available.</returns>
[Obsolete($"Use {nameof(ClipboardExtensions)}.{nameof(ClipboardExtensions.TryGetTextAsync)} instead")]
Task<string?> GetTextAsync();
// TODO12: remove, ClipboardExtensions.SetTextAsync exists
/// <summary>
/// Places a text on the clipboard.
/// </summary>
/// <param name="text">The text value to set.</param>
/// <remarks>
/// <para>By calling this method, the clipboard will get cleared of any possible previous data.</para>
/// <para>
/// If <paramref name="text"/> is null or empty, nothing will get placed on the clipboard and this method
/// will be equivalent to <see cref="ClearAsync"/>.
/// </para>
/// </remarks>
Task SetTextAsync(string? text);
/// <summary>
/// Clears any data from the system clipboard.
/// </summary>
Task ClearAsync();
/// <summary>
/// Places a specified non-persistent data object on the system Clipboard.
/// </summary>
/// <param name="data">A data object (an object that implements <see cref="IDataObject"/>) to place on the system Clipboard.</param>
/// <exception cref="System.ArgumentNullException"><paramref name="data"/> is null.</exception>
[Obsolete($"Use {nameof(SetDataAsync)} instead.")]
Task SetDataObjectAsync(IDataObject data);
/// <summary>
/// Places a data object on the clipboard.
/// The data object is responsible for providing supported formats and data upon request.
@ -69,20 +38,6 @@ namespace Avalonia.Input.Platform
/// <remarks>This method is only supported on the Windows platform. This method will do nothing on other platforms.</remarks>
Task FlushAsync();
/// <summary>
/// Get list of available Clipboard format.
/// </summary>
[Obsolete($"Use {nameof(ClipboardExtensions.GetDataFormatsAsync)} instead.")]
Task<string[]> GetFormatsAsync();
/// <summary>
/// Retrieves data in a specified format from the Clipboard.
/// </summary>
/// <param name="format">A string that specifies the format of the data to retrieve. For a set of predefined data formats, see the <see cref="DataFormats"/> class.</param>
/// <returns></returns>
[Obsolete($"Use {nameof(TryGetDataAsync)} instead.")]
Task<object?> GetDataAsync(string format);
/// <summary>
/// Retrieves data from the clipboard.
/// </summary>
@ -95,16 +50,6 @@ namespace Avalonia.Input.Platform
/// </remarks>
Task<IAsyncDataTransfer?> TryGetDataAsync();
/// <summary>
/// If clipboard contains the IDataObject that was set by a previous call to <see cref="SetDataObjectAsync(Avalonia.Input.IDataObject)"/>,
/// return said IDataObject instance. Otherwise, return null.
/// Note that not every platform supports that method, on unsupported platforms this method will always return
/// null
/// </summary>
/// <returns></returns>
[Obsolete($"Use {nameof(TryGetInProcessDataAsync)} instead.")]
Task<IDataObject?> TryGetInProcessDataObjectAsync();
/// <summary>
/// Retrieves the exact instance of a <see cref="IAsyncDataTransfer"/> previously placed on the clipboard
/// by <see cref="SetDataAsync"/>, if any.

9
src/Avalonia.Base/Input/Platform/IPlatformDragSource.cs

@ -1,5 +1,4 @@
using System;
using System.Threading.Tasks;
using System.Threading.Tasks;
using Avalonia.Metadata;
namespace Avalonia.Input.Platform
@ -7,12 +6,6 @@ namespace Avalonia.Input.Platform
[NotClientImplementable]
public interface IPlatformDragSource
{
[Obsolete($"Use {nameof(DoDragDropAsync)} instead.")]
Task<DragDropEffects> DoDragDrop(
PointerEventArgs triggerEvent,
IDataObject data,
DragDropEffects allowedEffects);
Task<DragDropEffects> DoDragDropAsync(
PointerEventArgs triggerEvent,
IDataTransfer dataTransfer,

22
src/Avalonia.Base/Input/Raw/RawDragEvent.cs

@ -1,40 +1,20 @@
using System;
using Avalonia.Input.Platform;
using Avalonia.Metadata;
using Avalonia.Metadata;
namespace Avalonia.Input.Raw
{
[PrivateApi]
public class RawDragEvent : RawInputEventArgs
{
[Obsolete] private IDataObject? _legacyDataObject;
public Point Location { get; set; }
public IDataTransfer DataTransfer { get; }
[Obsolete($"Use {nameof(DataTransfer)} instead.")]
public IDataObject Data
=> _legacyDataObject ??= DataTransfer.ToLegacyDataObject();
public DragDropEffects Effects { get; set; }
public RawDragEventType Type { get; }
public KeyModifiers KeyModifiers { get; }
[Obsolete($"Use the constructor accepting a {nameof(IDataTransfer)} instance instead.")]
public RawDragEvent(IDragDropDevice inputDevice,
RawDragEventType type,
IInputRoot root,
Point location,
IDataObject data,
DragDropEffects effects,
RawInputModifiers modifiers)
: this(inputDevice, type, root, location, new DataObjectToDataTransferWrapper(data), effects, modifiers)
{
}
public RawDragEvent(
IDragDropDevice inputDevice,
RawDragEventType type,

7
src/Avalonia.Base/Media/Color.cs

@ -472,13 +472,6 @@ namespace Avalonia.Media
return ((uint)A << 24) | ((uint)R << 16) | ((uint)G << 8) | (uint)B;
}
/// <inheritdoc cref="Color.ToUInt32"/>
[Obsolete("Use Color.ToUInt32() instead."), EditorBrowsable(EditorBrowsableState.Never)]
public uint ToUint32()
{
return ToUInt32();
}
/// <summary>
/// Returns the HSL color model equivalent of this RGB color.
/// </summary>

9
src/Avalonia.Base/Media/DrawingContext.cs

@ -432,15 +432,8 @@ namespace Avalonia.Media
_states.Push(new RestoreState(this, RestoreState.PushedStateType.TextOptions));
return new PushedState(this);
}
protected abstract void PushTextOptionsCore(TextOptions textOptions);
[Obsolete("Use PushTransform"), EditorBrowsable(EditorBrowsableState.Never)]
public PushedState PushPreTransform(Matrix matrix) => PushTransform(matrix);
[Obsolete("Use PushTransform"), EditorBrowsable(EditorBrowsableState.Never)]
public PushedState PushPostTransform(Matrix matrix) => PushTransform(matrix);
[Obsolete("Use PushTransform"), EditorBrowsable(EditorBrowsableState.Never)]
public PushedState PushTransformContainer() => PushTransform(Matrix.Identity);
protected abstract void PushTextOptionsCore(TextOptions textOptions);
protected abstract void PushTransformCore(Matrix matrix);

2
src/Avalonia.Base/Media/IRadialGradientBrush.cs

@ -20,8 +20,6 @@ namespace Avalonia.Media
/// </summary>
RelativePoint GradientOrigin { get; }
[Obsolete("Use RadiusX/RadiusY")] public double Radius { get; }
/// <summary>
/// Gets the horizontal radius of the outermost circle of the radial gradient.
/// </summary>

2
src/Avalonia.Base/Media/Immutable/ImmutableRadialGradientBrush.cs

@ -85,7 +85,5 @@ namespace Avalonia.Media.Immutable
/// <inheritdoc/>
public RelativeScalar RadiusY { get; }
[Obsolete("Use RadiusX/RadiusY")] public double Radius => RadiusX.Scalar;
}
}

40
src/Avalonia.Base/Media/RadialGradientBrush.cs

@ -27,15 +27,6 @@ namespace Avalonia.Media
AvaloniaProperty.Register<RadialGradientBrush, RelativePoint>(
nameof(GradientOrigin),
RelativePoint.Center);
/// <summary>
/// Defines the <see cref="Radius"/> property.
/// </summary>
[Obsolete("Use RadiusX/RadiusY, note that those properties use _relative_ values, so Radius=0.55 would become RadiusX=55% RadiusY=55%. Radius property is always relative even if the rest of the brush uses absolute values.")]
public static readonly StyledProperty<double> RadiusProperty =
AvaloniaProperty.Register<RadialGradientBrush, double>(
nameof(Radius),
0.5);
/// <summary>
/// Defines the <see cref="RadiusX"/> property.
@ -74,9 +65,6 @@ namespace Avalonia.Media
/// Gets or sets the horizontal radius of the outermost circle of the radial
/// gradient.
/// </summary>
#pragma warning disable CS0618 // Type or member is obsolete
[DependsOn(nameof(Radius))]
#pragma warning restore CS0618 // Type or member is obsolete
public RelativeScalar RadiusX
{
get { return GetValue(RadiusXProperty); }
@ -87,25 +75,11 @@ namespace Avalonia.Media
/// Gets or sets the vertical radius of the outermost circle of the radial
/// gradient.
/// </summary>
#pragma warning disable CS0618 // Type or member is obsolete
[DependsOn(nameof(Radius))]
#pragma warning restore CS0618 // Type or member is obsolete
public RelativeScalar RadiusY
{
get { return GetValue(RadiusYProperty); }
set { SetValue(RadiusYProperty, value); }
}
/// <summary>
/// Gets or sets the horizontal and vertical radius of the outermost circle of the radial
/// gradient.
/// </summary>
[Obsolete("Use RadiusX/RadiusY, note that those properties use _relative_ values, so Radius=0.55 would become RadiusX=55% RadiusY=55%. Radius property is always relative even if the rest of the brush uses absolute values.")]
public double Radius
{
get { return GetValue(RadiusProperty); }
set { SetValue(RadiusProperty, value); }
}
/// <inheritdoc/>
public override IImmutableBrush ToImmutable()
@ -121,19 +95,5 @@ namespace Avalonia.Media
base.SerializeChanges(c, writer);
ServerCompositionSimpleRadialGradientBrush.SerializeAllChanges(writer, Center, GradientOrigin, RadiusX, RadiusY);
}
protected override void OnPropertyChanged(AvaloniaPropertyChangedEventArgs change)
{
#pragma warning disable CS0618 // Type or member is obsolete: compatibility code for Radius
if (change.IsEffectiveValueChange && change.Property == RadiusProperty)
{
var compatibilityValue = new RelativeScalar(Radius, RelativeUnit.Relative);
SetCurrentValue(RadiusXProperty, compatibilityValue);
SetCurrentValue(RadiusYProperty, compatibilityValue);
}
#pragma warning restore CS0618 // Type or member is obsolete
base.OnPropertyChanged(change);
}
}
}

2
src/Avalonia.Base/Rendering/Composition/Brushes/ServerSimpleCompositionBrush.cs

@ -49,7 +49,7 @@ namespace Avalonia.Rendering.Composition.Server
partial class ServerCompositionSimpleRadialGradientBrush : IRadialGradientBrush
{
public double Radius => RadiusX.Scalar;
}
partial class ServerCompositionSimpleSolidColorBrush : ISolidColorBrush

6
src/Avalonia.Base/Rendering/Composition/CompositionExternalMemory.cs

@ -101,12 +101,6 @@ public interface ICompositionGpuImportedObject : IAsyncDisposable
/// </summary>
Task ImportCompleted { get; }
/// <inheritdoc cref="ImportCompleted"/>
/// <seealso cref="ImportCompleted">ImportCompleted (recommended replacement)</seealso>
[Obsolete("Please use ICompositionGpuImportedObject.ImportCompleted instead")]
[EditorBrowsable(EditorBrowsableState.Never)]
Task ImportCompeted { get; }
/// <summary>
/// Indicates if the device context this instance is associated with is no longer available
/// </summary>

1
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(() =>

27
src/Avalonia.Base/StyledElement.cs

@ -21,7 +21,6 @@ namespace Avalonia
/// Extends an <see cref="Animatable"/> with the following features:
///
/// - An inherited <see cref="DataContext"/>.
/// - Implements <see cref="IStyleable"/> to allow styling to work on the styled element.
/// - Implements <see cref="ILogical"/> to form part of a logical tree.
/// - A collection of class strings for custom styling.
/// </summary>
@ -35,10 +34,7 @@ namespace Avalonia
ISetInheritanceParent,
ISupportInitialize,
INamed,
IAvaloniaListItemValidator<ILogical>,
#pragma warning disable CS0618 // Type or member is obsolete
IStyleable
#pragma warning restore CS0618 // Type or member is obsolete
IAvaloniaListItemValidator<ILogical>
{
/// <summary>
/// Defines the <see cref="DataContext"/> property.
@ -330,9 +326,6 @@ namespace Avalonia
bool IResourceNode.HasResources => (_resources?.HasResources ?? false) ||
(((IResourceNode?)_styles)?.HasResources ?? false);
/// <inheritdoc/>
IAvaloniaReadOnlyList<string> IStyleable.Classes => Classes;
/// <inheritdoc/>
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
}
}
/// <summary>
/// Internal getter for <see cref="IStyleable.StyleKey"/> so that we only need to suppress the obsolete
/// warning in one place.
/// </summary>
/// <param name="e">The element</param>
/// <remarks>
/// <see cref="IStyleable"/> is obsolete and will be removed in a future version, but for backwards
/// compatibility we need to support code which overrides <see cref="IStyleable.StyleKey"/>.
/// </remarks>
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)

2
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);

28
src/Avalonia.Base/Styling/IStyleable.cs

@ -1,28 +0,0 @@
using System;
using Avalonia.Collections;
namespace Avalonia.Styling
{
/// <summary>
/// Interface for styleable elements.
/// </summary>
[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
{
/// <summary>
/// Gets the list of classes for the control.
/// </summary>
IAvaloniaReadOnlyList<string> Classes { get; }
/// <summary>
/// Gets the type by which the control is styled.
/// </summary>
[Obsolete("Override StyledElement.StyleKeyOverride instead.")]
Type StyleKey { get; }
/// <summary>
/// Gets the template parent of this element if the control comes from a template.
/// </summary>
AvaloniaObject? TemplatedParent { get; }
}
}

4
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;
}

2
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)
{

8
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<Stream> 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<AvaloniaResourcesEntry> resources)
{
var entries = new List<AvaloniaResourcesIndexEntry>();

2
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.

10
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<IDragDropDevice>();
}
[Obsolete($"Use {nameof(DoDragDropAsync)} instead.")]
Task<DragDropEffects> IPlatformDragSource.DoDragDrop(
PointerEventArgs triggerEvent,
IDataObject data,
DragDropEffects allowedEffects)
=> DoDragDropAsync(triggerEvent, new DataObjectToDataTransferWrapper(data), allowedEffects);
public async Task<DragDropEffects> DoDragDropAsync(
PointerEventArgs triggerEvent,
IDataTransfer dataTransfer,

14
src/Avalonia.DesignerSupport/Remote/Stubs.cs

@ -223,26 +223,12 @@ namespace Avalonia.DesignerSupport.Remote
class ClipboardStub : IClipboard
{
public Task<string?> GetTextAsync() => Task.FromResult<string?>(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<string[]> GetFormatsAsync() => Task.FromResult<string[]>([]);
public Task<object?> GetDataAsync(string format) => Task.FromResult<object?>(null);
public Task<IAsyncDataTransfer?> TryGetDataAsync() => Task.FromResult<IAsyncDataTransfer?>(null);
[Obsolete($"Use {nameof(TryGetInProcessDataAsync)} instead.")]
public Task<IDataObject?> TryGetInProcessDataObjectAsync() => Task.FromResult<IDataObject?>(null);
public Task FlushAsync() => Task.CompletedTask;
public Task<IAsyncDataTransfer?> TryGetInProcessDataAsync() => Task.FromResult<IAsyncDataTransfer?>(null);

7
src/Avalonia.Native/AvaloniaNativeDragSource.cs

@ -32,13 +32,6 @@ namespace Avalonia.Native
}
}
[Obsolete($"Use {nameof(DoDragDropAsync)} instead.")]
Task<DragDropEffects> IPlatformDragSource.DoDragDrop(
PointerEventArgs triggerEvent,
IDataObject data,
DragDropEffects allowedEffects)
=> DoDragDropAsync(triggerEvent, new DataObjectToDataTransferWrapper(data), allowedEffects);
public Task<DragDropEffects> DoDragDropAsync(
PointerEventArgs triggerEvent,
IDataTransfer dataTransfer,

4
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 =>
{

130
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<Action> _beforeTest;
private readonly List<Action> _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<Func<TestExecutionContext, Task>> _beforeTest;
private readonly List<Func<TestExecutionContext, Task>> _afterTest;
private AvaloniaTestMethodCommand(
HeadlessUnitTestSession session,
TestCommand innerCommand,
List<Action> beforeTest,
List<Action> afterTest)
List<Func<TestExecutionContext, Task>> beforeTest,
List<Func<TestExecutionContext, Task>> 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<Action>(), new List<Action>());
return ProcessCommand(session, command, [], []);
}
private static TestCommand ProcessCommand(HeadlessUnitTestSession session, TestCommand command, List<Action> before, List<Action> after)
private static TestCommand ProcessCommand(
HeadlessUnitTestSession session,
TestCommand command,
List<Func<TestExecutionContext, Task>> before,
List<Func<TestExecutionContext, Task>> after)
{
if (command is BeforeAndAfterTestCommand beforeAndAfterTestCommand)
var beforeAndAfterTestCommand = command as BeforeAndAfterTestCommand;
if (beforeAndAfterTestCommand is not null)
{
if (s_beforeTest.GetValue(beforeAndAfterTestCommand) is Action<TestExecutionContext> beforeTest)
{
Action<TestExecutionContext> beforeAction = c => before.Add(() => beforeTest(c));
s_beforeTest.SetValue(beforeAndAfterTestCommand, beforeAction);
}
if (s_afterTest.GetValue(beforeAndAfterTestCommand) is Action<TestExecutionContext> afterTest)
ref var beforeTest = ref beforeAndAfterTestCommand.BeforeTest();
if (beforeTest is not null)
{
Action<TestExecutionContext> 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<TestResult> 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<TestExecutionContext> action, List<Func<TestExecutionContext, Task>> 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
};
}

86
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;
/// <summary>
/// 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.
/// </summary>
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<TestExecutionContext>? BeforeAndAfterTestCommand_BeforeTest(BeforeAndAfterTestCommand instance);
[UnsafeAccessor(UnsafeAccessorKind.Field, Name = ReflectionBeforeAndAfterTestCommand.AfterTestFieldName)]
private static extern ref Action<TestExecutionContext>? BeforeAndAfterTestCommand_AfterTest(BeforeAndAfterTestCommand instance);
[UnsafeAccessor(UnsafeAccessorKind.Field, Name = "_setUpMethods")]
private static extern ref IList<IMethodInfo> SetUpTearDownItem_SetUpMethods(SetUpTearDownItem instance);
[UnsafeAccessor(UnsafeAccessorKind.Field, Name = "_tearDownMethods")]
private static extern ref IList<IMethodInfo> SetUpTearDownItem_TearDownMethods(SetUpTearDownItem instance);
extension(DelegatingTestCommand instance)
{
public ref TestCommand InnerCommand()
=> ref DelegatingTestCommand_InnerCommand(instance);
}
extension(BeforeAndAfterTestCommand instance)
{
public ref Action<TestExecutionContext>? BeforeTest()
=> ref BeforeAndAfterTestCommand_BeforeTest(instance);
public ref Action<TestExecutionContext>? AfterTest()
=> ref BeforeAndAfterTestCommand_AfterTest(instance);
}
extension(SetUpTearDownItem instance)
{
public ref IList<IMethodInfo> SetUpMethods()
=> ref SetUpTearDownItem_SetUpMethods(instance);
public ref IList<IMethodInfo> 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);
}
}

8
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));
/// <summary>
/// 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.
/// </summary>
[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));
/// <summary>
/// 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.
/// </summary>

7
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<IDragDropDevice>();
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<IDragDropDevice>();

2
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);
}
}

6
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");

26
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);
}
}

10
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<DragDropEffects> IPlatformDragSource.DoDragDrop(
PointerEventArgs triggerEvent,
IDataObject data,
DragDropEffects allowedEffects)
=> DoDragDropAsync(triggerEvent, new DataObjectToDataTransferWrapper(data), allowedEffects);
public Task<DragDropEffects> DoDragDropAsync(
PointerEventArgs triggerEvent,
IDataTransfer dataTransfer,

32
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

45
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;
}
}
Loading…
Cancel
Save