diff --git a/.ncrunch/Avalonia.HarfBuzz.v3.ncrunchproject b/.ncrunch/Avalonia.HarfBuzz.v3.ncrunchproject
new file mode 100644
index 0000000000..0bcc569d05
--- /dev/null
+++ b/.ncrunch/Avalonia.HarfBuzz.v3.ncrunchproject
@@ -0,0 +1,5 @@
+
+
+ False
+
+
\ No newline at end of file
diff --git a/Avalonia.v3.ncrunchsolution b/Avalonia.v3.ncrunchsolution
index 4de91979d6..f675b66f7b 100644
--- a/Avalonia.v3.ncrunchsolution
+++ b/Avalonia.v3.ncrunchsolution
@@ -13,8 +13,9 @@
TargetFrameworks = net10.0
False
+ True
.ncrunch
True
True
-
+
\ No newline at end of file
diff --git a/api/Avalonia.Android.nupkg.xml b/api/Avalonia.Android.nupkg.xml
index 3c65a6fb9d..6ffd08efe1 100644
--- a/api/Avalonia.Android.nupkg.xml
+++ b/api/Avalonia.Android.nupkg.xml
@@ -1,6 +1,12 @@
+
+ CP0001
+ T:Avalonia.Android.Platform.Specific.IAndroidView
+ baseline/Avalonia.Android/lib/net10.0-android36.0/Avalonia.Android.dll
+ current/Avalonia.Android/lib/net10.0-android36.0/Avalonia.Android.dll
+
CP0008
T:Avalonia.Android.AvaloniaActivity
diff --git a/api/Avalonia.Headless.nupkg.xml b/api/Avalonia.Headless.nupkg.xml
new file mode 100644
index 0000000000..229047057a
--- /dev/null
+++ b/api/Avalonia.Headless.nupkg.xml
@@ -0,0 +1,40 @@
+
+
+
+
+ CP0002
+ M:Avalonia.Headless.HeadlessWindowExtensions.DragDrop(Avalonia.Controls.TopLevel,Avalonia.Point,Avalonia.Input.Raw.RawDragEventType,Avalonia.Input.IDataObject,Avalonia.Input.DragDropEffects,Avalonia.Input.RawInputModifiers)
+ baseline/Avalonia.Headless/lib/net10.0/Avalonia.Headless.dll
+ current/Avalonia.Headless/lib/net10.0/Avalonia.Headless.dll
+
+
+ CP0002
+ M:Avalonia.Headless.HeadlessWindowExtensions.KeyPress(Avalonia.Controls.TopLevel,Avalonia.Input.Key,Avalonia.Input.RawInputModifiers)
+ baseline/Avalonia.Headless/lib/net10.0/Avalonia.Headless.dll
+ current/Avalonia.Headless/lib/net10.0/Avalonia.Headless.dll
+
+
+ CP0002
+ M:Avalonia.Headless.HeadlessWindowExtensions.KeyRelease(Avalonia.Controls.TopLevel,Avalonia.Input.Key,Avalonia.Input.RawInputModifiers)
+ baseline/Avalonia.Headless/lib/net10.0/Avalonia.Headless.dll
+ current/Avalonia.Headless/lib/net10.0/Avalonia.Headless.dll
+
+
+ CP0002
+ M:Avalonia.Headless.HeadlessWindowExtensions.DragDrop(Avalonia.Controls.TopLevel,Avalonia.Point,Avalonia.Input.Raw.RawDragEventType,Avalonia.Input.IDataObject,Avalonia.Input.DragDropEffects,Avalonia.Input.RawInputModifiers)
+ baseline/Avalonia.Headless/lib/net8.0/Avalonia.Headless.dll
+ current/Avalonia.Headless/lib/net8.0/Avalonia.Headless.dll
+
+
+ CP0002
+ M:Avalonia.Headless.HeadlessWindowExtensions.KeyPress(Avalonia.Controls.TopLevel,Avalonia.Input.Key,Avalonia.Input.RawInputModifiers)
+ baseline/Avalonia.Headless/lib/net8.0/Avalonia.Headless.dll
+ current/Avalonia.Headless/lib/net8.0/Avalonia.Headless.dll
+
+
+ CP0002
+ M:Avalonia.Headless.HeadlessWindowExtensions.KeyRelease(Avalonia.Controls.TopLevel,Avalonia.Input.Key,Avalonia.Input.RawInputModifiers)
+ baseline/Avalonia.Headless/lib/net8.0/Avalonia.Headless.dll
+ current/Avalonia.Headless/lib/net8.0/Avalonia.Headless.dll
+
+
diff --git a/api/Avalonia.Skia.nupkg.xml b/api/Avalonia.Skia.nupkg.xml
new file mode 100644
index 0000000000..8e9d60f7d4
--- /dev/null
+++ b/api/Avalonia.Skia.nupkg.xml
@@ -0,0 +1,100 @@
+
+
+
+
+ CP0001
+ T:Avalonia.Skia.ISkiaGpuRenderTarget2
+ baseline/Avalonia.Skia/lib/net10.0/Avalonia.Skia.dll
+ current/Avalonia.Skia/lib/net10.0/Avalonia.Skia.dll
+
+
+ CP0001
+ T:Avalonia.Skia.ISkiaGpuWithPlatformGraphicsContext
+ baseline/Avalonia.Skia/lib/net10.0/Avalonia.Skia.dll
+ current/Avalonia.Skia/lib/net10.0/Avalonia.Skia.dll
+
+
+ CP0001
+ T:Avalonia.Skia.ISkiaGpuRenderTarget2
+ baseline/Avalonia.Skia/lib/net8.0/Avalonia.Skia.dll
+ current/Avalonia.Skia/lib/net8.0/Avalonia.Skia.dll
+
+
+ CP0001
+ T:Avalonia.Skia.ISkiaGpuWithPlatformGraphicsContext
+ baseline/Avalonia.Skia/lib/net8.0/Avalonia.Skia.dll
+ current/Avalonia.Skia/lib/net8.0/Avalonia.Skia.dll
+
+
+ CP0002
+ M:Avalonia.Skia.ISkiaGpuRenderTarget.BeginRenderingSession
+ baseline/Avalonia.Skia/lib/net10.0/Avalonia.Skia.dll
+ current/Avalonia.Skia/lib/net10.0/Avalonia.Skia.dll
+
+
+ CP0002
+ M:Avalonia.Skia.ISkiaGpuRenderTarget.BeginRenderingSession
+ baseline/Avalonia.Skia/lib/net8.0/Avalonia.Skia.dll
+ current/Avalonia.Skia/lib/net8.0/Avalonia.Skia.dll
+
+
+ CP0006
+ M:Avalonia.Skia.ISkiaGpu.TryGetGrContext
+ baseline/Avalonia.Skia/lib/net10.0/Avalonia.Skia.dll
+ current/Avalonia.Skia/lib/net10.0/Avalonia.Skia.dll
+
+
+ CP0006
+ M:Avalonia.Skia.ISkiaGpuRenderTarget.BeginRenderingSession(System.Nullable{Avalonia.PixelSize})
+ baseline/Avalonia.Skia/lib/net10.0/Avalonia.Skia.dll
+ current/Avalonia.Skia/lib/net10.0/Avalonia.Skia.dll
+
+
+ CP0006
+ P:Avalonia.Skia.ISkiaGpu.PlatformGraphicsContext
+ baseline/Avalonia.Skia/lib/net10.0/Avalonia.Skia.dll
+ current/Avalonia.Skia/lib/net10.0/Avalonia.Skia.dll
+
+
+ CP0006
+ M:Avalonia.Skia.ISkiaGpu.TryGetGrContext
+ baseline/Avalonia.Skia/lib/net8.0/Avalonia.Skia.dll
+ current/Avalonia.Skia/lib/net8.0/Avalonia.Skia.dll
+
+
+ CP0006
+ M:Avalonia.Skia.ISkiaGpuRenderTarget.BeginRenderingSession(System.Nullable{Avalonia.PixelSize})
+ baseline/Avalonia.Skia/lib/net8.0/Avalonia.Skia.dll
+ current/Avalonia.Skia/lib/net8.0/Avalonia.Skia.dll
+
+
+ CP0006
+ P:Avalonia.Skia.ISkiaGpu.PlatformGraphicsContext
+ baseline/Avalonia.Skia/lib/net8.0/Avalonia.Skia.dll
+ current/Avalonia.Skia/lib/net8.0/Avalonia.Skia.dll
+
+
+ CP0008
+ T:Avalonia.Skia.ISkiaGpu
+ baseline/Avalonia.Skia/lib/net10.0/Avalonia.Skia.dll
+ current/Avalonia.Skia/lib/net10.0/Avalonia.Skia.dll
+
+
+ CP0008
+ T:Avalonia.Skia.ISkiaGpuWithPlatformGraphicsContext
+ baseline/Avalonia.Skia/lib/net10.0/Avalonia.Skia.dll
+ current/Avalonia.Skia/lib/net10.0/Avalonia.Skia.dll
+
+
+ CP0008
+ T:Avalonia.Skia.ISkiaGpu
+ baseline/Avalonia.Skia/lib/net8.0/Avalonia.Skia.dll
+ current/Avalonia.Skia/lib/net8.0/Avalonia.Skia.dll
+
+
+ CP0008
+ T:Avalonia.Skia.ISkiaGpuWithPlatformGraphicsContext
+ baseline/Avalonia.Skia/lib/net8.0/Avalonia.Skia.dll
+ current/Avalonia.Skia/lib/net8.0/Avalonia.Skia.dll
+
+
diff --git a/api/Avalonia.nupkg.xml b/api/Avalonia.nupkg.xml
index 3858eaa6ff..b7efaf7869 100644
--- a/api/Avalonia.nupkg.xml
+++ b/api/Avalonia.nupkg.xml
@@ -1,12 +1,60 @@
+
+ CP0001
+ T:Avalonia.Animation.CustomAnimatorBase
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
+
+ CP0001
+ T:Avalonia.Animation.CustomAnimatorBase`1
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
+
+ CP0001
+ T:Avalonia.Animation.Easings.CubicBezierEasing
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
CP0001
T:Avalonia.Controls.Primitives.IScrollable
baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
+ CP0001
+ T:Avalonia.Diagnostics.AppliedStyle
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
+
+ CP0001
+ T:Avalonia.Diagnostics.StyledElementExtensions
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
+
+ CP0001
+ T:Avalonia.Diagnostics.StyleDiagnostics
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
+
+ CP0001
+ T:Avalonia.Input.DataObjectExtensions
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
+
+ CP0001
+ T:Avalonia.Input.IDataObject
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
CP0001
T:Avalonia.Media.Fonts.FontFamilyLoader
@@ -19,24 +67,162 @@
baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
+ CP0001
+ T:Avalonia.Platform.IOptionalFeatureProvider
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
CP0001
T:Avalonia.Platform.IReadableBitmapWithAlphaImpl
baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
+ CP0001
+ T:Avalonia.Platform.IRenderTarget2
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
+
+ CP0001
+ T:Avalonia.Platform.IRenderTargetWithProperties
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
+
+ CP0001
+ T:Avalonia.Platform.OptionalFeatureProviderExtensions
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
+
+ CP0001
+ T:Avalonia.Styling.IStyleable
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
CP0001
T:Avalonia.Utilities.StringTokenizer
baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
+ CP0001
+ T:Avalonia.Controls.ApplicationLifetimes.ClassicDesktopStyleApplicationLifetimeOptions
+ baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net10.0/Avalonia.Controls.dll
+
+
+ CP0001
+ T:Avalonia.Controls.ApplicationLifetimes.IActivatableApplicationLifetime
+ baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net10.0/Avalonia.Controls.dll
+
+
+ CP0001
+ T:Avalonia.Controls.AutoCompleteBox.BindingEvaluator`1
+ baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net10.0/Avalonia.Controls.dll
+
+
+ CP0001
+ T:Avalonia.Controls.FileDialog
+ baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net10.0/Avalonia.Controls.dll
+
+
+ CP0001
+ T:Avalonia.Controls.FileDialogFilter
+ baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net10.0/Avalonia.Controls.dll
+
+
+ CP0001
+ T:Avalonia.Controls.FileSystemDialog
+ baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net10.0/Avalonia.Controls.dll
+
+
+ CP0001
+ T:Avalonia.Controls.Generators.TreeContainerIndex
+ baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net10.0/Avalonia.Controls.dll
+
+
+ CP0001
+ T:Avalonia.Controls.Generators.TreeItemContainerGenerator
+ baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net10.0/Avalonia.Controls.dll
+
+
+ CP0001
+ T:Avalonia.Controls.NativeMenuItemToggleType
+ baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net10.0/Avalonia.Controls.dll
+
+
+ CP0001
+ T:Avalonia.Controls.OpenFileDialog
+ baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net10.0/Avalonia.Controls.dll
+
+
+ CP0001
+ T:Avalonia.Controls.OpenFolderDialog
+ baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net10.0/Avalonia.Controls.dll
+
+
+ CP0001
+ T:Avalonia.Controls.Platform.ISystemDialogImpl
+ baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net10.0/Avalonia.Controls.dll
+
CP0001
T:Avalonia.Controls.Primitives.IScrollable
baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll
current/Avalonia/lib/net10.0/Avalonia.Controls.dll
+
+ CP0001
+ T:Avalonia.Controls.SaveFileDialog
+ baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net10.0/Avalonia.Controls.dll
+
+
+ CP0001
+ T:Avalonia.Controls.SystemDialog
+ baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net10.0/Avalonia.Controls.dll
+
+
+ CP0001
+ T:Avalonia.Platform.IApplicationPlatformEvents
+ baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net10.0/Avalonia.Controls.dll
+
+
+ CP0001
+ T:Avalonia.Markup.Xaml.ConstructorArgumentAttribute
+ baseline/Avalonia/lib/net10.0/Avalonia.Markup.Xaml.dll
+ current/Avalonia/lib/net10.0/Avalonia.Markup.Xaml.dll
+
+
+ CP0001
+ T:Avalonia.OpenGL.Surfaces.IGlPlatformSurfaceRenderTarget2
+ baseline/Avalonia/lib/net10.0/Avalonia.OpenGL.dll
+ current/Avalonia/lib/net10.0/Avalonia.OpenGL.dll
+
+
+ CP0001
+ T:Avalonia.OpenGL.Surfaces.IGlPlatformSurfaceRenderTargetWithCorruptionInfo
+ baseline/Avalonia/lib/net10.0/Avalonia.OpenGL.dll
+ current/Avalonia/lib/net10.0/Avalonia.OpenGL.dll
+
CP0001
T:Avalonia.Media.Fonts.FontFamilyLoader
@@ -45,709 +231,1939 @@
CP0001
- T:Avalonia.Controls.Primitives.IScrollable
+ T:Avalonia.Animation.CustomAnimatorBase
baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
current/Avalonia/lib/net8.0/Avalonia.Base.dll
CP0001
- T:Avalonia.Media.Fonts.FontFamilyLoader
+ T:Avalonia.Animation.CustomAnimatorBase`1
baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
current/Avalonia/lib/net8.0/Avalonia.Base.dll
CP0001
- T:Avalonia.Platform.IGeometryContext2
+ T:Avalonia.Animation.Easings.CubicBezierEasing
baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
current/Avalonia/lib/net8.0/Avalonia.Base.dll
CP0001
- T:Avalonia.Platform.IReadableBitmapWithAlphaImpl
+ T:Avalonia.Controls.Primitives.IScrollable
baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
current/Avalonia/lib/net8.0/Avalonia.Base.dll
CP0001
- T:Avalonia.Utilities.StringTokenizer
+ T:Avalonia.Diagnostics.AppliedStyle
baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
current/Avalonia/lib/net8.0/Avalonia.Base.dll
CP0001
- T:Avalonia.Controls.Primitives.IScrollable
- baseline/Avalonia/lib/net8.0/Avalonia.Controls.dll
- current/Avalonia/lib/net8.0/Avalonia.Controls.dll
+ T:Avalonia.Diagnostics.StyledElementExtensions
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
CP0001
- T:Avalonia.Media.Fonts.FontFamilyLoader
- baseline/Avalonia/lib/netstandard2.0/Avalonia.Base.dll
- current/Avalonia/lib/netstandard2.0/Avalonia.Base.dll
+ T:Avalonia.Diagnostics.StyleDiagnostics
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
- CP0002
- F:Avalonia.Media.DrawingImage.ViewboxProperty
- baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
- current/Avalonia/lib/net10.0/Avalonia.Base.dll
+ CP0001
+ T:Avalonia.Input.DataObjectExtensions
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
- CP0002
- F:Avalonia.Media.Fonts.FontCollectionBase._glyphTypefaceCache
- baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
- current/Avalonia/lib/net10.0/Avalonia.Base.dll
+ CP0001
+ T:Avalonia.Input.IDataObject
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
- CP0002
- M:Avalonia.Input.IKeyboardNavigationHandler.Move(Avalonia.Input.IInputElement,Avalonia.Input.NavigationDirection,Avalonia.Input.KeyModifiers)
- baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
- current/Avalonia/lib/net10.0/Avalonia.Base.dll
+ CP0001
+ T:Avalonia.Media.Fonts.FontFamilyLoader
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
- CP0002
- M:Avalonia.Input.KeyboardNavigationHandler.Move(Avalonia.Input.IInputElement,Avalonia.Input.NavigationDirection,Avalonia.Input.KeyModifiers)
- baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
- current/Avalonia/lib/net10.0/Avalonia.Base.dll
+ CP0001
+ T:Avalonia.Platform.IGeometryContext2
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
- CP0002
- M:Avalonia.Input.TextInput.TextInputMethodClient.ShowInputPanel
- baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
- current/Avalonia/lib/net10.0/Avalonia.Base.dll
+ CP0001
+ T:Avalonia.Platform.IOptionalFeatureProvider
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
- CP0002
- M:Avalonia.Media.DrawingImage.get_Viewbox
- baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
- current/Avalonia/lib/net10.0/Avalonia.Base.dll
+ CP0001
+ T:Avalonia.Platform.IReadableBitmapWithAlphaImpl
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
- CP0002
- M:Avalonia.Media.DrawingImage.set_Viewbox(System.Nullable{Avalonia.Rect})
- baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
- current/Avalonia/lib/net10.0/Avalonia.Base.dll
+ CP0001
+ T:Avalonia.Platform.IRenderTarget2
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
- CP0002
- M:Avalonia.Media.Fonts.FontCollectionBase.Initialize(Avalonia.Platform.IFontManagerImpl)
- baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
- current/Avalonia/lib/net10.0/Avalonia.Base.dll
+ CP0001
+ T:Avalonia.Platform.IRenderTargetWithProperties
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
- CP0002
- M:Avalonia.Media.Fonts.IFontCollection.Initialize(Avalonia.Platform.IFontManagerImpl)
- baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
- current/Avalonia/lib/net10.0/Avalonia.Base.dll
+ CP0001
+ T:Avalonia.Platform.OptionalFeatureProviderExtensions
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
- CP0002
- M:Avalonia.Media.Imaging.Bitmap.CopyPixels(Avalonia.Platform.ILockedFramebuffer,Avalonia.Platform.AlphaFormat)
- baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
- current/Avalonia/lib/net10.0/Avalonia.Base.dll
+ CP0001
+ T:Avalonia.Styling.IStyleable
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
- CP0002
- M:Avalonia.Media.StreamGeometryContext.ArcTo(Avalonia.Point,Avalonia.Size,System.Double,System.Boolean,Avalonia.Media.SweepDirection)
- baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
- current/Avalonia/lib/net10.0/Avalonia.Base.dll
+ CP0001
+ T:Avalonia.Utilities.StringTokenizer
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
- CP0002
- M:Avalonia.Media.StreamGeometryContext.CubicBezierTo(Avalonia.Point,Avalonia.Point,Avalonia.Point)
- baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
- current/Avalonia/lib/net10.0/Avalonia.Base.dll
+ CP0001
+ T:Avalonia.Controls.ApplicationLifetimes.ClassicDesktopStyleApplicationLifetimeOptions
+ baseline/Avalonia/lib/net8.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net8.0/Avalonia.Controls.dll
+
+
+ CP0001
+ T:Avalonia.Controls.ApplicationLifetimes.IActivatableApplicationLifetime
+ baseline/Avalonia/lib/net8.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net8.0/Avalonia.Controls.dll
+
+
+ CP0001
+ T:Avalonia.Controls.AutoCompleteBox.BindingEvaluator`1
+ baseline/Avalonia/lib/net8.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net8.0/Avalonia.Controls.dll
+
+
+ CP0001
+ T:Avalonia.Controls.FileDialog
+ baseline/Avalonia/lib/net8.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net8.0/Avalonia.Controls.dll
+
+
+ CP0001
+ T:Avalonia.Controls.FileDialogFilter
+ baseline/Avalonia/lib/net8.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net8.0/Avalonia.Controls.dll
+
+
+ CP0001
+ T:Avalonia.Controls.FileSystemDialog
+ baseline/Avalonia/lib/net8.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net8.0/Avalonia.Controls.dll
+
+
+ CP0001
+ T:Avalonia.Controls.Generators.TreeContainerIndex
+ baseline/Avalonia/lib/net8.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net8.0/Avalonia.Controls.dll
+
+
+ CP0001
+ T:Avalonia.Controls.Generators.TreeItemContainerGenerator
+ baseline/Avalonia/lib/net8.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net8.0/Avalonia.Controls.dll
+
+
+ CP0001
+ T:Avalonia.Controls.NativeMenuItemToggleType
+ baseline/Avalonia/lib/net8.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net8.0/Avalonia.Controls.dll
+
+
+ CP0001
+ T:Avalonia.Controls.OpenFileDialog
+ baseline/Avalonia/lib/net8.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net8.0/Avalonia.Controls.dll
+
+
+ CP0001
+ T:Avalonia.Controls.OpenFolderDialog
+ baseline/Avalonia/lib/net8.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net8.0/Avalonia.Controls.dll
+
+
+ CP0001
+ T:Avalonia.Controls.Platform.ISystemDialogImpl
+ baseline/Avalonia/lib/net8.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net8.0/Avalonia.Controls.dll
+
+
+ CP0001
+ T:Avalonia.Controls.Primitives.IScrollable
+ baseline/Avalonia/lib/net8.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net8.0/Avalonia.Controls.dll
+
+
+ CP0001
+ T:Avalonia.Controls.SaveFileDialog
+ baseline/Avalonia/lib/net8.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net8.0/Avalonia.Controls.dll
+
+
+ CP0001
+ T:Avalonia.Controls.SystemDialog
+ baseline/Avalonia/lib/net8.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net8.0/Avalonia.Controls.dll
+
+
+ CP0001
+ T:Avalonia.Platform.IApplicationPlatformEvents
+ baseline/Avalonia/lib/net8.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net8.0/Avalonia.Controls.dll
+
+
+ CP0001
+ T:Avalonia.Markup.Xaml.ConstructorArgumentAttribute
+ baseline/Avalonia/lib/net8.0/Avalonia.Markup.Xaml.dll
+ current/Avalonia/lib/net8.0/Avalonia.Markup.Xaml.dll
+
+
+ CP0001
+ T:Avalonia.OpenGL.Surfaces.IGlPlatformSurfaceRenderTarget2
+ baseline/Avalonia/lib/net8.0/Avalonia.OpenGL.dll
+ current/Avalonia/lib/net8.0/Avalonia.OpenGL.dll
+
+
+ CP0001
+ T:Avalonia.OpenGL.Surfaces.IGlPlatformSurfaceRenderTargetWithCorruptionInfo
+ baseline/Avalonia/lib/net8.0/Avalonia.OpenGL.dll
+ current/Avalonia/lib/net8.0/Avalonia.OpenGL.dll
+
+
+ CP0001
+ T:Avalonia.Media.Fonts.FontFamilyLoader
+ baseline/Avalonia/lib/netstandard2.0/Avalonia.Base.dll
+ current/Avalonia/lib/netstandard2.0/Avalonia.Base.dll
+
+
+ CP0002
+ F:Avalonia.Controls.ResourcesChangedEventArgs.Empty
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
+
+ CP0002
+ F:Avalonia.Data.BindingPriority.TemplatedParent
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
+
+ CP0002
+ F:Avalonia.Input.DataFormats.FileNames
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
+
+ CP0002
+ F:Avalonia.Input.DataFormats.Files
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
+
+ CP0002
+ F:Avalonia.Input.DataFormats.Text
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
+
+ CP0002
+ F:Avalonia.Media.DrawingImage.ViewboxProperty
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
+
+ CP0002
+ F:Avalonia.Media.Fonts.FontCollectionBase._glyphTypefaceCache
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
+
+ CP0002
+ F:Avalonia.Media.RadialGradientBrush.RadiusProperty
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
+
+ CP0002
+ M:Avalonia.Animation.Animation.SetAnimator(Avalonia.Animation.IAnimationSetter,Avalonia.Animation.CustomAnimatorBase)
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
+
+ CP0002
+ M:Avalonia.AvaloniaObjectExtensions.Bind(Avalonia.AvaloniaObject,Avalonia.AvaloniaProperty,Avalonia.Data.BindingBase,System.Object)
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
+
+ CP0002
+ M:Avalonia.Controls.ResourcesChangedEventArgs.#ctor
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
+
+ CP0002
+ M:Avalonia.Data.CompiledBindingPathBuilder.SetRawSource(System.Object)
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
+
+ CP0002
+ M:Avalonia.Data.ReflectionBinding.#ctor(System.String,Avalonia.Data.BindingMode)
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
+
+ CP0002
+ M:Avalonia.Input.DataObject.Contains(System.String)
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
+
+ CP0002
+ M:Avalonia.Input.DataObject.Get(System.String)
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
+
+ CP0002
+ M:Avalonia.Input.DataObject.GetDataFormats
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
+
+ CP0002
+ M:Avalonia.Input.DataObject.Set(System.String,System.Object)
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
+
+ CP0002
+ M:Avalonia.Input.DragDrop.DoDragDrop(Avalonia.Input.PointerEventArgs,Avalonia.Input.IDataObject,Avalonia.Input.DragDropEffects)
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
+
+ CP0002
+ M:Avalonia.Input.DragEventArgs.#ctor(Avalonia.Interactivity.RoutedEvent{Avalonia.Input.DragEventArgs},Avalonia.Input.IDataObject,Avalonia.Interactivity.Interactive,Avalonia.Point,Avalonia.Input.KeyModifiers)
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
+
+ CP0002
+ M:Avalonia.Input.DragEventArgs.get_Data
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
+
+ CP0002
+ M:Avalonia.Input.IKeyboardNavigationHandler.Move(Avalonia.Input.IInputElement,Avalonia.Input.NavigationDirection,Avalonia.Input.KeyModifiers)
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
+
+ CP0002
+ M:Avalonia.Input.KeyboardNavigationHandler.Move(Avalonia.Input.IInputElement,Avalonia.Input.NavigationDirection,Avalonia.Input.KeyModifiers)
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
+
+ CP0002
+ M:Avalonia.Input.Platform.IClipboard.GetDataAsync(System.String)
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
+
+ CP0002
+ M:Avalonia.Input.Platform.IClipboard.GetFormatsAsync
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
+
+ CP0002
+ M:Avalonia.Input.Platform.IClipboard.GetTextAsync
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
+
+ CP0002
+ M:Avalonia.Input.Platform.IClipboard.SetDataObjectAsync(Avalonia.Input.IDataObject)
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
+
+ CP0002
+ M:Avalonia.Input.Platform.IClipboard.SetTextAsync(System.String)
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
+
+ CP0002
+ M:Avalonia.Input.Platform.IClipboard.TryGetInProcessDataObjectAsync
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
+
+ CP0002
+ M:Avalonia.Input.Platform.IPlatformDragSource.DoDragDrop(Avalonia.Input.PointerEventArgs,Avalonia.Input.IDataObject,Avalonia.Input.DragDropEffects)
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
+
+ CP0002
+ M:Avalonia.Input.Raw.RawDragEvent.#ctor(Avalonia.Input.Raw.IDragDropDevice,Avalonia.Input.Raw.RawDragEventType,Avalonia.Input.IInputRoot,Avalonia.Point,Avalonia.Input.IDataObject,Avalonia.Input.DragDropEffects,Avalonia.Input.RawInputModifiers)
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
+
+ CP0002
+ M:Avalonia.Input.Raw.RawDragEvent.get_Data
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
+
+ CP0002
+ M:Avalonia.Input.Raw.RawKeyEventArgs.#ctor(Avalonia.Input.IInputDevice,System.UInt64,Avalonia.Input.IInputRoot,Avalonia.Input.Raw.RawKeyEventType,Avalonia.Input.Key,Avalonia.Input.RawInputModifiers,Avalonia.Input.PhysicalKey,Avalonia.Input.KeyDeviceType,System.String)
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
+
+ CP0002
+ M:Avalonia.Input.Raw.RawKeyEventArgs.#ctor(Avalonia.Input.IInputDevice,System.UInt64,Avalonia.Input.IInputRoot,Avalonia.Input.Raw.RawKeyEventType,Avalonia.Input.Key,Avalonia.Input.RawInputModifiers,Avalonia.Input.PhysicalKey,System.String)
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
+
+ CP0002
+ M:Avalonia.Input.Raw.RawKeyEventArgs.#ctor(Avalonia.Input.IKeyboardDevice,System.UInt64,Avalonia.Input.IInputRoot,Avalonia.Input.Raw.RawKeyEventType,Avalonia.Input.Key,Avalonia.Input.RawInputModifiers)
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
+
+ CP0002
+ M:Avalonia.Input.TextInput.TextInputMethodClient.ShowInputPanel
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
+
+ CP0002
+ M:Avalonia.Media.Color.ToUint32
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
+
+ CP0002
+ M:Avalonia.Media.DrawingContext.PushPostTransform(Avalonia.Matrix)
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
+
+ CP0002
+ M:Avalonia.Media.DrawingContext.PushPreTransform(Avalonia.Matrix)
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
+
+ CP0002
+ M:Avalonia.Media.DrawingContext.PushTransformContainer
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
+
+ CP0002
+ M:Avalonia.Media.DrawingImage.get_Viewbox
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
+
+ CP0002
+ M:Avalonia.Media.DrawingImage.set_Viewbox(System.Nullable{Avalonia.Rect})
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
+
+ CP0002
+ M:Avalonia.Media.Fonts.FontCollectionBase.Initialize(Avalonia.Platform.IFontManagerImpl)
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
+
+ CP0002
+ M:Avalonia.Media.Fonts.IFontCollection.Initialize(Avalonia.Platform.IFontManagerImpl)
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
+
+ CP0002
+ M:Avalonia.Media.Imaging.Bitmap.CopyPixels(Avalonia.Platform.ILockedFramebuffer,Avalonia.Platform.AlphaFormat)
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
+
+ CP0002
+ M:Avalonia.Media.Immutable.ImmutableRadialGradientBrush.get_Radius
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
+
+ CP0002
+ M:Avalonia.Media.IRadialGradientBrush.get_Radius
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
+
+ CP0002
+ M:Avalonia.Media.RadialGradientBrush.get_Radius
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
+
+ CP0002
+ M:Avalonia.Media.RadialGradientBrush.set_Radius(System.Double)
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
+
+ CP0002
+ M:Avalonia.Media.StreamGeometryContext.ArcTo(Avalonia.Point,Avalonia.Size,System.Double,System.Boolean,Avalonia.Media.SweepDirection)
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
+
+ CP0002
+ M:Avalonia.Media.StreamGeometryContext.CubicBezierTo(Avalonia.Point,Avalonia.Point,Avalonia.Point)
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
+
+ CP0002
+ M:Avalonia.Media.StreamGeometryContext.LineTo(Avalonia.Point)
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
+
+ CP0002
+ M:Avalonia.Media.StreamGeometryContext.QuadraticBezierTo(Avalonia.Point,Avalonia.Point)
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
+
+ CP0002
+ M:Avalonia.Media.TextFormatting.GenericTextRunProperties.#ctor(Avalonia.Media.Typeface,Avalonia.Media.FontFeatureCollection,System.Double,Avalonia.Media.TextDecorationCollection,Avalonia.Media.IBrush,Avalonia.Media.IBrush,Avalonia.Media.BaselineAlignment,System.Globalization.CultureInfo)
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
+
+ CP0002
+ M:Avalonia.Media.TextFormatting.GenericTextRunProperties.#ctor(Avalonia.Media.Typeface,System.Double,Avalonia.Media.TextDecorationCollection,Avalonia.Media.IBrush,Avalonia.Media.IBrush,Avalonia.Media.BaselineAlignment,System.Globalization.CultureInfo)
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
+
+ CP0002
+ M:Avalonia.Media.TextFormatting.TextCollapsingProperties.CreateCollapsedRuns(Avalonia.Media.TextFormatting.TextLine,System.Int32,Avalonia.Media.FlowDirection,Avalonia.Media.TextFormatting.TextRun)
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
+
+ CP0002
+ M:Avalonia.Media.TextFormatting.TextLayout.#ctor(System.String,Avalonia.Media.Typeface,Avalonia.Media.FontFeatureCollection,System.Double,Avalonia.Media.IBrush,Avalonia.Media.TextAlignment,Avalonia.Media.TextWrapping,Avalonia.Media.TextTrimming,Avalonia.Media.TextDecorationCollection,Avalonia.Media.FlowDirection,System.Double,System.Double,System.Double,System.Double,System.Int32,System.Collections.Generic.IReadOnlyList{Avalonia.Utilities.ValueSpan{Avalonia.Media.TextFormatting.TextRunProperties}})
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
+
+ CP0002
+ M:Avalonia.Media.TextFormatting.TextLayout.#ctor(System.String,Avalonia.Media.Typeface,System.Double,Avalonia.Media.IBrush,Avalonia.Media.TextAlignment,Avalonia.Media.TextWrapping,Avalonia.Media.TextTrimming,Avalonia.Media.TextDecorationCollection,Avalonia.Media.FlowDirection,System.Double,System.Double,System.Double,System.Double,System.Int32,System.Collections.Generic.IReadOnlyList{Avalonia.Utilities.ValueSpan{Avalonia.Media.TextFormatting.TextRunProperties}})
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
+
+ CP0002
+ M:Avalonia.Media.TextFormatting.TextShaperOptions.#ctor(Avalonia.Media.GlyphTypeface,System.Collections.Generic.IReadOnlyList{Avalonia.Media.FontFeature},System.Double,System.SByte,System.Globalization.CultureInfo,System.Double,System.Double)
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
+
+ CP0002
+ M:Avalonia.Media.TextFormatting.TextShaperOptions.#ctor(Avalonia.Media.GlyphTypeface,System.Double,System.SByte,System.Globalization.CultureInfo,System.Double,System.Double)
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
+
+ CP0002
+ M:Avalonia.Platform.IDrawingContextImplWithEffects.PushEffect(Avalonia.Media.IEffect)
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
+
+ CP0002
+ M:Avalonia.Platform.IFontManagerImpl.TryMatchCharacter(System.Int32,Avalonia.Media.FontStyle,Avalonia.Media.FontWeight,Avalonia.Media.FontStretch,System.Globalization.CultureInfo,Avalonia.Media.Typeface@)
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
+
+ CP0002
+ M:Avalonia.Platform.IGeometryContext.ArcTo(Avalonia.Point,Avalonia.Size,System.Double,System.Boolean,Avalonia.Media.SweepDirection)
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
+
+ CP0002
+ M:Avalonia.Platform.IGeometryContext.CubicBezierTo(Avalonia.Point,Avalonia.Point,Avalonia.Point)
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
+
+ CP0002
+ M:Avalonia.Platform.IGeometryContext.LineTo(Avalonia.Point)
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
+
+ CP0002
+ M:Avalonia.Platform.IGeometryContext.QuadraticBezierTo(Avalonia.Point,Avalonia.Point)
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
+
+ CP0002
+ M:Avalonia.Platform.IPlatformRenderInterfaceContext.CreateOffscreenRenderTarget(Avalonia.PixelSize,System.Double)
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
+
+ CP0002
+ M:Avalonia.Platform.LockedFramebuffer.#ctor(System.IntPtr,Avalonia.PixelSize,System.Int32,Avalonia.Vector,Avalonia.Platform.PixelFormat,System.Action)
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
+
+ CP0002
+ M:Avalonia.Rendering.Composition.ICompositionGpuImportedObject.get_ImportCompeted
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
+
+ CP0002
+ M:Avalonia.Utilities.AvaloniaResourcesIndexReaderWriter.WriteResources(System.IO.Stream,System.Collections.Generic.List{System.ValueTuple{System.String,System.Int32,System.Func{System.IO.Stream}}})
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
+
+ CP0002
+ M:Avalonia.Visuals.Platform.PathGeometryContext.ArcTo(Avalonia.Point,Avalonia.Size,System.Double,System.Boolean,Avalonia.Media.SweepDirection)
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
+
+ CP0002
+ M:Avalonia.Visuals.Platform.PathGeometryContext.CubicBezierTo(Avalonia.Point,Avalonia.Point,Avalonia.Point)
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
+
+ CP0002
+ M:Avalonia.Visuals.Platform.PathGeometryContext.LineTo(Avalonia.Point)
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
+
+ CP0002
+ M:Avalonia.Visuals.Platform.PathGeometryContext.QuadraticBezierTo(Avalonia.Point,Avalonia.Point)
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
+
+ CP0002
+ F:Avalonia.Controls.ContextMenu.PlacementModeProperty
+ baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net10.0/Avalonia.Controls.dll
+
+
+ CP0002
+ F:Avalonia.Controls.Documents.Inline.TextDecorationsProperty
+ baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net10.0/Avalonia.Controls.dll
+
+
+ CP0002
+ F:Avalonia.Controls.NativeMenuBar.EnableMenuItemClickForwardingProperty
+ baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net10.0/Avalonia.Controls.dll
+
+
+ CP0002
+ F:Avalonia.Controls.NativeMenuItem.ToggleTypeProperty
+ baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net10.0/Avalonia.Controls.dll
+
+
+ CP0002
+ F:Avalonia.Controls.Primitives.Popup.PlacementModeProperty
+ baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net10.0/Avalonia.Controls.dll
+
+
+ CP0002
+ F:Avalonia.Controls.Primitives.ToggleButton.CheckedEvent
+ baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net10.0/Avalonia.Controls.dll
+
+
+ CP0002
+ F:Avalonia.Controls.Primitives.ToggleButton.IndeterminateEvent
+ baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net10.0/Avalonia.Controls.dll
+
+
+ CP0002
+ F:Avalonia.Controls.Primitives.ToggleButton.UncheckedEvent
+ baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net10.0/Avalonia.Controls.dll
+
+
+ CP0002
+ F:Avalonia.Controls.TextBlock.LetterSpacingProperty
+ baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net10.0/Avalonia.Controls.dll
+
+
+ CP0002
+ F:Avalonia.Controls.TextBox.LetterSpacingProperty
+ baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net10.0/Avalonia.Controls.dll
+
+
+ CP0002
+ M:Avalonia.AppBuilder.get_LifetimeOverride
+ baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net10.0/Avalonia.Controls.dll
+
+
+ CP0002
+ M:Avalonia.Application.add_UrlsOpened(System.EventHandler{Avalonia.UrlOpenedEventArgs})
+ baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net10.0/Avalonia.Controls.dll
+
+
+ CP0002
+ M:Avalonia.Application.remove_UrlsOpened(System.EventHandler{Avalonia.UrlOpenedEventArgs})
+ baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net10.0/Avalonia.Controls.dll
+
+
+ CP0002
+ M:Avalonia.Controls.ContextMenu.get_PlacementMode
+ baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net10.0/Avalonia.Controls.dll
+
+
+ CP0002
+ M:Avalonia.Controls.ContextMenu.set_PlacementMode(Avalonia.Controls.PlacementMode)
+ baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net10.0/Avalonia.Controls.dll
+
+
+ CP0002
+ M:Avalonia.Controls.Design.CreatePreviewWithControl(System.Object)
+ baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net10.0/Avalonia.Controls.dll
+
+
+ CP0002
+ M:Avalonia.Controls.Design.GetDataContext(Avalonia.Controls.Templates.IDataTemplate)
+ baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net10.0/Avalonia.Controls.dll
+
+
+ CP0002
+ M:Avalonia.Controls.Design.GetPreviewWith(Avalonia.Controls.Templates.IDataTemplate)
+ baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net10.0/Avalonia.Controls.dll
+
+
+ CP0002
+ M:Avalonia.Controls.Design.GetPreviewWith(Avalonia.Styling.IStyle)
+ baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net10.0/Avalonia.Controls.dll
+
+
+ CP0002
+ M:Avalonia.Controls.Design.SetDataContext(Avalonia.Controls.Templates.IDataTemplate,System.Object)
+ baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net10.0/Avalonia.Controls.dll
+
+
+ CP0002
+ M:Avalonia.Controls.Design.SetPreviewWith(Avalonia.AvaloniaObject,Avalonia.Controls.Control)
+ baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net10.0/Avalonia.Controls.dll
+
+
+ CP0002
+ M:Avalonia.Controls.Design.SetPreviewWith(Avalonia.AvaloniaObject,Avalonia.Controls.ITemplate{Avalonia.Controls.Control})
+ baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net10.0/Avalonia.Controls.dll
+
+
+ CP0002
+ M:Avalonia.Controls.Design.SetPreviewWith(Avalonia.Controls.ResourceDictionary,Avalonia.Controls.ITemplate{Avalonia.Controls.Control})
+ baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net10.0/Avalonia.Controls.dll
+
+
+ CP0002
+ M:Avalonia.Controls.Design.SetPreviewWith(Avalonia.Controls.Templates.IDataTemplate,Avalonia.Controls.Control)
+ baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net10.0/Avalonia.Controls.dll
+
+
+ CP0002
+ M:Avalonia.Controls.Design.SetPreviewWith(Avalonia.Controls.Templates.IDataTemplate,Avalonia.Controls.ITemplate{Avalonia.Controls.Control})
+ baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net10.0/Avalonia.Controls.dll
+
+
+ CP0002
+ M:Avalonia.Controls.Design.SetPreviewWith(Avalonia.Styling.IStyle,Avalonia.Controls.Control)
+ baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net10.0/Avalonia.Controls.dll
+
+
+ CP0002
+ M:Avalonia.Controls.Design.SetPreviewWith(Avalonia.Styling.IStyle,Avalonia.Controls.ITemplate{Avalonia.Controls.Control})
+ baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net10.0/Avalonia.Controls.dll
+
+
+ CP0002
+ M:Avalonia.Controls.Generators.ItemContainerGenerator.ContainerFromIndex(System.Int32)
+ baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net10.0/Avalonia.Controls.dll
+
+
+ CP0002
+ M:Avalonia.Controls.Generators.ItemContainerGenerator.IndexFromContainer(Avalonia.Controls.Control)
+ baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net10.0/Avalonia.Controls.dll
+
+
+ CP0002
+ M:Avalonia.Controls.ItemsControl.ItemsControlFromItemContaner(Avalonia.Controls.Control)
+ baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net10.0/Avalonia.Controls.dll
+
+
+ CP0002
+ M:Avalonia.Controls.NativeMenuBar.SetEnableMenuItemClickForwarding(Avalonia.Controls.MenuItem,System.Boolean)
+ baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net10.0/Avalonia.Controls.dll
+
+
+ CP0002
+ M:Avalonia.Controls.NativeMenuItem.get_ToggleType
+ baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net10.0/Avalonia.Controls.dll
+
+
+ CP0002
+ M:Avalonia.Controls.Platform.IInsetsManager.get_DisplayEdgeToEdge
+ baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net10.0/Avalonia.Controls.dll
+
+
+ CP0002
+ M:Avalonia.Controls.Platform.IInsetsManager.set_DisplayEdgeToEdge(System.Boolean)
+ baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net10.0/Avalonia.Controls.dll
+
+
+ CP0002
+ M:Avalonia.Controls.Platform.InsetsManagerBase.get_DisplayEdgeToEdge
+ baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net10.0/Avalonia.Controls.dll
+
+
+ CP0002
+ M:Avalonia.Controls.Platform.InsetsManagerBase.set_DisplayEdgeToEdge(System.Boolean)
+ baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net10.0/Avalonia.Controls.dll
+
+
+ CP0002
+ M:Avalonia.Controls.Primitives.OverlayPopupHost.ConfigurePosition(Avalonia.Visual,Avalonia.Controls.PlacementMode,Avalonia.Point,Avalonia.Controls.Primitives.PopupPositioning.PopupAnchor,Avalonia.Controls.Primitives.PopupPositioning.PopupGravity,Avalonia.Controls.Primitives.PopupPositioning.PopupPositionerConstraintAdjustment,System.Nullable{Avalonia.Rect})
+ baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net10.0/Avalonia.Controls.dll
+
+
+ CP0002
+ M:Avalonia.Controls.Primitives.OverlayPopupHost.CreatePopupHost(Avalonia.Visual,Avalonia.IAvaloniaDependencyResolver)
+ baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net10.0/Avalonia.Controls.dll
+
+
+ CP0002
+ M:Avalonia.Controls.Primitives.Popup.get_PlacementMode
+ baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net10.0/Avalonia.Controls.dll
+
+
+ CP0002
+ M:Avalonia.Controls.Primitives.Popup.set_PlacementMode(Avalonia.Controls.PlacementMode)
+ baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net10.0/Avalonia.Controls.dll
+
+
+ CP0002
+ M:Avalonia.Controls.Primitives.PopupRoot.ConfigurePosition(Avalonia.Visual,Avalonia.Controls.PlacementMode,Avalonia.Point,Avalonia.Controls.Primitives.PopupPositioning.PopupAnchor,Avalonia.Controls.Primitives.PopupPositioning.PopupGravity,Avalonia.Controls.Primitives.PopupPositioning.PopupPositionerConstraintAdjustment,System.Nullable{Avalonia.Rect})
+ baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net10.0/Avalonia.Controls.dll
+
+
+ CP0002
+ M:Avalonia.Controls.Primitives.TextSearch.GetText(Avalonia.Controls.Control)
+ baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net10.0/Avalonia.Controls.dll
+
+
+ CP0002
+ M:Avalonia.Controls.Primitives.TextSearch.SetText(Avalonia.Controls.Control,System.String)
+ baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net10.0/Avalonia.Controls.dll
+
+
+ CP0002
+ M:Avalonia.Controls.Primitives.ToggleButton.add_Checked(System.EventHandler{Avalonia.Interactivity.RoutedEventArgs})
+ baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net10.0/Avalonia.Controls.dll
+
+
+ CP0002
+ M:Avalonia.Controls.Primitives.ToggleButton.add_Indeterminate(System.EventHandler{Avalonia.Interactivity.RoutedEventArgs})
+ baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net10.0/Avalonia.Controls.dll
+
+
+ CP0002
+ M:Avalonia.Controls.Primitives.ToggleButton.add_Unchecked(System.EventHandler{Avalonia.Interactivity.RoutedEventArgs})
+ baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net10.0/Avalonia.Controls.dll
+
+
+ CP0002
+ M:Avalonia.Controls.Primitives.ToggleButton.OnChecked(Avalonia.Interactivity.RoutedEventArgs)
+ baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net10.0/Avalonia.Controls.dll
+
+
+ CP0002
+ M:Avalonia.Controls.Primitives.ToggleButton.OnIndeterminate(Avalonia.Interactivity.RoutedEventArgs)
+ baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net10.0/Avalonia.Controls.dll
+
+
+ CP0002
+ M:Avalonia.Controls.Primitives.ToggleButton.OnUnchecked(Avalonia.Interactivity.RoutedEventArgs)
+ baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net10.0/Avalonia.Controls.dll
+
+
+ CP0002
+ M:Avalonia.Controls.Primitives.ToggleButton.remove_Checked(System.EventHandler{Avalonia.Interactivity.RoutedEventArgs})
+ baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net10.0/Avalonia.Controls.dll
+
+
+ CP0002
+ M:Avalonia.Controls.Primitives.ToggleButton.remove_Indeterminate(System.EventHandler{Avalonia.Interactivity.RoutedEventArgs})
+ baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net10.0/Avalonia.Controls.dll
+
+
+ CP0002
+ M:Avalonia.Controls.Primitives.ToggleButton.remove_Unchecked(System.EventHandler{Avalonia.Interactivity.RoutedEventArgs})
+ baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net10.0/Avalonia.Controls.dll
+
+
+ CP0002
+ M:Avalonia.Controls.Screens.ScreenFromWindow(Avalonia.Platform.IWindowBaseImpl)
+ baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net10.0/Avalonia.Controls.dll
+
+
+ CP0002
+ M:Avalonia.Controls.TabItem.SubscribeToOwnerProperties(Avalonia.AvaloniaObject)
+ baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net10.0/Avalonia.Controls.dll
+
+
+ CP0002
+ M:Avalonia.Controls.TreeView.get_ItemContainerGenerator
+ baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net10.0/Avalonia.Controls.dll
+
+
+ CP0002
+ M:Avalonia.Controls.Window.SortWindowsByZOrder(Avalonia.Controls.Window[])
+ baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net10.0/Avalonia.Controls.dll
+
+
+ CP0002
+ M:Avalonia.Platform.IWindowImpl.GetWindowsZOrder(System.Span{Avalonia.Controls.Window},System.Span{System.Int64})
+ baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net10.0/Avalonia.Controls.dll
+
+
+ CP0002
+ M:Avalonia.Platform.Screen.#ctor(System.Double,Avalonia.PixelRect,Avalonia.PixelRect,System.Boolean)
+ baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net10.0/Avalonia.Controls.dll
+
+
+ CP0002
+ M:Avalonia.Platform.Screen.get_PixelDensity
+ baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net10.0/Avalonia.Controls.dll
+
+
+ CP0002
+ M:Avalonia.Platform.Screen.get_Primary
+ baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net10.0/Avalonia.Controls.dll
+
+
+ CP0002
+ M:Avalonia.Platform.Screen.set_Bounds(Avalonia.PixelRect)
+ baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net10.0/Avalonia.Controls.dll
+
+
+ CP0002
+ M:Avalonia.Platform.Screen.set_CurrentOrientation(Avalonia.Platform.ScreenOrientation)
+ baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net10.0/Avalonia.Controls.dll
+
+
+ CP0002
+ M:Avalonia.Platform.Screen.set_DisplayName(System.String)
+ baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net10.0/Avalonia.Controls.dll
+
+
+ CP0002
+ M:Avalonia.Platform.Screen.set_IsPrimary(System.Boolean)
+ baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net10.0/Avalonia.Controls.dll
+
+
+ CP0002
+ M:Avalonia.Platform.Screen.set_Scaling(System.Double)
+ baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net10.0/Avalonia.Controls.dll
+
+
+ CP0002
+ M:Avalonia.Platform.Screen.set_WorkingArea(Avalonia.PixelRect)
+ baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net10.0/Avalonia.Controls.dll
+
+
+ CP0002
+ M:Avalonia.Dialogs.ManagedFileDialogExtensions.ShowManagedAsync(Avalonia.Controls.OpenFileDialog,Avalonia.Controls.Window,Avalonia.Dialogs.ManagedFileDialogOptions)
+ baseline/Avalonia/lib/net10.0/Avalonia.Dialogs.dll
+ current/Avalonia/lib/net10.0/Avalonia.Dialogs.dll
+
+
+ CP0002
+ M:Avalonia.Dialogs.ManagedFileDialogExtensions.ShowManagedAsync``1(Avalonia.Controls.OpenFileDialog,Avalonia.Controls.Window,Avalonia.Dialogs.ManagedFileDialogOptions)
+ baseline/Avalonia/lib/net10.0/Avalonia.Dialogs.dll
+ current/Avalonia/lib/net10.0/Avalonia.Dialogs.dll
+
+
+ CP0002
+ M:Avalonia.Data.Binding.#ctor(System.String,Avalonia.Data.BindingMode)
+ baseline/Avalonia/lib/net10.0/Avalonia.Markup.dll
+ current/Avalonia/lib/net10.0/Avalonia.Markup.dll
+
+
+ CP0002
+ M:Avalonia.Markup.Xaml.MarkupExtensions.ReflectionBindingExtension.#ctor(System.String,Avalonia.Data.BindingMode)
+ baseline/Avalonia/lib/net10.0/Avalonia.Markup.Xaml.dll
+ current/Avalonia/lib/net10.0/Avalonia.Markup.Xaml.dll
+
+
+ CP0002
+ M:Avalonia.Markup.Xaml.XamlLoadException.#ctor(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext)
+ baseline/Avalonia/lib/net10.0/Avalonia.Markup.Xaml.dll
+ current/Avalonia/lib/net10.0/Avalonia.Markup.Xaml.dll
+
+
+ CP0002
+ M:Avalonia.OpenGL.Egl.EglPlatformSurfaceRenderTargetBase.BeginDraw
+ baseline/Avalonia/lib/net10.0/Avalonia.OpenGL.dll
+ current/Avalonia/lib/net10.0/Avalonia.OpenGL.dll
+
+
+ CP0002
+ M:Avalonia.OpenGL.Egl.EglPlatformSurfaceRenderTargetBase.BeginDrawCore
+ baseline/Avalonia/lib/net10.0/Avalonia.OpenGL.dll
+ current/Avalonia/lib/net10.0/Avalonia.OpenGL.dll
+
+
+ CP0002
+ M:Avalonia.OpenGL.Surfaces.IGlPlatformSurfaceRenderTarget.BeginDraw
+ baseline/Avalonia/lib/net10.0/Avalonia.OpenGL.dll
+ current/Avalonia/lib/net10.0/Avalonia.OpenGL.dll
+
+
+ CP0002
+ F:Avalonia.Media.Fonts.FontCollectionBase._glyphTypefaceCache
+ baseline/Avalonia/lib/net6.0/Avalonia.Base.dll
+ current/Avalonia/lib/net6.0/Avalonia.Base.dll
+
+
+ CP0002
+ M:Avalonia.Media.Fonts.FontCollectionBase.Initialize(Avalonia.Platform.IFontManagerImpl)
+ baseline/Avalonia/lib/net6.0/Avalonia.Base.dll
+ current/Avalonia/lib/net6.0/Avalonia.Base.dll
+
+
+ CP0002
+ M:Avalonia.Media.Fonts.IFontCollection.Initialize(Avalonia.Platform.IFontManagerImpl)
+ baseline/Avalonia/lib/net6.0/Avalonia.Base.dll
+ current/Avalonia/lib/net6.0/Avalonia.Base.dll
+
+
+ CP0002
+ M:Avalonia.Platform.IFontManagerImpl.TryMatchCharacter(System.Int32,Avalonia.Media.FontStyle,Avalonia.Media.FontWeight,Avalonia.Media.FontStretch,System.Globalization.CultureInfo,Avalonia.Media.Typeface@)
+ baseline/Avalonia/lib/net6.0/Avalonia.Base.dll
+ current/Avalonia/lib/net6.0/Avalonia.Base.dll
+
+
+ CP0002
+ M:Avalonia.Dialogs.Internal.ManagedFileChooserFilterViewModel.#ctor(Avalonia.Platform.Storage.FilePickerFileType)
+ baseline/Avalonia/lib/net6.0/Avalonia.Dialogs.dll
+ current/Avalonia/lib/net6.0/Avalonia.Dialogs.dll
+
+
+ CP0002
+ F:Avalonia.Controls.ResourcesChangedEventArgs.Empty
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
+
+
+ CP0002
+ F:Avalonia.Data.BindingPriority.TemplatedParent
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
+
+
+ CP0002
+ F:Avalonia.Input.DataFormats.FileNames
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
+
+
+ CP0002
+ F:Avalonia.Input.DataFormats.Files
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
+
+
+ CP0002
+ F:Avalonia.Input.DataFormats.Text
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
+
+
+ CP0002
+ F:Avalonia.Media.DrawingImage.ViewboxProperty
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
+
+
+ CP0002
+ F:Avalonia.Media.Fonts.FontCollectionBase._glyphTypefaceCache
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
+
+
+ CP0002
+ F:Avalonia.Media.RadialGradientBrush.RadiusProperty
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
+
+
+ CP0002
+ M:Avalonia.Animation.Animation.SetAnimator(Avalonia.Animation.IAnimationSetter,Avalonia.Animation.CustomAnimatorBase)
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
+
+
+ CP0002
+ M:Avalonia.AvaloniaObjectExtensions.Bind(Avalonia.AvaloniaObject,Avalonia.AvaloniaProperty,Avalonia.Data.BindingBase,System.Object)
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
+
+
+ CP0002
+ M:Avalonia.Controls.ResourcesChangedEventArgs.#ctor
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
+
+
+ CP0002
+ M:Avalonia.Data.CompiledBindingPathBuilder.SetRawSource(System.Object)
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
+
+
+ CP0002
+ M:Avalonia.Data.ReflectionBinding.#ctor(System.String,Avalonia.Data.BindingMode)
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
+
+
+ CP0002
+ M:Avalonia.Input.DataObject.Contains(System.String)
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
+
+
+ CP0002
+ M:Avalonia.Input.DataObject.Get(System.String)
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
+
+
+ CP0002
+ M:Avalonia.Input.DataObject.GetDataFormats
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
+
+
+ CP0002
+ M:Avalonia.Input.DataObject.Set(System.String,System.Object)
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
+
+
+ CP0002
+ M:Avalonia.Input.DragDrop.DoDragDrop(Avalonia.Input.PointerEventArgs,Avalonia.Input.IDataObject,Avalonia.Input.DragDropEffects)
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
+
+
+ CP0002
+ M:Avalonia.Input.DragEventArgs.#ctor(Avalonia.Interactivity.RoutedEvent{Avalonia.Input.DragEventArgs},Avalonia.Input.IDataObject,Avalonia.Interactivity.Interactive,Avalonia.Point,Avalonia.Input.KeyModifiers)
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
+
+
+ CP0002
+ M:Avalonia.Input.DragEventArgs.get_Data
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
+
+
+ CP0002
+ M:Avalonia.Input.IKeyboardNavigationHandler.Move(Avalonia.Input.IInputElement,Avalonia.Input.NavigationDirection,Avalonia.Input.KeyModifiers)
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
+
+
+ CP0002
+ M:Avalonia.Input.KeyboardNavigationHandler.Move(Avalonia.Input.IInputElement,Avalonia.Input.NavigationDirection,Avalonia.Input.KeyModifiers)
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
+
+
+ CP0002
+ M:Avalonia.Input.Platform.IClipboard.GetDataAsync(System.String)
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
+
+
+ CP0002
+ M:Avalonia.Input.Platform.IClipboard.GetFormatsAsync
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
+
+
+ CP0002
+ M:Avalonia.Input.Platform.IClipboard.GetTextAsync
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
+
+
+ CP0002
+ M:Avalonia.Input.Platform.IClipboard.SetDataObjectAsync(Avalonia.Input.IDataObject)
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
+
+
+ CP0002
+ M:Avalonia.Input.Platform.IClipboard.SetTextAsync(System.String)
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
+
+
+ CP0002
+ M:Avalonia.Input.Platform.IClipboard.TryGetInProcessDataObjectAsync
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
+
+
+ CP0002
+ M:Avalonia.Input.Platform.IPlatformDragSource.DoDragDrop(Avalonia.Input.PointerEventArgs,Avalonia.Input.IDataObject,Avalonia.Input.DragDropEffects)
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
+
+
+ CP0002
+ M:Avalonia.Input.Raw.RawDragEvent.#ctor(Avalonia.Input.Raw.IDragDropDevice,Avalonia.Input.Raw.RawDragEventType,Avalonia.Input.IInputRoot,Avalonia.Point,Avalonia.Input.IDataObject,Avalonia.Input.DragDropEffects,Avalonia.Input.RawInputModifiers)
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
+
+
+ CP0002
+ M:Avalonia.Input.Raw.RawDragEvent.get_Data
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
+
+
+ CP0002
+ M:Avalonia.Input.Raw.RawKeyEventArgs.#ctor(Avalonia.Input.IInputDevice,System.UInt64,Avalonia.Input.IInputRoot,Avalonia.Input.Raw.RawKeyEventType,Avalonia.Input.Key,Avalonia.Input.RawInputModifiers,Avalonia.Input.PhysicalKey,Avalonia.Input.KeyDeviceType,System.String)
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
+
+
+ CP0002
+ M:Avalonia.Input.Raw.RawKeyEventArgs.#ctor(Avalonia.Input.IInputDevice,System.UInt64,Avalonia.Input.IInputRoot,Avalonia.Input.Raw.RawKeyEventType,Avalonia.Input.Key,Avalonia.Input.RawInputModifiers,Avalonia.Input.PhysicalKey,System.String)
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
+
+
+ CP0002
+ M:Avalonia.Input.Raw.RawKeyEventArgs.#ctor(Avalonia.Input.IKeyboardDevice,System.UInt64,Avalonia.Input.IInputRoot,Avalonia.Input.Raw.RawKeyEventType,Avalonia.Input.Key,Avalonia.Input.RawInputModifiers)
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
CP0002
- M:Avalonia.Media.StreamGeometryContext.LineTo(Avalonia.Point)
- baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
- current/Avalonia/lib/net10.0/Avalonia.Base.dll
+ M:Avalonia.Input.TextInput.TextInputMethodClient.ShowInputPanel
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
CP0002
- M:Avalonia.Media.StreamGeometryContext.QuadraticBezierTo(Avalonia.Point,Avalonia.Point)
- baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
- current/Avalonia/lib/net10.0/Avalonia.Base.dll
+ M:Avalonia.Media.Color.ToUint32
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
CP0002
- M:Avalonia.Media.TextFormatting.GenericTextRunProperties.#ctor(Avalonia.Media.Typeface,Avalonia.Media.FontFeatureCollection,System.Double,Avalonia.Media.TextDecorationCollection,Avalonia.Media.IBrush,Avalonia.Media.IBrush,Avalonia.Media.BaselineAlignment,System.Globalization.CultureInfo)
- baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
- current/Avalonia/lib/net10.0/Avalonia.Base.dll
+ M:Avalonia.Media.DrawingContext.PushPostTransform(Avalonia.Matrix)
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
CP0002
- M:Avalonia.Media.TextFormatting.GenericTextRunProperties.#ctor(Avalonia.Media.Typeface,System.Double,Avalonia.Media.TextDecorationCollection,Avalonia.Media.IBrush,Avalonia.Media.IBrush,Avalonia.Media.BaselineAlignment,System.Globalization.CultureInfo)
- baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
- current/Avalonia/lib/net10.0/Avalonia.Base.dll
+ M:Avalonia.Media.DrawingContext.PushPreTransform(Avalonia.Matrix)
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
CP0002
- M:Avalonia.Media.TextFormatting.TextCollapsingProperties.CreateCollapsedRuns(Avalonia.Media.TextFormatting.TextLine,System.Int32,Avalonia.Media.FlowDirection,Avalonia.Media.TextFormatting.TextRun)
- baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
- current/Avalonia/lib/net10.0/Avalonia.Base.dll
+ M:Avalonia.Media.DrawingContext.PushTransformContainer
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
CP0002
- M:Avalonia.Media.TextFormatting.TextLayout.#ctor(System.String,Avalonia.Media.Typeface,Avalonia.Media.FontFeatureCollection,System.Double,Avalonia.Media.IBrush,Avalonia.Media.TextAlignment,Avalonia.Media.TextWrapping,Avalonia.Media.TextTrimming,Avalonia.Media.TextDecorationCollection,Avalonia.Media.FlowDirection,System.Double,System.Double,System.Double,System.Double,System.Int32,System.Collections.Generic.IReadOnlyList{Avalonia.Utilities.ValueSpan{Avalonia.Media.TextFormatting.TextRunProperties}})
- baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
- current/Avalonia/lib/net10.0/Avalonia.Base.dll
+ M:Avalonia.Media.DrawingImage.get_Viewbox
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
CP0002
- M:Avalonia.Media.TextFormatting.TextLayout.#ctor(System.String,Avalonia.Media.Typeface,System.Double,Avalonia.Media.IBrush,Avalonia.Media.TextAlignment,Avalonia.Media.TextWrapping,Avalonia.Media.TextTrimming,Avalonia.Media.TextDecorationCollection,Avalonia.Media.FlowDirection,System.Double,System.Double,System.Double,System.Double,System.Int32,System.Collections.Generic.IReadOnlyList{Avalonia.Utilities.ValueSpan{Avalonia.Media.TextFormatting.TextRunProperties}})
- baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
- current/Avalonia/lib/net10.0/Avalonia.Base.dll
+ M:Avalonia.Media.DrawingImage.set_Viewbox(System.Nullable{Avalonia.Rect})
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
CP0002
- M:Avalonia.Media.TextFormatting.TextShaperOptions.#ctor(Avalonia.Media.GlyphTypeface,System.Collections.Generic.IReadOnlyList{Avalonia.Media.FontFeature},System.Double,System.SByte,System.Globalization.CultureInfo,System.Double,System.Double)
- baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
- current/Avalonia/lib/net10.0/Avalonia.Base.dll
+ M:Avalonia.Media.Fonts.FontCollectionBase.Initialize(Avalonia.Platform.IFontManagerImpl)
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
CP0002
- M:Avalonia.Media.TextFormatting.TextShaperOptions.#ctor(Avalonia.Media.GlyphTypeface,System.Double,System.SByte,System.Globalization.CultureInfo,System.Double,System.Double)
- baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
- current/Avalonia/lib/net10.0/Avalonia.Base.dll
+ M:Avalonia.Media.Fonts.IFontCollection.Initialize(Avalonia.Platform.IFontManagerImpl)
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
CP0002
- M:Avalonia.Platform.IDrawingContextImplWithEffects.PushEffect(Avalonia.Media.IEffect)
- baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
- current/Avalonia/lib/net10.0/Avalonia.Base.dll
+ M:Avalonia.Media.Imaging.Bitmap.CopyPixels(Avalonia.Platform.ILockedFramebuffer,Avalonia.Platform.AlphaFormat)
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
CP0002
- M:Avalonia.Platform.IFontManagerImpl.TryMatchCharacter(System.Int32,Avalonia.Media.FontStyle,Avalonia.Media.FontWeight,Avalonia.Media.FontStretch,System.Globalization.CultureInfo,Avalonia.Media.Typeface@)
- baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
- current/Avalonia/lib/net10.0/Avalonia.Base.dll
+ M:Avalonia.Media.Immutable.ImmutableRadialGradientBrush.get_Radius
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
CP0002
- M:Avalonia.Platform.IGeometryContext.ArcTo(Avalonia.Point,Avalonia.Size,System.Double,System.Boolean,Avalonia.Media.SweepDirection)
- baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
- current/Avalonia/lib/net10.0/Avalonia.Base.dll
+ M:Avalonia.Media.IRadialGradientBrush.get_Radius
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
CP0002
- M:Avalonia.Platform.IGeometryContext.CubicBezierTo(Avalonia.Point,Avalonia.Point,Avalonia.Point)
- baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
- current/Avalonia/lib/net10.0/Avalonia.Base.dll
+ M:Avalonia.Media.RadialGradientBrush.get_Radius
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
CP0002
- M:Avalonia.Platform.IGeometryContext.LineTo(Avalonia.Point)
- baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
- current/Avalonia/lib/net10.0/Avalonia.Base.dll
+ M:Avalonia.Media.RadialGradientBrush.set_Radius(System.Double)
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
CP0002
- M:Avalonia.Platform.IGeometryContext.QuadraticBezierTo(Avalonia.Point,Avalonia.Point)
- baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
- current/Avalonia/lib/net10.0/Avalonia.Base.dll
+ M:Avalonia.Media.StreamGeometryContext.ArcTo(Avalonia.Point,Avalonia.Size,System.Double,System.Boolean,Avalonia.Media.SweepDirection)
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
CP0002
- M:Avalonia.Platform.LockedFramebuffer.#ctor(System.IntPtr,Avalonia.PixelSize,System.Int32,Avalonia.Vector,Avalonia.Platform.PixelFormat,System.Action)
- baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
- current/Avalonia/lib/net10.0/Avalonia.Base.dll
+ M:Avalonia.Media.StreamGeometryContext.CubicBezierTo(Avalonia.Point,Avalonia.Point,Avalonia.Point)
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
CP0002
- M:Avalonia.Visuals.Platform.PathGeometryContext.ArcTo(Avalonia.Point,Avalonia.Size,System.Double,System.Boolean,Avalonia.Media.SweepDirection)
- baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
- current/Avalonia/lib/net10.0/Avalonia.Base.dll
+ M:Avalonia.Media.StreamGeometryContext.LineTo(Avalonia.Point)
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
CP0002
- M:Avalonia.Visuals.Platform.PathGeometryContext.CubicBezierTo(Avalonia.Point,Avalonia.Point,Avalonia.Point)
- baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
- current/Avalonia/lib/net10.0/Avalonia.Base.dll
+ M:Avalonia.Media.StreamGeometryContext.QuadraticBezierTo(Avalonia.Point,Avalonia.Point)
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
CP0002
- M:Avalonia.Visuals.Platform.PathGeometryContext.LineTo(Avalonia.Point)
- baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
- current/Avalonia/lib/net10.0/Avalonia.Base.dll
+ M:Avalonia.Media.TextFormatting.GenericTextRunProperties.#ctor(Avalonia.Media.Typeface,Avalonia.Media.FontFeatureCollection,System.Double,Avalonia.Media.TextDecorationCollection,Avalonia.Media.IBrush,Avalonia.Media.IBrush,Avalonia.Media.BaselineAlignment,System.Globalization.CultureInfo)
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
CP0002
- M:Avalonia.Visuals.Platform.PathGeometryContext.QuadraticBezierTo(Avalonia.Point,Avalonia.Point)
- baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
- current/Avalonia/lib/net10.0/Avalonia.Base.dll
+ M:Avalonia.Media.TextFormatting.GenericTextRunProperties.#ctor(Avalonia.Media.Typeface,System.Double,Avalonia.Media.TextDecorationCollection,Avalonia.Media.IBrush,Avalonia.Media.IBrush,Avalonia.Media.BaselineAlignment,System.Globalization.CultureInfo)
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
CP0002
- F:Avalonia.Controls.Documents.Inline.TextDecorationsProperty
- baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll
- current/Avalonia/lib/net10.0/Avalonia.Controls.dll
+ M:Avalonia.Media.TextFormatting.TextCollapsingProperties.CreateCollapsedRuns(Avalonia.Media.TextFormatting.TextLine,System.Int32,Avalonia.Media.FlowDirection,Avalonia.Media.TextFormatting.TextRun)
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
CP0002
- F:Avalonia.Controls.TextBlock.LetterSpacingProperty
- baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll
- current/Avalonia/lib/net10.0/Avalonia.Controls.dll
+ M:Avalonia.Media.TextFormatting.TextLayout.#ctor(System.String,Avalonia.Media.Typeface,Avalonia.Media.FontFeatureCollection,System.Double,Avalonia.Media.IBrush,Avalonia.Media.TextAlignment,Avalonia.Media.TextWrapping,Avalonia.Media.TextTrimming,Avalonia.Media.TextDecorationCollection,Avalonia.Media.FlowDirection,System.Double,System.Double,System.Double,System.Double,System.Int32,System.Collections.Generic.IReadOnlyList{Avalonia.Utilities.ValueSpan{Avalonia.Media.TextFormatting.TextRunProperties}})
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
CP0002
- F:Avalonia.Controls.TextBox.LetterSpacingProperty
- baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll
- current/Avalonia/lib/net10.0/Avalonia.Controls.dll
+ M:Avalonia.Media.TextFormatting.TextLayout.#ctor(System.String,Avalonia.Media.Typeface,System.Double,Avalonia.Media.IBrush,Avalonia.Media.TextAlignment,Avalonia.Media.TextWrapping,Avalonia.Media.TextTrimming,Avalonia.Media.TextDecorationCollection,Avalonia.Media.FlowDirection,System.Double,System.Double,System.Double,System.Double,System.Int32,System.Collections.Generic.IReadOnlyList{Avalonia.Utilities.ValueSpan{Avalonia.Media.TextFormatting.TextRunProperties}})
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
CP0002
- M:Avalonia.Controls.Design.CreatePreviewWithControl(System.Object)
- baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll
- current/Avalonia/lib/net10.0/Avalonia.Controls.dll
+ M:Avalonia.Media.TextFormatting.TextShaperOptions.#ctor(Avalonia.Media.GlyphTypeface,System.Collections.Generic.IReadOnlyList{Avalonia.Media.FontFeature},System.Double,System.SByte,System.Globalization.CultureInfo,System.Double,System.Double)
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
CP0002
- M:Avalonia.Controls.Design.GetDataContext(Avalonia.Controls.Templates.IDataTemplate)
- baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll
- current/Avalonia/lib/net10.0/Avalonia.Controls.dll
+ M:Avalonia.Media.TextFormatting.TextShaperOptions.#ctor(Avalonia.Media.GlyphTypeface,System.Double,System.SByte,System.Globalization.CultureInfo,System.Double,System.Double)
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
CP0002
- M:Avalonia.Controls.Design.GetPreviewWith(Avalonia.Controls.Templates.IDataTemplate)
- baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll
- current/Avalonia/lib/net10.0/Avalonia.Controls.dll
+ M:Avalonia.Platform.IDrawingContextImplWithEffects.PushEffect(Avalonia.Media.IEffect)
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
CP0002
- M:Avalonia.Controls.Design.GetPreviewWith(Avalonia.Styling.IStyle)
- baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll
- current/Avalonia/lib/net10.0/Avalonia.Controls.dll
+ M:Avalonia.Platform.IFontManagerImpl.TryMatchCharacter(System.Int32,Avalonia.Media.FontStyle,Avalonia.Media.FontWeight,Avalonia.Media.FontStretch,System.Globalization.CultureInfo,Avalonia.Media.Typeface@)
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
CP0002
- M:Avalonia.Controls.Design.SetDataContext(Avalonia.Controls.Templates.IDataTemplate,System.Object)
- baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll
- current/Avalonia/lib/net10.0/Avalonia.Controls.dll
+ M:Avalonia.Platform.IGeometryContext.ArcTo(Avalonia.Point,Avalonia.Size,System.Double,System.Boolean,Avalonia.Media.SweepDirection)
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
CP0002
- M:Avalonia.Controls.Design.SetPreviewWith(Avalonia.AvaloniaObject,Avalonia.Controls.Control)
- baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll
- current/Avalonia/lib/net10.0/Avalonia.Controls.dll
+ M:Avalonia.Platform.IGeometryContext.CubicBezierTo(Avalonia.Point,Avalonia.Point,Avalonia.Point)
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
CP0002
- M:Avalonia.Controls.Design.SetPreviewWith(Avalonia.AvaloniaObject,Avalonia.Controls.ITemplate{Avalonia.Controls.Control})
- baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll
- current/Avalonia/lib/net10.0/Avalonia.Controls.dll
+ M:Avalonia.Platform.IGeometryContext.LineTo(Avalonia.Point)
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
CP0002
- M:Avalonia.Controls.Design.SetPreviewWith(Avalonia.Controls.ResourceDictionary,Avalonia.Controls.ITemplate{Avalonia.Controls.Control})
- baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll
- current/Avalonia/lib/net10.0/Avalonia.Controls.dll
+ M:Avalonia.Platform.IGeometryContext.QuadraticBezierTo(Avalonia.Point,Avalonia.Point)
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
CP0002
- M:Avalonia.Controls.Design.SetPreviewWith(Avalonia.Controls.Templates.IDataTemplate,Avalonia.Controls.Control)
- baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll
- current/Avalonia/lib/net10.0/Avalonia.Controls.dll
+ M:Avalonia.Platform.IPlatformRenderInterfaceContext.CreateOffscreenRenderTarget(Avalonia.PixelSize,System.Double)
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
CP0002
- M:Avalonia.Controls.Design.SetPreviewWith(Avalonia.Controls.Templates.IDataTemplate,Avalonia.Controls.ITemplate{Avalonia.Controls.Control})
- baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll
- current/Avalonia/lib/net10.0/Avalonia.Controls.dll
+ M:Avalonia.Platform.LockedFramebuffer.#ctor(System.IntPtr,Avalonia.PixelSize,System.Int32,Avalonia.Vector,Avalonia.Platform.PixelFormat,System.Action)
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
CP0002
- M:Avalonia.Controls.Design.SetPreviewWith(Avalonia.Styling.IStyle,Avalonia.Controls.Control)
- baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll
- current/Avalonia/lib/net10.0/Avalonia.Controls.dll
+ M:Avalonia.Rendering.Composition.ICompositionGpuImportedObject.get_ImportCompeted
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
CP0002
- M:Avalonia.Controls.Design.SetPreviewWith(Avalonia.Styling.IStyle,Avalonia.Controls.ITemplate{Avalonia.Controls.Control})
- baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll
- current/Avalonia/lib/net10.0/Avalonia.Controls.dll
+ M:Avalonia.Utilities.AvaloniaResourcesIndexReaderWriter.WriteResources(System.IO.Stream,System.Collections.Generic.List{System.ValueTuple{System.String,System.Int32,System.Func{System.IO.Stream}}})
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
CP0002
- M:Avalonia.Controls.Primitives.TextSearch.GetText(Avalonia.Controls.Control)
- baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll
- current/Avalonia/lib/net10.0/Avalonia.Controls.dll
+ M:Avalonia.Visuals.Platform.PathGeometryContext.ArcTo(Avalonia.Point,Avalonia.Size,System.Double,System.Boolean,Avalonia.Media.SweepDirection)
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
CP0002
- M:Avalonia.Controls.Primitives.TextSearch.SetText(Avalonia.Controls.Control,System.String)
- baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll
- current/Avalonia/lib/net10.0/Avalonia.Controls.dll
+ M:Avalonia.Visuals.Platform.PathGeometryContext.CubicBezierTo(Avalonia.Point,Avalonia.Point,Avalonia.Point)
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
CP0002
- M:Avalonia.Platform.Screen.#ctor(System.Double,Avalonia.PixelRect,Avalonia.PixelRect,System.Boolean)
- baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll
- current/Avalonia/lib/net10.0/Avalonia.Controls.dll
+ M:Avalonia.Visuals.Platform.PathGeometryContext.LineTo(Avalonia.Point)
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
CP0002
- M:Avalonia.Platform.Screen.set_Bounds(Avalonia.PixelRect)
- baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll
- current/Avalonia/lib/net10.0/Avalonia.Controls.dll
+ M:Avalonia.Visuals.Platform.PathGeometryContext.QuadraticBezierTo(Avalonia.Point,Avalonia.Point)
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
CP0002
- M:Avalonia.Platform.Screen.set_CurrentOrientation(Avalonia.Platform.ScreenOrientation)
- baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll
- current/Avalonia/lib/net10.0/Avalonia.Controls.dll
+ F:Avalonia.Controls.ContextMenu.PlacementModeProperty
+ baseline/Avalonia/lib/net8.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net8.0/Avalonia.Controls.dll
CP0002
- M:Avalonia.Platform.Screen.set_DisplayName(System.String)
- baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll
- current/Avalonia/lib/net10.0/Avalonia.Controls.dll
+ F:Avalonia.Controls.Documents.Inline.TextDecorationsProperty
+ baseline/Avalonia/lib/net8.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net8.0/Avalonia.Controls.dll
CP0002
- M:Avalonia.Platform.Screen.set_IsPrimary(System.Boolean)
- baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll
- current/Avalonia/lib/net10.0/Avalonia.Controls.dll
+ F:Avalonia.Controls.NativeMenuBar.EnableMenuItemClickForwardingProperty
+ baseline/Avalonia/lib/net8.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net8.0/Avalonia.Controls.dll
CP0002
- M:Avalonia.Platform.Screen.set_Scaling(System.Double)
- baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll
- current/Avalonia/lib/net10.0/Avalonia.Controls.dll
+ F:Avalonia.Controls.NativeMenuItem.ToggleTypeProperty
+ baseline/Avalonia/lib/net8.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net8.0/Avalonia.Controls.dll
CP0002
- M:Avalonia.Platform.Screen.set_WorkingArea(Avalonia.PixelRect)
- baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll
- current/Avalonia/lib/net10.0/Avalonia.Controls.dll
+ F:Avalonia.Controls.Primitives.Popup.PlacementModeProperty
+ baseline/Avalonia/lib/net8.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net8.0/Avalonia.Controls.dll
CP0002
- F:Avalonia.Media.Fonts.FontCollectionBase._glyphTypefaceCache
- baseline/Avalonia/lib/net6.0/Avalonia.Base.dll
- current/Avalonia/lib/net6.0/Avalonia.Base.dll
+ F:Avalonia.Controls.Primitives.ToggleButton.CheckedEvent
+ baseline/Avalonia/lib/net8.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net8.0/Avalonia.Controls.dll
CP0002
- M:Avalonia.Media.Fonts.FontCollectionBase.Initialize(Avalonia.Platform.IFontManagerImpl)
- baseline/Avalonia/lib/net6.0/Avalonia.Base.dll
- current/Avalonia/lib/net6.0/Avalonia.Base.dll
+ F:Avalonia.Controls.Primitives.ToggleButton.IndeterminateEvent
+ baseline/Avalonia/lib/net8.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net8.0/Avalonia.Controls.dll
CP0002
- M:Avalonia.Media.Fonts.IFontCollection.Initialize(Avalonia.Platform.IFontManagerImpl)
- baseline/Avalonia/lib/net6.0/Avalonia.Base.dll
- current/Avalonia/lib/net6.0/Avalonia.Base.dll
+ F:Avalonia.Controls.Primitives.ToggleButton.UncheckedEvent
+ baseline/Avalonia/lib/net8.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net8.0/Avalonia.Controls.dll
CP0002
- M:Avalonia.Platform.IFontManagerImpl.TryMatchCharacter(System.Int32,Avalonia.Media.FontStyle,Avalonia.Media.FontWeight,Avalonia.Media.FontStretch,System.Globalization.CultureInfo,Avalonia.Media.Typeface@)
- baseline/Avalonia/lib/net6.0/Avalonia.Base.dll
- current/Avalonia/lib/net6.0/Avalonia.Base.dll
+ F:Avalonia.Controls.TextBlock.LetterSpacingProperty
+ baseline/Avalonia/lib/net8.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net8.0/Avalonia.Controls.dll
CP0002
- M:Avalonia.Dialogs.Internal.ManagedFileChooserFilterViewModel.#ctor(Avalonia.Platform.Storage.FilePickerFileType)
- baseline/Avalonia/lib/net6.0/Avalonia.Dialogs.dll
- current/Avalonia/lib/net6.0/Avalonia.Dialogs.dll
+ F:Avalonia.Controls.TextBox.LetterSpacingProperty
+ baseline/Avalonia/lib/net8.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net8.0/Avalonia.Controls.dll
CP0002
- F:Avalonia.Media.DrawingImage.ViewboxProperty
- baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
- current/Avalonia/lib/net8.0/Avalonia.Base.dll
+ M:Avalonia.AppBuilder.get_LifetimeOverride
+ baseline/Avalonia/lib/net8.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net8.0/Avalonia.Controls.dll
CP0002
- F:Avalonia.Media.Fonts.FontCollectionBase._glyphTypefaceCache
- baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
- current/Avalonia/lib/net8.0/Avalonia.Base.dll
+ M:Avalonia.Application.add_UrlsOpened(System.EventHandler{Avalonia.UrlOpenedEventArgs})
+ baseline/Avalonia/lib/net8.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net8.0/Avalonia.Controls.dll
CP0002
- M:Avalonia.Input.IKeyboardNavigationHandler.Move(Avalonia.Input.IInputElement,Avalonia.Input.NavigationDirection,Avalonia.Input.KeyModifiers)
- baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
- current/Avalonia/lib/net8.0/Avalonia.Base.dll
+ M:Avalonia.Application.remove_UrlsOpened(System.EventHandler{Avalonia.UrlOpenedEventArgs})
+ baseline/Avalonia/lib/net8.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net8.0/Avalonia.Controls.dll
CP0002
- M:Avalonia.Input.KeyboardNavigationHandler.Move(Avalonia.Input.IInputElement,Avalonia.Input.NavigationDirection,Avalonia.Input.KeyModifiers)
- baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
- current/Avalonia/lib/net8.0/Avalonia.Base.dll
+ M:Avalonia.Controls.ContextMenu.get_PlacementMode
+ baseline/Avalonia/lib/net8.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net8.0/Avalonia.Controls.dll
CP0002
- M:Avalonia.Input.TextInput.TextInputMethodClient.ShowInputPanel
- baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
- current/Avalonia/lib/net8.0/Avalonia.Base.dll
+ M:Avalonia.Controls.ContextMenu.set_PlacementMode(Avalonia.Controls.PlacementMode)
+ baseline/Avalonia/lib/net8.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net8.0/Avalonia.Controls.dll
CP0002
- M:Avalonia.Media.DrawingImage.get_Viewbox
- baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
- current/Avalonia/lib/net8.0/Avalonia.Base.dll
+ M:Avalonia.Controls.Design.CreatePreviewWithControl(System.Object)
+ baseline/Avalonia/lib/net8.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net8.0/Avalonia.Controls.dll
CP0002
- M:Avalonia.Media.DrawingImage.set_Viewbox(System.Nullable{Avalonia.Rect})
- baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
- current/Avalonia/lib/net8.0/Avalonia.Base.dll
+ M:Avalonia.Controls.Design.GetDataContext(Avalonia.Controls.Templates.IDataTemplate)
+ baseline/Avalonia/lib/net8.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net8.0/Avalonia.Controls.dll
CP0002
- M:Avalonia.Media.Fonts.FontCollectionBase.Initialize(Avalonia.Platform.IFontManagerImpl)
- baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
- current/Avalonia/lib/net8.0/Avalonia.Base.dll
+ M:Avalonia.Controls.Design.GetPreviewWith(Avalonia.Controls.Templates.IDataTemplate)
+ baseline/Avalonia/lib/net8.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net8.0/Avalonia.Controls.dll
CP0002
- M:Avalonia.Media.Fonts.IFontCollection.Initialize(Avalonia.Platform.IFontManagerImpl)
- baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
- current/Avalonia/lib/net8.0/Avalonia.Base.dll
+ M:Avalonia.Controls.Design.GetPreviewWith(Avalonia.Styling.IStyle)
+ baseline/Avalonia/lib/net8.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net8.0/Avalonia.Controls.dll
CP0002
- M:Avalonia.Media.Imaging.Bitmap.CopyPixels(Avalonia.Platform.ILockedFramebuffer,Avalonia.Platform.AlphaFormat)
- baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
- current/Avalonia/lib/net8.0/Avalonia.Base.dll
+ M:Avalonia.Controls.Design.SetDataContext(Avalonia.Controls.Templates.IDataTemplate,System.Object)
+ baseline/Avalonia/lib/net8.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net8.0/Avalonia.Controls.dll
CP0002
- M:Avalonia.Media.StreamGeometryContext.ArcTo(Avalonia.Point,Avalonia.Size,System.Double,System.Boolean,Avalonia.Media.SweepDirection)
- baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
- current/Avalonia/lib/net8.0/Avalonia.Base.dll
+ M:Avalonia.Controls.Design.SetPreviewWith(Avalonia.AvaloniaObject,Avalonia.Controls.Control)
+ baseline/Avalonia/lib/net8.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net8.0/Avalonia.Controls.dll
CP0002
- M:Avalonia.Media.StreamGeometryContext.CubicBezierTo(Avalonia.Point,Avalonia.Point,Avalonia.Point)
- baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
- current/Avalonia/lib/net8.0/Avalonia.Base.dll
+ M:Avalonia.Controls.Design.SetPreviewWith(Avalonia.AvaloniaObject,Avalonia.Controls.ITemplate{Avalonia.Controls.Control})
+ baseline/Avalonia/lib/net8.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net8.0/Avalonia.Controls.dll
CP0002
- M:Avalonia.Media.StreamGeometryContext.LineTo(Avalonia.Point)
- baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
- current/Avalonia/lib/net8.0/Avalonia.Base.dll
+ M:Avalonia.Controls.Design.SetPreviewWith(Avalonia.Controls.ResourceDictionary,Avalonia.Controls.ITemplate{Avalonia.Controls.Control})
+ baseline/Avalonia/lib/net8.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net8.0/Avalonia.Controls.dll
CP0002
- M:Avalonia.Media.StreamGeometryContext.QuadraticBezierTo(Avalonia.Point,Avalonia.Point)
- baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
- current/Avalonia/lib/net8.0/Avalonia.Base.dll
+ M:Avalonia.Controls.Design.SetPreviewWith(Avalonia.Controls.Templates.IDataTemplate,Avalonia.Controls.Control)
+ baseline/Avalonia/lib/net8.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net8.0/Avalonia.Controls.dll
CP0002
- M:Avalonia.Media.TextFormatting.GenericTextRunProperties.#ctor(Avalonia.Media.Typeface,Avalonia.Media.FontFeatureCollection,System.Double,Avalonia.Media.TextDecorationCollection,Avalonia.Media.IBrush,Avalonia.Media.IBrush,Avalonia.Media.BaselineAlignment,System.Globalization.CultureInfo)
- baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
- current/Avalonia/lib/net8.0/Avalonia.Base.dll
+ M:Avalonia.Controls.Design.SetPreviewWith(Avalonia.Controls.Templates.IDataTemplate,Avalonia.Controls.ITemplate{Avalonia.Controls.Control})
+ baseline/Avalonia/lib/net8.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net8.0/Avalonia.Controls.dll
CP0002
- M:Avalonia.Media.TextFormatting.GenericTextRunProperties.#ctor(Avalonia.Media.Typeface,System.Double,Avalonia.Media.TextDecorationCollection,Avalonia.Media.IBrush,Avalonia.Media.IBrush,Avalonia.Media.BaselineAlignment,System.Globalization.CultureInfo)
- baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
- current/Avalonia/lib/net8.0/Avalonia.Base.dll
+ M:Avalonia.Controls.Design.SetPreviewWith(Avalonia.Styling.IStyle,Avalonia.Controls.Control)
+ baseline/Avalonia/lib/net8.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net8.0/Avalonia.Controls.dll
CP0002
- M:Avalonia.Media.TextFormatting.TextCollapsingProperties.CreateCollapsedRuns(Avalonia.Media.TextFormatting.TextLine,System.Int32,Avalonia.Media.FlowDirection,Avalonia.Media.TextFormatting.TextRun)
- baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
- current/Avalonia/lib/net8.0/Avalonia.Base.dll
+ M:Avalonia.Controls.Design.SetPreviewWith(Avalonia.Styling.IStyle,Avalonia.Controls.ITemplate{Avalonia.Controls.Control})
+ baseline/Avalonia/lib/net8.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net8.0/Avalonia.Controls.dll
CP0002
- M:Avalonia.Media.TextFormatting.TextLayout.#ctor(System.String,Avalonia.Media.Typeface,Avalonia.Media.FontFeatureCollection,System.Double,Avalonia.Media.IBrush,Avalonia.Media.TextAlignment,Avalonia.Media.TextWrapping,Avalonia.Media.TextTrimming,Avalonia.Media.TextDecorationCollection,Avalonia.Media.FlowDirection,System.Double,System.Double,System.Double,System.Double,System.Int32,System.Collections.Generic.IReadOnlyList{Avalonia.Utilities.ValueSpan{Avalonia.Media.TextFormatting.TextRunProperties}})
- baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
- current/Avalonia/lib/net8.0/Avalonia.Base.dll
+ M:Avalonia.Controls.Generators.ItemContainerGenerator.ContainerFromIndex(System.Int32)
+ baseline/Avalonia/lib/net8.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net8.0/Avalonia.Controls.dll
CP0002
- M:Avalonia.Media.TextFormatting.TextLayout.#ctor(System.String,Avalonia.Media.Typeface,System.Double,Avalonia.Media.IBrush,Avalonia.Media.TextAlignment,Avalonia.Media.TextWrapping,Avalonia.Media.TextTrimming,Avalonia.Media.TextDecorationCollection,Avalonia.Media.FlowDirection,System.Double,System.Double,System.Double,System.Double,System.Int32,System.Collections.Generic.IReadOnlyList{Avalonia.Utilities.ValueSpan{Avalonia.Media.TextFormatting.TextRunProperties}})
- baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
- current/Avalonia/lib/net8.0/Avalonia.Base.dll
+ M:Avalonia.Controls.Generators.ItemContainerGenerator.IndexFromContainer(Avalonia.Controls.Control)
+ baseline/Avalonia/lib/net8.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net8.0/Avalonia.Controls.dll
CP0002
- M:Avalonia.Media.TextFormatting.TextShaperOptions.#ctor(Avalonia.Media.GlyphTypeface,System.Collections.Generic.IReadOnlyList{Avalonia.Media.FontFeature},System.Double,System.SByte,System.Globalization.CultureInfo,System.Double,System.Double)
- baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
- current/Avalonia/lib/net8.0/Avalonia.Base.dll
+ M:Avalonia.Controls.ItemsControl.ItemsControlFromItemContaner(Avalonia.Controls.Control)
+ baseline/Avalonia/lib/net8.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net8.0/Avalonia.Controls.dll
CP0002
- M:Avalonia.Media.TextFormatting.TextShaperOptions.#ctor(Avalonia.Media.GlyphTypeface,System.Double,System.SByte,System.Globalization.CultureInfo,System.Double,System.Double)
- baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
- current/Avalonia/lib/net8.0/Avalonia.Base.dll
+ M:Avalonia.Controls.NativeMenuBar.SetEnableMenuItemClickForwarding(Avalonia.Controls.MenuItem,System.Boolean)
+ baseline/Avalonia/lib/net8.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net8.0/Avalonia.Controls.dll
CP0002
- M:Avalonia.Platform.IDrawingContextImplWithEffects.PushEffect(Avalonia.Media.IEffect)
- baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
- current/Avalonia/lib/net8.0/Avalonia.Base.dll
+ M:Avalonia.Controls.NativeMenuItem.get_ToggleType
+ baseline/Avalonia/lib/net8.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net8.0/Avalonia.Controls.dll
CP0002
- M:Avalonia.Platform.IFontManagerImpl.TryMatchCharacter(System.Int32,Avalonia.Media.FontStyle,Avalonia.Media.FontWeight,Avalonia.Media.FontStretch,System.Globalization.CultureInfo,Avalonia.Media.Typeface@)
- baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
- current/Avalonia/lib/net8.0/Avalonia.Base.dll
+ M:Avalonia.Controls.Platform.IInsetsManager.get_DisplayEdgeToEdge
+ baseline/Avalonia/lib/net8.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net8.0/Avalonia.Controls.dll
CP0002
- M:Avalonia.Platform.IGeometryContext.ArcTo(Avalonia.Point,Avalonia.Size,System.Double,System.Boolean,Avalonia.Media.SweepDirection)
- baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
- current/Avalonia/lib/net8.0/Avalonia.Base.dll
+ M:Avalonia.Controls.Platform.IInsetsManager.set_DisplayEdgeToEdge(System.Boolean)
+ baseline/Avalonia/lib/net8.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net8.0/Avalonia.Controls.dll
CP0002
- M:Avalonia.Platform.IGeometryContext.CubicBezierTo(Avalonia.Point,Avalonia.Point,Avalonia.Point)
- baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
- current/Avalonia/lib/net8.0/Avalonia.Base.dll
+ M:Avalonia.Controls.Platform.InsetsManagerBase.get_DisplayEdgeToEdge
+ baseline/Avalonia/lib/net8.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net8.0/Avalonia.Controls.dll
CP0002
- M:Avalonia.Platform.IGeometryContext.LineTo(Avalonia.Point)
- baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
- current/Avalonia/lib/net8.0/Avalonia.Base.dll
+ M:Avalonia.Controls.Platform.InsetsManagerBase.set_DisplayEdgeToEdge(System.Boolean)
+ baseline/Avalonia/lib/net8.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net8.0/Avalonia.Controls.dll
CP0002
- M:Avalonia.Platform.IGeometryContext.QuadraticBezierTo(Avalonia.Point,Avalonia.Point)
- baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
- current/Avalonia/lib/net8.0/Avalonia.Base.dll
+ M:Avalonia.Controls.Primitives.OverlayPopupHost.ConfigurePosition(Avalonia.Visual,Avalonia.Controls.PlacementMode,Avalonia.Point,Avalonia.Controls.Primitives.PopupPositioning.PopupAnchor,Avalonia.Controls.Primitives.PopupPositioning.PopupGravity,Avalonia.Controls.Primitives.PopupPositioning.PopupPositionerConstraintAdjustment,System.Nullable{Avalonia.Rect})
+ baseline/Avalonia/lib/net8.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net8.0/Avalonia.Controls.dll
CP0002
- M:Avalonia.Platform.LockedFramebuffer.#ctor(System.IntPtr,Avalonia.PixelSize,System.Int32,Avalonia.Vector,Avalonia.Platform.PixelFormat,System.Action)
- baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
- current/Avalonia/lib/net8.0/Avalonia.Base.dll
+ M:Avalonia.Controls.Primitives.OverlayPopupHost.CreatePopupHost(Avalonia.Visual,Avalonia.IAvaloniaDependencyResolver)
+ baseline/Avalonia/lib/net8.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net8.0/Avalonia.Controls.dll
CP0002
- M:Avalonia.Visuals.Platform.PathGeometryContext.ArcTo(Avalonia.Point,Avalonia.Size,System.Double,System.Boolean,Avalonia.Media.SweepDirection)
- baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
- current/Avalonia/lib/net8.0/Avalonia.Base.dll
+ M:Avalonia.Controls.Primitives.Popup.get_PlacementMode
+ baseline/Avalonia/lib/net8.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net8.0/Avalonia.Controls.dll
CP0002
- M:Avalonia.Visuals.Platform.PathGeometryContext.CubicBezierTo(Avalonia.Point,Avalonia.Point,Avalonia.Point)
- baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
- current/Avalonia/lib/net8.0/Avalonia.Base.dll
+ M:Avalonia.Controls.Primitives.Popup.set_PlacementMode(Avalonia.Controls.PlacementMode)
+ baseline/Avalonia/lib/net8.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net8.0/Avalonia.Controls.dll
CP0002
- M:Avalonia.Visuals.Platform.PathGeometryContext.LineTo(Avalonia.Point)
- baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
- current/Avalonia/lib/net8.0/Avalonia.Base.dll
+ M:Avalonia.Controls.Primitives.PopupRoot.ConfigurePosition(Avalonia.Visual,Avalonia.Controls.PlacementMode,Avalonia.Point,Avalonia.Controls.Primitives.PopupPositioning.PopupAnchor,Avalonia.Controls.Primitives.PopupPositioning.PopupGravity,Avalonia.Controls.Primitives.PopupPositioning.PopupPositionerConstraintAdjustment,System.Nullable{Avalonia.Rect})
+ baseline/Avalonia/lib/net8.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net8.0/Avalonia.Controls.dll
CP0002
- M:Avalonia.Visuals.Platform.PathGeometryContext.QuadraticBezierTo(Avalonia.Point,Avalonia.Point)
- baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
- current/Avalonia/lib/net8.0/Avalonia.Base.dll
+ M:Avalonia.Controls.Primitives.TextSearch.GetText(Avalonia.Controls.Control)
+ baseline/Avalonia/lib/net8.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net8.0/Avalonia.Controls.dll
CP0002
- F:Avalonia.Controls.Documents.Inline.TextDecorationsProperty
+ M:Avalonia.Controls.Primitives.TextSearch.SetText(Avalonia.Controls.Control,System.String)
baseline/Avalonia/lib/net8.0/Avalonia.Controls.dll
current/Avalonia/lib/net8.0/Avalonia.Controls.dll
CP0002
- F:Avalonia.Controls.TextBlock.LetterSpacingProperty
+ M:Avalonia.Controls.Primitives.ToggleButton.add_Checked(System.EventHandler{Avalonia.Interactivity.RoutedEventArgs})
baseline/Avalonia/lib/net8.0/Avalonia.Controls.dll
current/Avalonia/lib/net8.0/Avalonia.Controls.dll
CP0002
- F:Avalonia.Controls.TextBox.LetterSpacingProperty
+ M:Avalonia.Controls.Primitives.ToggleButton.add_Indeterminate(System.EventHandler{Avalonia.Interactivity.RoutedEventArgs})
baseline/Avalonia/lib/net8.0/Avalonia.Controls.dll
current/Avalonia/lib/net8.0/Avalonia.Controls.dll
CP0002
- M:Avalonia.Controls.Design.CreatePreviewWithControl(System.Object)
+ M:Avalonia.Controls.Primitives.ToggleButton.add_Unchecked(System.EventHandler{Avalonia.Interactivity.RoutedEventArgs})
baseline/Avalonia/lib/net8.0/Avalonia.Controls.dll
current/Avalonia/lib/net8.0/Avalonia.Controls.dll
CP0002
- M:Avalonia.Controls.Design.GetDataContext(Avalonia.Controls.Templates.IDataTemplate)
+ M:Avalonia.Controls.Primitives.ToggleButton.OnChecked(Avalonia.Interactivity.RoutedEventArgs)
baseline/Avalonia/lib/net8.0/Avalonia.Controls.dll
current/Avalonia/lib/net8.0/Avalonia.Controls.dll
CP0002
- M:Avalonia.Controls.Design.GetPreviewWith(Avalonia.Controls.Templates.IDataTemplate)
+ M:Avalonia.Controls.Primitives.ToggleButton.OnIndeterminate(Avalonia.Interactivity.RoutedEventArgs)
baseline/Avalonia/lib/net8.0/Avalonia.Controls.dll
current/Avalonia/lib/net8.0/Avalonia.Controls.dll
CP0002
- M:Avalonia.Controls.Design.GetPreviewWith(Avalonia.Styling.IStyle)
+ M:Avalonia.Controls.Primitives.ToggleButton.OnUnchecked(Avalonia.Interactivity.RoutedEventArgs)
baseline/Avalonia/lib/net8.0/Avalonia.Controls.dll
current/Avalonia/lib/net8.0/Avalonia.Controls.dll
CP0002
- M:Avalonia.Controls.Design.SetDataContext(Avalonia.Controls.Templates.IDataTemplate,System.Object)
+ M:Avalonia.Controls.Primitives.ToggleButton.remove_Checked(System.EventHandler{Avalonia.Interactivity.RoutedEventArgs})
baseline/Avalonia/lib/net8.0/Avalonia.Controls.dll
current/Avalonia/lib/net8.0/Avalonia.Controls.dll
CP0002
- M:Avalonia.Controls.Design.SetPreviewWith(Avalonia.AvaloniaObject,Avalonia.Controls.Control)
+ M:Avalonia.Controls.Primitives.ToggleButton.remove_Indeterminate(System.EventHandler{Avalonia.Interactivity.RoutedEventArgs})
baseline/Avalonia/lib/net8.0/Avalonia.Controls.dll
current/Avalonia/lib/net8.0/Avalonia.Controls.dll
CP0002
- M:Avalonia.Controls.Design.SetPreviewWith(Avalonia.AvaloniaObject,Avalonia.Controls.ITemplate{Avalonia.Controls.Control})
+ M:Avalonia.Controls.Primitives.ToggleButton.remove_Unchecked(System.EventHandler{Avalonia.Interactivity.RoutedEventArgs})
baseline/Avalonia/lib/net8.0/Avalonia.Controls.dll
current/Avalonia/lib/net8.0/Avalonia.Controls.dll
CP0002
- M:Avalonia.Controls.Design.SetPreviewWith(Avalonia.Controls.ResourceDictionary,Avalonia.Controls.ITemplate{Avalonia.Controls.Control})
+ M:Avalonia.Controls.Screens.ScreenFromWindow(Avalonia.Platform.IWindowBaseImpl)
baseline/Avalonia/lib/net8.0/Avalonia.Controls.dll
current/Avalonia/lib/net8.0/Avalonia.Controls.dll
CP0002
- M:Avalonia.Controls.Design.SetPreviewWith(Avalonia.Controls.Templates.IDataTemplate,Avalonia.Controls.Control)
+ M:Avalonia.Controls.TabItem.SubscribeToOwnerProperties(Avalonia.AvaloniaObject)
baseline/Avalonia/lib/net8.0/Avalonia.Controls.dll
current/Avalonia/lib/net8.0/Avalonia.Controls.dll
CP0002
- M:Avalonia.Controls.Design.SetPreviewWith(Avalonia.Controls.Templates.IDataTemplate,Avalonia.Controls.ITemplate{Avalonia.Controls.Control})
+ M:Avalonia.Controls.TreeView.get_ItemContainerGenerator
baseline/Avalonia/lib/net8.0/Avalonia.Controls.dll
current/Avalonia/lib/net8.0/Avalonia.Controls.dll
CP0002
- M:Avalonia.Controls.Design.SetPreviewWith(Avalonia.Styling.IStyle,Avalonia.Controls.Control)
+ M:Avalonia.Controls.Window.SortWindowsByZOrder(Avalonia.Controls.Window[])
baseline/Avalonia/lib/net8.0/Avalonia.Controls.dll
current/Avalonia/lib/net8.0/Avalonia.Controls.dll
CP0002
- M:Avalonia.Controls.Design.SetPreviewWith(Avalonia.Styling.IStyle,Avalonia.Controls.ITemplate{Avalonia.Controls.Control})
+ M:Avalonia.Platform.IWindowImpl.GetWindowsZOrder(System.Span{Avalonia.Controls.Window},System.Span{System.Int64})
baseline/Avalonia/lib/net8.0/Avalonia.Controls.dll
current/Avalonia/lib/net8.0/Avalonia.Controls.dll
CP0002
- M:Avalonia.Controls.Primitives.TextSearch.GetText(Avalonia.Controls.Control)
+ M:Avalonia.Platform.Screen.#ctor(System.Double,Avalonia.PixelRect,Avalonia.PixelRect,System.Boolean)
baseline/Avalonia/lib/net8.0/Avalonia.Controls.dll
current/Avalonia/lib/net8.0/Avalonia.Controls.dll
CP0002
- M:Avalonia.Controls.Primitives.TextSearch.SetText(Avalonia.Controls.Control,System.String)
+ M:Avalonia.Platform.Screen.get_PixelDensity
baseline/Avalonia/lib/net8.0/Avalonia.Controls.dll
current/Avalonia/lib/net8.0/Avalonia.Controls.dll
CP0002
- M:Avalonia.Platform.Screen.#ctor(System.Double,Avalonia.PixelRect,Avalonia.PixelRect,System.Boolean)
+ M:Avalonia.Platform.Screen.get_Primary
baseline/Avalonia/lib/net8.0/Avalonia.Controls.dll
current/Avalonia/lib/net8.0/Avalonia.Controls.dll
@@ -793,6 +2209,54 @@
baseline/Avalonia/lib/net8.0/Avalonia.Dialogs.dll
current/Avalonia/lib/net8.0/Avalonia.Dialogs.dll
+
+ CP0002
+ M:Avalonia.Dialogs.ManagedFileDialogExtensions.ShowManagedAsync(Avalonia.Controls.OpenFileDialog,Avalonia.Controls.Window,Avalonia.Dialogs.ManagedFileDialogOptions)
+ baseline/Avalonia/lib/net8.0/Avalonia.Dialogs.dll
+ current/Avalonia/lib/net8.0/Avalonia.Dialogs.dll
+
+
+ CP0002
+ M:Avalonia.Dialogs.ManagedFileDialogExtensions.ShowManagedAsync``1(Avalonia.Controls.OpenFileDialog,Avalonia.Controls.Window,Avalonia.Dialogs.ManagedFileDialogOptions)
+ baseline/Avalonia/lib/net8.0/Avalonia.Dialogs.dll
+ current/Avalonia/lib/net8.0/Avalonia.Dialogs.dll
+
+
+ CP0002
+ M:Avalonia.Data.Binding.#ctor(System.String,Avalonia.Data.BindingMode)
+ baseline/Avalonia/lib/net8.0/Avalonia.Markup.dll
+ current/Avalonia/lib/net8.0/Avalonia.Markup.dll
+
+
+ CP0002
+ M:Avalonia.Markup.Xaml.MarkupExtensions.ReflectionBindingExtension.#ctor(System.String,Avalonia.Data.BindingMode)
+ baseline/Avalonia/lib/net8.0/Avalonia.Markup.Xaml.dll
+ current/Avalonia/lib/net8.0/Avalonia.Markup.Xaml.dll
+
+
+ CP0002
+ M:Avalonia.Markup.Xaml.XamlLoadException.#ctor(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext)
+ baseline/Avalonia/lib/net8.0/Avalonia.Markup.Xaml.dll
+ current/Avalonia/lib/net8.0/Avalonia.Markup.Xaml.dll
+
+
+ CP0002
+ M:Avalonia.OpenGL.Egl.EglPlatformSurfaceRenderTargetBase.BeginDraw
+ baseline/Avalonia/lib/net8.0/Avalonia.OpenGL.dll
+ current/Avalonia/lib/net8.0/Avalonia.OpenGL.dll
+
+
+ CP0002
+ M:Avalonia.OpenGL.Egl.EglPlatformSurfaceRenderTargetBase.BeginDrawCore
+ baseline/Avalonia/lib/net8.0/Avalonia.OpenGL.dll
+ current/Avalonia/lib/net8.0/Avalonia.OpenGL.dll
+
+
+ CP0002
+ M:Avalonia.OpenGL.Surfaces.IGlPlatformSurfaceRenderTarget.BeginDraw
+ baseline/Avalonia/lib/net8.0/Avalonia.OpenGL.dll
+ current/Avalonia/lib/net8.0/Avalonia.OpenGL.dll
+
CP0002
F:Avalonia.Media.Fonts.FontCollectionBase._glyphTypefaceCache
@@ -835,6 +2299,18 @@
baseline/netstandard2.0/Avalonia.Base.dll
target/netstandard2.0/Avalonia.Base.dll
+
+ CP0005
+ M:Avalonia.OpenGL.Egl.EglPlatformSurfaceRenderTargetBase.BeginDrawCore(System.Nullable{Avalonia.PixelSize})
+ baseline/Avalonia/lib/net10.0/Avalonia.OpenGL.dll
+ current/Avalonia/lib/net10.0/Avalonia.OpenGL.dll
+
+
+ CP0005
+ M:Avalonia.OpenGL.Egl.EglPlatformSurfaceRenderTargetBase.BeginDrawCore(System.Nullable{Avalonia.PixelSize})
+ baseline/Avalonia/lib/net8.0/Avalonia.OpenGL.dll
+ current/Avalonia/lib/net8.0/Avalonia.OpenGL.dll
+
CP0006
M:Avalonia.Input.IKeyboardNavigationHandler.Move(Avalonia.Input.IInputElement,Avalonia.Input.NavigationDirection,Avalonia.Input.KeyModifiers,System.Nullable{Avalonia.Input.KeyDeviceType})
@@ -889,18 +2365,60 @@
baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
+ CP0006
+ M:Avalonia.Platform.IPlatformRenderInterfaceContext.CreateOffscreenRenderTarget(Avalonia.PixelSize,Avalonia.Vector,System.Boolean)
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
+
+ CP0006
+ M:Avalonia.Platform.IRenderTarget.CreateDrawingContext(Avalonia.PixelSize,Avalonia.Platform.RenderTargetDrawingContextProperties@)
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
CP0006
P:Avalonia.Platform.ILockedFramebuffer.AlphaFormat
baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
+ CP0006
+ P:Avalonia.Platform.IPlatformRenderInterfaceContext.MaxOffscreenRenderTargetPixelSize
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
CP0006
P:Avalonia.Platform.IReadableBitmapImpl.AlphaFormat
baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
+ CP0006
+ P:Avalonia.Platform.IRenderTarget.Properties
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
+
+ CP0006
+ M:Avalonia.Platform.IWindowingPlatform.GetWindowsZOrder(System.ReadOnlySpan{Avalonia.Platform.IWindowImpl},System.Span{System.Int64})
+ baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net10.0/Avalonia.Controls.dll
+
+
+ CP0006
+ M:Avalonia.OpenGL.Surfaces.IGlPlatformSurfaceRenderTarget.BeginDraw(System.Nullable{Avalonia.PixelSize})
+ baseline/Avalonia/lib/net10.0/Avalonia.OpenGL.dll
+ current/Avalonia/lib/net10.0/Avalonia.OpenGL.dll
+
+
+ CP0006
+ P:Avalonia.OpenGL.Surfaces.IGlPlatformSurfaceRenderTarget.IsCorrupted
+ baseline/Avalonia/lib/net10.0/Avalonia.OpenGL.dll
+ current/Avalonia/lib/net10.0/Avalonia.OpenGL.dll
+
CP0006
M:Avalonia.Input.Platform.IClipboard.SetDataAsync(Avalonia.Input.IAsyncDataTransfer)
@@ -1039,12 +2557,24 @@
baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
current/Avalonia/lib/net8.0/Avalonia.Base.dll
+
+ CP0006
+ M:Avalonia.Platform.IPlatformRenderInterfaceContext.CreateOffscreenRenderTarget(Avalonia.PixelSize,Avalonia.Vector,System.Boolean)
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
+
CP0006
M:Avalonia.Platform.IPlatformRenderInterfaceImportedImage.SnapshotWithTimelineSemaphores(Avalonia.Platform.IPlatformRenderInterfaceImportedSemaphore,System.UInt64,Avalonia.Platform.IPlatformRenderInterfaceImportedSemaphore,System.UInt64)
baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
current/Avalonia/lib/net8.0/Avalonia.Base.dll
+
+ CP0006
+ M:Avalonia.Platform.IRenderTarget.CreateDrawingContext(Avalonia.PixelSize,Avalonia.Platform.RenderTargetDrawingContextProperties@)
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
+
CP0006
M:Avalonia.Platform.Storage.IStorageProvider.SaveFilePickerWithResultAsync(Avalonia.Platform.Storage.FilePickerSaveOptions)
@@ -1057,12 +2587,30 @@
baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
current/Avalonia/lib/net8.0/Avalonia.Base.dll
+
+ CP0006
+ P:Avalonia.Platform.IPlatformRenderInterfaceContext.MaxOffscreenRenderTargetPixelSize
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
+
CP0006
P:Avalonia.Platform.IReadableBitmapImpl.AlphaFormat
baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
current/Avalonia/lib/net8.0/Avalonia.Base.dll
+
+ CP0006
+ P:Avalonia.Platform.IRenderTarget.Properties
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
+
+
+ CP0006
+ M:Avalonia.Platform.IWindowingPlatform.GetWindowsZOrder(System.ReadOnlySpan{Avalonia.Platform.IWindowImpl},System.Span{System.Int64})
+ baseline/Avalonia/lib/net8.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net8.0/Avalonia.Controls.dll
+
CP0006
M:Avalonia.OpenGL.IGlExternalSemaphore.SignalTimelineSemaphore(Avalonia.OpenGL.IGlExternalImageTexture,System.UInt64)
@@ -1075,12 +2623,24 @@
baseline/Avalonia/lib/net8.0/Avalonia.OpenGL.dll
current/Avalonia/lib/net8.0/Avalonia.OpenGL.dll
+
+ CP0006
+ M:Avalonia.OpenGL.Surfaces.IGlPlatformSurfaceRenderTarget.BeginDraw(System.Nullable{Avalonia.PixelSize})
+ baseline/Avalonia/lib/net8.0/Avalonia.OpenGL.dll
+ current/Avalonia/lib/net8.0/Avalonia.OpenGL.dll
+
CP0006
P:Avalonia.OpenGL.IGlExternalImageTexture.TextureType
baseline/Avalonia/lib/net8.0/Avalonia.OpenGL.dll
current/Avalonia/lib/net8.0/Avalonia.OpenGL.dll
+
+ CP0006
+ P:Avalonia.OpenGL.Surfaces.IGlPlatformSurfaceRenderTarget.IsCorrupted
+ baseline/Avalonia/lib/net8.0/Avalonia.OpenGL.dll
+ current/Avalonia/lib/net8.0/Avalonia.OpenGL.dll
+
CP0006
M:Avalonia.Input.Platform.IClipboard.SetDataAsync(Avalonia.Input.IAsyncDataTransfer)
@@ -1141,36 +2701,288 @@
baseline/Avalonia/lib/netstandard2.0/Avalonia.OpenGL.dll
current/Avalonia/lib/netstandard2.0/Avalonia.OpenGL.dll
+
+ CP0007
+ T:Avalonia.Controls.ResourcesChangedEventArgs
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
+
+ CP0007
+ T:Avalonia.Controls.ResourcesChangedEventArgs
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
+
+
+ CP0008
+ T:Avalonia.Input.DataObject
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
+
+ CP0008
+ T:Avalonia.Media.ImmediateDrawingContext
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
CP0008
T:Avalonia.Media.StreamGeometryContext
baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
+ CP0008
+ T:Avalonia.Platform.IPlatformGraphicsContext
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
+
+ CP0008
+ T:Avalonia.Platform.IPlatformGraphicsWithFeatures
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
+
+ CP0008
+ T:Avalonia.Platform.IPlatformRenderInterfaceContext
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
CP0008
T:Avalonia.Platform.IWriteableBitmapImpl
baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
+ CP0008
+ T:Avalonia.Application
+ baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net10.0/Avalonia.Controls.dll
+
+
+ CP0008
+ T:Avalonia.Controls.Embedding.Offscreen.OffscreenTopLevelImplBase
+ baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net10.0/Avalonia.Controls.dll
+
+
+ CP0008
+ T:Avalonia.Controls.Platform.IWin32OptionsTopLevelImpl
+ baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net10.0/Avalonia.Controls.dll
+
+
+ CP0008
+ T:Avalonia.Platform.IPopupImpl
+ baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net10.0/Avalonia.Controls.dll
+
+
+ CP0008
+ T:Avalonia.Platform.ITopLevelImpl
+ baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net10.0/Avalonia.Controls.dll
+
+
+ CP0008
+ T:Avalonia.Platform.IWindowBaseImpl
+ baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net10.0/Avalonia.Controls.dll
+
+
+ CP0008
+ T:Avalonia.Platform.IWindowImpl
+ baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net10.0/Avalonia.Controls.dll
+
+
+ CP0008
+ T:Avalonia.Metal.IMetalDevice
+ baseline/Avalonia/lib/net10.0/Avalonia.Metal.dll
+ current/Avalonia/lib/net10.0/Avalonia.Metal.dll
+
+
+ CP0008
+ T:Avalonia.OpenGL.Egl.EglContext
+ baseline/Avalonia/lib/net10.0/Avalonia.OpenGL.dll
+ current/Avalonia/lib/net10.0/Avalonia.OpenGL.dll
+
+
+ CP0008
+ T:Avalonia.OpenGL.Egl.EglPlatformSurfaceRenderTargetBase
+ baseline/Avalonia/lib/net10.0/Avalonia.OpenGL.dll
+ current/Avalonia/lib/net10.0/Avalonia.OpenGL.dll
+
+
+ CP0008
+ T:Avalonia.OpenGL.IGlContext
+ baseline/Avalonia/lib/net10.0/Avalonia.OpenGL.dll
+ current/Avalonia/lib/net10.0/Avalonia.OpenGL.dll
+
+
+ CP0008
+ T:Avalonia.Vulkan.IVulkanDevice
+ baseline/Avalonia/lib/net10.0/Avalonia.Vulkan.dll
+ current/Avalonia/lib/net10.0/Avalonia.Vulkan.dll
+
+
+ CP0008
+ T:Avalonia.Vulkan.IVulkanPlatformGraphicsContext
+ baseline/Avalonia/lib/net10.0/Avalonia.Vulkan.dll
+ current/Avalonia/lib/net10.0/Avalonia.Vulkan.dll
+
+
+ CP0008
+ T:Avalonia.Input.DataObject
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
+
+
+ CP0008
+ T:Avalonia.Media.ImmediateDrawingContext
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
+
CP0008
T:Avalonia.Media.StreamGeometryContext
baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
current/Avalonia/lib/net8.0/Avalonia.Base.dll
+
+ CP0008
+ T:Avalonia.Platform.IPlatformGraphicsContext
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
+
+
+ CP0008
+ T:Avalonia.Platform.IPlatformGraphicsWithFeatures
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
+
+
+ CP0008
+ T:Avalonia.Platform.IPlatformRenderInterfaceContext
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
+
CP0008
T:Avalonia.Platform.IWriteableBitmapImpl
baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
current/Avalonia/lib/net8.0/Avalonia.Base.dll
+
+ CP0008
+ T:Avalonia.Application
+ baseline/Avalonia/lib/net8.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net8.0/Avalonia.Controls.dll
+
+
+ CP0008
+ T:Avalonia.Controls.Embedding.Offscreen.OffscreenTopLevelImplBase
+ baseline/Avalonia/lib/net8.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net8.0/Avalonia.Controls.dll
+
+
+ CP0008
+ T:Avalonia.Controls.Platform.IWin32OptionsTopLevelImpl
+ baseline/Avalonia/lib/net8.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net8.0/Avalonia.Controls.dll
+
+
+ CP0008
+ T:Avalonia.Platform.IPopupImpl
+ baseline/Avalonia/lib/net8.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net8.0/Avalonia.Controls.dll
+
+
+ CP0008
+ T:Avalonia.Platform.ITopLevelImpl
+ baseline/Avalonia/lib/net8.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net8.0/Avalonia.Controls.dll
+
+
+ CP0008
+ T:Avalonia.Platform.IWindowBaseImpl
+ baseline/Avalonia/lib/net8.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net8.0/Avalonia.Controls.dll
+
+
+ CP0008
+ T:Avalonia.Platform.IWindowImpl
+ baseline/Avalonia/lib/net8.0/Avalonia.Controls.dll
+ current/Avalonia/lib/net8.0/Avalonia.Controls.dll
+
+
+ CP0008
+ T:Avalonia.Metal.IMetalDevice
+ baseline/Avalonia/lib/net8.0/Avalonia.Metal.dll
+ current/Avalonia/lib/net8.0/Avalonia.Metal.dll
+
+
+ CP0008
+ T:Avalonia.OpenGL.Egl.EglContext
+ baseline/Avalonia/lib/net8.0/Avalonia.OpenGL.dll
+ current/Avalonia/lib/net8.0/Avalonia.OpenGL.dll
+
+
+ CP0008
+ T:Avalonia.OpenGL.Egl.EglPlatformSurfaceRenderTargetBase
+ baseline/Avalonia/lib/net8.0/Avalonia.OpenGL.dll
+ current/Avalonia/lib/net8.0/Avalonia.OpenGL.dll
+
+
+ CP0008
+ T:Avalonia.OpenGL.IGlContext
+ baseline/Avalonia/lib/net8.0/Avalonia.OpenGL.dll
+ current/Avalonia/lib/net8.0/Avalonia.OpenGL.dll
+
+
+ CP0008
+ T:Avalonia.Vulkan.IVulkanDevice
+ baseline/Avalonia/lib/net8.0/Avalonia.Vulkan.dll
+ current/Avalonia/lib/net8.0/Avalonia.Vulkan.dll
+
+
+ CP0008
+ T:Avalonia.Vulkan.IVulkanPlatformGraphicsContext
+ baseline/Avalonia/lib/net8.0/Avalonia.Vulkan.dll
+ current/Avalonia/lib/net8.0/Avalonia.Vulkan.dll
+
+
+ CP0009
+ T:Avalonia.Controls.ResourcesChangedEventArgs
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
+
+ CP0009
+ T:Avalonia.Input.DataObject
+ baseline/Avalonia/lib/net10.0/Avalonia.Base.dll
+ current/Avalonia/lib/net10.0/Avalonia.Base.dll
+
CP0009
T:Avalonia.Platform.Screen
baseline/Avalonia/lib/net10.0/Avalonia.Controls.dll
current/Avalonia/lib/net10.0/Avalonia.Controls.dll
+
+ CP0009
+ T:Avalonia.Controls.ResourcesChangedEventArgs
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
+
+
+ CP0009
+ T:Avalonia.Input.DataObject
+ baseline/Avalonia/lib/net8.0/Avalonia.Base.dll
+ current/Avalonia/lib/net8.0/Avalonia.Base.dll
+
CP0009
T:Avalonia.Platform.Screen
diff --git a/native/Avalonia.Native/src/OSX/AvnView.mm b/native/Avalonia.Native/src/OSX/AvnView.mm
index 0da6f43bf4..600dca865f 100644
--- a/native/Avalonia.Native/src/OSX/AvnView.mm
+++ b/native/Avalonia.Native/src/OSX/AvnView.mm
@@ -42,7 +42,8 @@
- (void) updateRenderTarget
{
if(_currentRenderTarget) {
- [_currentRenderTarget resize:_lastPixelSize withScale:static_cast([[self window] backingScaleFactor])];
+ AvnPixelSize size { MAX(_lastPixelSize.Width, 1), MAX(_lastPixelSize.Height, 1) };
+ [_currentRenderTarget resize:size withScale:static_cast([[self window] backingScaleFactor])];
[self setNeedsDisplayInRect:[self frame]];
}
}
diff --git a/samples/BindingDemo/MainWindow.xaml b/samples/BindingDemo/MainWindow.xaml
index 9d68c8da8a..3ff80069f4 100644
--- a/samples/BindingDemo/MainWindow.xaml
+++ b/samples/BindingDemo/MainWindow.xaml
@@ -1,7 +1,7 @@
-
+
-
-
-
-
+
+
+
+
-
+
-
+
!BooleanString
!!BooleanString
@@ -43,24 +43,24 @@
-
+
-
-
-
-
+
-
+
@@ -91,19 +91,19 @@
-
+
-
+
-
-
+
+
-
+
-
-
+
+
diff --git a/samples/ControlCatalog.Desktop/Program.cs b/samples/ControlCatalog.Desktop/Program.cs
index c4c42a7311..819072db18 100644
--- a/samples/ControlCatalog.Desktop/Program.cs
+++ b/samples/ControlCatalog.Desktop/Program.cs
@@ -8,8 +8,10 @@ using Avalonia;
using Avalonia.Controls;
using Avalonia.Controls.ApplicationLifetimes;
using Avalonia.Headless;
+using Avalonia.LinuxFramebuffer;
using Avalonia.LinuxFramebuffer.Output;
using Avalonia.LogicalTree;
+using Avalonia.Platform;
using Avalonia.Rendering.Composition;
using Avalonia.Threading;
using Avalonia.Vulkan;
@@ -19,16 +21,9 @@ namespace ControlCatalog.Desktop
{
static class Program
{
- private static bool s_useFramebuffer;
-
[STAThread]
static int Main(string[] args)
{
- if (args.Contains("--fbdev"))
- {
- s_useFramebuffer = true;
- }
-
if (args.Contains("--wait-for-attach"))
{
Console.WriteLine("Attach debugger and use 'Set next statement'");
@@ -45,12 +40,27 @@ namespace ControlCatalog.Desktop
double GetScaling()
{
var idx = Array.IndexOf(args, "--scaling");
- if (idx != 0 && args.Length > idx + 1 &&
+ if (idx >= 0 && args.Length > idx + 1 &&
double.TryParse(args[idx + 1], NumberStyles.Any, CultureInfo.InvariantCulture, out var scaling))
return scaling;
return 1;
}
- if (s_useFramebuffer)
+ SurfaceOrientation GetOrientation()
+ {
+ var idx = Array.IndexOf(args, "--orientation");
+ if (idx >= 0 && args.Length > idx + 1 &&
+ Enum.TryParse(args[idx + 1], true, out var orientation))
+ return orientation;
+ return SurfaceOrientation.Rotation0;
+ }
+ string? GetCard()
+ {
+ var idx = Array.IndexOf(args, "--card");
+ if (idx >= 0 && args.Length > idx + 1)
+ return args[idx + 1];
+ return null;
+ }
+ if (args.Contains("--fbdev"))
{
SilenceConsole();
return builder.StartLinuxFbDev(args, new FbDevOutputOptions()
@@ -108,13 +118,17 @@ namespace ControlCatalog.Desktop
else if (args.Contains("--drm"))
{
SilenceConsole();
- return builder.StartLinuxDrm(args, scaling: GetScaling());
+ return builder.StartLinuxDrm(args, card: GetCard(), options: new DrmOutputOptions()
+ {
+ Scaling = GetScaling(),
+ Orientation = GetOrientation(),
+ });
}
else if (args.Contains("--dxgi"))
{
builder.With(new Win32PlatformOptions()
{
- CompositionMode = new [] { Win32CompositionMode.LowLatencyDxgiSwapChain }
+ CompositionMode = [Win32CompositionMode.LowLatencyDxgiSwapChain]
});
return builder.StartWithClassicDesktopLifetime(args);
}
@@ -151,14 +165,14 @@ namespace ControlCatalog.Desktop
.WithDeveloperTools()
.AfterSetup(builder =>
{
- EmbedSample.Implementation = OperatingSystem.IsWindows() ? (INativeDemoControl)new EmbedSampleWin()
+ EmbedSample.Implementation = OperatingSystem.IsWindows() ? new EmbedSampleWin()
: OperatingSystem.IsMacOS() ? new EmbedSampleMac()
: OperatingSystem.IsLinux() ? new EmbedSampleGtk()
: null;
})
.LogToTrace();
- static void SilenceConsole()
+ private static void SilenceConsole()
{
new Thread(() =>
{
diff --git a/samples/ControlCatalog/MainView.xaml b/samples/ControlCatalog/MainView.xaml
index 984daf1200..803ca52254 100644
--- a/samples/ControlCatalog/MainView.xaml
+++ b/samples/ControlCatalog/MainView.xaml
@@ -34,6 +34,9 @@
+
+
+
diff --git a/samples/ControlCatalog/Pages/AutoCompleteBoxPage.xaml b/samples/ControlCatalog/Pages/AutoCompleteBoxPage.xaml
index b682ebf51d..35e917f996 100644
--- a/samples/ControlCatalog/Pages/AutoCompleteBoxPage.xaml
+++ b/samples/ControlCatalog/Pages/AutoCompleteBoxPage.xaml
@@ -39,8 +39,12 @@
-
-
+
+
+
+
+
+
diff --git a/samples/ControlCatalog/Pages/AutoCompleteBoxPage.xaml.cs b/samples/ControlCatalog/Pages/AutoCompleteBoxPage.xaml.cs
index d9e64ecee0..47b6eb7f4a 100644
--- a/samples/ControlCatalog/Pages/AutoCompleteBoxPage.xaml.cs
+++ b/samples/ControlCatalog/Pages/AutoCompleteBoxPage.xaml.cs
@@ -7,30 +7,12 @@ using Avalonia.Controls;
using Avalonia.Data;
using Avalonia.Data.Converters;
using Avalonia.LogicalTree;
+using ControlCatalog.Models;
namespace ControlCatalog.Pages
{
public partial class AutoCompleteBoxPage : UserControl
{
- public class StateData
- {
- public string Name { get; private set; }
- public string Abbreviation { get; private set; }
- public string Capital { get; private set; }
-
- public StateData(string name, string abbreviatoin, string capital)
- {
- Name = name;
- Abbreviation = abbreviatoin;
- Capital = capital;
- }
-
- public override string ToString()
- {
- return Name;
- }
- }
-
private static StateData[] BuildAllStates()
{
return new StateData[]
diff --git a/samples/ControlCatalog/Pages/BitmapCachePage.axaml b/samples/ControlCatalog/Pages/BitmapCachePage.axaml
new file mode 100644
index 0000000000..5902be8e51
--- /dev/null
+++ b/samples/ControlCatalog/Pages/BitmapCachePage.axaml
@@ -0,0 +1,45 @@
+
+
+
+
+
+
+
+
+ Render at scale
+
+ Scale
+
+ Enable clear type
+
+ Snap to device pixels
+ Subpixel offset X
+
+
+
+
+
+
+
+
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
+
+
+
+
+
+
+
diff --git a/samples/ControlCatalog/Pages/BitmapCachePage.axaml.cs b/samples/ControlCatalog/Pages/BitmapCachePage.axaml.cs
new file mode 100644
index 0000000000..92b3cbec68
--- /dev/null
+++ b/samples/ControlCatalog/Pages/BitmapCachePage.axaml.cs
@@ -0,0 +1,13 @@
+using Avalonia;
+using Avalonia.Controls;
+using Avalonia.Markup.Xaml;
+
+namespace ControlCatalog.Pages;
+
+public partial class BitmapCachePage : UserControl
+{
+ public BitmapCachePage()
+ {
+ InitializeComponent();
+ }
+}
\ No newline at end of file
diff --git a/samples/ControlCatalog/Pages/CalendarDatePickerPage.xaml b/samples/ControlCatalog/Pages/CalendarDatePickerPage.xaml
index 7a22c0ddab..8734758d26 100644
--- a/samples/ControlCatalog/Pages/CalendarDatePickerPage.xaml
+++ b/samples/ControlCatalog/Pages/CalendarDatePickerPage.xaml
@@ -5,7 +5,7 @@
x:Class="ControlCatalog.Pages.CalendarDatePickerPage">
A control for selecting dates with a calendar drop-down
-
+
+ PlaceholderText="Placeholder"/>
-
+ PlaceholderText="Floating Placeholder"
+ UseFloatingPlaceholder="True"/>
+
+
+
+
-
+
-
+
diff --git a/samples/ControlCatalog/Pages/ClipboardPage.xaml b/samples/ControlCatalog/Pages/ClipboardPage.xaml
index 80b3f4d1ed..864a520aca 100644
--- a/samples/ControlCatalog/Pages/ClipboardPage.xaml
+++ b/samples/ControlCatalog/Pages/ClipboardPage.xaml
@@ -1,4 +1,4 @@
-
@@ -21,7 +21,7 @@
+ PlaceholderText="Text to copy of file names per line" />
diff --git a/samples/ControlCatalog/Pages/DialogsPage.xaml b/samples/ControlCatalog/Pages/DialogsPage.xaml
index 7320c1f3d7..e6b3568909 100644
--- a/samples/ControlCatalog/Pages/DialogsPage.xaml
+++ b/samples/ControlCatalog/Pages/DialogsPage.xaml
@@ -49,26 +49,17 @@
-
-
-
-
-
-
-
-
-
-
+
-
+
-
+
Desktop
@@ -80,17 +71,17 @@
-
+
-
+
+ PlaceholderText="Picked file content" />
diff --git a/samples/ControlCatalog/Pages/DialogsPage.xaml.cs b/samples/ControlCatalog/Pages/DialogsPage.xaml.cs
index 0e2ad7d2b9..892e320afc 100644
--- a/samples/ControlCatalog/Pages/DialogsPage.xaml.cs
+++ b/samples/ControlCatalog/Pages/DialogsPage.xaml.cs
@@ -1,23 +1,14 @@
using System;
using System.Buffers;
using System.Collections.Generic;
-using System.IO;
using System.Linq;
-using System.Reflection;
using System.Security;
-using System.Text;
using System.Threading.Tasks;
using Avalonia;
using Avalonia.Controls;
-using Avalonia.Controls.Presenters;
using Avalonia.Dialogs;
using Avalonia.Layout;
-using Avalonia.Markup.Xaml;
using Avalonia.Platform.Storage;
-using Avalonia.Platform.Storage.FileIO;
-
-#pragma warning disable CS0618 // Type or member is obsolete
-#nullable enable
namespace ControlCatalog.Pages
{
@@ -70,14 +61,6 @@ namespace ControlCatalog.Pages
};
- List GetFilters()
- {
- return GetFileTypes()?.Select(f => new FileDialogFilter
- {
- Name = f.Name, Extensions = f.Patterns!.ToList()
- }).ToList() ?? new List();
- }
-
List? BuildFileTypes()
{
var selectedItem = (FilterSelector.SelectedItem as ComboBoxItem)?.Content
@@ -168,88 +151,12 @@ namespace ControlCatalog.Pages
void UpdateSuggestedFilterSelectorState() =>
suggestedFilterSelector.IsEnabled = useSuggestedFilter.IsChecked == true;
- useSuggestedFilter.Checked += (_, _) => UpdateSuggestedFilterSelectorState();
- useSuggestedFilter.Unchecked += (_, _) => UpdateSuggestedFilterSelectorState();
+ useSuggestedFilter.IsCheckedChanged += (_, _) => UpdateSuggestedFilterSelectorState();
UpdateSuggestedFilterSelectorState();
FilterSelector.SelectionChanged += (_, _) => UpdateSuggestedFilterSelector(BuildFileTypes());
UpdateSuggestedFilterSelector(BuildFileTypes());
- OpenFile.Click += async delegate
- {
- // Almost guaranteed to exist
- var uri = Assembly.GetEntryAssembly()?.GetModules().FirstOrDefault()?.FullyQualifiedName;
- var initialFileName = uri == null ? null : System.IO.Path.GetFileName(uri);
- var initialDirectory = uri == null ? null : System.IO.Path.GetDirectoryName(uri);
-
- var result = await new OpenFileDialog()
- {
- Title = "Open file",
- Filters = GetFilters(),
- Directory = initialDirectory,
- InitialFileName = initialFileName
- }.ShowAsync(GetWindow());
- results.ItemsSource = result;
- resultsVisible.IsVisible = result?.Any() == true;
- };
- OpenMultipleFiles.Click += async delegate
- {
- var result = await new OpenFileDialog()
- {
- Title = "Open multiple files",
- Filters = GetFilters(),
- Directory = lastSelectedDirectory?.Path is {IsAbsoluteUri:true} path ? path.LocalPath : null,
- AllowMultiple = true
- }.ShowAsync(GetWindow());
- results.ItemsSource = result;
- resultsVisible.IsVisible = result?.Any() == true;
- };
- SaveFile.Click += async delegate
- {
- var filters = GetFilters();
- var result = await new SaveFileDialog()
- {
- Title = "Save file",
- Filters = filters,
- Directory = lastSelectedDirectory?.Path is {IsAbsoluteUri:true} path ? path.LocalPath : null,
- DefaultExtension = filters?.Any() == true ? "txt" : null,
- InitialFileName = "test.txt"
- }.ShowAsync(GetWindow());
- results.ItemsSource = new[] { result };
- resultsVisible.IsVisible = result != null;
- };
- SelectFolder.Click += async delegate
- {
- var result = await new OpenFolderDialog()
- {
- Title = "Select folder",
- Directory = lastSelectedDirectory?.Path is {IsAbsoluteUri:true} path ? path.LocalPath : null,
- }.ShowAsync(GetWindow());
- if (string.IsNullOrEmpty(result))
- {
- resultsVisible.IsVisible = false;
- }
- else
- {
- SetFolder(await GetStorageProvider().TryGetFolderFromPathAsync(result!));
- results.ItemsSource = new[] { result };
- resultsVisible.IsVisible = true;
- }
- };
- OpenBoth.Click += async delegate
- {
- var result = await new OpenFileDialog()
- {
- Title = "Select both",
- Directory = lastSelectedDirectory?.Path is {IsAbsoluteUri:true} path ? path.LocalPath : null,
- AllowMultiple = true
- }.ShowManagedAsync(GetWindow(), new ManagedFileDialogOptions
- {
- AllowDirectorySelection = true
- });
- results.ItemsSource = result;
- resultsVisible.IsVisible = result?.Any() == true;
- };
DecoratedWindow.Click += delegate
{
new DecoratedWindow().Show();
diff --git a/samples/ControlCatalog/Pages/NumericUpDownPage.xaml b/samples/ControlCatalog/Pages/NumericUpDownPage.xaml
index b01b4a93bc..a112f79c02 100644
--- a/samples/ControlCatalog/Pages/NumericUpDownPage.xaml
+++ b/samples/ControlCatalog/Pages/NumericUpDownPage.xaml
@@ -1,4 +1,4 @@
-
- Watermark:
-
+ PlaceholderText:
+
Text:
@@ -81,23 +81,23 @@
+ PlaceholderText="Enter text" FormatString="{Binding SelectedFormat.Value}"/>
+ PlaceholderText="Enter text" FormatString="{Binding SelectedFormat.Value}"/>
-
+
+ PlaceholderText="Enter text" FormatString="{Binding SelectedFormat.Value}">
-
+
@@ -110,10 +110,18 @@
-
+
+
+
+
+
+
diff --git a/samples/ControlCatalog/Pages/TextBoxPage.xaml b/samples/ControlCatalog/Pages/TextBoxPage.xaml
index e2230e3cb6..346e561dfc 100644
--- a/samples/ControlCatalog/Pages/TextBoxPage.xaml
+++ b/samples/ControlCatalog/Pages/TextBoxPage.xaml
@@ -17,34 +17,41 @@
-
-
+
+
+
+
-
+
-
+
-
+
+ SelectionStart="5" SelectionEnd="22"
+ SelectionBrush="Green" SelectionForegroundBrush="Yellow" ClearSelectionOnLostFocus="False"/>
@@ -54,11 +61,11 @@
-
+
+ FontFamily="Comic Sans MS"
+ FontSize="10"
+ Foreground="Red"/>
-
diff --git a/samples/ControlCatalog/Pages/ThemePage.axaml b/samples/ControlCatalog/Pages/ThemePage.axaml
index 2d948c44a0..7eb95471a0 100644
--- a/samples/ControlCatalog/Pages/ThemePage.axaml
+++ b/samples/ControlCatalog/Pages/ThemePage.axaml
@@ -1,4 +1,4 @@
-
-
-
+
+
diff --git a/samples/Generators.Sandbox/Controls/SignUpView.xaml b/samples/Generators.Sandbox/Controls/SignUpView.xaml
index b256d7a31c..09313705f4 100644
--- a/samples/Generators.Sandbox/Controls/SignUpView.xaml
+++ b/samples/Generators.Sandbox/Controls/SignUpView.xaml
@@ -1,4 +1,4 @@
-
+ PlaceholderText="Please, enter user name..."
+ UseFloatingPlaceholder="True" />
diff --git a/samples/IntegrationTestApp/Pages/EmbeddingPage.axaml b/samples/IntegrationTestApp/Pages/EmbeddingPage.axaml
index 632893bcd0..4d6bc24b47 100644
--- a/samples/IntegrationTestApp/Pages/EmbeddingPage.axaml
+++ b/samples/IntegrationTestApp/Pages/EmbeddingPage.axaml
@@ -16,5 +16,7 @@
+
+
diff --git a/samples/IntegrationTestApp/Pages/EmbeddingPage.axaml.cs b/samples/IntegrationTestApp/Pages/EmbeddingPage.axaml.cs
index 93855cd13d..465743afbf 100644
--- a/samples/IntegrationTestApp/Pages/EmbeddingPage.axaml.cs
+++ b/samples/IntegrationTestApp/Pages/EmbeddingPage.axaml.cs
@@ -1,10 +1,19 @@
+using System;
+using Avalonia.Automation;
using Avalonia.Controls;
+using Avalonia.Controls.Embedding;
using Avalonia.Interactivity;
+using IntegrationTestApp.Embedding;
+using MonoMac.AppKit;
+using MonoMac.CoreGraphics;
+using MonoMac.ObjCRuntime;
namespace IntegrationTestApp;
public partial class EmbeddingPage : UserControl
{
+ private const long NSModalResponseContinue = -1002;
+
public EmbeddingPage()
{
InitializeComponent();
@@ -19,5 +28,65 @@ public partial class EmbeddingPage : UserControl
private void Reset_Click(object? sender, RoutedEventArgs e)
{
ResetText();
+ ModalResultTextBox.Text = "";
+ }
+
+ private void RunNativeModalSession_OnClick(object? sender, RoutedEventArgs e)
+ {
+ MacHelper.EnsureInitialized();
+
+ var app = NSApplication.SharedApplication;
+ var modalWindow = CreateNativeWindow();
+ var session = app.BeginModalSession(modalWindow);
+
+ while (true)
+ {
+ if (app.RunModalSession(session) != NSModalResponseContinue)
+ break;
+ }
+
+ app.EndModalSession(session);
+ }
+
+ private NSWindow CreateNativeWindow()
+ {
+ var button = new Button
+ {
+ Name = "ButtonInModal",
+ Content = "Button"
+ };
+
+ AutomationProperties.SetAutomationId(button, "ButtonInModal");
+
+ var root = new EmbeddableControlRoot
+ {
+ Width = 200,
+ Height = 200,
+ Content = button
+ };
+ root.Prepare();
+
+ var window = new NSWindow(
+ new CGRect(0, 0, root.Width, root.Height),
+ NSWindowStyle.Titled | NSWindowStyle.Closable,
+ NSBackingStore.Buffered,
+ false);
+
+ window.Identifier = "ModalNativeWindow";
+ window.WillClose += (_, _) => NSApplication.SharedApplication.StopModal();
+
+ button.Click += (_, _) =>
+ {
+ ModalResultTextBox.Text = "Clicked";
+ window.Close();
+ };
+
+ if (root.TryGetPlatformHandle() is not { } handle)
+ throw new InvalidOperationException("Could not get platform handle");
+
+ window.ContentView = (NSView)Runtime.GetNSObject(handle.Handle)!;
+ root.StartRendering();
+
+ return window;
}
}
diff --git a/samples/IntegrationTestApp/Pages/ScreensPage.axaml b/samples/IntegrationTestApp/Pages/ScreensPage.axaml
index 2d95c4719a..7f0b341714 100644
--- a/samples/IntegrationTestApp/Pages/ScreensPage.axaml
+++ b/samples/IntegrationTestApp/Pages/ScreensPage.axaml
@@ -8,12 +8,12 @@
-
-
-
-
-
-
-
+
+
+
+
+
+
+
diff --git a/samples/IntegrationTestApp/Pages/WindowDecorationsPage.axaml b/samples/IntegrationTestApp/Pages/WindowDecorationsPage.axaml
index d6b418952a..0a7dce9c02 100644
--- a/samples/IntegrationTestApp/Pages/WindowDecorationsPage.axaml
+++ b/samples/IntegrationTestApp/Pages/WindowDecorationsPage.axaml
@@ -10,7 +10,7 @@
-
+
diff --git a/samples/IntegrationTestApp/Pages/WindowPage.axaml b/samples/IntegrationTestApp/Pages/WindowPage.axaml
index 60900a4778..797c1c7170 100644
--- a/samples/IntegrationTestApp/Pages/WindowPage.axaml
+++ b/samples/IntegrationTestApp/Pages/WindowPage.axaml
@@ -6,7 +6,7 @@
x:Class="IntegrationTestApp.Pages.WindowPage">
-
+
NonOwned
Owned
diff --git a/samples/SafeAreaDemo/Views/MainView.xaml b/samples/SafeAreaDemo/Views/MainView.xaml
index 85163e7dad..c03ffc1f39 100644
--- a/samples/SafeAreaDemo/Views/MainView.xaml
+++ b/samples/SafeAreaDemo/Views/MainView.xaml
@@ -24,7 +24,7 @@
+ HorizontalContentAlignment="Right">View Bounds
Use Safe Area
Automatic Paddings
Hide System Bars
-
+
diff --git a/samples/SingleProjectSandbox/MainView.axaml b/samples/SingleProjectSandbox/MainView.axaml
index e1764b0795..b7f1bdaa53 100644
--- a/samples/SingleProjectSandbox/MainView.axaml
+++ b/samples/SingleProjectSandbox/MainView.axaml
@@ -5,10 +5,10 @@
x:DataType="local:MainView">
-
-
-
-
+
+
+
+
diff --git a/src/Android/Avalonia.Android/AvaloniaActivity.cs b/src/Android/Avalonia.Android/AvaloniaActivity.cs
index 6841f5ba92..60345e0a50 100644
--- a/src/Android/Avalonia.Android/AvaloniaActivity.cs
+++ b/src/Android/Avalonia.Android/AvaloniaActivity.cs
@@ -119,22 +119,14 @@ public class AvaloniaActivity : AppCompatActivity, IAvaloniaActivity
activatableLifetime.CurrentIntendActivity = this;
}
- if (Intent?.Data is { } androidUri
- && androidUri.IsAbsolute
- && Uri.TryCreate(androidUri.ToString(), UriKind.Absolute, out var uri))
- {
- if (uri.Scheme == Uri.UriSchemeFile)
- {
- if (AndroidStorageItem.CreateItem(this, androidUri) is { } item)
- {
- _onActivated?.Invoke(this, new FileActivatedEventArgs(new [] { item }));
- }
- }
- else
- {
- _onActivated?.Invoke(this, new ProtocolActivatedEventArgs(uri));
- }
- }
+ HandleIntent(Intent);
+ }
+
+ protected override void OnNewIntent(Intent? intent)
+ {
+ base.OnNewIntent(intent);
+
+ HandleIntent(intent);
}
protected override void OnStop()
@@ -218,6 +210,26 @@ public class AvaloniaActivity : AppCompatActivity, IAvaloniaActivity
_view = new AvaloniaView(this) { Content = initialContent };
}
+ private void HandleIntent(Intent? intent)
+ {
+ if (intent?.Data is { } androidUri
+ && androidUri.IsAbsolute
+ && Uri.TryCreate(androidUri.ToString(), UriKind.Absolute, out var uri))
+ {
+ if (uri.Scheme == Uri.UriSchemeFile || uri.Scheme == "content")
+ {
+ if (AndroidStorageItem.CreateItem(this, androidUri) is { } item)
+ {
+ _onActivated?.Invoke(this, new FileActivatedEventArgs(new[] { item }));
+ }
+ }
+ else
+ {
+ _onActivated?.Invoke(this, new ProtocolActivatedEventArgs(uri));
+ }
+ }
+ }
+
public void OnBackInvoked()
{
var eventArgs = new AndroidBackRequestedEventArgs();
diff --git a/src/Android/Avalonia.Android/Platform/AndroidInsetsManager.cs b/src/Android/Avalonia.Android/Platform/AndroidInsetsManager.cs
index 4991a7547f..a8ab825808 100644
--- a/src/Android/Avalonia.Android/Platform/AndroidInsetsManager.cs
+++ b/src/Android/Avalonia.Android/Platform/AndroidInsetsManager.cs
@@ -318,8 +318,6 @@ namespace Avalonia.Android.Platform
}
}
- public bool DisplayEdgeToEdge { get => DisplaysEdgeToEdge; set => DisplayEdgeToEdgePreference = value; }
-
public bool DisplaysEdgeToEdge => _displaysEdgeToEdge;
internal void ApplyStatusBarState()
diff --git a/src/Android/Avalonia.Android/Platform/AndroidScreens.cs b/src/Android/Avalonia.Android/Platform/AndroidScreens.cs
index 3f1f9bf44e..9b0f1bee38 100644
--- a/src/Android/Avalonia.Android/Platform/AndroidScreens.cs
+++ b/src/Android/Avalonia.Android/Platform/AndroidScreens.cs
@@ -10,6 +10,7 @@ using AndroidX.Window.Layout;
using Avalonia.Android.Platform.SkiaPlatform;
using Avalonia.Platform;
using AndroidOrientation = global::Android.Content.Res.Orientation;
+using AndroidRotation = global::Android.Views.SurfaceOrientation;
namespace Avalonia.Android.Platform;
@@ -53,7 +54,7 @@ internal class AndroidScreen(Display display) : PlatformScreen(new PlatformHandl
var orientation = displayContext.Resources?.Configuration?.Orientation;
if (orientation == AndroidOrientation.Square)
naturalOrientation = ScreenOrientation.None;
- else if (rotation is SurfaceOrientation.Rotation0 or SurfaceOrientation.Rotation180)
+ else if (rotation is AndroidRotation.Rotation0 or AndroidRotation.Rotation180)
naturalOrientation = orientation == AndroidOrientation.Landscape ?
ScreenOrientation.Landscape :
ScreenOrientation.Portrait;
@@ -73,14 +74,14 @@ internal class AndroidScreen(Display display) : PlatformScreen(new PlatformHandl
CurrentOrientation = (display.Rotation, naturalOrientation) switch
{
(_, ScreenOrientation.None) => ScreenOrientation.None,
- (SurfaceOrientation.Rotation0, ScreenOrientation.Landscape) => ScreenOrientation.Landscape,
- (SurfaceOrientation.Rotation90, ScreenOrientation.Landscape) => ScreenOrientation.Portrait,
- (SurfaceOrientation.Rotation180, ScreenOrientation.Landscape) => ScreenOrientation.LandscapeFlipped,
- (SurfaceOrientation.Rotation270, ScreenOrientation.Landscape) => ScreenOrientation.PortraitFlipped,
- (SurfaceOrientation.Rotation0, _) => ScreenOrientation.Portrait,
- (SurfaceOrientation.Rotation90, _) => ScreenOrientation.Landscape,
- (SurfaceOrientation.Rotation180, _) => ScreenOrientation.PortraitFlipped,
- (SurfaceOrientation.Rotation270, _) => ScreenOrientation.LandscapeFlipped,
+ (AndroidRotation.Rotation0, ScreenOrientation.Landscape) => ScreenOrientation.Landscape,
+ (AndroidRotation.Rotation90, ScreenOrientation.Landscape) => ScreenOrientation.Portrait,
+ (AndroidRotation.Rotation180, ScreenOrientation.Landscape) => ScreenOrientation.LandscapeFlipped,
+ (AndroidRotation.Rotation270, ScreenOrientation.Landscape) => ScreenOrientation.PortraitFlipped,
+ (AndroidRotation.Rotation0, _) => ScreenOrientation.Portrait,
+ (AndroidRotation.Rotation90, _) => ScreenOrientation.Landscape,
+ (AndroidRotation.Rotation180, _) => ScreenOrientation.PortraitFlipped,
+ (AndroidRotation.Rotation270, _) => ScreenOrientation.LandscapeFlipped,
_ => ScreenOrientation.Portrait
};
}
diff --git a/src/Android/Avalonia.Android/Platform/SkiaPlatform/TopLevelImpl.cs b/src/Android/Avalonia.Android/Platform/SkiaPlatform/TopLevelImpl.cs
index 8f133f266d..42f0877eca 100644
--- a/src/Android/Avalonia.Android/Platform/SkiaPlatform/TopLevelImpl.cs
+++ b/src/Android/Avalonia.Android/Platform/SkiaPlatform/TopLevelImpl.cs
@@ -26,7 +26,7 @@ using ClipboardManager = Android.Content.ClipboardManager;
namespace Avalonia.Android.Platform.SkiaPlatform
{
- class TopLevelImpl : IAndroidView, ITopLevelImpl, EglGlPlatformSurface.IEglWindowGlPlatformSurfaceInfoWithWaitPolicy
+ class TopLevelImpl : ITopLevelImpl, EglGlPlatformSurface.IEglWindowGlPlatformSurfaceInfoWithWaitPolicy
{
private readonly AndroidKeyboardEventsHelper _keyboardHelper;
private readonly AndroidMotionEventsHelper _pointerHelper;
diff --git a/src/Android/Avalonia.Android/Platform/Specific/Helpers/AndroidKeyboardEventsHelper.cs b/src/Android/Avalonia.Android/Platform/Specific/Helpers/AndroidKeyboardEventsHelper.cs
index 58fc59f804..03be7c2153 100644
--- a/src/Android/Avalonia.Android/Platform/Specific/Helpers/AndroidKeyboardEventsHelper.cs
+++ b/src/Android/Avalonia.Android/Platform/Specific/Helpers/AndroidKeyboardEventsHelper.cs
@@ -8,7 +8,7 @@ using Avalonia.Input.Raw;
namespace Avalonia.Android.Platform.Specific.Helpers
{
- internal class AndroidKeyboardEventsHelper : IDisposable where TView : TopLevelImpl, IAndroidView
+ internal class AndroidKeyboardEventsHelper : IDisposable where TView : TopLevelImpl
{
private readonly TView _view;
@@ -65,8 +65,8 @@ namespace Avalonia.Android.Platform.Specific.Helpers
AndroidKeyboardDevice.ConvertKey(e.KeyCode),
GetModifierKeys(e),
physicalKey,
- keyDeviceType,
- keySymbol);
+ keySymbol,
+ keyDeviceType);
_view.Input?.Invoke(rawKeyEvent);
diff --git a/src/Android/Avalonia.Android/Platform/Specific/IAndroidView.cs b/src/Android/Avalonia.Android/Platform/Specific/IAndroidView.cs
deleted file mode 100644
index 056912835a..0000000000
--- a/src/Android/Avalonia.Android/Platform/Specific/IAndroidView.cs
+++ /dev/null
@@ -1,11 +0,0 @@
-using System;
-using Android.Views;
-
-namespace Avalonia.Android.Platform.Specific
-{
- public interface IAndroidView
- {
- [Obsolete("Use TopLevel.TryGetPlatformHandle instead, which can be casted to AndroidViewControlHandle.")]
- View View { get; }
- }
-}
diff --git a/src/Android/Avalonia.Android/Stubs.cs b/src/Android/Avalonia.Android/Stubs.cs
index c79a23d8e7..0620919e4d 100644
--- a/src/Android/Avalonia.Android/Stubs.cs
+++ b/src/Android/Avalonia.Android/Stubs.cs
@@ -12,6 +12,8 @@ namespace Avalonia.Android
public IWindowImpl CreateEmbeddableWindow() => throw new NotSupportedException();
public ITrayIconImpl? CreateTrayIcon() => null;
+
+ public void GetWindowsZOrder(ReadOnlySpan windows, Span zOrder) => throw new NotSupportedException();
}
internal class PlatformIconLoaderStub : IPlatformIconLoader
diff --git a/src/Avalonia.Base/Animation/Animation.AnimatorRegistry.cs b/src/Avalonia.Base/Animation/Animation.AnimatorRegistry.cs
index b07bd686b8..da3c4cb8e6 100644
--- a/src/Avalonia.Base/Animation/Animation.AnimatorRegistry.cs
+++ b/src/Avalonia.Base/Animation/Animation.AnimatorRegistry.cs
@@ -7,17 +7,6 @@ namespace Avalonia.Animation;
partial class Animation
{
- ///
- /// Sets the value of the Animator attached property for a setter.
- ///
- /// The animation setter.
- /// The property animator value.
- [Obsolete("CustomAnimatorBase will be removed before 11.0, use InterpolatingAnimator", true)]
- public static void SetAnimator(IAnimationSetter setter, CustomAnimatorBase value)
- {
- s_animators[setter] = (value.WrapperType, value.CreateWrapper);
- }
-
///
/// Sets the value of the Animator attached property for a setter.
///
@@ -92,4 +81,4 @@ partial class Animation
return null;
}
-}
\ No newline at end of file
+}
diff --git a/src/Avalonia.Base/Animation/Easings/CubicBezierEasing.cs b/src/Avalonia.Base/Animation/Easings/CubicBezierEasing.cs
deleted file mode 100644
index 2e43e97da2..0000000000
--- a/src/Avalonia.Base/Animation/Easings/CubicBezierEasing.cs
+++ /dev/null
@@ -1,17 +0,0 @@
-using System;
-
-namespace Avalonia.Animation.Easings;
-
-[Obsolete("Use SplineEasing instead")]
-public sealed class CubicBezierEasing : IEasing
-{
- private CubicBezierEasing()
- {
- }
-
- public Point ControlPoint2 { get; set; }
- public Point ControlPoint1 { get; set; }
-
- double IEasing.Ease(double progress)
- => throw new NotSupportedException();
-}
diff --git a/src/Avalonia.Base/Animation/ICustomAnimator.cs b/src/Avalonia.Base/Animation/ICustomAnimator.cs
index 119a6115da..7155af1223 100644
--- a/src/Avalonia.Base/Animation/ICustomAnimator.cs
+++ b/src/Avalonia.Base/Animation/ICustomAnimator.cs
@@ -2,34 +2,6 @@ using System;
using Avalonia.Animation.Animators;
namespace Avalonia.Animation;
-[Obsolete("This class will be removed before 11.0, use InterpolatingAnimator", true)]
-public abstract class CustomAnimatorBase
-{
- internal abstract IAnimator CreateWrapper();
- internal abstract Type WrapperType { get; }
-}
-
-[Obsolete("This class will be removed before 11.0, use InterpolatingAnimator", true)]
-public abstract class CustomAnimatorBase : CustomAnimatorBase
-{
- public abstract T Interpolate(double progress, T oldValue, T newValue);
-
- internal override Type WrapperType => typeof(AnimatorWrapper);
- internal override IAnimator CreateWrapper() => new AnimatorWrapper(this);
-
- internal class AnimatorWrapper : Animator
- {
- private readonly CustomAnimatorBase _parent;
-
- public AnimatorWrapper(CustomAnimatorBase parent)
- {
- _parent = parent;
- }
-
- public override T Interpolate(double progress, T oldValue, T newValue) => _parent.Interpolate(progress, oldValue, newValue);
- }
-}
-
public interface ICustomAnimator
{
internal IAnimator CreateWrapper();
@@ -55,4 +27,4 @@ public abstract class InterpolatingAnimator : ICustomAnimator
public override T Interpolate(double progress, T oldValue, T newValue) => _parent.Interpolate(progress, oldValue, newValue);
}
-}
\ No newline at end of file
+}
diff --git a/src/Avalonia.Base/AvaloniaObjectExtensions.cs b/src/Avalonia.Base/AvaloniaObjectExtensions.cs
index 7c4e67b5cc..3c9c047684 100644
--- a/src/Avalonia.Base/AvaloniaObjectExtensions.cs
+++ b/src/Avalonia.Base/AvaloniaObjectExtensions.cs
@@ -227,33 +227,6 @@ namespace Avalonia
};
}
- ///
- /// Binds a property on an to an .
- ///
- /// The object.
- /// The property to bind.
- /// The binding.
- ///
- /// An optional anchor from which to locate required context. When binding to objects that
- /// are not in the logical tree, certain types of binding need an anchor into the tree in
- /// order to locate named controls or resources. The parameter
- /// can be used to provide this context.
- ///
- /// An which can be used to cancel the binding.
- [Obsolete("Use AvaloniaObject.Bind(AvaloniaProperty, IBinding")]
- public static IDisposable Bind(
- this AvaloniaObject target,
- AvaloniaProperty property,
- BindingBase binding,
- object? anchor = null)
- {
- target = target ?? throw new ArgumentNullException(nameof(target));
- property = property ?? throw new ArgumentNullException(nameof(property));
- binding = binding ?? throw new ArgumentNullException(nameof(binding));
-
- return target.Bind(property, binding);
- }
-
///
/// Gets a value.
///
diff --git a/src/Avalonia.Base/Controls/IResourceHost.cs b/src/Avalonia.Base/Controls/IResourceHost.cs
index 361e3562ec..286f0e36ef 100644
--- a/src/Avalonia.Base/Controls/IResourceHost.cs
+++ b/src/Avalonia.Base/Controls/IResourceHost.cs
@@ -29,12 +29,4 @@ namespace Avalonia.Controls
///
void NotifyHostedResourcesChanged(ResourcesChangedEventArgs e);
}
-
- // TODO12: merge with IResourceHost
- internal interface IResourceHost2 : IResourceHost
- {
- event EventHandler ResourcesChanged2;
-
- void NotifyHostedResourcesChanged(ResourcesChangedToken token);
- }
}
diff --git a/src/Avalonia.Base/Controls/ResourceDictionary.cs b/src/Avalonia.Base/Controls/ResourceDictionary.cs
index e0944a5708..f8f6267e7b 100644
--- a/src/Avalonia.Base/Controls/ResourceDictionary.cs
+++ b/src/Avalonia.Base/Controls/ResourceDictionary.cs
@@ -358,7 +358,7 @@ namespace Avalonia.Controls
if (hasResources)
{
- owner.NotifyHostedResourcesChanged(ResourcesChangedToken.Create());
+ owner.NotifyHostedResourcesChanged(ResourcesChangedEventArgs.Create());
}
}
@@ -385,7 +385,7 @@ namespace Avalonia.Controls
if (hasResources)
{
- owner.NotifyHostedResourcesChanged(ResourcesChangedToken.Create());
+ owner.NotifyHostedResourcesChanged(ResourcesChangedEventArgs.Create());
}
}
diff --git a/src/Avalonia.Base/Controls/ResourceNodeExtensions.cs b/src/Avalonia.Base/Controls/ResourceNodeExtensions.cs
index 36cc00d245..07c1c8d654 100644
--- a/src/Avalonia.Base/Controls/ResourceNodeExtensions.cs
+++ b/src/Avalonia.Base/Controls/ResourceNodeExtensions.cs
@@ -158,7 +158,7 @@ namespace Avalonia.Controls
protected override void Initialize()
{
- _target.SubscribeToResourcesChanged(ResourcesChanged, ResourcesChanged2);
+ _target.ResourcesChanged += ResourcesChanged;
if (_target is IThemeVariantHost themeVariantHost)
{
@@ -168,7 +168,7 @@ namespace Avalonia.Controls
protected override void Deinitialize()
{
- _target.UnsubscribeFromResourcesChanged(ResourcesChanged, ResourcesChanged2);
+ _target.ResourcesChanged -= ResourcesChanged;
if (_target is IThemeVariantHost themeVariantHost)
{
@@ -186,11 +186,6 @@ namespace Avalonia.Controls
PublishNext(GetValue());
}
- private void ResourcesChanged2(object? sender, ResourcesChangedToken token)
- {
- PublishNext(GetValue());
- }
-
private void ActualThemeVariantChanged(object? sender, EventArgs e)
{
PublishNext(GetValue());
@@ -230,7 +225,7 @@ namespace Avalonia.Controls
_target.OwnerChanged += OwnerChanged;
_owner = _target.Owner;
- _owner?.SubscribeToResourcesChanged(ResourcesChanged, ResourcesChanged2);
+ _owner?.ResourcesChanged += ResourcesChanged;
if (_overrideThemeVariant is null && _owner is IThemeVariantHost themeVariantHost)
{
@@ -242,7 +237,7 @@ namespace Avalonia.Controls
{
_target.OwnerChanged -= OwnerChanged;
- _owner?.UnsubscribeFromResourcesChanged(ResourcesChanged, ResourcesChanged2);
+ _owner?.ResourcesChanged -= ResourcesChanged;
if (_overrideThemeVariant is null && _owner is IThemeVariantHost themeVariantHost)
{
@@ -270,7 +265,7 @@ namespace Avalonia.Controls
private void OwnerChanged(object? sender, EventArgs e)
{
- _owner?.UnsubscribeFromResourcesChanged(ResourcesChanged, ResourcesChanged2);
+ _owner?.ResourcesChanged -= ResourcesChanged;
if (_overrideThemeVariant is null && _owner is IThemeVariantHost themeVariantHost)
{
@@ -279,7 +274,7 @@ namespace Avalonia.Controls
_owner = _target.Owner;
- _owner?.SubscribeToResourcesChanged(ResourcesChanged, ResourcesChanged2);
+ _owner?.ResourcesChanged += ResourcesChanged;
if (_overrideThemeVariant is null && _owner is IThemeVariantHost themeVariantHost2)
{
@@ -299,11 +294,6 @@ namespace Avalonia.Controls
PublishNext();
}
- private void ResourcesChanged2(object? sender, ResourcesChangedToken token)
- {
- PublishNext();
- }
-
private object? GetValue()
{
var theme = _overrideThemeVariant ?? (_target.Owner as IThemeVariantHost)?.ActualThemeVariant;
diff --git a/src/Avalonia.Base/Controls/ResourceProvider.cs b/src/Avalonia.Base/Controls/ResourceProvider.cs
index f0ab42a4a8..f73f11e713 100644
--- a/src/Avalonia.Base/Controls/ResourceProvider.cs
+++ b/src/Avalonia.Base/Controls/ResourceProvider.cs
@@ -45,7 +45,7 @@ public abstract class ResourceProvider : AvaloniaObject, IResourceProvider
protected void RaiseResourcesChanged()
{
- Owner?.NotifyHostedResourcesChanged(ResourcesChangedToken.Create());
+ Owner?.NotifyHostedResourcesChanged(ResourcesChangedEventArgs.Create());
}
///
@@ -57,7 +57,7 @@ public abstract class ResourceProvider : AvaloniaObject, IResourceProvider
{
if (HasResources)
{
- owner.NotifyHostedResourcesChanged(ResourcesChangedToken.Create());
+ owner.NotifyHostedResourcesChanged(ResourcesChangedEventArgs.Create());
}
}
@@ -70,7 +70,7 @@ public abstract class ResourceProvider : AvaloniaObject, IResourceProvider
{
if (HasResources)
{
- owner.NotifyHostedResourcesChanged(ResourcesChangedToken.Create());
+ owner.NotifyHostedResourcesChanged(ResourcesChangedEventArgs.Create());
}
}
diff --git a/src/Avalonia.Base/Controls/ResourcesChangedEventArgs.cs b/src/Avalonia.Base/Controls/ResourcesChangedEventArgs.cs
index a60c95a2e0..f78910b003 100644
--- a/src/Avalonia.Base/Controls/ResourcesChangedEventArgs.cs
+++ b/src/Avalonia.Base/Controls/ResourcesChangedEventArgs.cs
@@ -1,10 +1,24 @@
-using System;
+using System.Threading;
-namespace Avalonia.Controls
+namespace Avalonia.Controls;
+
+///
+/// Represents the event arguments of .
+/// The identifies the changes.
+///
+/// The sequence number used to identify the changes.
+///
+/// For performance reasons, this type is a struct.
+/// Avoid using a default instance of this type or its default constructor, call instead.
+///
+public readonly record struct ResourcesChangedEventArgs(int SequenceNumber)
{
- // TODO12: change this to be a struct, remove ResourcesChangedToken
- public class ResourcesChangedEventArgs : EventArgs
- {
- public static new readonly ResourcesChangedEventArgs Empty = new ResourcesChangedEventArgs();
- }
+ private static int s_lastSequenceNumber;
+
+ ///
+ /// Creates a new instance of with an auto-incremented sequence number.
+ ///
+ ///
+ public static ResourcesChangedEventArgs Create()
+ => new(Interlocked.Increment(ref s_lastSequenceNumber));
}
diff --git a/src/Avalonia.Base/Controls/ResourcesChangedHelper.cs b/src/Avalonia.Base/Controls/ResourcesChangedHelper.cs
deleted file mode 100644
index 8ad121ad3a..0000000000
--- a/src/Avalonia.Base/Controls/ResourcesChangedHelper.cs
+++ /dev/null
@@ -1,45 +0,0 @@
-using System;
-using Avalonia.LogicalTree;
-
-namespace Avalonia.Controls;
-
-internal static class ResourcesChangedHelper
-{
- internal static void NotifyHostedResourcesChanged(this IResourceHost host, ResourcesChangedToken token)
- {
- if (host is IResourceHost2 host2)
- host2.NotifyHostedResourcesChanged(token);
- else
- host.NotifyHostedResourcesChanged(ResourcesChangedEventArgs.Empty);
- }
-
- internal static void NotifyResourcesChanged(this ILogical logical, ResourcesChangedToken token)
- {
- if (logical is StyledElement styledElement)
- styledElement.NotifyResourcesChanged(token);
- else
- logical.NotifyResourcesChanged(ResourcesChangedEventArgs.Empty);
- }
-
- internal static void SubscribeToResourcesChanged(
- this IResourceHost host,
- EventHandler handler,
- EventHandler handler2)
- {
- if (host is IResourceHost2 host2)
- host2.ResourcesChanged2 += handler2;
- else
- host.ResourcesChanged += handler;
- }
-
- internal static void UnsubscribeFromResourcesChanged(
- this IResourceHost host,
- EventHandler handler,
- EventHandler handler2)
- {
- if (host is IResourceHost2 host2)
- host2.ResourcesChanged2 -= handler2;
- else
- host.ResourcesChanged -= handler;
- }
-}
diff --git a/src/Avalonia.Base/Controls/ResourcesChangedToken.cs b/src/Avalonia.Base/Controls/ResourcesChangedToken.cs
deleted file mode 100644
index 8de692e729..0000000000
--- a/src/Avalonia.Base/Controls/ResourcesChangedToken.cs
+++ /dev/null
@@ -1,11 +0,0 @@
-using System.Threading;
-
-namespace Avalonia.Controls;
-
-internal record struct ResourcesChangedToken(int SequenceNumber)
-{
- private static int s_lastSequenceNumber;
-
- public static ResourcesChangedToken Create()
- => new(Interlocked.Increment(ref s_lastSequenceNumber));
-}
diff --git a/src/Avalonia.Base/Data/BindingPriority.cs b/src/Avalonia.Base/Data/BindingPriority.cs
index cb7f559e0a..b817c89f7b 100644
--- a/src/Avalonia.Base/Data/BindingPriority.cs
+++ b/src/Avalonia.Base/Data/BindingPriority.cs
@@ -46,9 +46,6 @@ namespace Avalonia.Data
///
/// The value is uninitialized.
///
- Unset = int.MaxValue,
-
- [Obsolete("Use Template priority"), EditorBrowsable(EditorBrowsableState.Never)]
- TemplatedParent = Template,
+ Unset = int.MaxValue
}
}
diff --git a/src/Avalonia.Base/Data/CompiledBinding.cs b/src/Avalonia.Base/Data/CompiledBinding.cs
index 764b04957e..e243246b4f 100644
--- a/src/Avalonia.Base/Data/CompiledBinding.cs
+++ b/src/Avalonia.Base/Data/CompiledBinding.cs
@@ -1,12 +1,15 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
+using System.Diagnostics.CodeAnalysis;
using System.Globalization;
+using System.Linq.Expressions;
using Avalonia.Controls;
using Avalonia.Data.Converters;
using Avalonia.Data.Core;
using Avalonia.Data.Core.ExpressionNodes;
using Avalonia.Data.Core.Parsers;
+using Avalonia.Metadata;
namespace Avalonia.Data;
@@ -26,6 +29,95 @@ public class CompiledBinding : BindingBase
/// The binding path.
public CompiledBinding(CompiledBindingPath path) => Path = path;
+ ///
+ /// Creates a from a lambda expression.
+ ///
+ /// The input type of the binding expression.
+ /// The output type of the binding expression.
+ ///
+ /// The lambda expression representing the binding path
+ /// (e.g., vm => vm.PropertyName).
+ ///
+ /// The source object for the binding. If null, uses the target's DataContext.
+ ///
+ ///
+ /// Optional value converter to transform values between source and target.
+ ///
+ ///
+ /// The binding mode. Default is which resolves to the
+ /// property's default binding mode.
+ ///
+ /// The binding priority.
+ /// The culture in which to evaluate the converter.
+ /// A parameter to pass to the converter.
+ ///
+ /// The value to use when the binding is unable to produce a value.
+ ///
+ /// The string format for the binding result.
+ /// The value to use when the binding result is null.
+ ///
+ /// The timing of binding source updates for TwoWay/OneWayToSource bindings.
+ ///
+ ///
+ /// The amount of time, in milliseconds, to wait before updating the binding source.
+ ///
+ ///
+ /// A configured instance ready to be applied to a property.
+ ///
+ ///
+ /// Thrown when the expression contains unsupported operations or invalid syntax for binding
+ /// expressions.
+ ///
+ ///
+ /// This builds a with a path described by a lambda expression.
+ /// The resulting binding avoids reflection for property access, providing better performance
+ /// than reflection-based bindings.
+ ///
+ /// Supported expressions include:
+ ///
+ /// - Property access: x => x.Property
+ /// - Nested properties: x => x.Property.Nested
+ /// - Indexers: x => x.Items[0]
+ /// - Type casts: x => ((DerivedType)x).Property
+ /// - Logical NOT: x => !x.BoolProperty
+ /// - Stream bindings: x => x.TaskProperty (Task/Observable)
+ /// - AvaloniaProperty access: x => x[MyProperty]
+ ///
+ ///
+ [RequiresDynamicCode(TrimmingMessages.ExpressionNodeRequiresDynamicCodeMessage)]
+ [RequiresUnreferencedCode(TrimmingMessages.ExpressionNodeRequiresUnreferencedCodeMessage)]
+ public static CompiledBinding Create(
+ Expression> expression,
+ object? source = null,
+ IValueConverter? converter = null,
+ BindingMode mode = BindingMode.Default,
+ BindingPriority priority = BindingPriority.LocalValue,
+ CultureInfo? converterCulture = null,
+ object? converterParameter = null,
+ object? fallbackValue = null,
+ string? stringFormat = null,
+ object? targetNullValue = null,
+ UpdateSourceTrigger updateSourceTrigger = UpdateSourceTrigger.Default,
+ int delay = 0)
+ {
+ var path = BindingExpressionVisitor.BuildPath(expression);
+ return new CompiledBinding(path)
+ {
+ Source = source ?? AvaloniaProperty.UnsetValue,
+ Converter = converter,
+ ConverterCulture = converterCulture,
+ ConverterParameter = converterParameter,
+ FallbackValue = fallbackValue ?? AvaloniaProperty.UnsetValue,
+ Mode = mode,
+ Priority = priority,
+ StringFormat = stringFormat,
+ TargetNullValue = targetNullValue ?? AvaloniaProperty.UnsetValue,
+ UpdateSourceTrigger = updateSourceTrigger,
+ Delay = delay
+ };
+ }
+
///
/// Gets or sets the amount of time, in milliseconds, to wait before updating the binding
/// source after the value on the target changes.
@@ -70,6 +162,7 @@ public class CompiledBinding : BindingBase
///
/// Gets or sets the binding path.
///
+ [ConstructorArgument("path")]
public CompiledBindingPath? Path { get; set; }
///
diff --git a/src/Avalonia.Base/Data/CompiledBindingPath.cs b/src/Avalonia.Base/Data/CompiledBindingPath.cs
index aea320702e..886d89df43 100644
--- a/src/Avalonia.Base/Data/CompiledBindingPath.cs
+++ b/src/Avalonia.Base/Data/CompiledBindingPath.cs
@@ -203,12 +203,6 @@ namespace Avalonia.Data
return this;
}
- [Obsolete("This method doesn't do anything anymore. Use Binding.Source instead.")]
- public CompiledBindingPathBuilder SetRawSource(object? rawSource)
- {
- return this;
- }
-
public CompiledBindingPath Build() => new CompiledBindingPath(_elements.ToArray());
}
diff --git a/src/Avalonia.Base/Data/Core/BindingExpression.cs b/src/Avalonia.Base/Data/Core/BindingExpression.cs
index 6ad1a99f41..00a90f87fe 100644
--- a/src/Avalonia.Base/Data/Core/BindingExpression.cs
+++ b/src/Avalonia.Base/Data/Core/BindingExpression.cs
@@ -173,59 +173,6 @@ internal class BindingExpression : UntypedBindingExpressionBase, IDescription, I
_nodes[0].SetSource(source, null);
}
- ///
- /// Creates an from an expression tree.
- ///
- /// The input type of the binding expression.
- /// The output type of the binding expression.
- /// The source from which the binding value will be read.
- /// The expression representing the binding path.
- /// The converter to use.
- /// The converter culture to use.
- /// The converter parameter.
- /// Whether data validation should be enabled for the binding.
- /// The fallback value.
- /// The binding mode.
- /// The binding priority.
- /// The null target value.
- /// Whether to allow reflection for target type conversion.
- [RequiresUnreferencedCode(TrimmingMessages.ExpressionNodeRequiresUnreferencedCodeMessage)]
-#if NET8_0_OR_GREATER
- [RequiresDynamicCode(TrimmingMessages.ExpressionNodeRequiresDynamicCodeMessage)]
-#endif
- internal static BindingExpression Create(
- TIn source,
- Expression> expression,
- IValueConverter? converter = null,
- CultureInfo? converterCulture = null,
- object? converterParameter = null,
- bool enableDataValidation = false,
- Optional
-
+
@@ -34,7 +34,8 @@
-
@@ -74,5 +75,5 @@
-
+
diff --git a/src/Avalonia.Themes.Fluent/Controls/CalendarDatePicker.xaml b/src/Avalonia.Themes.Fluent/Controls/CalendarDatePicker.xaml
index ce580764d7..3a8db8ae36 100644
--- a/src/Avalonia.Themes.Fluent/Controls/CalendarDatePicker.xaml
+++ b/src/Avalonia.Themes.Fluent/Controls/CalendarDatePicker.xaml
@@ -1,4 +1,4 @@
-
@@ -92,8 +92,9 @@
CornerRadius="{TemplateBinding CornerRadius}"
Margin="{TemplateBinding BorderThickness}"
Padding="{TemplateBinding Padding}"
- Watermark="{TemplateBinding Watermark}"
- UseFloatingWatermark="{TemplateBinding UseFloatingWatermark}"
+ PlaceholderText="{TemplateBinding PlaceholderText}"
+ PlaceholderForeground="{TemplateBinding PlaceholderForeground}"
+ UseFloatingPlaceholder="{TemplateBinding UseFloatingPlaceholder}"
HorizontalAlignment="Stretch"
VerticalAlignment="Stretch"
VerticalContentAlignment="{TemplateBinding VerticalContentAlignment}"
@@ -112,7 +113,7 @@
-
diff --git a/src/Avalonia.Themes.Fluent/Controls/ComboBox.xaml b/src/Avalonia.Themes.Fluent/Controls/ComboBox.xaml
index bcba646461..d9ce927153 100644
--- a/src/Avalonia.Themes.Fluent/Controls/ComboBox.xaml
+++ b/src/Avalonia.Themes.Fluent/Controls/ComboBox.xaml
@@ -1,4 +1,4 @@
-
@@ -16,7 +16,7 @@
Item 1
Item 2
-
+
@@ -126,7 +126,7 @@
Foreground="{TemplateBinding Foreground}"
Background="Transparent"
Text="{TemplateBinding Text, Mode=TwoWay}"
- Watermark="{TemplateBinding PlaceholderText}"
+ PlaceholderText="{TemplateBinding PlaceholderText}"
BorderThickness="0"
IsVisible="{TemplateBinding IsEditable}">
diff --git a/src/Avalonia.Themes.Fluent/Controls/ManagedFileChooser.xaml b/src/Avalonia.Themes.Fluent/Controls/ManagedFileChooser.xaml
index 598cec7ace..c980135eca 100644
--- a/src/Avalonia.Themes.Fluent/Controls/ManagedFileChooser.xaml
+++ b/src/Avalonia.Themes.Fluent/Controls/ManagedFileChooser.xaml
@@ -1,4 +1,4 @@
-
@@ -184,7 +184,7 @@
IsVisible="{Binding ShowFilters}"
ItemsSource="{Binding Filters}"
SelectedItem="{Binding SelectedFilter}" />
-
+
@@ -344,7 +344,7 @@
-
+
diff --git a/src/Avalonia.Themes.Fluent/Controls/NumericUpDown.xaml b/src/Avalonia.Themes.Fluent/Controls/NumericUpDown.xaml
index 22b6ef045c..b6c19484e9 100644
--- a/src/Avalonia.Themes.Fluent/Controls/NumericUpDown.xaml
+++ b/src/Avalonia.Themes.Fluent/Controls/NumericUpDown.xaml
@@ -1,21 +1,21 @@
-
+
-
+ Maximum="10"
+ Increment="0.5"
+ VerticalContentAlignment="Center"
+ HorizontalContentAlignment="Center"
+ ButtonSpinnerLocation="Left"
+ PlaceholderText="Enter text" />
Clear
Reveal Password
Password Revealed
-
-
- Content
+
+
+ Content
@@ -20,7 +20,7 @@
M 11.416016,10 20,1.4160156 18.583984,0 10,8.5839846 1.4160156,0 0,1.4160156 8.5839844,10 0,18.583985 1.4160156,20 10,11.416015 18.583984,20 20,18.583985 Z
m10.051 7.0032c2.215 0 4.0105 1.7901 4.0105 3.9984s-1.7956 3.9984-4.0105 3.9984c-2.215 0-4.0105-1.7901-4.0105-3.9984s1.7956-3.9984 4.0105-3.9984zm0 1.4994c-1.3844 0-2.5066 1.1188-2.5066 2.499s1.1222 2.499 2.5066 2.499 2.5066-1.1188 2.5066-2.499-1.1222-2.499-2.5066-2.499zm0-5.0026c4.6257 0 8.6188 3.1487 9.7267 7.5613 0.10085 0.40165-0.14399 0.80877-0.54686 0.90931-0.40288 0.10054-0.81122-0.14355-0.91208-0.54521-0.94136-3.7492-4.3361-6.4261-8.2678-6.4261-3.9334 0-7.3292 2.6792-8.2689 6.4306-0.10063 0.40171-0.50884 0.64603-0.91177 0.54571s-0.648-0.5073-0.54737-0.90901c1.106-4.4152 5.1003-7.5667 9.728-7.5667z
m0.21967 0.21965c-0.26627 0.26627-0.29047 0.68293-0.07262 0.97654l0.07262 0.08412 4.0346 4.0346c-1.922 1.3495-3.3585 3.365-3.9554 5.7495-0.10058 0.4018 0.14362 0.8091 0.54543 0.9097 0.40182 0.1005 0.80909-0.1436 0.90968-0.5455 0.52947-2.1151 1.8371-3.8891 3.5802-5.0341l1.8096 1.8098c-0.70751 0.7215-1.1438 1.71-1.1438 2.8003 0 2.2092 1.7909 4 4 4 1.0904 0 2.0788-0.4363 2.8004-1.1438l5.9193 5.9195c0.2929 0.2929 0.7677 0.2929 1.0606 0 0.2663-0.2662 0.2905-0.6829 0.0726-0.9765l-0.0726-0.0841-6.1135-6.1142 0.0012-0.0015-1.2001-1.1979-2.8699-2.8693 2e-3 -8e-4 -2.8812-2.8782 0.0012-0.0018-1.1333-1.1305-4.3064-4.3058c-0.29289-0.29289-0.76777-0.29289-1.0607 0zm7.9844 9.0458 3.5351 3.5351c-0.45 0.4358-1.0633 0.704-1.7392 0.704-1.3807 0-2.5-1.1193-2.5-2.5 0-0.6759 0.26824-1.2892 0.7041-1.7391zm1.7959-5.7655c-1.0003 0-1.9709 0.14807-2.8889 0.425l1.237 1.2362c0.5358-0.10587 1.0883-0.16119 1.6519-0.16119 3.9231 0 7.3099 2.6803 8.2471 6.4332 0.1004 0.4018 0.5075 0.6462 0.9094 0.5459 0.4019-0.1004 0.6463-0.5075 0.5459-0.9094-1.103-4.417-5.0869-7.5697-9.7024-7.5697zm0.1947 3.5093 3.8013 3.8007c-0.1018-2.0569-1.7488-3.7024-3.8013-3.8007z
-
+
@@ -99,6 +99,7 @@
+
@@ -132,11 +133,12 @@
Grid.Column="1"
Grid.ColumnSpan="1"
Margin="{TemplateBinding Padding}">
-
+
-
+
-
@@ -217,19 +218,12 @@
-
-
-
-
-
+
-
@@ -203,7 +205,7 @@
diff --git a/src/Avalonia.X11/Clipboard/X11Clipboard.cs b/src/Avalonia.X11/Clipboard/X11Clipboard.cs
index f0f4561945..6435e42e32 100644
--- a/src/Avalonia.X11/Clipboard/X11Clipboard.cs
+++ b/src/Avalonia.X11/Clipboard/X11Clipboard.cs
@@ -55,10 +55,9 @@ namespace Avalonia.X11.Clipboard
_storedDataTransfer = null;
_storeAtomTcs?.TrySetResult(true);
- return;
}
- if (ev.type == XEventName.SelectionRequest)
+ else if (ev.type == XEventName.SelectionRequest)
{
var sel = ev.SelectionRequestEvent;
var resp = new XEvent
@@ -83,6 +82,17 @@ namespace Avalonia.X11.Clipboard
XSendEvent(_x11.Display, sel.requestor, false, new IntPtr((int)EventMask.NoEventMask), ref resp);
}
+ else if (ev.type == XEventName.SelectionNotify)
+ {
+ if (ev.SelectionEvent.selection == _x11.Atoms.CLIPBOARD_MANAGER &&
+ ev.SelectionEvent.target == _x11.Atoms.SAVE_TARGETS &&
+ _x11.Atoms.CLIPBOARD_MANAGER != IntPtr.Zero &&
+ _x11.Atoms.SAVE_TARGETS != IntPtr.Zero)
+ {
+ _storeAtomTcs?.TrySetResult(true);
+ }
+ }
+
IntPtr WriteTargetToProperty(IntPtr target, IntPtr window, IntPtr property)
{
if (target == _x11.Atoms.TARGETS)
diff --git a/src/Avalonia.X11/Glx/GlxGlPlatformSurface.cs b/src/Avalonia.X11/Glx/GlxGlPlatformSurface.cs
index a4d6e27451..e1cd12bece 100644
--- a/src/Avalonia.X11/Glx/GlxGlPlatformSurface.cs
+++ b/src/Avalonia.X11/Glx/GlxGlPlatformSurface.cs
@@ -21,7 +21,7 @@ namespace Avalonia.X11.Glx
return new RenderTarget((GlxContext)context, _info);
}
- private class RenderTarget : IGlPlatformSurfaceRenderTarget2
+ private class RenderTarget : IGlPlatformSurfaceRenderTarget
{
private readonly GlxContext _context;
private readonly EglGlPlatformSurface.IEglWindowGlPlatformSurfaceInfo _info;
@@ -39,9 +39,8 @@ namespace Avalonia.X11.Glx
}
public bool IsCorrupted => false;
- public IGlPlatformSurfaceRenderingSession BeginDraw(PixelSize size) => BeginDrawCore(size);
- public IGlPlatformSurfaceRenderingSession BeginDraw() => BeginDrawCore(null);
- public IGlPlatformSurfaceRenderingSession BeginDrawCore(PixelSize? expectedSize)
+
+ public IGlPlatformSurfaceRenderingSession BeginDraw(PixelSize? expectedSize)
{
var size = expectedSize ?? _info.Size;
if (expectedSize.HasValue)
diff --git a/src/Avalonia.X11/X11Platform.cs b/src/Avalonia.X11/X11Platform.cs
index 6e129b6a65..62be01cbce 100644
--- a/src/Avalonia.X11/X11Platform.cs
+++ b/src/Avalonia.X11/X11Platform.cs
@@ -230,6 +230,83 @@ namespace Avalonia.X11
throw new InvalidOperationException($"{nameof(X11PlatformOptions)}.{nameof(X11PlatformOptions.RenderingMode)} has a value of \"{string.Join(", ", opts.RenderingMode)}\", but no options were applied.");
}
+
+ public void GetWindowsZOrder(ReadOnlySpan windows, Span outputZOrder)
+ {
+ // a mapping of parent windows to their children, sorted by z-order (bottom to top)
+ var windowsChildren = new Dictionary>();
+
+ var indexInWindowsSpan = new Dictionary();
+ for (var i = 0; i < windows.Length; i++)
+ if (windows[i] is X11Window { Handle: { } handle })
+ indexInWindowsSpan[handle.Handle] = i;
+
+ foreach (var window in windows)
+ {
+ if (window is not X11Window x11Window)
+ continue;
+
+ var node = x11Window.Handle.Handle;
+ while (node != IntPtr.Zero)
+ {
+ if (windowsChildren.ContainsKey(node))
+ {
+ break;
+ }
+
+ if (XQueryTree(Info.Display, node, out _, out var parent,
+ out var childrenPtr, out var childrenCount) == 0)
+ {
+ break;
+ }
+
+ if (childrenPtr != IntPtr.Zero)
+ {
+ unsafe
+ {
+ var children = (IntPtr*)childrenPtr;
+ windowsChildren[node] = new List(childrenCount);
+ for (var i = 0; i < childrenCount; i++)
+ {
+ windowsChildren[node].Add(children[i]);
+ }
+
+ XFree(childrenPtr);
+ }
+ }
+
+ node = parent;
+ }
+ }
+
+ var stack = new Stack();
+ var zOrder = 0;
+ stack.Push(Info.RootWindow);
+
+ while (stack.Count > 0)
+ {
+ var currentWindow = stack.Pop();
+
+ if (!windowsChildren.TryGetValue(currentWindow, out var children))
+ {
+ continue;
+ }
+
+ if (indexInWindowsSpan.TryGetValue(currentWindow, out var index))
+ {
+ outputZOrder[index] = zOrder;
+ }
+
+ zOrder++;
+
+ // Children are returned bottom to top, so we need to push them in reverse order
+ // In order to traverse bottom children first
+ for (int i = children.Count - 1; i >= 0; i--)
+ {
+ stack.Push(children[i]);
+ }
+ }
+ }
}
}
diff --git a/src/Avalonia.X11/X11Window.cs b/src/Avalonia.X11/X11Window.cs
index ab59882962..c931b1a6fb 100644
--- a/src/Avalonia.X11/X11Window.cs
+++ b/src/Avalonia.X11/X11Window.cs
@@ -1557,80 +1557,6 @@ namespace Avalonia.X11
}
- ///
- public void GetWindowsZOrder(Span windows, Span outputZOrder)
- {
- // a mapping of parent windows to their children, sorted by z-order (bottom to top)
- var windowsChildren = new Dictionary>();
-
- var indexInWindowsSpan = new Dictionary();
- for (var i = 0; i < windows.Length; i++)
- if (windows[i].PlatformImpl is { Handle: { } handle })
- indexInWindowsSpan[handle.Handle] = i;
-
- foreach (var window in windows)
- {
- if (window.PlatformImpl is not X11Window x11Window)
- continue;
-
- var node = x11Window.Handle.Handle;
- while (node != IntPtr.Zero)
- {
- if (windowsChildren.ContainsKey(node))
- {
- break;
- }
-
- if (XQueryTree(_x11.Display, node, out _, out var parent,
- out var childrenPtr, out var childrenCount) == 0)
- {
- break;
- }
-
- if (childrenPtr != IntPtr.Zero)
- {
- var children = (IntPtr*)childrenPtr;
- windowsChildren[node] = new List(childrenCount);
- for (var i = 0; i < childrenCount; i++)
- {
- windowsChildren[node].Add(children[i]);
- }
- XFree(childrenPtr);
- }
-
- node = parent;
- }
- }
-
- var stack = new Stack();
- var zOrder = 0;
- stack.Push(_x11.RootWindow);
-
- while (stack.Count > 0)
- {
- var currentWindow = stack.Pop();
-
- if (!windowsChildren.TryGetValue(currentWindow, out var children))
- {
- continue;
- }
-
- if (indexInWindowsSpan.TryGetValue(currentWindow, out var index))
- {
- outputZOrder[index] = zOrder;
- }
-
- zOrder++;
-
- // Children are returned bottom to top, so we need to push them in reverse order
- // In order to traverse bottom children first
- for (int i = children.Count - 1; i >= 0; i--)
- {
- stack.Push(children[i]);
- }
- }
- }
-
public void TakeFocus()
{
// TODO: Not yet implemented: need to check if this is required on X11 or not.
diff --git a/src/Browser/Avalonia.Browser/Rendering/BrowserWebGlRenderTarget.cs b/src/Browser/Avalonia.Browser/Rendering/BrowserWebGlRenderTarget.cs
index db66c9a0ee..4417dd2301 100644
--- a/src/Browser/Avalonia.Browser/Rendering/BrowserWebGlRenderTarget.cs
+++ b/src/Browser/Avalonia.Browser/Rendering/BrowserWebGlRenderTarget.cs
@@ -65,14 +65,17 @@ partial class BrowserWebGlRenderTarget : BrowserRenderTarget, IGlPlatformSurface
{
_target = target;
}
-
+
+ public bool IsCorrupted => false;
+
public void Dispose()
{
// No-op
}
- public IGlPlatformSurfaceRenderingSession BeginDraw()
+ public IGlPlatformSurfaceRenderingSession BeginDraw(PixelSize? expectedPixelSize)
{
+ // TODO: use expectedPixelSize
var s = _target._sizeGetter();
_target.UpdateSize(s.Size);
var restoreContext = _target.GlContext.EnsureCurrent();
diff --git a/src/Browser/Avalonia.Browser/WindowingPlatform.cs b/src/Browser/Avalonia.Browser/WindowingPlatform.cs
index 0589b67c0d..33b9521ae2 100644
--- a/src/Browser/Avalonia.Browser/WindowingPlatform.cs
+++ b/src/Browser/Avalonia.Browser/WindowingPlatform.cs
@@ -74,6 +74,9 @@ internal class BrowserWindowingPlatform : IWindowingPlatform
return null;
}
+ public void GetWindowsZOrder(ReadOnlySpan windows, Span zOrder)
+ => throw new NotSupportedException();
+
public static KeyboardDevice Keyboard => s_keyboard ??
throw new InvalidOperationException("BrowserWindowingPlatform not registered.");
diff --git a/src/Headless/Avalonia.Headless.NUnit/AvaloniaTestMethodCommand.cs b/src/Headless/Avalonia.Headless.NUnit/AvaloniaTestMethodCommand.cs
index 96dfd701e9..515b9651e3 100644
--- a/src/Headless/Avalonia.Headless.NUnit/AvaloniaTestMethodCommand.cs
+++ b/src/Headless/Avalonia.Headless.NUnit/AvaloniaTestMethodCommand.cs
@@ -1,6 +1,5 @@
using System;
using System.Collections.Generic;
-using System.Reflection;
using System.Threading.Tasks;
using Avalonia.Threading;
using NUnit.Framework.Interfaces;
@@ -13,28 +12,14 @@ internal class AvaloniaTestMethodCommand : TestCommand
{
private readonly HeadlessUnitTestSession _session;
private readonly TestCommand _innerCommand;
- private readonly List _beforeTest;
- private readonly List _afterTest;
-
- // There are multiple problems with NUnit integration at the moment when we wrote this integration.
- // NUnit doesn't have extensibility API for running on custom dispatcher/sync-context.
- // See https://github.com/nunit/nunit/issues/2917 https://github.com/nunit/nunit/issues/2774
- // To workaround that we had to replace inner TestMethodCommand with our own implementation while keeping original hierarchy of commands.
- // Which will respect proper async/await awaiting code that works with our session and can be block-awaited to fit in NUnit.
- // Also, we need to push BeforeTest/AfterTest callbacks to the very same session call.
- // I hope there will be a better solution without reflection, but for now that's it.
- private static FieldInfo s_innerCommand = typeof(DelegatingTestCommand)
- .GetField("innerCommand", BindingFlags.Instance | BindingFlags.NonPublic)!;
- private static FieldInfo s_beforeTest = typeof(BeforeAndAfterTestCommand)
- .GetField("BeforeTest", BindingFlags.Instance | BindingFlags.NonPublic)!;
- private static FieldInfo s_afterTest = typeof(BeforeAndAfterTestCommand)
- .GetField("AfterTest", BindingFlags.Instance | BindingFlags.NonPublic)!;
+ private readonly List> _beforeTest;
+ private readonly List> _afterTest;
private AvaloniaTestMethodCommand(
HeadlessUnitTestSession session,
TestCommand innerCommand,
- List beforeTest,
- List afterTest)
+ List> beforeTest,
+ List> afterTest)
: base(innerCommand.Test)
{
_session = session;
@@ -45,61 +30,65 @@ internal class AvaloniaTestMethodCommand : TestCommand
public static TestCommand ProcessCommand(HeadlessUnitTestSession session, TestCommand command)
{
- return ProcessCommand(session, command, new List(), new List());
+ return ProcessCommand(session, command, [], []);
}
- private static TestCommand ProcessCommand(HeadlessUnitTestSession session, TestCommand command, List before, List after)
+ private static TestCommand ProcessCommand(
+ HeadlessUnitTestSession session,
+ TestCommand command,
+ List> before,
+ List> after)
{
- if (command is BeforeAndAfterTestCommand beforeAndAfterTestCommand)
+ var beforeAndAfterTestCommand = command as BeforeAndAfterTestCommand;
+ if (beforeAndAfterTestCommand is not null)
{
- if (s_beforeTest.GetValue(beforeAndAfterTestCommand) is Action beforeTest)
- {
- Action beforeAction = c => before.Add(() => beforeTest(c));
- s_beforeTest.SetValue(beforeAndAfterTestCommand, beforeAction);
- }
- if (s_afterTest.GetValue(beforeAndAfterTestCommand) is Action afterTest)
+ ref var beforeTest = ref beforeAndAfterTestCommand.BeforeTest();
+ if (beforeTest is not null)
{
- Action afterAction = c => after.Add(() => afterTest(c));
- s_afterTest.SetValue(beforeAndAfterTestCommand, afterAction);
+ AddBeforeOrAfterAction(beforeTest, before);
+ beforeTest = _ => { };
}
}
-
- if (command is DelegatingTestCommand delegatingTestCommand
- && s_innerCommand.GetValue(delegatingTestCommand) is TestCommand inner)
+
+ var delegatingTestCommand = command as DelegatingTestCommand;
+ if (delegatingTestCommand is not null)
{
- s_innerCommand.SetValue(delegatingTestCommand, ProcessCommand(session, inner, before, after));
+ ref var innerCommand = ref delegatingTestCommand.InnerCommand();
+ innerCommand = ProcessCommand(session, innerCommand, before, after);
}
- else if (command is TestMethodCommand methodCommand)
+
+ if (beforeAndAfterTestCommand is not null)
{
- return new AvaloniaTestMethodCommand(session, methodCommand, before, after);
+ ref var afterTest = ref beforeAndAfterTestCommand.AfterTest();
+ if (afterTest is not null)
+ {
+ AddBeforeOrAfterAction(afterTest, after);
+ afterTest = _ => { };
+ }
}
+
+ if (delegatingTestCommand is null && command is TestMethodCommand methodCommand)
+ return new AvaloniaTestMethodCommand(session, methodCommand, before, after);
return command;
}
public override TestResult Execute(TestExecutionContext context)
{
- return _session.DispatchCore(() => ExecuteTestMethod(context), true, default).GetAwaiter().GetResult();
+ return _session.DispatchCore(() => ExecuteTestMethod(context), true, context.CancellationToken).GetAwaiter().GetResult();
}
// Unfortunately, NUnit has issues with custom synchronization contexts, which means we need to add some hacks to make it work.
private async Task ExecuteTestMethod(TestExecutionContext context)
{
- _beforeTest.ForEach(a => a());
+ foreach (var beforeTest in _beforeTest)
+ await beforeTest(context);
var testMethod = _innerCommand.Test.Method;
var methodInfo = testMethod!.MethodInfo;
var result = methodInfo.Invoke(context.TestObject, _innerCommand.Test.Arguments);
- // Only Task, non generic ValueTask are supported in async context. No ValueTask<> nor F# tasks.
- if (result is Task task)
- {
- await task;
- }
- else if (result is ValueTask valueTask)
- {
- await valueTask;
- }
+ await ToTask(result);
context.CurrentResult.SetResult(ResultState.Success);
@@ -108,10 +97,55 @@ internal class AvaloniaTestMethodCommand : TestCommand
if (context.ExecutionStatus != TestExecutionStatus.AbortRequested)
{
- _afterTest.ForEach(a => a());
+ foreach (var afterTest in _afterTest)
+ await afterTest(context);
+
Dispatcher.UIThread.RunJobs();
}
return context.CurrentResult;
}
+
+ private static void AddBeforeOrAfterAction(Action action, List> targets)
+ {
+ // We need to extract the SetUp and TearDown methods to run them asynchronously on Avalonia's synchronization context.
+ if (action.Target is SetUpTearDownItem setUpTearDownItem)
+ {
+ var methods = action.Method.Name switch
+ {
+ nameof(SetUpTearDownItem.RunSetUp) => setUpTearDownItem.SetUpMethods(),
+ nameof(SetUpTearDownItem.RunTearDown) => setUpTearDownItem.TearDownMethods(),
+ _ => null
+ };
+
+ if (methods is not null)
+ {
+ foreach (var method in methods)
+ {
+ targets.Add(context =>
+ {
+ var result = method.Invoke(method.IsStatic ? null : context.TestObject, null);
+ return ToTask(result);
+ });
+ }
+
+ return;
+ }
+ }
+
+ targets.Add(context =>
+ {
+ action(context);
+ return Task.CompletedTask;
+ });
+ }
+
+ private static Task ToTask(object? result)
+ // Only Task, non generic ValueTask are supported in async context. No ValueTask<> nor F# tasks.
+ => result switch
+ {
+ Task task => task,
+ ValueTask valueTask => valueTask.AsTask(),
+ _ => Task.CompletedTask
+ };
}
diff --git a/src/Headless/Avalonia.Headless.NUnit/NUnitReflectionHelper.cs b/src/Headless/Avalonia.Headless.NUnit/NUnitReflectionHelper.cs
new file mode 100644
index 0000000000..cd24f49cfd
--- /dev/null
+++ b/src/Headless/Avalonia.Headless.NUnit/NUnitReflectionHelper.cs
@@ -0,0 +1,86 @@
+using System;
+using System.Collections.Generic;
+using System.Runtime.CompilerServices;
+using NUnit.Framework.Interfaces;
+using NUnit.Framework.Internal;
+using NUnit.Framework.Internal.Commands;
+
+namespace Avalonia.Headless.NUnit;
+
+///
+/// 2023-05-10, original comment from Max about NUnit 3:
+/// There are multiple problems with NUnit integration at the moment when we wrote this integration.
+/// NUnit doesn't have extensibility API for running on custom dispatcher/sync-context.
+/// See https://github.com/nunit/nunit/issues/2917 https://github.com/nunit/nunit/issues/2774
+/// To workaround that we had to replace inner TestMethodCommand with our own implementation while keeping original hierarchy of commands.
+/// Which will respect proper async/await awaiting code that works with our session and can be block-awaited to fit in NUnit.
+/// Also, we need to push BeforeTest/AfterTest callbacks to the very same session call.
+/// I hope there will be a better solution without reflection, but for now that's it.
+///
+/// 2026-02-04: the situation hasn't changed at all with NUnit 4.
+///
+internal static class NUnitReflectionHelper
+{
+ [UnsafeAccessor(UnsafeAccessorKind.Field, Name = ReflectionDelegatingTestCommand.InnerCommandFieldName)]
+ private static extern ref TestCommand DelegatingTestCommand_InnerCommand(DelegatingTestCommand instance);
+
+ [UnsafeAccessor(UnsafeAccessorKind.Field, Name = ReflectionBeforeAndAfterTestCommand.BeforeTestFieldName)]
+ private static extern ref Action? BeforeAndAfterTestCommand_BeforeTest(BeforeAndAfterTestCommand instance);
+
+ [UnsafeAccessor(UnsafeAccessorKind.Field, Name = ReflectionBeforeAndAfterTestCommand.AfterTestFieldName)]
+ private static extern ref Action? BeforeAndAfterTestCommand_AfterTest(BeforeAndAfterTestCommand instance);
+
+ [UnsafeAccessor(UnsafeAccessorKind.Field, Name = "_setUpMethods")]
+ private static extern ref IList SetUpTearDownItem_SetUpMethods(SetUpTearDownItem instance);
+
+ [UnsafeAccessor(UnsafeAccessorKind.Field, Name = "_tearDownMethods")]
+ private static extern ref IList SetUpTearDownItem_TearDownMethods(SetUpTearDownItem instance);
+
+ extension(DelegatingTestCommand instance)
+ {
+ public ref TestCommand InnerCommand()
+ => ref DelegatingTestCommand_InnerCommand(instance);
+ }
+
+ extension(BeforeAndAfterTestCommand instance)
+ {
+ public ref Action? BeforeTest()
+ => ref BeforeAndAfterTestCommand_BeforeTest(instance);
+
+ public ref Action? AfterTest()
+ => ref BeforeAndAfterTestCommand_AfterTest(instance);
+ }
+
+ extension(SetUpTearDownItem instance)
+ {
+ public ref IList SetUpMethods()
+ => ref SetUpTearDownItem_SetUpMethods(instance);
+
+ public ref IList TearDownMethods()
+ => ref SetUpTearDownItem_TearDownMethods(instance);
+ }
+
+ private sealed class ReflectionDelegatingTestCommand : DelegatingTestCommand
+ {
+ public ReflectionDelegatingTestCommand(TestCommand innerCommand)
+ : base(innerCommand)
+ {
+ }
+
+ public const string InnerCommandFieldName = nameof(innerCommand);
+
+ public override TestResult Execute(TestExecutionContext context)
+ => throw new NotSupportedException("Reflection-only type, this method should never be called");
+ }
+
+ private sealed class ReflectionBeforeAndAfterTestCommand : BeforeAndAfterTestCommand
+ {
+ public ReflectionBeforeAndAfterTestCommand(TestCommand innerCommand)
+ : base(innerCommand)
+ {
+ }
+
+ public const string BeforeTestFieldName = nameof(BeforeTest);
+ public const string AfterTestFieldName = nameof(AfterTest);
+ }
+}
diff --git a/src/Headless/Avalonia.Headless/AvaloniaHeadlessPlatform.cs b/src/Headless/Avalonia.Headless/AvaloniaHeadlessPlatform.cs
index a423c9d866..667a8ba3ee 100644
--- a/src/Headless/Avalonia.Headless/AvaloniaHeadlessPlatform.cs
+++ b/src/Headless/Avalonia.Headless/AvaloniaHeadlessPlatform.cs
@@ -63,6 +63,14 @@ namespace Avalonia.Headless
public IWindowImpl CreateEmbeddableWindow() => throw new PlatformNotSupportedException();
public ITrayIconImpl? CreateTrayIcon() => null;
+
+ public void GetWindowsZOrder(ReadOnlySpan windows, Span zOrder)
+ {
+ for (var i = 0; i < windows.Length; ++i)
+ {
+ zOrder[i] = (windows[i] as HeadlessWindowImpl)?.ZOrder ?? 0;
+ }
+ }
}
internal static void Initialize(AvaloniaHeadlessPlatformOptions opts)
diff --git a/src/Headless/Avalonia.Headless/HeadlessPlatformRenderInterface.cs b/src/Headless/Avalonia.Headless/HeadlessPlatformRenderInterface.cs
index 05d835c57c..c2f024cf37 100644
--- a/src/Headless/Avalonia.Headless/HeadlessPlatformRenderInterface.cs
+++ b/src/Headless/Avalonia.Headless/HeadlessPlatformRenderInterface.cs
@@ -56,11 +56,13 @@ namespace Avalonia.Headless
=> new HeadlessGeometryStub(g1.Bounds.Union(g2.Bounds));
public IRenderTarget CreateRenderTarget(IEnumerable surfaces) => new HeadlessRenderTarget();
- public IDrawingContextLayerImpl CreateOffscreenRenderTarget(PixelSize pixelSize, double scaling) =>
- new HeadlessBitmapStub(pixelSize, new Vector(96 * scaling, 96 * scaling));
+ public IDrawingContextLayerImpl CreateOffscreenRenderTarget(PixelSize pixelSize, Vector scaling,
+ bool enableTextAntialiasing) =>
+ new HeadlessBitmapStub(pixelSize, scaling * 96);
public bool IsLost => false;
public IReadOnlyDictionary PublicFeatures { get; } = new Dictionary();
+ public PixelSize? MaxOffscreenRenderTargetPixelSize => null;
public object? TryGetFeature(Type featureType) => null;
public IRenderTargetBitmapImpl CreateRenderTargetBitmap(PixelSize size, Vector dpi)
@@ -398,11 +400,20 @@ namespace Avalonia.Headless
}
- public IDrawingContextImpl CreateDrawingContext(bool _)
+ public IDrawingContextImpl CreateDrawingContext(bool useScaledDrawing)
{
return new HeadlessDrawingContextStub();
}
+ public IDrawingContextImpl CreateDrawingContext(PixelSize expectedPixelSize,
+ out RenderTargetDrawingContextProperties properties)
+ {
+ properties = default;
+ return new HeadlessDrawingContextStub();
+ }
+
+ public RenderTargetProperties Properties => default;
+
public bool IsCorrupted => false;
public void Blit(IDrawingContextImpl context)
@@ -580,13 +591,22 @@ namespace Avalonia.Headless
private class HeadlessRenderTarget : IRenderTarget
{
+ public RenderTargetProperties Properties => default;
+
public void Dispose()
{
}
- public IDrawingContextImpl CreateDrawingContext(bool _)
+ public IDrawingContextImpl CreateDrawingContext(bool useScaledDrawing)
+ {
+ return new HeadlessDrawingContextStub();
+ }
+
+ public IDrawingContextImpl CreateDrawingContext(PixelSize expectedPixelSize,
+ out RenderTargetDrawingContextProperties properties)
{
+ properties = default;
return new HeadlessDrawingContextStub();
}
diff --git a/src/Headless/Avalonia.Headless/HeadlessWindowExtensions.cs b/src/Headless/Avalonia.Headless/HeadlessWindowExtensions.cs
index b17a1150fc..79c0d331cd 100644
--- a/src/Headless/Avalonia.Headless/HeadlessWindowExtensions.cs
+++ b/src/Headless/Avalonia.Headless/HeadlessWindowExtensions.cs
@@ -41,13 +41,6 @@ public static class HeadlessWindowExtensions
return GetImpl(topLevel).GetLastRenderedFrame();
}
- ///
- /// Simulates a keyboard press on the headless window/toplevel.
- ///
- [Obsolete("Use the overload that takes a physical key and key symbol instead, or KeyPressQwerty alternatively.")]
- public static void KeyPress(this TopLevel topLevel, Key key, RawInputModifiers modifiers) =>
- KeyPress(topLevel, key, modifiers, PhysicalKey.None, null);
-
///
/// Simulates keyboard press on the headless window/toplevel.
///
@@ -61,13 +54,6 @@ public static class HeadlessWindowExtensions
public static void KeyPressQwerty(this TopLevel topLevel, PhysicalKey physicalKey, RawInputModifiers modifiers) =>
RunJobsOnImpl(topLevel, w => w.KeyPress(physicalKey.ToQwertyKey(), modifiers, physicalKey, physicalKey.ToQwertyKeySymbol()));
- ///
- /// Simulates a keyboard release on the headless window/toplevel.
- ///
- [Obsolete("Use the overload that takes a physical key and key symbol instead, or KeyReleaseQwerty alternatively.")]
- public static void KeyRelease(this TopLevel topLevel, Key key, RawInputModifiers modifiers) =>
- KeyRelease(topLevel, key, modifiers, PhysicalKey.None, null);
-
///
/// Simulates keyboard release on the headless window/toplevel.
///
@@ -121,14 +107,6 @@ public static class HeadlessWindowExtensions
RawInputModifiers modifiers = RawInputModifiers.None) =>
RunJobsOnImpl(topLevel, w => w.MouseWheel(point, delta, modifiers));
- ///
- /// Simulates a drag and drop target event on the headless window/toplevel. This event simulates a user moving files from another app to the current app.
- ///
- [Obsolete($"Use the overload accepting a {nameof(IDataTransfer)} instance instead.")]
- public static void DragDrop(this TopLevel topLevel, Point point, RawDragEventType type, IDataObject data,
- DragDropEffects effects, RawInputModifiers modifiers = RawInputModifiers.None) =>
- RunJobsOnImpl(topLevel, w => w.DragDrop(point, type, data, effects, modifiers));
-
///
/// Simulates a drag and drop target event on the headless window/toplevel. This event simulates a user moving files from another app to the current app.
///
diff --git a/src/Headless/Avalonia.Headless/HeadlessWindowImpl.cs b/src/Headless/Avalonia.Headless/HeadlessWindowImpl.cs
index 8f80e22138..8d88cebc13 100644
--- a/src/Headless/Avalonia.Headless/HeadlessWindowImpl.cs
+++ b/src/Headless/Avalonia.Headless/HeadlessWindowImpl.cs
@@ -25,7 +25,6 @@ namespace Avalonia.Headless
private WriteableBitmap? _lastRenderedFrame;
private readonly object _sync = new object();
private readonly PixelFormat _frameBufferFormat;
- private int _zOrder;
public bool IsPopup { get; }
public HeadlessWindowImpl(bool isPopup, PixelFormat frameBufferFormat)
@@ -59,6 +58,8 @@ namespace Avalonia.Headless
public Compositor Compositor => AvaloniaHeadlessPlatform.Compositor!;
+ public int ZOrder { get; private set; }
+
public void SetInputRoot(IInputRoot inputRoot)
{
InputRoot = inputRoot;
@@ -82,7 +83,7 @@ namespace Avalonia.Headless
{
if (activate)
{
- _zOrder = _nextGlobalZOrder++;
+ ZOrder = _nextGlobalZOrder++;
Dispatcher.UIThread.Post(() => Activated?.Invoke(), DispatcherPriority.Input);
}
}
@@ -96,7 +97,7 @@ namespace Avalonia.Headless
public Action? PositionChanged { get; set; }
public void Activate()
{
- _zOrder = _nextGlobalZOrder++;
+ ZOrder = _nextGlobalZOrder++;
Dispatcher.UIThread.Post(() => Activated?.Invoke(), DispatcherPriority.Input);
}
@@ -349,13 +350,6 @@ namespace Avalonia.Headless
point, delta, modifiers));
}
- [Obsolete($"Use the overload accepting a {nameof(IDataTransfer)} instance instead.")]
- void IHeadlessWindow.DragDrop(Point point, RawDragEventType type, IDataObject data, DragDropEffects effects, RawInputModifiers modifiers)
- {
- var device = AvaloniaLocator.Current.GetRequiredService();
- Input?.Invoke(new RawDragEvent(device, type, InputRoot!, point, new DataObjectToDataTransferWrapper(data), effects, modifiers));
- }
-
void IHeadlessWindow.DragDrop(Point point, RawDragEventType type, IDataTransfer data, DragDropEffects effects, RawInputModifiers modifiers)
{
var device = AvaloniaLocator.Current.GetRequiredService();
@@ -437,15 +431,6 @@ namespace Avalonia.Headless
}
- public void GetWindowsZOrder(Span windows, Span zOrder)
- {
- for (int i = 0; i < windows.Length; ++i)
- {
- if (windows[i].PlatformImpl is HeadlessWindowImpl headlessWindowImpl)
- zOrder[i] = headlessWindowImpl._zOrder;
- }
- }
-
public void TakeFocus()
{
}
diff --git a/src/Headless/Avalonia.Headless/IHeadlessWindow.cs b/src/Headless/Avalonia.Headless/IHeadlessWindow.cs
index 2fe11df2ca..30c2390f64 100644
--- a/src/Headless/Avalonia.Headless/IHeadlessWindow.cs
+++ b/src/Headless/Avalonia.Headless/IHeadlessWindow.cs
@@ -15,8 +15,6 @@ namespace Avalonia.Headless
void MouseMove(Point point, RawInputModifiers modifiers = RawInputModifiers.None);
void MouseUp(Point point, MouseButton button, RawInputModifiers modifiers = RawInputModifiers.None);
void MouseWheel(Point point, Vector delta, RawInputModifiers modifiers = RawInputModifiers.None);
- [Obsolete($"Use the overload accepting a {nameof(IDataTransfer)} instance instead.")]
- void DragDrop(Point point, RawDragEventType type, IDataObject data, DragDropEffects effects, RawInputModifiers modifiers = RawInputModifiers.None);
void DragDrop(Point point, RawDragEventType type, IDataTransfer data, DragDropEffects effects, RawInputModifiers modifiers = RawInputModifiers.None);
}
}
diff --git a/src/Linux/Avalonia.LinuxFramebuffer/DrmOutputOptions.cs b/src/Linux/Avalonia.LinuxFramebuffer/DrmOutputOptions.cs
index f733fe4d72..42a8ed4f0d 100644
--- a/src/Linux/Avalonia.LinuxFramebuffer/DrmOutputOptions.cs
+++ b/src/Linux/Avalonia.LinuxFramebuffer/DrmOutputOptions.cs
@@ -1,4 +1,5 @@
using Avalonia.Media;
+using Avalonia.Platform;
namespace Avalonia.LinuxFramebuffer
{
@@ -12,7 +13,13 @@ namespace Avalonia.LinuxFramebuffer
/// Default: 1.0
///
public double Scaling { get; set; } = 1.0;
-
+
+ ///
+ /// The orientation of the screen relative to the frame buffer memory orientation
+ /// Default: Normal
+ ///
+ public SurfaceOrientation Orientation { get; set; } = SurfaceOrientation.Rotation0;
+
///
/// If true an two cycle buffer swapping is processed at init.
/// Default: True
diff --git a/src/Linux/Avalonia.LinuxFramebuffer/FramebufferToplevelImpl.cs b/src/Linux/Avalonia.LinuxFramebuffer/FramebufferToplevelImpl.cs
index 2a086b353b..edd0b1ef72 100644
--- a/src/Linux/Avalonia.LinuxFramebuffer/FramebufferToplevelImpl.cs
+++ b/src/Linux/Avalonia.LinuxFramebuffer/FramebufferToplevelImpl.cs
@@ -11,7 +11,7 @@ using Avalonia.Rendering.Composition;
namespace Avalonia.LinuxFramebuffer
{
- class FramebufferToplevelImpl : ITopLevelImpl, IScreenInfoProvider
+ class FramebufferToplevelImpl : ITopLevelImpl, IScreenInfoProvider, ISurfaceOrientation
{
private readonly IOutputBackend _outputBackend;
private readonly IInputBackend _inputBackend;
@@ -81,5 +81,7 @@ using Avalonia.Rendering.Composition;
public AcrylicPlatformCompensationLevels AcrylicCompensationLevels { get; } = new AcrylicPlatformCompensationLevels(1, 1, 1);
public object? TryGetFeature(Type featureType) => null;
+
+ SurfaceOrientation ISurfaceOrientation.Orientation => _outputBackend is ISurfaceOrientation surfaceOrientation ? surfaceOrientation.Orientation : SurfaceOrientation.Rotation0;
}
}
diff --git a/src/Linux/Avalonia.LinuxFramebuffer/Input/LibInput/LibInputBackend.cs b/src/Linux/Avalonia.LinuxFramebuffer/Input/LibInput/LibInputBackend.cs
index abff7f0936..671508a943 100644
--- a/src/Linux/Avalonia.LinuxFramebuffer/Input/LibInput/LibInputBackend.cs
+++ b/src/Linux/Avalonia.LinuxFramebuffer/Input/LibInput/LibInputBackend.cs
@@ -1,8 +1,10 @@
using System;
using System.IO;
+using System.Linq;
using System.Threading;
using Avalonia.Input;
using Avalonia.Input.Raw;
+using Avalonia.Platform;
using static Avalonia.LinuxFramebuffer.Input.LibInput.LibInputNativeUnsafeMethods;
namespace Avalonia.LinuxFramebuffer.Input.LibInput
{
@@ -30,9 +32,22 @@ namespace Avalonia.LinuxFramebuffer.Input.LibInput
private unsafe void InputThread(IntPtr ctx, LibInputBackendOptions options)
{
var fd = libinput_get_fd(ctx);
+ IntPtr[] devices = [.. options.Events!.Select(f => libinput_path_add_device(ctx, f)).Where(d => d != IntPtr.Zero)];
+ var screenOrientation = _screen is ISurfaceOrientation surfaceOrientation ? surfaceOrientation.Orientation : SurfaceOrientation.Rotation0;
+
+ float[] matrix = screenOrientation switch
+ {
+ SurfaceOrientation.Rotation90 => [0, 1, 0, -1, 0, 1],
+ SurfaceOrientation.Rotation180 => [-1, 0, 1, 0, -1, 1],
+ SurfaceOrientation.Rotation270 => [0, -1, 1, 1, 0, 0],
+ _ => [1, 0, 0, 0, 1, 0], // Normal
+ };
+
+ foreach (var device in devices)
+ {
+ libinput_device_config_calibration_set_matrix(device, matrix);
+ }
- foreach (var f in options.Events!)
- libinput_path_add_device(ctx, f);
while (true)
{
IntPtr ev;
diff --git a/src/Linux/Avalonia.LinuxFramebuffer/Input/LibInput/LibInputNativeUnsafeMethods.cs b/src/Linux/Avalonia.LinuxFramebuffer/Input/LibInput/LibInputNativeUnsafeMethods.cs
index c027440708..fbb11905f9 100644
--- a/src/Linux/Avalonia.LinuxFramebuffer/Input/LibInput/LibInputNativeUnsafeMethods.cs
+++ b/src/Linux/Avalonia.LinuxFramebuffer/Input/LibInput/LibInputNativeUnsafeMethods.cs
@@ -55,6 +55,9 @@ namespace Avalonia.LinuxFramebuffer.Input.LibInput
[DllImport(LibInput)]
public extern static IntPtr libinput_path_remove_device(IntPtr device);
+ [DllImport(LibInput)]
+ public extern static int libinput_device_config_calibration_set_matrix(IntPtr device, float[] matrix);
+
[DllImport(LibInput)]
public extern static int libinput_get_fd(IntPtr ctx);
diff --git a/src/Linux/Avalonia.LinuxFramebuffer/LinuxFramebufferPlatform.cs b/src/Linux/Avalonia.LinuxFramebuffer/LinuxFramebufferPlatform.cs
index 92ec8b475d..0d7d74e01c 100644
--- a/src/Linux/Avalonia.LinuxFramebuffer/LinuxFramebufferPlatform.cs
+++ b/src/Linux/Avalonia.LinuxFramebuffer/LinuxFramebufferPlatform.cs
@@ -142,7 +142,10 @@ namespace Avalonia.LinuxFramebuffer
{
get
{
- EnsureTopLevel();
+ if (_topLevel == null)
+ {
+ EnsureTopLevel();
+ }
return _topLevel;
}
}
diff --git a/src/Linux/Avalonia.LinuxFramebuffer/Output/DrmOutput.cs b/src/Linux/Avalonia.LinuxFramebuffer/Output/DrmOutput.cs
index 12ab5ad821..59de00f4b3 100644
--- a/src/Linux/Avalonia.LinuxFramebuffer/Output/DrmOutput.cs
+++ b/src/Linux/Avalonia.LinuxFramebuffer/Output/DrmOutput.cs
@@ -13,11 +13,13 @@ using static Avalonia.LinuxFramebuffer.Output.LibDrm;
namespace Avalonia.LinuxFramebuffer.Output
{
- public unsafe class DrmOutput : IGlOutputBackend, IGlPlatformSurface
+ public unsafe class DrmOutput : IGlOutputBackend, IGlPlatformSurface, ISurfaceOrientation
{
private DrmOutputOptions _outputOptions = new();
private DrmCard _card;
- public PixelSize PixelSize => _mode.Resolution;
+ public PixelSize PixelSize => Orientation == SurfaceOrientation.Rotation0 || Orientation == SurfaceOrientation.Rotation180
+ ? new PixelSize(_mode.Resolution.Width, _mode.Resolution.Height)
+ : new PixelSize(_mode.Resolution.Height, _mode.Resolution.Width);
public double Scaling
{
@@ -25,6 +27,12 @@ namespace Avalonia.LinuxFramebuffer.Output
set => _outputOptions.Scaling = value;
}
+ public SurfaceOrientation Orientation
+ {
+ get => _outputOptions.Orientation;
+ set => _outputOptions.Orientation = value;
+ }
+
class SharedContextGraphics : IPlatformGraphics
{
private readonly IPlatformGraphicsContext _context;
@@ -113,6 +121,12 @@ namespace Avalonia.LinuxFramebuffer.Output
private IntPtr _currentBo;
private IntPtr _gbmTargetSurface;
private uint _crtcId;
+ private int _rotationFbo;
+ private int _rotationTexture;
+ private PixelSize _rotatedSize;
+ private int _rotationProgram;
+ private int _rotationVbo;
+ private int _rotationVao;
void FbDestroyCallback(IntPtr bo, IntPtr userData)
{
@@ -157,7 +171,6 @@ namespace Avalonia.LinuxFramebuffer.Output
return fbHandle;
}
-
[MemberNotNull(nameof(_card))]
[MemberNotNull(nameof(PlatformGraphics))]
[MemberNotNull(nameof(FbDestroyDelegate))]
@@ -236,12 +249,135 @@ namespace Avalonia.LinuxFramebuffer.Output
_mode = mode;
_currentBo = bo;
+
+ // Initialize FBO for rotation if needed
+ var needsRotation = _outputOptions.Orientation != SurfaceOrientation.Rotation0;
+ if (needsRotation)
+ {
+ // For 90/270 rotation, swap width and height
+ _rotatedSize = (_outputOptions.Orientation == SurfaceOrientation.Rotation90 ||
+ _outputOptions.Orientation == SurfaceOrientation.Rotation270)
+ ? new PixelSize(modeInfo.Resolution.Height, modeInfo.Resolution.Width)
+ : modeInfo.Resolution;
+
+ using (_deferredContext.MakeCurrent(_eglSurface))
+ {
+ var gl = _deferredContext.GlInterface;
+ _rotationFbo = gl.GenFramebuffer();
+ _rotationTexture = gl.GenTexture();
+
+ gl.BindTexture(GlConsts.GL_TEXTURE_2D, _rotationTexture);
+ gl.TexImage2D(GlConsts.GL_TEXTURE_2D, 0, GlConsts.GL_RGBA, _rotatedSize.Width, _rotatedSize.Height, 0,
+ GlConsts.GL_RGBA, GlConsts.GL_UNSIGNED_BYTE, IntPtr.Zero);
+ gl.TexParameteri(GlConsts.GL_TEXTURE_2D, GlConsts.GL_TEXTURE_MIN_FILTER, GlConsts.GL_LINEAR);
+ gl.TexParameteri(GlConsts.GL_TEXTURE_2D, GlConsts.GL_TEXTURE_MAG_FILTER, GlConsts.GL_LINEAR);
+
+ gl.BindFramebuffer(GlConsts.GL_FRAMEBUFFER, _rotationFbo);
+ gl.FramebufferTexture2D(GlConsts.GL_FRAMEBUFFER, GlConsts.GL_COLOR_ATTACHMENT0,
+ GlConsts.GL_TEXTURE_2D, _rotationTexture, 0);
+ gl.BindFramebuffer(GlConsts.GL_FRAMEBUFFER, 0);
+
+ // Create shader program for textured quad
+ const string vertexShader = @"
+ attribute vec2 aPos;
+ attribute vec2 aTexCoord;
+ varying vec2 vTexCoord;
+ void main() {
+ gl_Position = vec4(aPos, 0.0, 1.0);
+ vTexCoord = aTexCoord;
+ }";
+
+ const string fragmentShader = @"
+ precision mediump float;
+ varying vec2 vTexCoord;
+ uniform sampler2D uTexture;
+ void main() {
+ gl_FragColor = texture2D(uTexture, vTexCoord);
+ }";
+
+ var vs = gl.CreateShader(GlConsts.GL_VERTEX_SHADER);
+ gl.ShaderSourceString(vs, vertexShader);
+ gl.CompileShader(vs);
+
+ var fs = gl.CreateShader(GlConsts.GL_FRAGMENT_SHADER);
+ gl.ShaderSourceString(fs, fragmentShader);
+ gl.CompileShader(fs);
+
+ _rotationProgram = gl.CreateProgram();
+ gl.AttachShader(_rotationProgram, vs);
+ gl.AttachShader(_rotationProgram, fs);
+ gl.LinkProgram(_rotationProgram);
+ gl.DeleteShader(vs);
+ gl.DeleteShader(fs);
+
+ // Create VBO with quad vertices - texture coords depend on rotation
+ // Format: x, y, u, v
+ float[] vertices = _outputOptions.Orientation switch
+ {
+ SurfaceOrientation.Rotation90 => new float[] {
+ // 90° clockwise rotation
+ -1.0f, -1.0f, 1.0f, 0.0f, // Bottom-left -> Bottom-right of texture
+ 1.0f, -1.0f, 1.0f, 1.0f, // Bottom-right -> Top-right of texture
+ 1.0f, 1.0f, 0.0f, 1.0f, // Top-right -> Top-left of texture
+ -1.0f, 1.0f, 0.0f, 0.0f // Top-left -> Bottom-left of texture
+ },
+ SurfaceOrientation.Rotation180 => new float[] {
+ // 180° rotation
+ -1.0f, -1.0f, 1.0f, 1.0f, // Bottom-left -> Top-right of texture
+ 1.0f, -1.0f, 0.0f, 1.0f, // Bottom-right -> Top-left of texture
+ 1.0f, 1.0f, 0.0f, 0.0f, // Top-right -> Bottom-left of texture
+ -1.0f, 1.0f, 1.0f, 0.0f // Top-left -> Bottom-right of texture
+ },
+ SurfaceOrientation.Rotation270 => new float[] {
+ // 270° clockwise (90° counter-clockwise) rotation
+ -1.0f, -1.0f, 0.0f, 1.0f, // Bottom-left -> Top-left of texture
+ 1.0f, -1.0f, 0.0f, 0.0f, // Bottom-right -> Bottom-left of texture
+ 1.0f, 1.0f, 1.0f, 0.0f, // Top-right -> Bottom-right of texture
+ -1.0f, 1.0f, 1.0f, 1.0f // Top-left -> Top-right of texture
+ },
+ _ => new float[] {
+ // No rotation (shouldn't reach here but fallback)
+ -1.0f, -1.0f, 0.0f, 0.0f,
+ 1.0f, -1.0f, 1.0f, 0.0f,
+ 1.0f, 1.0f, 1.0f, 1.0f,
+ -1.0f, 1.0f, 0.0f, 1.0f
+ }
+ };
+
+ _rotationVbo = gl.GenBuffer();
+ _rotationVao = gl.GenVertexArray();
+
+ gl.BindVertexArray(_rotationVao);
+ gl.BindBuffer(GlConsts.GL_ARRAY_BUFFER, _rotationVbo);
+
+ fixed (float* ptr = vertices)
+ {
+ gl.BufferData(GlConsts.GL_ARRAY_BUFFER, new IntPtr(vertices.Length * sizeof(float)),
+ new IntPtr(ptr), GlConsts.GL_STATIC_DRAW);
+ }
+
+ var posAttrib = gl.GetAttribLocationString(_rotationProgram, "aPos");
+ gl.EnableVertexAttribArray(posAttrib);
+ gl.VertexAttribPointer(posAttrib, 2, GlConsts.GL_FLOAT, 0, 4 * sizeof(float), IntPtr.Zero);
+
+ var texAttrib = gl.GetAttribLocationString(_rotationProgram, "aTexCoord");
+ gl.EnableVertexAttribArray(texAttrib);
+ gl.VertexAttribPointer(texAttrib, 2, GlConsts.GL_FLOAT, 0, 4 * sizeof(float), new IntPtr(2 * sizeof(float)));
+
+ gl.BindVertexArray(0);
+ }
+ }
+ else
+ {
+ // No rotation needed
+ _rotatedSize = modeInfo.Resolution;
+ }
if (_outputOptions.EnableInitialBufferSwapping)
{
//Go through two cycles of buffer swapping (there are render artifacts otherwise)
for (var c = 0; c < 2; c++)
- using (CreateGlRenderTarget().BeginDraw())
+ using (CreateGlRenderTarget().BeginDraw(PixelSize))
{
_deferredContext.GlInterface.ClearColor(initialBufferSwappingColorR, initialBufferSwappingColorG,
initialBufferSwappingColorB, initialBufferSwappingColorA);
@@ -270,6 +406,9 @@ namespace Avalonia.LinuxFramebuffer.Output
{
_parent = parent;
}
+
+ public bool IsCorrupted => false;
+
public void Dispose()
{
// We are wrapping GBM buffer chain associated with CRTC, and don't free it on a whim
@@ -288,7 +427,39 @@ namespace Avalonia.LinuxFramebuffer.Output
public void Dispose()
{
- _parent._deferredContext.GlInterface.Flush();
+ var gl = _parent._deferredContext.GlInterface;
+
+ if (_parent._outputOptions.Orientation != SurfaceOrientation.Rotation0)
+ {
+ // Rotation enabled - blit from FBO to screen
+ // Unbind FBO to render to default framebuffer
+ gl.BindFramebuffer(GlConsts.GL_FRAMEBUFFER, 0);
+ gl.Viewport(0, 0, _parent._mode.Resolution.Width, _parent._mode.Resolution.Height);
+
+ // Clear the screen
+ gl.ClearColor(0, 0, 0, 1);
+ gl.Clear(GlConsts.GL_COLOR_BUFFER_BIT);
+
+ // Use the shader program
+ gl.UseProgram(_parent._rotationProgram);
+
+ // Bind the FBO texture
+ gl.ActiveTexture(GlConsts.GL_TEXTURE0);
+ gl.BindTexture(GlConsts.GL_TEXTURE_2D, _parent._rotationTexture);
+
+ // Set texture uniform (texture unit 0)
+ var texLoc = gl.GetUniformLocationString(_parent._rotationProgram, "uTexture");
+ gl.Uniform1i(texLoc, 0);
+
+ // Draw the rotated quad
+ gl.BindVertexArray(_parent._rotationVao);
+ gl.DrawArrays(GlConsts.GL_TRIANGLE_FAN, 0, 4);
+ gl.BindVertexArray(0);
+
+ gl.UseProgram(0);
+ }
+
+ gl.Flush();
_parent._eglSurface.SwapBuffers();
var nextBo = gbm_surface_lock_front_buffer(_parent._gbmTargetSurface);
@@ -333,16 +504,32 @@ namespace Avalonia.LinuxFramebuffer.Output
public IGlContext Context => _parent._deferredContext;
- public PixelSize Size => _parent._mode.Resolution;
+ public PixelSize Size => _parent._rotatedSize;
public double Scaling => _parent.Scaling;
public bool IsYFlipped => false;
}
- public IGlPlatformSurfaceRenderingSession BeginDraw()
+ public IGlPlatformSurfaceRenderingSession BeginDraw(PixelSize? expectedPixelSize)
{
- return new RenderSession(_parent, _parent._deferredContext.MakeCurrent(_parent._eglSurface));
+ var clearContext = _parent._deferredContext.MakeCurrent(_parent._eglSurface);
+ var gl = _parent._deferredContext.GlInterface;
+
+ if (_parent._outputOptions.Orientation != SurfaceOrientation.Rotation0)
+ {
+ // Bind FBO for rendering when rotation is enabled
+ gl.BindFramebuffer(GlConsts.GL_FRAMEBUFFER, _parent._rotationFbo);
+ gl.Viewport(0, 0, _parent._rotatedSize.Width, _parent._rotatedSize.Height);
+ }
+ else
+ {
+ // Render directly to screen when no rotation
+ gl.BindFramebuffer(GlConsts.GL_FRAMEBUFFER, 0);
+ gl.Viewport(0, 0, _parent._mode.Resolution.Width, _parent._mode.Resolution.Height);
+ }
+
+ return new RenderSession(_parent, clearContext);
}
}
diff --git a/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/Transformers/AvaloniaXamlIlWellKnownTypes.cs b/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/Transformers/AvaloniaXamlIlWellKnownTypes.cs
index df54e71108..28ea193adf 100644
--- a/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/Transformers/AvaloniaXamlIlWellKnownTypes.cs
+++ b/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/Transformers/AvaloniaXamlIlWellKnownTypes.cs
@@ -22,6 +22,7 @@ namespace Avalonia.Markup.Xaml.XamlIl.CompilerExtensions.Transformers
public IXamlMethod AvaloniaObjectSetStyledPropertyValue { get; }
public IXamlType AvaloniaAttachedPropertyT { get; }
public IXamlType BindingBase { get; }
+ public IXamlType BindingExpressionBase { get; }
public IXamlType MultiBinding { get; }
public IXamlMethod AvaloniaObjectBindMethod { get; }
public IXamlMethod AvaloniaObjectSetValueMethod { get; }
@@ -200,6 +201,7 @@ namespace Avalonia.Markup.Xaml.XamlIl.CompilerExtensions.Transformers
&& m.Parameters[0].Name == "StyledProperty`1"
&& m.Parameters[2].Equals(BindingPriority));
BindingBase = cfg.TypeSystem.GetType("Avalonia.Data.BindingBase");
+ BindingExpressionBase = cfg.TypeSystem.GetType("Avalonia.Data.BindingExpressionBase");
MultiBinding = cfg.TypeSystem.GetType("Avalonia.Data.MultiBinding");
IDisposable = cfg.TypeSystem.GetType("System.IDisposable");
ICommand = cfg.TypeSystem.GetType("System.Windows.Input.ICommand");
@@ -215,9 +217,7 @@ namespace Avalonia.Markup.Xaml.XamlIl.CompilerExtensions.Transformers
AvaloniaListAttribute = cfg.TypeSystem.GetType("Avalonia.Metadata.AvaloniaListAttribute");
AvaloniaList = cfg.TypeSystem.GetType("Avalonia.Collections.AvaloniaList`1");
OnExtensionType = cfg.TypeSystem.GetType("Avalonia.Markup.Xaml.MarkupExtensions.On");
- AvaloniaObjectBindMethod = AvaloniaObjectExtensions.GetMethod("Bind", IDisposable, false, AvaloniaObject,
- AvaloniaProperty,
- BindingBase, cfg.WellKnownTypes.Object);
+ AvaloniaObjectBindMethod = AvaloniaObject.GetMethod("Bind", BindingExpressionBase, false, AvaloniaProperty, BindingBase);
UnsetValueType = cfg.TypeSystem.GetType("Avalonia.UnsetValueType");
StyledElement = cfg.TypeSystem.GetType("Avalonia.StyledElement");
INameScope = cfg.TypeSystem.GetType("Avalonia.Controls.INameScope");
diff --git a/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/XamlIlAvaloniaPropertyHelper.cs b/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/XamlIlAvaloniaPropertyHelper.cs
index 442c7dd495..1a72dcd9a5 100644
--- a/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/XamlIlAvaloniaPropertyHelper.cs
+++ b/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/XamlIlAvaloniaPropertyHelper.cs
@@ -297,8 +297,8 @@ namespace Avalonia.Markup.Xaml.XamlIl.CompilerExtensions
emitter
.Stloc(bloc.Local)
.Ldsfld(AvaloniaProperty)
- .Ldloc(bloc.Local);
- EmitAnchorAndBind(emitter);
+ .Ldloc(bloc.Local)
+ .EmitCall(Types.AvaloniaObjectBindMethod, true);
}
public override void EmitWithArguments(
@@ -308,14 +308,7 @@ namespace Avalonia.Markup.Xaml.XamlIl.CompilerExtensions
{
emitter.Ldsfld(AvaloniaProperty);
context.Emit(arguments[0], emitter, Parameters[0]);
- EmitAnchorAndBind(emitter);
- }
-
- private void EmitAnchorAndBind(IXamlILEmitter emitter)
- {
- emitter
- .Ldnull() // TODO: provide anchor?
- .EmitCall(Types.AvaloniaObjectBindMethod, true);
+ emitter.EmitCall(Types.AvaloniaObjectBindMethod, true);
}
}
@@ -336,8 +329,8 @@ namespace Avalonia.Markup.Xaml.XamlIl.CompilerExtensions
.Stloc(bloc.Local)
.Pop() // ignore priority
.Ldsfld(AvaloniaProperty)
- .Ldloc(bloc.Local);
- EmitAnchorAndBind(emitter);
+ .Ldloc(bloc.Local)
+ .EmitCall(Types.AvaloniaObjectBindMethod, true);
}
public override void EmitWithArguments(
@@ -347,14 +340,7 @@ namespace Avalonia.Markup.Xaml.XamlIl.CompilerExtensions
{
emitter.Ldsfld(AvaloniaProperty);
context.Emit(arguments[1], emitter, Parameters[1]);
- EmitAnchorAndBind(emitter);
- }
-
- private void EmitAnchorAndBind(IXamlILEmitter emitter)
- {
- emitter
- .Ldnull() // TODO: provide anchor?
- .EmitCall(Types.AvaloniaObjectBindMethod, true);
+ emitter.EmitCall(Types.AvaloniaObjectBindMethod, true);
}
}
diff --git a/src/Markup/Avalonia.Markup.Xaml/Data/DynamicResourceExpression.cs b/src/Markup/Avalonia.Markup.Xaml/Data/DynamicResourceExpression.cs
index e65282b36b..fbe09fa0de 100644
--- a/src/Markup/Avalonia.Markup.Xaml/Data/DynamicResourceExpression.cs
+++ b/src/Markup/Avalonia.Markup.Xaml/Data/DynamicResourceExpression.cs
@@ -84,8 +84,6 @@ namespace Avalonia.Markup.Xaml.MarkupExtensions
private void ResourcesChanged(object? sender, ResourcesChangedEventArgs e) => PublishValue();
- private void ResourcesChanged2(object? sender, ResourcesChangedToken token) => PublishValue();
-
private void ActualThemeVariantChanged(object? sender, EventArgs e)
{
if (!IsRunning)
@@ -134,7 +132,7 @@ namespace Avalonia.Markup.Xaml.MarkupExtensions
{
if (host is not null)
{
- host.SubscribeToResourcesChanged(ResourcesChanged, ResourcesChanged2);
+ host.ResourcesChanged += ResourcesChanged;
if (!_overrideThemeVariant && _host is IThemeVariantHost themeVariantHost)
{
@@ -148,7 +146,7 @@ namespace Avalonia.Markup.Xaml.MarkupExtensions
{
if (host is not null)
{
- host.UnsubscribeFromResourcesChanged(ResourcesChanged, ResourcesChanged2);
+ host.ResourcesChanged -= ResourcesChanged;
if (!_overrideThemeVariant && _host is IThemeVariantHost themeVariantHost)
themeVariantHost.ActualThemeVariantChanged -= ActualThemeVariantChanged;
diff --git a/src/Markup/Avalonia.Markup.Xaml/MarkupExtensions/DynamicResourceExtension.cs b/src/Markup/Avalonia.Markup.Xaml/MarkupExtensions/DynamicResourceExtension.cs
index f602b1a82d..8737367fb1 100644
--- a/src/Markup/Avalonia.Markup.Xaml/MarkupExtensions/DynamicResourceExtension.cs
+++ b/src/Markup/Avalonia.Markup.Xaml/MarkupExtensions/DynamicResourceExtension.cs
@@ -3,6 +3,7 @@ using Avalonia.Controls;
using Avalonia.Data;
using Avalonia.Data.Core;
using Avalonia.Markup.Xaml.XamlIl.Runtime;
+using Avalonia.Metadata;
using Avalonia.Styling;
namespace Avalonia.Markup.Xaml.MarkupExtensions
@@ -22,6 +23,7 @@ namespace Avalonia.Markup.Xaml.MarkupExtensions
ResourceKey = resourceKey;
}
+ [ConstructorArgument("resourceKey")]
public object? ResourceKey { get; set; }
public BindingBase ProvideValue(IServiceProvider serviceProvider)
diff --git a/src/Markup/Avalonia.Markup.Xaml/MarkupExtensions/ReflectionBindingExtension.cs b/src/Markup/Avalonia.Markup.Xaml/MarkupExtensions/ReflectionBindingExtension.cs
index 311d151ddb..f4b7864185 100644
--- a/src/Markup/Avalonia.Markup.Xaml/MarkupExtensions/ReflectionBindingExtension.cs
+++ b/src/Markup/Avalonia.Markup.Xaml/MarkupExtensions/ReflectionBindingExtension.cs
@@ -22,13 +22,6 @@ namespace Avalonia.Markup.Xaml.MarkupExtensions
/// The binding path.
public ReflectionBindingExtension(string path) : base(path) { }
- ///
- /// Initializes a new instance of the class.
- ///
- /// The binding path.
- /// The binding mode.
- public ReflectionBindingExtension(string path, BindingMode mode) : base(path, mode) { }
-
public ReflectionBinding ProvideValue(IServiceProvider serviceProvider)
{
return new ReflectionBinding
diff --git a/src/Markup/Avalonia.Markup.Xaml/MarkupExtensions/RelativeSourceExtension.cs b/src/Markup/Avalonia.Markup.Xaml/MarkupExtensions/RelativeSourceExtension.cs
index fce026bb1c..c59d038223 100644
--- a/src/Markup/Avalonia.Markup.Xaml/MarkupExtensions/RelativeSourceExtension.cs
+++ b/src/Markup/Avalonia.Markup.Xaml/MarkupExtensions/RelativeSourceExtension.cs
@@ -1,5 +1,6 @@
using System;
using Avalonia.Data;
+using Avalonia.Metadata;
namespace Avalonia.Markup.Xaml.MarkupExtensions
{
diff --git a/src/Markup/Avalonia.Markup.Xaml/XamlLoadException.cs b/src/Markup/Avalonia.Markup.Xaml/XamlLoadException.cs
index 5861f37e47..74f1e009b1 100644
--- a/src/Markup/Avalonia.Markup.Xaml/XamlLoadException.cs
+++ b/src/Markup/Avalonia.Markup.Xaml/XamlLoadException.cs
@@ -1,5 +1,4 @@
using System;
-using System.Runtime.Serialization;
namespace Avalonia.Markup.Xaml
{
@@ -9,13 +8,6 @@ namespace Avalonia.Markup.Xaml
{
}
-#if NET8_0_OR_GREATER
- [Obsolete("This API supports obsolete formatter-based serialization. It should not be called or extended by application code.", DiagnosticId = "SYSLIB0051")]
-#endif
- protected XamlLoadException(SerializationInfo info, StreamingContext context): base(info, context)
- {
- }
-
public XamlLoadException(string message): base(message)
{
}
diff --git a/src/Markup/Avalonia.Markup.Xaml/XamlTypes.cs b/src/Markup/Avalonia.Markup.Xaml/XamlTypes.cs
index 513b18c7a7..cf3c82fdb9 100644
--- a/src/Markup/Avalonia.Markup.Xaml/XamlTypes.cs
+++ b/src/Markup/Avalonia.Markup.Xaml/XamlTypes.cs
@@ -32,14 +32,4 @@ namespace Avalonia.Markup.Xaml
[RequiresUnreferencedCode(TrimmingMessages.XamlTypeResolvedRequiresUnreferenceCodeMessage)]
Type Resolve (string qualifiedTypeName);
}
-
- // TODO12: Move to Avalonia.Base
- [AttributeUsage(AttributeTargets.Property)]
- public sealed class ConstructorArgumentAttribute : Attribute
- {
- public ConstructorArgumentAttribute(string name)
- {
-
- }
- }
}
diff --git a/src/Markup/Avalonia.Markup/Data/Binding.cs b/src/Markup/Avalonia.Markup/Data/Binding.cs
index 3a0f8a482e..4e624b6479 100644
--- a/src/Markup/Avalonia.Markup/Data/Binding.cs
+++ b/src/Markup/Avalonia.Markup/Data/Binding.cs
@@ -16,6 +16,4 @@ public class Binding : ReflectionBinding
public Binding() { }
public Binding(string path) : base(path) { }
-
- public Binding(string path, BindingMode mode) : base(path, mode) { }
}
diff --git a/src/Skia/Avalonia.Skia/DrawingContextImpl.cs b/src/Skia/Avalonia.Skia/DrawingContextImpl.cs
index 42448ed631..8051dd7993 100644
--- a/src/Skia/Avalonia.Skia/DrawingContextImpl.cs
+++ b/src/Skia/Avalonia.Skia/DrawingContextImpl.cs
@@ -170,8 +170,7 @@ namespace Avalonia.Skia
public ISkiaSharpPlatformGraphicsApiLease? TryLeasePlatformGraphicsApi()
{
CheckLease();
- if (_context._gpu is ISkiaGpuWithPlatformGraphicsContext gpu &&
- gpu.PlatformGraphicsContext is { } context)
+ if (_context._gpu?.PlatformGraphicsContext is { } context)
return new PlatformApiLease(this, context);
return null;
}
diff --git a/src/Skia/Avalonia.Skia/FramebufferRenderTarget.cs b/src/Skia/Avalonia.Skia/FramebufferRenderTarget.cs
index 46be609ec0..0eb11ff404 100644
--- a/src/Skia/Avalonia.Skia/FramebufferRenderTarget.cs
+++ b/src/Skia/Avalonia.Skia/FramebufferRenderTarget.cs
@@ -10,7 +10,7 @@ namespace Avalonia.Skia
///
/// Skia render target that renders to a framebuffer surface. No gpu acceleration available.
///
- internal class FramebufferRenderTarget : IRenderTarget2
+ internal class FramebufferRenderTarget : IRenderTarget
{
private SKImageInfo _currentImageInfo;
private IntPtr _currentFramebufferAddress;
@@ -125,6 +125,14 @@ namespace Avalonia.Skia
_currentFramebufferAddress = framebuffer.Address;
+ // A surface with a width/height of 0 is invalid and can't be created
+ if (desiredImageInfo.Width <= 0 || desiredImageInfo.Height <= 0)
+ {
+ throw new ArgumentException(
+ $"Unable to create a surface with size {desiredImageInfo.Width}x{desiredImageInfo.Height}",
+ nameof(desiredImageInfo));
+ }
+
var surface = SKSurface.Create(desiredImageInfo, _currentFramebufferAddress,
framebuffer.RowBytes, new SKSurfaceProperties(SKPixelGeometry.RgbHorizontal));
diff --git a/src/Skia/Avalonia.Skia/Gpu/ISkiaGpu.cs b/src/Skia/Avalonia.Skia/Gpu/ISkiaGpu.cs
index 85a2cbdd22..93edea7169 100644
--- a/src/Skia/Avalonia.Skia/Gpu/ISkiaGpu.cs
+++ b/src/Skia/Avalonia.Skia/Gpu/ISkiaGpu.cs
@@ -1,16 +1,22 @@
using System;
using System.Collections.Generic;
-using Avalonia.Metadata;
using Avalonia.Platform;
using SkiaSharp;
namespace Avalonia.Skia
{
+ //TODO12: Make it private
+
///
/// Custom Skia gpu instance.
///
public interface ISkiaGpu : IPlatformGraphicsContext
{
+ ///
+ /// Gets the platform graphics context.
+ ///
+ IPlatformGraphicsContext? PlatformGraphicsContext { get; }
+
///
/// Attempts to create custom render target from given surfaces.
///
@@ -24,13 +30,11 @@ namespace Avalonia.Skia
/// size in pixels.
/// An optional custom render session.
ISkiaSurface? TryCreateSurface(PixelSize size, ISkiaGpuRenderSession? session);
- }
- //TODO12: Merge into ISkiaGpu
- [Unstable]
- public interface ISkiaGpuWithPlatformGraphicsContext : ISkiaGpu
- {
- IPlatformGraphicsContext? PlatformGraphicsContext { get; }
+ ///
+ /// Tries to get a .
+ ///
+ /// A .
IScopedResource? TryGetGrContext();
}
diff --git a/src/Skia/Avalonia.Skia/Gpu/ISkiaGpuRenderTarget.cs b/src/Skia/Avalonia.Skia/Gpu/ISkiaGpuRenderTarget.cs
index f8be7dc66f..eb7399f6a6 100644
--- a/src/Skia/Avalonia.Skia/Gpu/ISkiaGpuRenderTarget.cs
+++ b/src/Skia/Avalonia.Skia/Gpu/ISkiaGpuRenderTarget.cs
@@ -1,6 +1,4 @@
using System;
-using Avalonia.Metadata;
-using SkiaSharp;
namespace Avalonia.Skia
{
@@ -12,16 +10,10 @@ namespace Avalonia.Skia
///
/// Start rendering to this render target.
///
- ///
- ISkiaGpuRenderSession BeginRenderingSession();
+ /// The expected size.
+ /// A render session instance.
+ ISkiaGpuRenderSession BeginRenderingSession(PixelSize? expectedPixelSize);
bool IsCorrupted { get; }
}
-
- [PrivateApi]
- //TODO12: Merge with ISkiaGpuRenderTarget
- public interface ISkiaGpuRenderTarget2 : ISkiaGpuRenderTarget
- {
- ISkiaGpuRenderSession BeginRenderingSession(PixelSize pixelSize);
- }
}
diff --git a/src/Skia/Avalonia.Skia/Gpu/Metal/SkiaMetalGpu.cs b/src/Skia/Avalonia.Skia/Gpu/Metal/SkiaMetalGpu.cs
index ad5f624a03..460a994839 100644
--- a/src/Skia/Avalonia.Skia/Gpu/Metal/SkiaMetalGpu.cs
+++ b/src/Skia/Avalonia.Skia/Gpu/Metal/SkiaMetalGpu.cs
@@ -6,7 +6,7 @@ using SkiaSharp;
namespace Avalonia.Skia.Metal;
-internal class SkiaMetalGpu : ISkiaGpu, ISkiaGpuWithPlatformGraphicsContext
+internal class SkiaMetalGpu : ISkiaGpu
{
private GRContext? _context;
private readonly IMetalDevice _device;
@@ -80,8 +80,9 @@ internal class SkiaMetalGpu : ISkiaGpu, ISkiaGpuWithPlatformGraphicsContext
_target = null;
}
- public ISkiaGpuRenderSession BeginRenderingSession()
+ public ISkiaGpuRenderSession BeginRenderingSession(PixelSize? expectedPixelSize)
{
+ // TODO: use expectedPixelSize
var session = (_target ?? throw new ObjectDisposedException(nameof(SkiaMetalRenderTarget))).BeginRendering();
var backendTarget = new GRBackendRenderTarget(session.Size.Width, session.Size.Height,
new GRMtlTextureInfo(session.Texture));
diff --git a/src/Skia/Avalonia.Skia/Gpu/OpenGl/GlRenderTarget.cs b/src/Skia/Avalonia.Skia/Gpu/OpenGl/GlRenderTarget.cs
index 56ce4a7194..bb43e13b55 100644
--- a/src/Skia/Avalonia.Skia/Gpu/OpenGl/GlRenderTarget.cs
+++ b/src/Skia/Avalonia.Skia/Gpu/OpenGl/GlRenderTarget.cs
@@ -1,15 +1,12 @@
using System;
-using Avalonia.Reactive;
using Avalonia.OpenGL;
using Avalonia.OpenGL.Surfaces;
-using Avalonia.Platform;
-using Avalonia.Rendering;
using SkiaSharp;
using static Avalonia.OpenGL.GlConsts;
namespace Avalonia.Skia
{
- internal class GlRenderTarget : ISkiaGpuRenderTarget2
+ internal class GlRenderTarget : ISkiaGpuRenderTarget
{
private readonly GRContext _grContext;
private IGlPlatformSurfaceRenderTarget _surface;
@@ -23,7 +20,7 @@ namespace Avalonia.Skia
public void Dispose() => _surface.Dispose();
- public bool IsCorrupted => (_surface as IGlPlatformSurfaceRenderTargetWithCorruptionInfo)?.IsCorrupted == true;
+ public bool IsCorrupted => _surface.IsCorrupted;
class GlGpuSession : ISkiaGpuRenderSession
{
@@ -58,16 +55,10 @@ namespace Avalonia.Skia
public SKSurface SkSurface => _surface;
public double ScaleFactor => _glSession.Scaling;
}
-
- public ISkiaGpuRenderSession BeginRenderingSession(PixelSize size) => BeginRenderingSessionCore(size);
- public ISkiaGpuRenderSession BeginRenderingSession() => BeginRenderingSessionCore(null);
- ISkiaGpuRenderSession BeginRenderingSessionCore(PixelSize? expectedSize)
+ public ISkiaGpuRenderSession BeginRenderingSession(PixelSize? expectedPixelSize)
{
- var glSession =
- expectedSize != null && _surface is IGlPlatformSurfaceRenderTarget2 surface2
- ? surface2.BeginDraw(expectedSize.Value)
- : _surface.BeginDraw();
+ var glSession = _surface.BeginDraw(expectedPixelSize);
bool success = false;
try
diff --git a/src/Skia/Avalonia.Skia/Gpu/OpenGl/GlSkiaGpu.cs b/src/Skia/Avalonia.Skia/Gpu/OpenGl/GlSkiaGpu.cs
index 7336e7672b..a20ceb0fd0 100644
--- a/src/Skia/Avalonia.Skia/Gpu/OpenGl/GlSkiaGpu.cs
+++ b/src/Skia/Avalonia.Skia/Gpu/OpenGl/GlSkiaGpu.cs
@@ -10,8 +10,7 @@ using static Avalonia.OpenGL.GlConsts;
namespace Avalonia.Skia
{
- internal class GlSkiaGpu : ISkiaGpu, IOpenGlTextureSharingRenderInterfaceContextFeature,
- ISkiaGpuWithPlatformGraphicsContext
+ internal class GlSkiaGpu : ISkiaGpu, IOpenGlTextureSharingRenderInterfaceContextFeature
{
private readonly GRContext _grContext;
private readonly IGlContext _glContext;
diff --git a/src/Skia/Avalonia.Skia/Gpu/SkiaGpuRenderTarget.cs b/src/Skia/Avalonia.Skia/Gpu/SkiaGpuRenderTarget.cs
index 8d231a5784..488888f50a 100644
--- a/src/Skia/Avalonia.Skia/Gpu/SkiaGpuRenderTarget.cs
+++ b/src/Skia/Avalonia.Skia/Gpu/SkiaGpuRenderTarget.cs
@@ -5,7 +5,7 @@ namespace Avalonia.Skia
///
/// Adapts to be used within our rendering pipeline.
///
- internal class SkiaGpuRenderTarget : IRenderTarget2
+ internal class SkiaGpuRenderTarget : IRenderTarget
{
private readonly ISkiaGpu _skiaGpu;
private readonly ISkiaGpuRenderTarget _renderTarget;
@@ -34,10 +34,7 @@ namespace Avalonia.Skia
out RenderTargetDrawingContextProperties properties)
{
properties = default;
- var session =
- expectedPixelSize.HasValue && _renderTarget is ISkiaGpuRenderTarget2 target2
- ? target2.BeginRenderingSession(expectedPixelSize.Value)
- : _renderTarget.BeginRenderingSession();
+ var session = _renderTarget.BeginRenderingSession(expectedPixelSize);
var nfo = new DrawingContextImpl.CreateInfo
{
diff --git a/src/Skia/Avalonia.Skia/Gpu/Vulkan/VulkanSkiaGpu.cs b/src/Skia/Avalonia.Skia/Gpu/Vulkan/VulkanSkiaGpu.cs
index a862424e51..9d3ca6789b 100644
--- a/src/Skia/Avalonia.Skia/Gpu/Vulkan/VulkanSkiaGpu.cs
+++ b/src/Skia/Avalonia.Skia/Gpu/Vulkan/VulkanSkiaGpu.cs
@@ -2,12 +2,11 @@ using System;
using System.Collections.Generic;
using Avalonia.Vulkan;
using Avalonia.Platform;
-using Avalonia.Rendering;
using SkiaSharp;
namespace Avalonia.Skia.Vulkan;
-internal class VulkanSkiaGpu : ISkiaGpuWithPlatformGraphicsContext
+internal class VulkanSkiaGpu : ISkiaGpu
{
private readonly VulkanSkiaExternalObjectsFeature? _externalObjects;
public IVulkanPlatformGraphicsContext Vulkan { get; private set; }
diff --git a/src/Skia/Avalonia.Skia/Gpu/Vulkan/VulkanSkiaRenderTarget.cs b/src/Skia/Avalonia.Skia/Gpu/Vulkan/VulkanSkiaRenderTarget.cs
index c86a1204f3..3ab1714f6c 100644
--- a/src/Skia/Avalonia.Skia/Gpu/Vulkan/VulkanSkiaRenderTarget.cs
+++ b/src/Skia/Avalonia.Skia/Gpu/Vulkan/VulkanSkiaRenderTarget.cs
@@ -21,8 +21,9 @@ class VulkanSkiaRenderTarget : ISkiaGpuRenderTarget
_target.Dispose();
}
- public ISkiaGpuRenderSession BeginRenderingSession()
+ public ISkiaGpuRenderSession BeginRenderingSession(PixelSize? expectedPixelSize)
{
+ // TODO: use expectedPixelSize
var session = _target.BeginDraw();
bool success = false;
try
diff --git a/src/Skia/Avalonia.Skia/RenderTargetBitmapImpl.cs b/src/Skia/Avalonia.Skia/RenderTargetBitmapImpl.cs
index 32b7340993..2e63f8bfd3 100644
--- a/src/Skia/Avalonia.Skia/RenderTargetBitmapImpl.cs
+++ b/src/Skia/Avalonia.Skia/RenderTargetBitmapImpl.cs
@@ -1,6 +1,4 @@
-using System.IO;
using Avalonia.Controls.Platform.Surfaces;
-using Avalonia.Media.Imaging;
using Avalonia.Platform;
using SkiaSharp;
@@ -19,9 +17,18 @@ internal class RenderTargetBitmapImpl : WriteableBitmapImpl,
_renderTarget = new FramebufferRenderTarget(this);
}
+ public RenderTargetProperties Properties => default;
+
IDrawingContextImpl IRenderTarget.CreateDrawingContext(bool useScaledDrawing) =>
_renderTarget.CreateDrawingContext(useScaledDrawing);
+ IDrawingContextImpl IRenderTarget.CreateDrawingContext(PixelSize expectedPixelSize,
+ out RenderTargetDrawingContextProperties properties)
+ {
+ properties = default;
+ return _renderTarget.CreateDrawingContext(false);
+ }
+
public bool IsCorrupted => false;
public override void Dispose()
@@ -31,4 +38,4 @@ internal class RenderTargetBitmapImpl : WriteableBitmapImpl,
}
public IFramebufferRenderTarget CreateFramebufferRenderTarget() => new FuncFramebufferRenderTarget(Lock);
-}
\ No newline at end of file
+}
diff --git a/src/Skia/Avalonia.Skia/SkiaBackendContext.cs b/src/Skia/Avalonia.Skia/SkiaBackendContext.cs
index db50c1e424..dcaf6b542e 100644
--- a/src/Skia/Avalonia.Skia/SkiaBackendContext.cs
+++ b/src/Skia/Avalonia.Skia/SkiaBackendContext.cs
@@ -5,7 +5,6 @@ using System.Linq;
using Avalonia.Controls.Platform.Surfaces;
using Avalonia.OpenGL;
using Avalonia.Platform;
-using SkiaSharp;
namespace Avalonia.Skia;
@@ -29,6 +28,13 @@ internal class SkiaContext : IPlatformRenderInterfaceContext
// TODO12: extend ISkiaGpu with PublicFeatures instead
TryFeature();
TryFeature();
+ using (var gr = gpu.TryGetGrContext())
+ {
+ var renderTargetSize = gr?.Value.MaxRenderTargetSize;
+ if (renderTargetSize.HasValue)
+ MaxOffscreenRenderTargetPixelSize =
+ new PixelSize(renderTargetSize.Value, renderTargetSize.Value);
+ }
}
PublicFeatures = features;
@@ -61,17 +67,21 @@ internal class SkiaContext : IPlatformRenderInterfaceContext
"Don't know how to create a Skia render target from any of provided surfaces");
}
- public IDrawingContextLayerImpl CreateOffscreenRenderTarget(PixelSize pixelSize, double scaling)
+
+ public PixelSize? MaxOffscreenRenderTargetPixelSize { get; }
+
+ public IDrawingContextLayerImpl CreateOffscreenRenderTarget(PixelSize pixelSize, Vector scaling,
+ bool enableTextAntialiasing)
{
- using (var gr = (_gpu as ISkiaGpuWithPlatformGraphicsContext)?.TryGetGrContext())
+ using (var gr = _gpu?.TryGetGrContext())
{
var createInfo = new SurfaceRenderTarget.CreateInfo
{
Width = pixelSize.Width,
Height = pixelSize.Height,
- Dpi = new Vector(96 * scaling, 96 * scaling),
+ Dpi = scaling * 96,
Format = null,
- DisableTextLcdRendering = false,
+ DisableTextLcdRendering = !enableTextAntialiasing,
GrContext = gr?.Value,
Gpu = _gpu,
DisableManualFbo = true,
diff --git a/src/Skia/Avalonia.Skia/SurfaceRenderTarget.cs b/src/Skia/Avalonia.Skia/SurfaceRenderTarget.cs
index 87aebc2df1..82d0760207 100644
--- a/src/Skia/Avalonia.Skia/SurfaceRenderTarget.cs
+++ b/src/Skia/Avalonia.Skia/SurfaceRenderTarget.cs
@@ -72,6 +72,8 @@ namespace Avalonia.Skia
_canvas = canvas;
}
+ public RenderTargetProperties Properties => default;
+
///
/// Create backing Skia surface.
///
@@ -114,6 +116,13 @@ namespace Avalonia.Skia
return new DrawingContextImpl(createInfo, Disposable.Create(() => Version++));
}
+ public IDrawingContextImpl CreateDrawingContext(PixelSize expectedPixelSize,
+ out RenderTargetDrawingContextProperties properties)
+ {
+ properties = default;
+ return CreateDrawingContext(false);
+ }
+
public bool IsCorrupted => _gpu?.IsLost == true;
///
diff --git a/src/Windows/Avalonia.Win32/ClipboardFormatRegistry.cs b/src/Windows/Avalonia.Win32/ClipboardFormatRegistry.cs
index 9b551332b3..5503ee1543 100644
--- a/src/Windows/Avalonia.Win32/ClipboardFormatRegistry.cs
+++ b/src/Windows/Avalonia.Win32/ClipboardFormatRegistry.cs
@@ -1,6 +1,7 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
+using System.Diagnostics;
using Avalonia.Input;
using Avalonia.Media.Imaging;
using Avalonia.Utilities;
@@ -12,19 +13,15 @@ namespace Avalonia.Win32
{
private const int MaxFormatNameLength = 260;
private const string AppPrefix = "avn-app-fmt:";
- public const string PngFormatMimeType = "image/png";
- public const string PngFormatSystemType = "PNG";
- public const string BitmapFormat = "CF_BITMAP";
- public const string DibFormat = "CF_DIB";
- public const string DibV5Format = "CF_DIBV5";
private static readonly List<(DataFormat Format, ushort Id)> s_formats = [];
- public static DataFormat PngSystemDataFormat = DataFormat.FromSystemName(PngFormatSystemType, AppPrefix);
- public static DataFormat PngMimeDataFormat = DataFormat.FromSystemName(PngFormatMimeType, AppPrefix);
- public static DataFormat HBitmapDataFormat = DataFormat.FromSystemName(BitmapFormat, AppPrefix);
- public static DataFormat DibDataFormat = DataFormat.FromSystemName(DibFormat, AppPrefix);
- public static DataFormat DibV5DataFormat = DataFormat.FromSystemName(DibV5Format, AppPrefix);
+ public static readonly DataFormat PngSystemDataFormat = new DataFormat(DataFormatKind.Platform, "PNG");
+ public static readonly DataFormat PngMimeDataFormat = new DataFormat(DataFormatKind.Platform, "image/png");
+ public static readonly DataFormat HBitmapDataFormat = new DataFormat(DataFormatKind.Platform, "CF_BITMAP");
+ public static readonly DataFormat DibDataFormat = new DataFormat(DataFormatKind.Platform, "CF_DIB");
+ public static readonly DataFormat DibV5DataFormat = new DataFormat(DataFormatKind.Platform, "CF_DIBV5");
+ // Ordered from the most preferred to the least preferred
public static DataFormat[] ImageFormats = [PngMimeDataFormat, PngSystemDataFormat, DibDataFormat, DibV5DataFormat, HBitmapDataFormat];
static ClipboardFormatRegistry()
@@ -44,12 +41,12 @@ namespace Avalonia.Win32
var buffer = StringBuilderCache.Acquire(MaxFormatNameLength);
if (UnmanagedMethods.GetClipboardFormatName(id, buffer, buffer.Capacity) > 0)
return StringBuilderCache.GetStringAndRelease(buffer);
- if (Enum.IsDefined(typeof(UnmanagedMethods.ClipboardFormat), (int)id))
- return Enum.GetName(typeof(UnmanagedMethods.ClipboardFormat), (int)id)!;
+ if (Enum.IsDefined(typeof(UnmanagedMethods.ClipboardFormat), id))
+ return Enum.GetName(typeof(UnmanagedMethods.ClipboardFormat), id)!;
return $"Unknown_Format_{id}";
}
- public static DataFormat GetFormatById(ushort id)
+ public static DataFormat GetOrAddFormat(ushort id)
{
lock (s_formats)
{
@@ -66,30 +63,12 @@ namespace Avalonia.Win32
}
}
- public static ushort GetFormatId(DataFormat format)
+ public static ushort GetOrAddFormat(DataFormat format)
{
+ Debug.Assert(format != DataFormat.Bitmap); // Callers must pass an effective platform type
+
lock (s_formats)
{
- if (DataFormat.Bitmap.Equals(format))
- {
- (DataFormat, ushort)? pngFormat = null;
- (DataFormat, ushort)? dibFormat = null;
-
- foreach (var currentFormat in s_formats)
- {
- if (currentFormat.Id == (ushort)UnmanagedMethods.ClipboardFormat.CF_DIB)
- dibFormat = currentFormat;
- else if (currentFormat.Format.Identifier == PngFormatMimeType)
- pngFormat = currentFormat;
- }
- var imageFormatId = pngFormat?.Item2 ?? dibFormat?.Item2 ?? 0;
-
- if (imageFormatId != 0)
- {
- return imageFormatId;
- }
- }
-
for (var i = 0; i < s_formats.Count; ++i)
{
if (s_formats[i].Format.Equals(format))
diff --git a/src/Windows/Avalonia.Win32/DataTransferToOleDataObjectWrapper.cs b/src/Windows/Avalonia.Win32/DataTransferToOleDataObjectWrapper.cs
index 672899cb9f..f8f1784180 100644
--- a/src/Windows/Avalonia.Win32/DataTransferToOleDataObjectWrapper.cs
+++ b/src/Windows/Avalonia.Win32/DataTransferToOleDataObjectWrapper.cs
@@ -30,25 +30,9 @@ internal class DataTransferToOleDataObjectWrapper(IDataTransfer dataTransfer)
_current = current;
}
- public FormatEnumerator(IReadOnlyList dataFormats)
+ public FormatEnumerator(ushort[] formatIds)
{
- List formats = new List();
-
- if (dataFormats.Contains(DataFormat.Bitmap))
- {
- // We add extra formats for bitmaps
- formats.Add(OleDataObjectHelper.ToFormatEtc(ClipboardFormatRegistry.PngMimeDataFormat));
- formats.Add(OleDataObjectHelper.ToFormatEtc(ClipboardFormatRegistry.PngSystemDataFormat));
- formats.Add(OleDataObjectHelper.ToFormatEtc(ClipboardFormatRegistry.DibDataFormat));
- formats.Add(OleDataObjectHelper.ToFormatEtc(ClipboardFormatRegistry.DibV5DataFormat));
- formats.Add(OleDataObjectHelper.ToFormatEtc(ClipboardFormatRegistry.HBitmapDataFormat, true));
- }
- else
- {
- formats.AddRange(dataFormats.Select(x => OleDataObjectHelper.ToFormatEtc(x)));
- }
-
- _formats = formats.ToArray();
+ _formats = formatIds.Select(OleDataObjectHelper.ToFormatEtc).ToArray();
_current = 0;
}
@@ -98,6 +82,9 @@ internal class DataTransferToOleDataObjectWrapper(IDataTransfer dataTransfer)
public bool IsDisposed
=> DataTransfer is null;
+ private ushort[] FormatIds
+ => field ??= CalcFormatIds();
+
public event Action? OnDestroyed;
unsafe int Win32Com.IDataObject.DAdvise(FORMATETC* pFormatetc, int advf, void* adviseSink)
@@ -115,7 +102,7 @@ internal class DataTransferToOleDataObjectWrapper(IDataTransfer dataTransfer)
throw new COMException(nameof(COR_E_OBJECTDISPOSED), unchecked((int)HRESULT.E_NOTIMPL));
if ((DATADIR)direction == DATADIR.DATADIR_GET)
- return new FormatEnumerator(DataTransfer.Formats);
+ return new FormatEnumerator(FormatIds);
throw new COMException(nameof(HRESULT.E_NOTIMPL), unchecked((int)HRESULT.E_NOTIMPL));
}
@@ -166,7 +153,8 @@ internal class DataTransferToOleDataObjectWrapper(IDataTransfer dataTransfer)
{
dataFormat = null;
- if (!(format->tymed.HasAllFlags(TYMED.TYMED_HGLOBAL) || format->cfFormat == (ushort)ClipboardFormat.CF_BITMAP && format->tymed == TYMED.TYMED_GDI))
+ if (!(format->tymed == TYMED.TYMED_HGLOBAL ||
+ (format->tymed == TYMED.TYMED_GDI && format->cfFormat == (ushort)ClipboardFormat.CF_BITMAP)))
{
result = DV_E_TYMED;
dataFormat = null;
@@ -185,17 +173,38 @@ internal class DataTransferToOleDataObjectWrapper(IDataTransfer dataTransfer)
return false;
}
- dataFormat = ClipboardFormatRegistry.GetFormatById(format->cfFormat);
- if (!DataTransfer.Contains(dataFormat) && !ClipboardFormatRegistry.ImageFormats.Contains(dataFormat))
+ if (!FormatIds.Contains(format->cfFormat))
{
result = DV_E_FORMATETC;
return false;
}
+ dataFormat = ClipboardFormatRegistry.GetOrAddFormat(format->cfFormat);
result = (uint)HRESULT.S_OK;
return true;
}
+ private ushort[] CalcFormatIds()
+ {
+ if (DataTransfer is null)
+ return [];
+
+ var formatIds = new List(DataTransfer.Formats.Count);
+
+ foreach (var dataFormat in DataTransfer.Formats)
+ {
+ if (DataFormat.Bitmap.Equals(dataFormat))
+ {
+ // We add extra formats for bitmaps
+ formatIds.AddRange(ClipboardFormatRegistry.ImageFormats.Select(ClipboardFormatRegistry.GetOrAddFormat));
+ }
+ else
+ formatIds.Add(ClipboardFormatRegistry.GetOrAddFormat(dataFormat));
+ }
+
+ return formatIds.ToArray();
+ }
+
unsafe uint Win32Com.IDataObject.SetData(FORMATETC* pformatetc, STGMEDIUM* pmedium, int fRelease)
=> (uint)HRESULT.E_NOTIMPL;
diff --git a/src/Windows/Avalonia.Win32/DirectX/DxgiRenderTarget.cs b/src/Windows/Avalonia.Win32/DirectX/DxgiRenderTarget.cs
index 6470aa48b8..698e47d27e 100644
--- a/src/Windows/Avalonia.Win32/DirectX/DxgiRenderTarget.cs
+++ b/src/Windows/Avalonia.Win32/DirectX/DxgiRenderTarget.cs
@@ -76,8 +76,9 @@ namespace Avalonia.Win32.DirectX
}
///
- public override IGlPlatformSurfaceRenderingSession BeginDrawCore()
+ public override IGlPlatformSurfaceRenderingSession BeginDrawCore(PixelSize? expectedPixelSize)
{
+ // TODO: use expectedPixelSize
if (_swapChain is null)
{
throw new InvalidOperationException("No chain to draw on");
diff --git a/src/Windows/Avalonia.Win32/DragSource.cs b/src/Windows/Avalonia.Win32/DragSource.cs
index 36d04a644e..f1cdfa440a 100644
--- a/src/Windows/Avalonia.Win32/DragSource.cs
+++ b/src/Windows/Avalonia.Win32/DragSource.cs
@@ -1,5 +1,4 @@
-using System;
-using System.Threading.Tasks;
+using System.Threading.Tasks;
using Avalonia.Input;
using Avalonia.Input.Platform;
using Avalonia.Threading;
@@ -10,13 +9,6 @@ namespace Avalonia.Win32
{
internal sealed class DragSource : IPlatformDragSource
{
- [Obsolete($"Use {nameof(DoDragDropAsync)} instead.")]
- Task IPlatformDragSource.DoDragDrop(
- PointerEventArgs triggerEvent,
- IDataObject data,
- DragDropEffects allowedEffects)
- => DoDragDropAsync(triggerEvent, new DataObjectToDataTransferWrapper(data), allowedEffects);
-
public Task DoDragDropAsync(
PointerEventArgs triggerEvent,
IDataTransfer dataTransfer,
diff --git a/src/Windows/Avalonia.Win32/Interop/UnmanagedMethods.cs b/src/Windows/Avalonia.Win32/Interop/UnmanagedMethods.cs
index 100df30511..1f8b0bdce3 100644
--- a/src/Windows/Avalonia.Win32/Interop/UnmanagedMethods.cs
+++ b/src/Windows/Avalonia.Win32/Interop/UnmanagedMethods.cs
@@ -1181,32 +1181,6 @@ namespace Avalonia.Win32.Interop
public int ciexyzZ;
}
- [StructLayout(LayoutKind.Sequential)]
- public struct BITMAPINFO
- {
- // C# cannot inlay structs in structs so must expand directly here
- //
- //[StructLayout(LayoutKind.Sequential)]
- //public struct BITMAPINFOHEADER
- //{
- public uint biSize;
- public int biWidth;
- public int biHeight;
- public ushort biPlanes;
- public ushort biBitCount;
- public BitmapCompressionMode biCompression;
- public uint biSizeImage;
- public int biXPelsPerMeter;
- public int biYPelsPerMeter;
- public uint biClrUsed;
- public uint biClrImportant;
- //}
- public uint biRedMask;
- public uint biGreenMask;
- public uint biBlueMask;
-
- }
-
[StructLayout(LayoutKind.Sequential)]
public struct MINMAXINFO
{
@@ -1274,16 +1248,10 @@ namespace Avalonia.Win32.Interop
uint dwWidth, uint dwHeight,
int XSrc, int YSrc,
uint uStartScan, uint cScanLines,
- IntPtr lpvBits, [In] ref BITMAPINFO lpbmi, uint fuColorUse);
-
- [DllImport("gdi32.dll")]
- public static extern int SetDIBits(IntPtr hdc, IntPtr hbm, uint start, uint cLines, IntPtr lpBits, in BITMAPINFO lpbmi, uint fuColorUse);
-
- [DllImport("gdi32.dll")]
- public static extern int SetDIBits(IntPtr hdc, IntPtr hbm, uint start, uint cLines, IntPtr lpBits, in BITMAPINFOHEADER lpbmi, uint fuColorUse);
+ IntPtr lpvBits, IntPtr lpbmi, uint fuColorUse);
[DllImport("gdi32.dll")]
- public static extern int SetDIBits(IntPtr hdc, IntPtr hbm, uint start, uint cLines, IntPtr lpBits, in BITMAPV5HEADER lpbmi, uint fuColorUse);
+ public static extern int SetDIBits(IntPtr hdc, IntPtr hbm, uint start, uint cLines, IntPtr lpBits, IntPtr lpbmi, uint fuColorUse);
[DllImport("gdi32.dll", SetLastError = false, ExactSpelling = true)]
public static extern IntPtr CreateRectRgn(int x1, int y1, int x2, int y2);
@@ -1784,7 +1752,7 @@ namespace Avalonia.Win32.Interop
[DllImport("gdi32.dll")]
public static extern IntPtr CreateDIBSection(IntPtr hDC, in BITMAPV5HEADER pBitmapInfo, DIBColorTable usage, out IntPtr lplpVoid, IntPtr handle, int dw);
[DllImport("gdi32.dll")]
- public static extern IntPtr CreateDIBitmap(IntPtr hDC, in BITMAPV5HEADER pBitmapInfo, int flInit, IntPtr lplpVoid, in BITMAPINFO pbmi, DIBColorTable iUsage);
+ public static extern IntPtr CreateDIBitmap(IntPtr hDC, in BITMAPV5HEADER pBitmapInfo, int flInit, IntPtr lplpVoid, IntPtr pbmi, DIBColorTable iUsage);
[DllImport("gdi32.dll")]
public static extern bool GdiFlush();
@@ -1819,7 +1787,7 @@ namespace Avalonia.Win32.Interop
public static extern int DescribePixelFormat(IntPtr hdc, int iPixelFormat, int bytes, ref PixelFormatDescriptor pfd);
[DllImport("gdi32.dll")]
- public static extern int StretchDIBits(IntPtr hdc, int xDest, int yDest, int DestWidth, int DestHeight, int xSrc, int ySrc, int SrcWidth, int SrcHeight, IntPtr lpBits, [In] ref BITMAPINFO lpbmi, uint iUsage, uint rop);
+ public static extern int StretchDIBits(IntPtr hdc, int xDest, int yDest, int DestWidth, int DestHeight, int xSrc, int ySrc, int SrcWidth, int SrcHeight, IntPtr lpBits, IntPtr lpbmi, uint iUsage, uint rop);
[DllImport("gdi32.dll")]
public static extern int StretchBlt(IntPtr hdc, int xDest, int yDest, int DestWidth, int DestHeight, IntPtr hdcSrc, int xSrc, int ySrc, int SrcWidth, int SrcHeight, uint rop);
@@ -2297,7 +2265,7 @@ namespace Avalonia.Win32.Interop
MDT_DEFAULT = MDT_EFFECTIVE_DPI
}
- public enum ClipboardFormat
+ public enum ClipboardFormat : ushort
{
///
/// A handle to a bitmap
diff --git a/src/Windows/Avalonia.Win32/OleDataObjectHelper.cs b/src/Windows/Avalonia.Win32/OleDataObjectHelper.cs
index 73edab2d02..6104613761 100644
--- a/src/Windows/Avalonia.Win32/OleDataObjectHelper.cs
+++ b/src/Windows/Avalonia.Win32/OleDataObjectHelper.cs
@@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
+using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices;
@@ -24,39 +25,26 @@ internal static class OleDataObjectHelper
{
private const int SRCCOPY = 0x00CC0020;
- public static FORMATETC ToFormatEtc(this DataFormat format, bool isGdi = false)
+ public static FORMATETC ToFormatEtc(ushort formatId)
=> new()
{
- cfFormat = ClipboardFormatRegistry.GetFormatId(format),
+ cfFormat = formatId,
dwAspect = DVASPECT.DVASPECT_CONTENT,
ptd = IntPtr.Zero,
lindex = -1,
- tymed = isGdi ? TYMED.TYMED_GDI : TYMED.TYMED_HGLOBAL
+ tymed = formatId == (ushort)ClipboardFormat.CF_BITMAP ? TYMED.TYMED_GDI : TYMED.TYMED_HGLOBAL
};
public static unsafe object? TryGet(this Win32Com.IDataObject oleDataObject, DataFormat format)
{
- var formatEtc = format.ToFormatEtc();
-
- if (oleDataObject.QueryGetData(&formatEtc) != (uint)HRESULT.S_OK)
+ if (TryGetContainedFormat(oleDataObject, format) is not { } formatId)
return null;
var medium = new STGMEDIUM();
+ var formatEtc = ToFormatEtc(formatId);
var result = oleDataObject.GetData(&formatEtc, &medium);
if (result != (uint)HRESULT.S_OK)
- {
- if (result == DV_E_TYMED)
- {
- formatEtc.tymed = TYMED.TYMED_GDI;
-
- if (oleDataObject.GetData(&formatEtc, &medium) != (uint)HRESULT.S_OK)
- {
- return null;
- }
- }
- else
- return null;
- }
+ return null;
try
{
@@ -82,6 +70,32 @@ internal static class OleDataObjectHelper
return null;
}
+ private static ushort? TryGetContainedFormat(Win32Com.IDataObject oleDataObject, DataFormat format)
+ {
+ // Bitmap is not a real format, find the first matching platform format, if any.
+ if (DataFormat.Bitmap.Equals(format))
+ {
+ foreach (var imageFormat in ClipboardFormatRegistry.ImageFormats)
+ {
+ if (TryGetContainedFormatCore(oleDataObject, imageFormat) is { } formatId)
+ return formatId;
+ }
+
+ return null;
+ }
+
+ return TryGetContainedFormatCore(oleDataObject, format);
+
+ static unsafe ushort? TryGetContainedFormatCore(Win32Com.IDataObject oleDataObject, DataFormat format)
+ {
+ Debug.Assert(format != DataFormat.Bitmap);
+
+ var formatId = ClipboardFormatRegistry.GetOrAddFormat(format);
+ var formatEtc = ToFormatEtc(formatId);
+ return oleDataObject.QueryGetData(&formatEtc) == (uint)HRESULT.S_OK ? formatId : null;
+ }
+ }
+
private static unsafe object? ReadDataFromGdi(nint bitmapHandle)
{
var bitmap = new BITMAP();
@@ -179,19 +193,19 @@ internal static class OleDataObjectHelper
var data = ReadBytesFromHGlobal(hGlobal);
fixed (byte* ptr = data)
{
- var bitmapInfo = Marshal.PtrToStructure((IntPtr)ptr);
+ var sourceHeader = Marshal.PtrToStructure((IntPtr)ptr);
- var bitmapInfoHeader = new BITMAPINFOHEADER()
+ var destHeader = new BITMAPINFOHEADER()
{
- biWidth = bitmapInfo.biWidth,
- biHeight = bitmapInfo.biHeight,
- biPlanes = bitmapInfo.biPlanes,
+ biWidth = sourceHeader.biWidth,
+ biHeight = sourceHeader.biHeight,
+ biPlanes = sourceHeader.biPlanes,
biBitCount = 32,
- biCompression = 0,
- biSizeImage = (uint)(bitmapInfo.biWidth * 4 * Math.Abs(bitmapInfo.biHeight))
+ biCompression = BitmapCompressionMode.BI_RGB,
+ biSizeImage = (uint)(sourceHeader.biWidth * 4 * Math.Abs(sourceHeader.biHeight))
};
- bitmapInfoHeader.Init();
+ destHeader.Init();
IntPtr hdc = IntPtr.Zero, compatDc = IntPtr.Zero, section = IntPtr.Zero;
try
@@ -204,31 +218,33 @@ internal static class OleDataObjectHelper
if (compatDc == IntPtr.Zero)
return null;
- section = CreateDIBSection(compatDc, ref bitmapInfoHeader, 0, out var lbBits, IntPtr.Zero, 0);
+ section = CreateDIBSection(compatDc, ref destHeader, 0, out var lbBits, IntPtr.Zero, 0);
if (section == IntPtr.Zero)
return null;
+ var extraSourceHeaderSize = GetExtraHeaderSize(sourceHeader);
+
SelectObject(compatDc, section);
if (StretchDIBits(compatDc,
0,
- bitmapInfo.biHeight,
- bitmapInfo.biWidth,
- -bitmapInfo.biHeight,
+ sourceHeader.biHeight - 1,
+ sourceHeader.biWidth,
+ -sourceHeader.biHeight,
0,
0,
- bitmapInfoHeader.biWidth,
- bitmapInfoHeader.biHeight,
- (IntPtr)(ptr + bitmapInfo.biSize),
- ref bitmapInfo,
+ destHeader.biWidth,
+ destHeader.biHeight,
+ (IntPtr)(ptr + (sourceHeader.biSize + extraSourceHeaderSize)),
+ (IntPtr)ptr,
0,
SRCCOPY
) != 0)
return new Bitmap(Platform.PixelFormats.Bgra8888,
Platform.AlphaFormat.Opaque,
lbBits,
- new PixelSize(bitmapInfoHeader.biWidth, bitmapInfoHeader.biHeight),
+ new PixelSize(destHeader.biWidth, destHeader.biHeight),
new Vector(96, 96),
- bitmapInfoHeader.biWidth * 4);
+ destHeader.biWidth * 4);
}
finally
{
@@ -260,6 +276,30 @@ internal static class OleDataObjectHelper
return null;
}
+ private static int GetExtraHeaderSize(in BITMAPINFOHEADER header)
+ {
+ // https://learn.microsoft.com/en-us/windows/win32/api/wingdi/ns-wingdi-bitmapinfoheader
+ switch (header.biCompression)
+ {
+ // If biCompression equals BI_RGB and the bitmap uses 8 bpp or less, the bitmap has a color table immediately
+ // following the BITMAPINFOHEADER structure. The color table consists of an array of RGBQUAD values. The size
+ // of the array is given by the biClrUsed member.
+ // If biClrUsed is zero, the array contains the maximum number of colors for the given bitdepth; that is,
+ // 2^biBitCount colors.
+ case BitmapCompressionMode.BI_RGB when header.biBitCount <= 8:
+ return (header.biClrUsed == 0 ? 1 << header.biBitCount : (int)header.biClrUsed) * 4;
+
+ // If biCompression equals BI_BITFIELDS, the bitmap uses three DWORD color masks (red, green, and blue,
+ // respectively), which specify the byte layout of the pixels. The 1 bits in each mask indicate the bits for
+ // that color within the pixel.
+ case BitmapCompressionMode.BI_BITFIELDS:
+ return 3 * 4;
+
+ default:
+ return 0;
+ }
+ }
+
private static string? ReadStringFromHGlobal(IntPtr hGlobal)
{
var sourcePtr = GlobalLock(hGlobal);
diff --git a/src/Windows/Avalonia.Win32/OleDataObjectToDataTransferWrapper.cs b/src/Windows/Avalonia.Win32/OleDataObjectToDataTransferWrapper.cs
index e3aebfbc94..969f13e39c 100644
--- a/src/Windows/Avalonia.Win32/OleDataObjectToDataTransferWrapper.cs
+++ b/src/Windows/Avalonia.Win32/OleDataObjectToDataTransferWrapper.cs
@@ -36,11 +36,7 @@ internal sealed class OleDataObjectToDataTransferWrapper(Win32Com.IDataObject ol
foreach (var format in formats)
{
- if (format.Identifier is ClipboardFormatRegistry.DibFormat
- or ClipboardFormatRegistry.BitmapFormat
- or ClipboardFormatRegistry.PngFormatMimeType
- or ClipboardFormatRegistry.PngFormatSystemType)
- {
+ if (ClipboardFormatRegistry.ImageFormats.Contains(format)) {
hasSupportedImageFormat = true;
break;
}
@@ -65,7 +61,7 @@ internal sealed class OleDataObjectToDataTransferWrapper(Win32Com.IDataObject ol
if (formatEtc.ptd != IntPtr.Zero)
Marshal.FreeCoTaskMem(formatEtc.ptd);
- return ClipboardFormatRegistry.GetFormatById(formatEtc.cfFormat);
+ return ClipboardFormatRegistry.GetOrAddFormat(formatEtc.cfFormat);
}
}
diff --git a/src/Windows/Avalonia.Win32/OpenGl/Angle/AngleD3DTextureFeature.cs b/src/Windows/Avalonia.Win32/OpenGl/Angle/AngleD3DTextureFeature.cs
index ffdd4fdfd6..e4c63bbeba 100644
--- a/src/Windows/Avalonia.Win32/OpenGl/Angle/AngleD3DTextureFeature.cs
+++ b/src/Windows/Avalonia.Win32/OpenGl/Angle/AngleD3DTextureFeature.cs
@@ -27,8 +27,9 @@ internal class AngleD3DTextureFeature : IGlPlatformSurfaceRenderTargetFactory
_target = target;
}
- public override IGlPlatformSurfaceRenderingSession BeginDrawCore()
+ public override IGlPlatformSurfaceRenderingSession BeginDrawCore(PixelSize? expectedPixelSize)
{
+ // TODO: use expectedPixelSize
var success = false;
var contextLock = Context.EnsureCurrent();
IDirect3D11TextureRenderTargetRenderSession? session = null;
diff --git a/src/Windows/Avalonia.Win32/OpenGl/WglGlPlatformSurface.cs b/src/Windows/Avalonia.Win32/OpenGl/WglGlPlatformSurface.cs
index 6d3d2d28c4..40619660eb 100644
--- a/src/Windows/Avalonia.Win32/OpenGl/WglGlPlatformSurface.cs
+++ b/src/Windows/Avalonia.Win32/OpenGl/WglGlPlatformSurface.cs
@@ -28,6 +28,7 @@ namespace Avalonia.Win32.OpenGl
private readonly WglContext _context;
private readonly EglGlPlatformSurface.IEglWindowGlPlatformSurfaceInfo _info;
private IntPtr _hdc;
+
public RenderTarget(WglContext context, EglGlPlatformSurface.IEglWindowGlPlatformSurfaceInfo info)
{
_context = context;
@@ -35,13 +36,16 @@ namespace Avalonia.Win32.OpenGl
_hdc = context.CreateConfiguredDeviceContext(info.Handle);
}
+ public bool IsCorrupted => false;
+
public void Dispose()
{
WglGdiResourceManager.ReleaseDC(_info.Handle, _hdc);
}
- public IGlPlatformSurfaceRenderingSession BeginDraw()
+ public IGlPlatformSurfaceRenderingSession BeginDraw(PixelSize? expectedPixelSize)
{
+ // TODO: use expectedPixelSize
var oldContext = _context.MakeCurrent(_hdc);
// Reset to default FBO first
diff --git a/src/Windows/Avalonia.Win32/Win32Platform.cs b/src/Windows/Avalonia.Win32/Win32Platform.cs
index b09872120f..41f273bc5e 100644
--- a/src/Windows/Avalonia.Win32/Win32Platform.cs
+++ b/src/Windows/Avalonia.Win32/Win32Platform.cs
@@ -323,5 +323,33 @@ namespace Avalonia.Win32
if (dpiAwareness != Win32DpiAwareness.Unaware)
SetProcessDPIAware();
}
+
+ public void GetWindowsZOrder(ReadOnlySpan windows, Span zOrder)
+ {
+ var handlesToIndex = new Dictionary(windows.Length);
+ var outputArray = new long[windows.Length];
+
+ for (int i = 0; i < windows.Length; i++)
+ {
+ if (windows[i] is WindowImpl platformImpl)
+ handlesToIndex.Add(platformImpl.Handle.Handle, i);
+ }
+
+ long nextZOrder = 0;
+ bool EnumWindowsProc(IntPtr hWnd, IntPtr lParam)
+ {
+ if (handlesToIndex.TryGetValue(hWnd, out var index))
+ {
+ // We negate the z-order so that the topmost window has the highest number.
+ outputArray[index] = -nextZOrder;
+ nextZOrder++;
+ }
+ return nextZOrder < outputArray.Length;
+ }
+
+ EnumChildWindows(IntPtr.Zero, EnumWindowsProc, IntPtr.Zero);
+
+ outputArray.CopyTo(zOrder);
+ }
}
}
diff --git a/src/Windows/Avalonia.Win32/WindowImpl.cs b/src/Windows/Avalonia.Win32/WindowImpl.cs
index 63336f9d8f..081c488cd4 100644
--- a/src/Windows/Avalonia.Win32/WindowImpl.cs
+++ b/src/Windows/Avalonia.Win32/WindowImpl.cs
@@ -1613,38 +1613,6 @@ namespace Avalonia.Win32
ExtendClientArea();
}
- ///
- public void GetWindowsZOrder(Span windows, Span zOrder)
- {
- var handlesToIndex = new Dictionary(windows.Length);
- var outputArray = new long[windows.Length];
-
- for (int i = 0; i < windows.Length; i++)
- {
- if (windows[i].PlatformImpl is WindowImpl platformImpl)
- handlesToIndex.Add(platformImpl.Handle.Handle, i);
- }
-
- long nextZOrder = 0;
- bool EnumWindowsProc(IntPtr hWnd, IntPtr lParam)
- {
- if (handlesToIndex.TryGetValue(hWnd, out var index))
- {
- // We negate the z-order so that the topmost window has the highest number.
- outputArray[index] = -nextZOrder;
- nextZOrder++;
- }
- return nextZOrder < outputArray.Length;
- }
-
- EnumChildWindows(IntPtr.Zero, EnumWindowsProc, IntPtr.Zero);
-
- for (int i = 0; i < windows.Length; i++)
- {
- zOrder[i] = outputArray[i];
- }
- }
-
///
public bool IsClientAreaExtendedToDecorations => _isClientAreaExtended;
diff --git a/src/iOS/Avalonia.iOS/Eagl/EaglLayerSurface.cs b/src/iOS/Avalonia.iOS/Eagl/EaglLayerSurface.cs
index cc3ae528a2..fb0015476a 100644
--- a/src/iOS/Avalonia.iOS/Eagl/EaglLayerSurface.cs
+++ b/src/iOS/Avalonia.iOS/Eagl/EaglLayerSurface.cs
@@ -61,6 +61,8 @@ namespace Avalonia.iOS.Eagl
_fbo = fbo;
}
+ public bool IsCorrupted => false;
+
public void Dispose()
{
CheckThread();
@@ -68,8 +70,9 @@ namespace Avalonia.iOS.Eagl
_fbo.Dispose();
}
- public IGlPlatformSurfaceRenderingSession BeginDraw()
+ public IGlPlatformSurfaceRenderingSession BeginDraw(PixelSize? expectedPixelSize)
{
+ // TODO: use expectedPixelSize
CheckThread();
var restoreContext = _ctx.MakeCurrent();
_fbo.Bind();
diff --git a/src/iOS/Avalonia.iOS/InputHandler.cs b/src/iOS/Avalonia.iOS/InputHandler.cs
index 552f003a38..bd66d5a51e 100644
--- a/src/iOS/Avalonia.iOS/InputHandler.cs
+++ b/src/iOS/Avalonia.iOS/InputHandler.cs
@@ -181,7 +181,7 @@ internal sealed class InputHandler
UIPressPhase.Stationary => RawKeyEventType.KeyDown,
UIPressPhase.Ended => RawKeyEventType.KeyUp,
_ => RawKeyEventType.KeyUp
- }, key, modifier, physicalKey, keyDeviceType, characters);
+ }, key, modifier, physicalKey, characters, keyDeviceType);
_tl.Input?.Invoke(ev);
handled |= ev.Handled;
@@ -229,7 +229,7 @@ internal sealed class InputHandler
{
// Don't pass PhysicalKey, as physically it's just a touch gesture.
var ev = new RawKeyEventArgs(KeyboardDevice.Instance!, timestamp, Root,
- RawKeyEventType.KeyDown, key, RawInputModifiers.None, PhysicalKey.None, KeyDeviceType.Remote, null);
+ RawKeyEventType.KeyDown, key, RawInputModifiers.None, PhysicalKey.None, null, KeyDeviceType.Remote);
_tl.Input?.Invoke(ev);
var handled = ev.Handled;
diff --git a/src/iOS/Avalonia.iOS/Stubs.cs b/src/iOS/Avalonia.iOS/Stubs.cs
index 17202d4c9d..d0eb86a496 100644
--- a/src/iOS/Avalonia.iOS/Stubs.cs
+++ b/src/iOS/Avalonia.iOS/Stubs.cs
@@ -25,6 +25,9 @@ namespace Avalonia.iOS
public IWindowImpl CreateEmbeddableWindow() => throw new NotSupportedException();
public ITrayIconImpl? CreateTrayIcon() => null;
+
+ public void GetWindowsZOrder(ReadOnlySpan windows, Span zOrder)
+ => throw new NotSupportedException();
}
internal class PlatformIconLoaderStub : IPlatformIconLoader
diff --git a/src/tools/DevGenerators/CompositionGenerator/Generator.cs b/src/tools/DevGenerators/CompositionGenerator/Generator.cs
index 2f27a752e2..4210dfc308 100644
--- a/src/tools/DevGenerators/CompositionGenerator/Generator.cs
+++ b/src/tools/DevGenerators/CompositionGenerator/Generator.cs
@@ -228,7 +228,7 @@ namespace Avalonia.SourceGenerator.CompositionGenerator
server = server.AddMembers(DeclareField($"CompositionProperty<{serverPropertyType}>", CompositionPropertyField(prop),
EqualsValueClause(ParseExpression(
$"CompositionProperty.Register<{serverName}, {serverPropertyType}>(\"{prop.Name}\", obj => (({serverName})obj).{fieldName}, (obj, v) => (({serverName})obj).{fieldName} = v, {compositionPropertyVariantGetter})")),
- SyntaxKind.InternalKeyword, SyntaxKind.StaticKeyword));
+ SyntaxKind.InternalKeyword, SyntaxKind.ReadOnlyKeyword, SyntaxKind.StaticKeyword));
if (prop.DefaultValue != null)
{
@@ -323,6 +323,7 @@ namespace Avalonia.SourceGenerator.CompositionGenerator
IdentifierName(fieldName),
IdentifierName("value")),
Block(
+ ParseStatement($"Validate{prop.Name}Change({fieldName}, value);"),
ParseStatement("On" + prop.Name + "Changing();"),
ParseStatement("changed = true;"),
GeneratePropertySetterAssignment(cl, prop, isObject, isNullable))
@@ -332,6 +333,12 @@ namespace Avalonia.SourceGenerator.CompositionGenerator
ParseStatement($"if(changed) On" + prop.Name + "Changed();")
)).WithModifiers(TokenList(prop.InternalSet ? new[]{Token(SyntaxKind.InternalKeyword)} : Array.Empty()))
))
+ .AddMembers(MethodDeclaration(ParseTypeName("void"), "Validate" + prop.Name + "Change")
+ .AddModifiers(SyntaxKind.PartialKeyword).WithSemicolonToken(Semicolon())
+ .WithParameterList(ParameterList(SeparatedList([
+ Parameter(Identifier("oldValue")).WithType(propType),
+ Parameter(Identifier("newValue")).WithType(propType)
+ ]))))
.AddMembers(MethodDeclaration(ParseTypeName("void"), "On" + prop.Name + "Changed")
.AddModifiers(SyntaxKind.PartialKeyword).WithSemicolonToken(Semicolon()))
.AddMembers(MethodDeclaration(ParseTypeName("void"), "On" + prop.Name + "Changing")
diff --git a/tests/Avalonia.Base.UnitTests/AvaloniaObjectTests_Binding.cs b/tests/Avalonia.Base.UnitTests/AvaloniaObjectTests_Binding.cs
index 19ede2bbb3..e47dca2391 100644
--- a/tests/Avalonia.Base.UnitTests/AvaloniaObjectTests_Binding.cs
+++ b/tests/Avalonia.Base.UnitTests/AvaloniaObjectTests_Binding.cs
@@ -1091,7 +1091,11 @@ namespace Avalonia.Base.UnitTests
var target = new Class1();
var source = new TestTwoWayBindingViewModel();
- target.Bind(Class1.DoubleValueProperty, new Binding(nameof(source.Value), BindingMode.TwoWay) { Source = source });
+ target.Bind(Class1.DoubleValueProperty, new Binding(nameof(source.Value))
+ {
+ Mode = BindingMode.TwoWay,
+ Source = source
+ });
target.DoubleValue = 123.4;
@@ -1105,7 +1109,11 @@ namespace Avalonia.Base.UnitTests
var target = new Class1();
var source = new TestTwoWayBindingViewModel();
- target.Bind(Class1.DoubleValueProperty, new Binding(nameof(source.Value), BindingMode.TwoWay) { Source = source });
+ target.Bind(Class1.DoubleValueProperty, new Binding(nameof(source.Value))
+ {
+ Mode = BindingMode.TwoWay,
+ Source = source
+ });
Assert.False(source.SetterCalled);
}
@@ -1116,7 +1124,11 @@ namespace Avalonia.Base.UnitTests
var target = new Class1();
var source = new TestTwoWayBindingViewModel();
- target.Bind(Class1.DoubleValueProperty, new Binding("[0]", BindingMode.TwoWay) { Source = source });
+ target.Bind(Class1.DoubleValueProperty, new Binding("[0]")
+ {
+ Mode = BindingMode.TwoWay,
+ Source = source
+ });
Assert.False(source.SetterCalled);
}
@@ -1127,7 +1139,7 @@ namespace Avalonia.Base.UnitTests
var target = new TextBlock();
target.DataContext = null;
- target.Bind(TextBlock.TextProperty, new Binding("Missing", BindingMode.TwoWay));
+ target.Bind(TextBlock.TextProperty, new Binding("Missing") { Mode = BindingMode.TwoWay });
}
[Fact]
@@ -1136,7 +1148,7 @@ namespace Avalonia.Base.UnitTests
var target = new TextBlock();
target.DataContext = null;
- target.Bind(TextBlock.TextProperty, new Binding("[0]", BindingMode.TwoWay));
+ target.Bind(TextBlock.TextProperty, new Binding("[0]") { Mode = BindingMode.TwoWay });
}
[Theory(Skip = "Will need changes to binding internals in order to pass")]
@@ -1147,7 +1159,11 @@ namespace Avalonia.Base.UnitTests
{
var target = new Class1();
var source = new TestTwoWayBindingViewModel();
- var binding = new Binding(nameof(source.Value), BindingMode.TwoWay) { Source = source };
+ var binding = new Binding(nameof(source.Value))
+ {
+ Mode = BindingMode.TwoWay,
+ Source = source
+ };
target.Bind(Class1.DoubleValueProperty, binding, priority);
target.SetValue(Class1.DoubleValueProperty, 123.4, priority - 1);
@@ -1165,7 +1181,11 @@ namespace Avalonia.Base.UnitTests
{
var target = new Class1();
var source = new TestTwoWayBindingViewModel();
- var binding1 = new Binding(nameof(source.Value), BindingMode.TwoWay) { Source = source };
+ var binding1 = new Binding(nameof(source.Value))
+ {
+ Mode = BindingMode.TwoWay,
+ Source = source
+ };
var binding2 = new BehaviorSubject(123.4);
target.Bind(Class1.DoubleValueProperty, binding1, priority);
@@ -1182,7 +1202,11 @@ namespace Avalonia.Base.UnitTests
var target = new Class1();
var source = new TestTwoWayBindingViewModel();
- target.Bind(Class1.DoubleValueProperty, new Binding(nameof(source.Value), BindingMode.TwoWay) { Source = source });
+ target.Bind(Class1.DoubleValueProperty, new Binding(nameof(source.Value))
+ {
+ Mode = BindingMode.TwoWay,
+ Source = source
+ });
target.SetValue(Class1.DoubleValueProperty, 123.4, BindingPriority.Animation);
// Setter should not be called because the TwoWay binding with Style priority
@@ -1197,7 +1221,11 @@ namespace Avalonia.Base.UnitTests
var source1 = new TestTwoWayBindingViewModel();
var source2 = new BehaviorSubject(123.4);
- target.Bind(Class1.DoubleValueProperty, new Binding(nameof(source1.Value), BindingMode.TwoWay) { Source = source1 });
+ target.Bind(Class1.DoubleValueProperty, new Binding(nameof(source1.Value))
+ {
+ Mode = BindingMode.TwoWay,
+ Source = source1
+ });
target.Bind(Class1.DoubleValueProperty, source2, BindingPriority.Animation);
// Setter should not be called because the TwoWay binding with Style priority
diff --git a/tests/Avalonia.Base.UnitTests/Data/CompiledBindingTests_Create.cs b/tests/Avalonia.Base.UnitTests/Data/CompiledBindingTests_Create.cs
new file mode 100644
index 0000000000..0dcce969df
--- /dev/null
+++ b/tests/Avalonia.Base.UnitTests/Data/CompiledBindingTests_Create.cs
@@ -0,0 +1,162 @@
+using System;
+using System.Globalization;
+using Avalonia.Controls;
+using Avalonia.Data;
+using Avalonia.Data.Converters;
+using Avalonia.UnitTests;
+using Xunit;
+
+namespace Avalonia.Base.UnitTests.Data;
+
+public class CompiledBindingTests_Create
+{
+ [Fact]
+ public void Create_Should_Create_Binding_With_Simple_Property()
+ {
+ var binding = CompiledBinding.Create(vm => vm.StringProperty);
+
+ Assert.NotNull(binding);
+ Assert.NotNull(binding.Path);
+ Assert.Equal("StringProperty", binding.Path.ToString());
+ Assert.Equal(AvaloniaProperty.UnsetValue, binding.Source);
+ Assert.Equal(BindingMode.Default, binding.Mode);
+ }
+
+ [Fact]
+ public void Create_Should_Create_Binding_With_Source()
+ {
+ var source = new TestViewModel { StringProperty = "Test" };
+ var binding = CompiledBinding.Create(
+ vm => vm.StringProperty,
+ source: source);
+
+ Assert.NotNull(binding);
+ Assert.NotNull(binding.Path);
+ Assert.Equal("StringProperty", binding.Path.ToString());
+ Assert.Same(source, binding.Source);
+ }
+
+ [Fact]
+ public void Create_Should_Apply_Converter()
+ {
+ var converter = new TestConverter();
+ var binding = CompiledBinding.Create(
+ vm => vm.StringProperty,
+ converter: converter);
+
+ Assert.Same(converter, binding.Converter);
+ }
+
+ [Fact]
+ public void Create_Should_Apply_Mode()
+ {
+ var binding = CompiledBinding.Create(
+ vm => vm.StringProperty,
+ mode: BindingMode.TwoWay);
+
+ Assert.Equal(BindingMode.TwoWay, binding.Mode);
+ }
+
+ [Fact]
+ public void Create_Should_Work_With_Nested_Properties()
+ {
+ var binding = CompiledBinding.Create(
+ vm => vm.Child!.StringProperty);
+
+ Assert.NotNull(binding);
+ Assert.NotNull(binding.Path);
+ Assert.Equal("Child.StringProperty", binding.Path.ToString());
+ }
+
+ [Fact]
+ public void Create_Should_Work_With_Indexer()
+ {
+ var binding = CompiledBinding.Create(
+ vm => vm.Items[0]);
+
+ Assert.NotNull(binding);
+ Assert.NotNull(binding.Path);
+ Assert.Equal("Items[0]", binding.Path.ToString());
+ }
+
+ [Fact]
+ public void Binding_Should_Work_When_Applied_To_Control()
+ {
+ using (UnitTestApplication.Start(TestServices.StyledWindow))
+ {
+ var target = new TextBlock();
+ var viewModel = new TestViewModel { StringProperty = "Hello" };
+ var binding = CompiledBinding.Create(
+ vm => vm.StringProperty,
+ source: viewModel);
+
+ target.Bind(TextBlock.TextProperty, binding);
+
+ Assert.Equal("Hello", target.Text);
+ }
+ }
+
+ [Fact]
+ public void Binding_Should_Update_When_Source_Property_Changes()
+ {
+ using (UnitTestApplication.Start(TestServices.StyledWindow))
+ {
+ var target = new TextBlock();
+ var viewModel = new TestViewModel { StringProperty = "Initial" };
+ var binding = CompiledBinding.Create(
+ vm => vm.StringProperty,
+ source: viewModel);
+
+ target.Bind(TextBlock.TextProperty, binding);
+ Assert.Equal("Initial", target.Text);
+
+ viewModel.StringProperty = "Updated";
+ Assert.Equal("Updated", target.Text);
+ }
+ }
+
+ [Fact]
+ public void Binding_Should_Use_DataContext_When_No_Source_Specified()
+ {
+ using (UnitTestApplication.Start(TestServices.StyledWindow))
+ {
+ var target = new TextBlock();
+ var viewModel = new TestViewModel { StringProperty = "FromDataContext" };
+ var binding = CompiledBinding.Create(vm => vm.StringProperty);
+
+ target.DataContext = viewModel;
+ target.Bind(TextBlock.TextProperty, binding);
+
+ Assert.Equal("FromDataContext", target.Text);
+ }
+ }
+
+ private class TestViewModel : NotifyingBase
+ {
+ private string? _stringProperty;
+ private TestViewModel? _child;
+
+ public string? StringProperty
+ {
+ get => _stringProperty;
+ set { _stringProperty = value; RaisePropertyChanged(); }
+ }
+
+ public TestViewModel? Child
+ {
+ get => _child;
+ set { _child = value; RaisePropertyChanged(); }
+ }
+
+ public string?[] Items { get; set; } = Array.Empty();
+ }
+
+ private class TestConverter : IValueConverter
+ {
+ public object? Convert(object? value, Type targetType, object? parameter, CultureInfo culture)
+ => value?.ToString()?.ToUpper();
+
+ public object? ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture)
+ => value?.ToString()?.ToLower();
+ }
+}
diff --git a/tests/Avalonia.Base.UnitTests/Data/Core/BindingExpressionTests.cs b/tests/Avalonia.Base.UnitTests/Data/Core/BindingExpressionTests.cs
index 251be3fc27..6302b68b08 100644
--- a/tests/Avalonia.Base.UnitTests/Data/Core/BindingExpressionTests.cs
+++ b/tests/Avalonia.Base.UnitTests/Data/Core/BindingExpressionTests.cs
@@ -95,7 +95,7 @@ public abstract partial class BindingExpressionTests
var target = new TargetClass { DataContext = dataContext };
var nodes = new List();
var fallback = fallbackValue.HasValue ? fallbackValue.Value : AvaloniaProperty.UnsetValue;
- var path = CompiledBindingPathFromExpressionBuilder.Build(expression, enableDataValidation);
+ var path = BindingExpressionVisitor.BuildPath(expression);
if (relativeSource is not null && relativeSource.Mode is not RelativeSourceMode.Self)
throw new NotImplementedException();
diff --git a/tests/Avalonia.Base.UnitTests/Data/Core/CompiledBindingPathFromExpressionBuilder.cs b/tests/Avalonia.Base.UnitTests/Data/Core/CompiledBindingPathFromExpressionBuilder.cs
deleted file mode 100644
index d3623fde80..0000000000
--- a/tests/Avalonia.Base.UnitTests/Data/Core/CompiledBindingPathFromExpressionBuilder.cs
+++ /dev/null
@@ -1,313 +0,0 @@
-using System;
-using System.Linq;
-using System.Linq.Expressions;
-using System.Reflection;
-using System.Threading.Tasks;
-using Avalonia.Data;
-using Avalonia.Data.Core;
-using Avalonia.Markup.Xaml.MarkupExtensions.CompiledBindings;
-
-#nullable enable
-
-namespace Avalonia.Base.UnitTests.Data.Core;
-
-internal class CompiledBindingPathFromExpressionBuilder : ExpressionVisitor
-{
- private static readonly PropertyInfo AvaloniaObjectIndexer;
- private static readonly MethodInfo CreateDelegateMethod;
- private static readonly string IndexerGetterName = "get_Item";
- private const string MultiDimensionalArrayGetterMethodName = "Get";
- private readonly bool _enableDataValidation;
- private readonly LambdaExpression _rootExpression;
- private readonly CompiledBindingPathBuilder _builder = new();
- private Expression? _head;
-
- public CompiledBindingPathFromExpressionBuilder(LambdaExpression expression, bool enableDataValidation)
- {
- _rootExpression = expression;
- _enableDataValidation = enableDataValidation;
- }
-
- static CompiledBindingPathFromExpressionBuilder()
- {
- AvaloniaObjectIndexer = typeof(AvaloniaObject).GetProperty("Item", new[] { typeof(AvaloniaProperty) })!;
- CreateDelegateMethod = typeof(MethodInfo).GetMethod("CreateDelegate", new[] { typeof(Type), typeof(object) })!;
- }
-
- public static CompiledBindingPath Build(Expression> expression, bool enableDataValidation)
- {
- var visitor = new CompiledBindingPathFromExpressionBuilder(expression, enableDataValidation);
- visitor.Visit(expression);
- return visitor._builder.Build();
- }
-
- protected override Expression VisitBinary(BinaryExpression node)
- {
- // Indexers require more work since the compiler doesn't generate IndexExpressions:
- // they weren't in System.Linq.Expressions v1 and so must be generated manually.
- if (node.NodeType == ExpressionType.ArrayIndex)
- return Visit(Expression.MakeIndex(node.Left, null, new[] { node.Right }));
-
- throw new ExpressionParseException(0, $"Invalid expression type in binding expression: {node.NodeType}.");
- }
-
- protected override Expression VisitIndex(IndexExpression node)
- {
- if (node.Indexer == AvaloniaObjectIndexer)
- {
- var property = GetValue(node.Arguments[0]);
- return Add(node.Object, node, x => x.Property(property, PropertyInfoAccessorFactory.CreateAvaloniaPropertyAccessor));
- }
- else if (node.Object?.Type.IsArray == true)
- {
- var indexes = node.Arguments.Select(GetValue).ToArray();
- return Add(node.Object, node, x => x.ArrayElement(indexes, node.Type));
- }
- else if (node.Indexer?.GetMethod is not null &&
- node.Arguments.Count == 1 &&
- node.Arguments[0].Type == typeof(int))
- {
- var getMethod = node.Indexer.GetMethod;
- var setMethod = node.Indexer.SetMethod;
- var index = GetValue(node.Arguments[0]);
- var info = new ClrPropertyInfo(
- CommonPropertyNames.IndexerName,
- x => getMethod.Invoke(x, new object[] { index }),
- setMethod is not null ? (o, v) => setMethod.Invoke(o, new[] { v }) : null,
- getMethod.ReturnType);
- return Add(node.Object, node, x => x.Property(
- info,
- (x, i) => PropertyInfoAccessorFactory.CreateIndexerPropertyAccessor(x, i, index)));
- }
- else if (node.Indexer?.GetMethod is not null)
- {
- var getMethod = node.Indexer.GetMethod;
- var setMethod = node.Indexer?.SetMethod;
- var indexes = node.Arguments.Select(GetValue).ToArray();
- var info = new ClrPropertyInfo(
- CommonPropertyNames.IndexerName,
- x => getMethod.Invoke(x, indexes),
- setMethod is not null ? (o, v) => setMethod.Invoke(o, indexes.Append(v).ToArray()) : null,
- getMethod.ReturnType);
- return Add(node.Object, node, x => x.Property(
- info,
- PropertyInfoAccessorFactory.CreateInpcPropertyAccessor));
- }
-
- throw new ExpressionParseException(0, $"Invalid indexer in binding expression: {node.NodeType}.");
- }
-
- protected override Expression VisitMember(MemberExpression node)
- {
- if (node.Member.MemberType != MemberTypes.Property)
- throw new ExpressionParseException(0, $"Invalid expression type in binding expression: {node.NodeType}.");
-
- if (typeof(AvaloniaObject).IsAssignableFrom(node.Expression?.Type) &&
- AvaloniaPropertyRegistry.Instance.FindRegistered(node.Expression.Type, node.Member.Name) is { } avaloniaProperty)
- {
- return Add(
- node.Expression,
- node,
- x => x.Property(avaloniaProperty, PropertyInfoAccessorFactory.CreateAvaloniaPropertyAccessor));
- }
- else
- {
- var property = (PropertyInfo)node.Member;
- var info = new ClrPropertyInfo(
- property.Name,
- CreateGetter(property),
- CreateSetter(property),
- property.PropertyType);
- return Add(node.Expression, node, x => x.Property(info, PropertyInfoAccessorFactory.CreateInpcPropertyAccessor));
- }
- }
-
- protected override Expression VisitMethodCall(MethodCallExpression node)
- {
- var method = node.Method;
-
- if (method.Name == IndexerGetterName && node.Object is not null)
- {
- var property = TryGetPropertyFromMethod(method);
- return Visit(Expression.MakeIndex(node.Object, property, node.Arguments));
- }
- else if (method.Name == MultiDimensionalArrayGetterMethodName &&
- node.Object is not null)
- {
- var indexes = node.Arguments.Select(GetValue).ToArray();
- return Add(node.Object, node, x => x.ArrayElement(indexes, node.Type));
- }
- else if (method.Name.StartsWith(StreamBindingExtensions.StreamBindingName) &&
- method.DeclaringType == typeof(StreamBindingExtensions) &&
- method.GetGenericArguments() is [Type genericArg])
- {
- var instance = node.Method.IsStatic ? node.Arguments[0] : node.Object;
-
- if (typeof(Task<>).MakeGenericType(genericArg).IsAssignableFrom(instance?.Type))
- {
- var builderMethod = typeof(CompiledBindingPathBuilder)
- .GetMethod(nameof(CompiledBindingPathBuilder.StreamTask))!
- .MakeGenericMethod(genericArg);
- return Add(instance, node, x => builderMethod.Invoke(x, null));
- }
- else if (typeof(IObservable<>).MakeGenericType(genericArg).IsAssignableFrom(instance?.Type))
- {
- var builderMethod = typeof(CompiledBindingPathBuilder)
- .GetMethod(nameof(CompiledBindingPathBuilder.StreamObservable))!
- .MakeGenericMethod(genericArg);
- return Add(instance, node, x => builderMethod.Invoke(x, null));
- }
- }
-
- throw new ExpressionParseException(0, $"Invalid method call in binding expression: '{node.Method.DeclaringType}.{node.Method.Name}'.");
- }
-
- protected override Expression VisitParameter(ParameterExpression node)
- {
- if (node == _rootExpression.Parameters[0] && _head is null)
- _head = node;
- return base.VisitParameter(node);
- }
-
- protected override Expression VisitUnary(UnaryExpression node)
- {
- if (node.NodeType == ExpressionType.Not && node.Type == typeof(bool))
- {
- return Add(node.Operand, node, x => x.Not());
- }
- else if (node.NodeType == ExpressionType.Convert)
- {
- if (node.Operand.Type.IsAssignableFrom(node.Type))
- {
- // Ignore inheritance casts
- return _head = base.VisitUnary(node);
- }
- }
- else if (node.NodeType == ExpressionType.TypeAs)
- {
- // Ignore as operator.
- return _head = base.VisitUnary(node);
- }
-
- throw new ExpressionParseException(0, $"Invalid expression type in binding expression: {node.NodeType}.");
- }
-
- protected override Expression VisitBlock(BlockExpression node)
- {
- throw new ExpressionParseException(0, $"Invalid expression type in binding expression: {node.NodeType}.");
- }
-
- protected override CatchBlock VisitCatchBlock(CatchBlock node)
- {
- throw new ExpressionParseException(0, $"Catch blocks are not allowed in binding expressions.");
- }
-
- protected override Expression VisitConditional(ConditionalExpression node)
- {
- throw new ExpressionParseException(0, $"Invalid expression type in binding expression: {node.NodeType}.");
- }
-
- protected override Expression VisitDynamic(DynamicExpression node)
- {
- throw new ExpressionParseException(0, $"Dynamic expressions are not allowed in binding expressions.");
- }
-
- protected override ElementInit VisitElementInit(ElementInit node)
- {
- throw new ExpressionParseException(0, $"Element init expressions are not valid in a binding expression.");
- }
-
- protected override Expression VisitGoto(GotoExpression node)
- {
- throw new ExpressionParseException(0, $"Goto expressions not supported in binding expressions.");
- }
-
- protected override Expression VisitInvocation(InvocationExpression node)
- {
- throw new ExpressionParseException(0, $"Invalid expression type in binding expression: {node.NodeType}.");
- }
-
- protected override Expression VisitLabel(LabelExpression node)
- {
- throw new ExpressionParseException(0, $"Invalid expression type in binding expression: {node.NodeType}.");
- }
-
- protected override Expression VisitListInit(ListInitExpression node)
- {
- throw new ExpressionParseException(0, $"Invalid expression type in binding expression: {node.NodeType}.");
- }
-
- protected override Expression VisitLoop(LoopExpression node)
- {
- throw new ExpressionParseException(0, $"Invalid expression type in binding expression: {node.NodeType}.");
- }
-
- protected override MemberAssignment VisitMemberAssignment(MemberAssignment node)
- {
- throw new ExpressionParseException(0, $"Member assignments not supported in binding expressions.");
- }
-
- protected override Expression VisitSwitch(SwitchExpression node)
- {
- throw new ExpressionParseException(0, $"Invalid expression type in binding expression: {node.NodeType}.");
- }
-
- protected override Expression VisitTry(TryExpression node)
- {
- throw new ExpressionParseException(0, $"Invalid expression type in binding expression: {node.NodeType}.");
- }
-
- protected override Expression VisitTypeBinary(TypeBinaryExpression node)
- {
- throw new ExpressionParseException(0, $"Invalid expression type in binding expression: {node.NodeType}.");
- }
-
- private Expression Add(Expression? instance, Expression expression, Action build)
- {
- var visited = Visit(instance);
- if (visited != _head)
- throw new ExpressionParseException(
- 0,
- $"Unable to parse '{expression}': expected an instance of '{_head}' but got '{visited}'.");
- build(_builder);
- return _head = expression;
- }
-
- private static Func? CreateGetter(PropertyInfo info)
- {
- if (info.GetMethod == null)
- return null;
- var target = Expression.Parameter(typeof(object), "target");
- return Expression.Lambda>(
- Expression.Convert(Expression.Call(Expression.Convert(target, info.DeclaringType!), info.GetMethod),
- typeof(object)),
- target)
- .Compile();
- }
-
- private static Action? CreateSetter(PropertyInfo info)
- {
- if (info.SetMethod == null)
- return null;
- var target = Expression.Parameter(typeof(object), "target");
- var value = Expression.Parameter(typeof(object), "value");
- return Expression.Lambda>(
- Expression.Call(Expression.Convert(target, info.DeclaringType!), info.SetMethod,
- Expression.Convert(value, info.SetMethod.GetParameters()[0].ParameterType)),
- target, value)
- .Compile();
- }
-
- private static T GetValue(Expression expr)
- {
- if (expr is ConstantExpression constant)
- return (T)constant.Value!;
- return Expression.Lambda>(expr).Compile(preferInterpretation: true)();
- }
-
- private static PropertyInfo? TryGetPropertyFromMethod(MethodInfo method)
- {
- var type = method.DeclaringType;
- return type?.GetRuntimeProperties().FirstOrDefault(prop => prop.GetMethod == method);
- }
-}
diff --git a/tests/Avalonia.Base.UnitTests/Data/Core/Parsers/BindingExpressionVisitorExtensions.cs b/tests/Avalonia.Base.UnitTests/Data/Core/Parsers/BindingExpressionVisitorExtensions.cs
new file mode 100644
index 0000000000..6f3d3474f5
--- /dev/null
+++ b/tests/Avalonia.Base.UnitTests/Data/Core/Parsers/BindingExpressionVisitorExtensions.cs
@@ -0,0 +1,25 @@
+using System;
+using System.Collections.Generic;
+using System.Linq.Expressions;
+using Avalonia.Data.Core.ExpressionNodes;
+using Avalonia.Data.Core.Parsers;
+
+namespace Avalonia.Base.UnitTests.Data.Core.Parsers;
+
+///
+/// Test extensions for BindingExpressionVisitor tests.
+///
+internal static class BindingExpressionVisitorExtensions
+{
+ ///
+ /// Builds a list of binding expression nodes from a lambda expression.
+ /// This is a test helper method - production code should use BuildPath() instead.
+ ///
+ public static List BuildNodes(Expression> expression)
+ {
+ var path = BindingExpressionVisitor.BuildPath(expression);
+ var nodes = new List();
+ path.BuildExpression(nodes, out var _);
+ return nodes;
+ }
+}
diff --git a/tests/Avalonia.Base.UnitTests/Data/Core/Parsers/BindingExpressionVisitorTests.cs b/tests/Avalonia.Base.UnitTests/Data/Core/Parsers/BindingExpressionVisitorTests.cs
new file mode 100644
index 0000000000..ddd0f87c04
--- /dev/null
+++ b/tests/Avalonia.Base.UnitTests/Data/Core/Parsers/BindingExpressionVisitorTests.cs
@@ -0,0 +1,528 @@
+using System;
+using System.Collections.Generic;
+using System.Linq.Expressions;
+using System.Threading.Tasks;
+using Avalonia.Data.Core;
+using Avalonia.Data.Core.ExpressionNodes;
+using Avalonia.Data.Core.Parsers;
+using Xunit;
+
+namespace Avalonia.Base.UnitTests.Data.Core.Parsers
+{
+ public class BindingExpressionVisitorTests
+ {
+ [Fact]
+ public void BuildNodes_Should_Parse_Simple_Property()
+ {
+ Expression> expr = x => x.StringProperty;
+
+ var nodes = BuildNodes(expr);
+
+ var node = Assert.Single(nodes);
+ var propertyNode = Assert.IsType(node);
+ Assert.Equal("StringProperty", propertyNode.PropertyName);
+ }
+
+ [Fact]
+ public void BuildNodes_Should_Parse_Property_Chain()
+ {
+ Expression> expr = x => x.Child!.StringProperty;
+
+ var nodes = BuildNodes(expr);
+
+ Assert.Equal(2, nodes.Count);
+
+ var firstNode = Assert.IsType(nodes[0]);
+ Assert.Equal("Child", firstNode.PropertyName);
+
+ var secondNode = Assert.IsType(nodes[1]);
+ Assert.Equal("StringProperty", secondNode.PropertyName);
+ }
+
+ [Fact]
+ public void BuildNodes_Should_Parse_Long_Property_Chain()
+ {
+ Expression> expr = x => x.Child!.Child!.StringProperty;
+
+ var nodes = BuildNodes(expr);
+
+ Assert.Equal(3, nodes.Count);
+ Assert.All(nodes, n => Assert.IsType(n));
+ Assert.Equal("Child", ((PropertyAccessorNode)nodes[0]).PropertyName);
+ Assert.Equal("Child", ((PropertyAccessorNode)nodes[1]).PropertyName);
+ Assert.Equal("StringProperty", ((PropertyAccessorNode)nodes[2]).PropertyName);
+ }
+
+ [Fact]
+ public void BuildNodes_Should_Parse_Indexer()
+ {
+ Expression> expr = x => x.IndexedProperty![0];
+
+ var nodes = BuildNodes(expr);
+
+ Assert.Equal(2, nodes.Count);
+
+ var propertyNode = Assert.IsType(nodes[0]);
+ Assert.Equal("IndexedProperty", propertyNode.PropertyName);
+
+ Assert.IsType(nodes[1]); // List indexer, not array
+ }
+
+ [Fact]
+ public void BuildNodes_Should_Parse_Array_Index()
+ {
+ Expression> expr = x => x.ArrayProperty![0];
+
+ var nodes = BuildNodes(expr);
+
+ Assert.Equal(2, nodes.Count);
+
+ var propertyNode = Assert.IsType(nodes[0]);
+ Assert.Equal("ArrayProperty", propertyNode.PropertyName);
+
+ Assert.IsType(nodes[1]);
+ }
+
+ [Fact]
+ public void BuildNodes_Should_Parse_Multi_Dimensional_Array()
+ {
+ Expression> expr = x => x.MultiDimensionalArray![0, 1];
+
+ var nodes = BuildNodes(expr);
+
+ Assert.Equal(2, nodes.Count);
+
+ var propertyNode = Assert.IsType(nodes[0]);
+ Assert.Equal("MultiDimensionalArray", propertyNode.PropertyName);
+
+ Assert.IsType(nodes[1]);
+ }
+
+ [Fact]
+ public void BuildNodes_Should_Parse_AvaloniaProperty_Access()
+ {
+ Expression> expr = x => x[StyledElement.DataContextProperty];
+
+ var nodes = BuildNodes(expr);
+
+ var node = Assert.Single(nodes);
+ var avaloniaPropertyNode = Assert.IsType(node);
+ Assert.Equal("DataContext", avaloniaPropertyNode.PropertyName); // AvaloniaProperty accessed as property
+ }
+
+ [Fact]
+ public void BuildNodes_Should_Parse_AvaloniaProperty_Access_In_Chain()
+ {
+ Expression> expr = x => x.StyledChild![StyledElement.DataContextProperty];
+
+ var nodes = BuildNodes(expr);
+
+ Assert.Equal(2, nodes.Count);
+
+ var propertyNode = Assert.IsType(nodes[0]);
+ Assert.Equal("StyledChild", propertyNode.PropertyName);
+
+ var avaloniaPropertyNode = Assert.IsType(nodes[1]);
+ Assert.Equal("DataContext", avaloniaPropertyNode.PropertyName); // AvaloniaProperty accessed as property
+ }
+
+ [Fact]
+ public void BuildNodes_Should_Parse_Logical_Not()
+ {
+ Expression> expr = x => !x.BoolProperty;
+
+ var nodes = BuildNodes(expr);
+
+ Assert.Equal(2, nodes.Count);
+
+ var propertyNode = Assert.IsType(nodes[0]);
+ Assert.Equal("BoolProperty", propertyNode.PropertyName);
+
+ Assert.IsType(nodes[1]);
+ }
+
+ [Fact]
+ public void BuildNodes_Should_Parse_Logical_Not_In_Chain()
+ {
+ Expression> expr = x => !x.Child!.BoolProperty;
+
+ var nodes = BuildNodes(expr);
+
+ Assert.Equal(3, nodes.Count);
+ Assert.IsType(nodes[0]);
+ Assert.IsType(nodes[1]);
+ Assert.IsType(nodes[2]);
+ }
+
+ [Fact]
+ public void BuildNodes_Should_Parse_Task_StreamBinding()
+ {
+ Expression> expr = x => x.TaskProperty!.StreamBinding();
+
+ var nodes = BuildNodes(expr);
+
+ Assert.Equal(2, nodes.Count);
+
+ var propertyNode = Assert.IsType(nodes[0]);
+ Assert.Equal("TaskProperty", propertyNode.PropertyName);
+
+ Assert.IsType(nodes[1]);
+ }
+
+ [Fact]
+ public void BuildNodes_Should_Parse_Observable_StreamBinding()
+ {
+ Expression> expr = x => x.ObservableProperty!.StreamBinding();
+
+ var nodes = BuildNodes(expr);
+
+ Assert.Equal(2, nodes.Count);
+
+ var propertyNode = Assert.IsType(nodes[0]);
+ Assert.Equal("ObservableProperty", propertyNode.PropertyName);
+
+ Assert.IsType(nodes[1]);
+ }
+
+ [Fact]
+ public void BuildNodes_Should_Parse_Void_Task_StreamBinding()
+ {
+ Expression> expr = x => x.VoidTaskProperty!.StreamBinding();
+
+ var nodes = BuildNodes(expr);
+
+ Assert.Equal(2, nodes.Count);
+
+ var propertyNode = Assert.IsType(nodes[0]);
+ Assert.Equal("VoidTaskProperty", propertyNode.PropertyName);
+
+ Assert.IsType(nodes[1]);
+ }
+
+ [Fact]
+ public void BuildNodes_Should_Create_Node_For_Upcast()
+ {
+ // Upcasts (derived to base) create a cast node
+ Expression> expr = x => (TestClass)x;
+
+ var nodes = BuildNodes(expr);
+
+ var node = Assert.Single(nodes);
+ Assert.IsType(node);
+ }
+
+ [Fact]
+ public void BuildNodes_Should_Create_Node_For_Upcast_In_Property_Chain()
+ {
+ // Cast creates a node, then property access creates another
+ Expression> expr = x => ((TestClass)x).StringProperty;
+
+ var nodes = BuildNodes(expr);
+
+ Assert.Equal(2, nodes.Count);
+ Assert.IsType(nodes[0]);
+ var propertyNode = Assert.IsType(nodes[1]);
+ Assert.Equal("StringProperty", propertyNode.PropertyName);
+ }
+
+ [Fact]
+ public void BuildNodes_Should_Create_Node_For_Downcast()
+ {
+ // Downcasts (base to derived) create a cast node - the binding system will handle runtime errors
+ Expression> expr = x => (DerivedTestClass)x;
+
+ var nodes = BuildNodes(expr);
+
+ var node = Assert.Single(nodes);
+ Assert.IsType(node);
+ }
+
+ [Fact]
+ public void BuildNodes_Should_Create_Node_For_Downcast_In_Property_Chain()
+ {
+ // Practical example: casting to access derived type properties
+ Expression> expr = x => ((DerivedTestClass)x.Child!).DerivedProperty;
+
+ var nodes = BuildNodes(expr);
+
+ Assert.Equal(3, nodes.Count);
+ var childNode = Assert.IsType(nodes[0]);
+ Assert.Equal("Child", childNode.PropertyName);
+ Assert.IsType(nodes[1]);
+ var derivedNode = Assert.IsType(nodes[2]);
+ Assert.Equal("DerivedProperty", derivedNode.PropertyName);
+ }
+
+ [Fact]
+ public void BuildNodes_Should_Throw_For_Value_Type_Cast()
+ {
+ // Value type conversions should throw
+ Expression> expr = x => (long)x.IntProperty;
+
+ var ex = Assert.Throws(() =>
+ BuildNodes(expr));
+
+ Assert.Contains("Invalid expression type", ex.Message);
+ Assert.Contains("Convert", ex.Message);
+ }
+
+ [Fact]
+ public void BuildNodes_Should_Create_Nodes_For_Casting_Through_Object()
+ {
+ // Casting through object creates cast nodes
+ Expression> expr = x => (string)(object)x.StringProperty!;
+
+ var nodes = BuildNodes(expr);
+
+ Assert.Equal(3, nodes.Count);
+ var propertyNode = Assert.IsType(nodes[0]);
+ Assert.Equal("StringProperty", propertyNode.PropertyName);
+ Assert.IsType(nodes[1]); // cast to object
+ Assert.IsType(nodes[2]); // cast to string
+ }
+
+ [Fact]
+ public void BuildNodes_Should_Create_Node_For_TypeAs_Operator()
+ {
+ // TypeAs operator creates a cast node
+ Expression> expr = x => x.Child as object;
+
+ var nodes = BuildNodes(expr);
+
+ Assert.Equal(2, nodes.Count);
+ var propertyNode = Assert.IsType(nodes[0]);
+ Assert.Equal("Child", propertyNode.PropertyName);
+ Assert.IsType(nodes[1]);
+ }
+
+ [Fact]
+ public void BuildNodes_Should_Throw_For_Addition_Operator()
+ {
+ Expression> expr = x => x.IntProperty + 1;
+
+ var ex = Assert.Throws(() =>
+ BuildNodes(expr));
+
+ Assert.Contains("Invalid expression type", ex.Message);
+ Assert.Contains("Add", ex.Message);
+ }
+
+ [Fact]
+ public void BuildNodes_Should_Throw_For_Subtraction_Operator()
+ {
+ Expression> expr = x => x.IntProperty - 1;
+
+ var ex = Assert.Throws(() =>
+ BuildNodes(expr));
+
+ Assert.Contains("Invalid expression type", ex.Message);
+ Assert.Contains("Subtract", ex.Message);
+ }
+
+ [Fact]
+ public void BuildNodes_Should_Throw_For_Multiplication_Operator()
+ {
+ Expression> expr = x => x.IntProperty * 2;
+
+ var ex = Assert.Throws(() =>
+ BuildNodes(expr));
+
+ Assert.Contains("Invalid expression type", ex.Message);
+ Assert.Contains("Multiply", ex.Message);
+ }
+
+ [Fact]
+ public void BuildNodes_Should_Throw_For_Equality_Operator()
+ {
+ Expression> expr = x => x.IntProperty == 42;
+
+ var ex = Assert.Throws(() =>
+ BuildNodes(expr));
+
+ Assert.Contains("Invalid expression type", ex.Message);
+ Assert.Contains("Equal", ex.Message);
+ }
+
+ [Fact]
+ public void BuildNodes_Should_Throw_For_Conditional_Expression()
+ {
+ Expression> expr = x => x.BoolProperty ? "true" : "false";
+
+ var ex = Assert.Throws(() =>
+ BuildNodes(expr));
+
+ Assert.Contains("Invalid expression type", ex.Message);
+ Assert.Contains("Conditional", ex.Message);
+ }
+
+ [Fact]
+ public void BuildNodes_Should_Throw_For_Method_Call_That_Is_Not_Indexer_Or_StreamBinding()
+ {
+ Expression> expr = x => x.StringProperty!.ToUpper();
+
+ var ex = Assert.Throws(() =>
+ BuildNodes(expr));
+
+ Assert.Contains("Invalid method call", ex.Message);
+ Assert.Contains("ToUpper", ex.Message);
+ }
+
+ [Fact]
+ public void BuildNodes_Should_Handle_Unary_Plus_Operator()
+ {
+ // Unary plus is typically optimized away by the C# compiler and doesn't appear in the
+ // expression tree, so it doesn't throw an exception.
+ Expression> expr = x => +x.IntProperty;
+
+ var nodes = BuildNodes(expr);
+
+ var node = Assert.Single(nodes);
+ var propertyNode = Assert.IsType(node);
+ Assert.Equal("IntProperty", propertyNode.PropertyName);
+ }
+
+ [Fact]
+ public void BuildNodes_Should_Throw_For_Unary_Minus_Operator()
+ {
+ Expression> expr = x => -x.IntProperty;
+
+ var ex = Assert.Throws(() =>
+ BuildNodes(expr));
+
+ Assert.Contains("Invalid expression type", ex.Message);
+ Assert.Contains("Negate", ex.Message);
+ }
+
+ [Fact]
+ public void BuildNodes_Should_Parse_Chained_Indexers()
+ {
+ Expression> expr = x => x.NestedIndexedProperty![0]![1];
+
+ var nodes = BuildNodes(expr);
+
+ Assert.Equal(3, nodes.Count);
+
+ var propertyNode = Assert.IsType(nodes[0]);
+ Assert.Equal("NestedIndexedProperty", propertyNode.PropertyName);
+
+ Assert.IsType(nodes[1]); // List indexer
+ Assert.IsType(nodes[2]); // List indexer
+ }
+
+ [Fact]
+ public void BuildNodes_Should_Parse_Property_After_Indexer()
+ {
+ Expression> expr = x => x.IndexedProperty![0]!.StringProperty;
+
+ var nodes = BuildNodes(expr);
+
+ Assert.Equal(3, nodes.Count);
+ Assert.IsType(nodes[0]);
+ Assert.IsType(nodes[1]); // List indexer
+ Assert.IsType(nodes[2]);
+ }
+
+ [Fact]
+ public void BuildNodes_Should_Parse_Indexer_With_String_Key()
+ {
+ Expression> expr = x => x.DictionaryProperty!["key"];
+
+ var nodes = BuildNodes(expr);
+
+ Assert.Equal(2, nodes.Count);
+
+ var propertyNode = Assert.IsType(nodes[0]);
+ Assert.Equal("DictionaryProperty", propertyNode.PropertyName);
+
+ Assert.IsType(nodes[1]); // Dictionary indexer
+ }
+
+ [Fact]
+ public void BuildNodes_Should_Parse_Indexer_With_Variable_Key()
+ {
+ var key = "test";
+ Expression> expr = x => x.DictionaryProperty![key];
+
+ var nodes = BuildNodes(expr);
+
+ Assert.Equal(2, nodes.Count);
+ Assert.IsType(nodes[0]);
+ Assert.IsType(nodes[1]); // Dictionary indexer
+ }
+
+ [Fact]
+ public void BuildNodes_Should_Parse_StreamBinding_In_Property_Chain()
+ {
+ Expression> expr = x => x.Child!.TaskProperty!.StreamBinding();
+
+ var nodes = BuildNodes(expr);
+
+ Assert.Equal(3, nodes.Count);
+ Assert.IsType(nodes[0]);
+ Assert.IsType(nodes[1]);
+ Assert.IsType(nodes[2]);
+ }
+
+ [Fact]
+ public void BuildNodes_Should_Parse_Logical_Not_After_StreamBinding()
+ {
+ Expression> expr = x => !x.BoolTaskProperty!.StreamBinding();
+
+ var nodes = BuildNodes(expr);
+
+ Assert.Equal(3, nodes.Count);
+ Assert.IsType(nodes[0]);
+ Assert.IsType(nodes[1]);
+ Assert.IsType(nodes[2]);
+ }
+
+ [Fact]
+ public void BuildNodes_Should_Handle_Empty_Expression()
+ {
+ Expression> expr = x => x;
+
+ var nodes = BuildNodes(expr);
+
+ Assert.Empty(nodes);
+ }
+
+ [Fact]
+ public void BuildNodes_Should_Parse_Multiple_Logical_Not_Operators()
+ {
+ Expression> expr = x => !!x.BoolProperty;
+
+ var nodes = BuildNodes(expr);
+
+ Assert.Equal(3, nodes.Count);
+ Assert.IsType(nodes[0]);
+ Assert.IsType(nodes[1]);
+ Assert.IsType(nodes[2]);
+ }
+
+ public class TestClass
+ {
+ public string? StringProperty { get; set; }
+ public int IntProperty { get; set; }
+ public bool BoolProperty { get; set; }
+ public TestClass? Child { get; set; }
+ public StyledElement? StyledChild { get; set; }
+ public string?[]? ArrayProperty { get; set; }
+ public string?[,]? MultiDimensionalArray { get; set; }
+ public List? IndexedProperty { get; set; }
+ public List>? NestedIndexedProperty { get; set; }
+ public Dictionary? DictionaryProperty { get; set; }
+ public Task? TaskProperty { get; set; }
+ public Task? VoidTaskProperty { get; set; }
+ public Task? BoolTaskProperty { get; set; }
+ public IObservable? ObservableProperty { get; set; }
+ }
+
+ public class DerivedTestClass : TestClass
+ {
+ public string? DerivedProperty { get; set; }
+ }
+
+ private static List BuildNodes(Expression> expression)
+ => BindingExpressionVisitorExtensions.BuildNodes(expression);
+ }
+}
diff --git a/tests/Avalonia.Base.UnitTests/Input/PointerTests.cs b/tests/Avalonia.Base.UnitTests/Input/PointerTests.cs
index 1f95c755ce..dfc081ad31 100644
--- a/tests/Avalonia.Base.UnitTests/Input/PointerTests.cs
+++ b/tests/Avalonia.Base.UnitTests/Input/PointerTests.cs
@@ -53,5 +53,61 @@ namespace Avalonia.Base.UnitTests.Input
Assert.Equal(2, pointer.PlatformCaptureCalled);
}
+
+ [Fact]
+ public void Capture_Explicit_ShouldNotify_After_Implicit()
+ {
+ var pointer = new TestPointer(Pointer.GetNextFreeId(), PointerType.Mouse, true);
+
+ Border capture = new Border();
+
+ List sources = new();
+ capture.PointerCaptureChanging += (sender, e) =>
+ {
+ sources.Add(e.CaptureSource);
+ };
+
+ pointer.Capture(capture, CaptureSource.Implicit);
+ pointer.Capture(capture, CaptureSource.Explicit);
+
+ Assert.True(sources.SequenceEqual([CaptureSource.Implicit, CaptureSource.Explicit]));
+
+ Assert.Equal(1, pointer.PlatformCaptureCalled);
+
+ pointer.Capture(null, CaptureSource.Implicit); // not ignored, so captured element will become null
+ pointer.Capture(null, CaptureSource.Explicit); // changing from null to null does not notify anything
+
+ Assert.True(sources.SequenceEqual([CaptureSource.Implicit, CaptureSource.Explicit, CaptureSource.Implicit]));
+
+ Assert.Equal(2, pointer.PlatformCaptureCalled);
+ }
+
+ [Fact]
+ public void Capture_Explicit_ShouldNotify_After_HandledImplicit()
+ {
+ var pointer = new TestPointer(Pointer.GetNextFreeId(), PointerType.Mouse, true);
+
+ Border capture = new Border();
+
+ List sources = new();
+ capture.PointerCaptureChanging += (sender, e) =>
+ {
+ sources.Add(e.CaptureSource);
+ e.Handled = e.CaptureSource == CaptureSource.Implicit;
+ };
+
+ pointer.Capture(capture, CaptureSource.Implicit);
+ pointer.Capture(capture, CaptureSource.Explicit);
+
+ Assert.True(sources.SequenceEqual([CaptureSource.Implicit, CaptureSource.Explicit]));
+
+ Assert.Equal(1, pointer.PlatformCaptureCalled);
+
+ pointer.Capture(null, CaptureSource.Implicit);
+ pointer.Capture(null, CaptureSource.Explicit);
+ Assert.True(sources.SequenceEqual([CaptureSource.Implicit, CaptureSource.Explicit, CaptureSource.Implicit, CaptureSource.Explicit]));
+
+ Assert.Equal(2, pointer.PlatformCaptureCalled);
+ }
}
}
diff --git a/tests/Avalonia.Base.UnitTests/Rendering/CompositorInvalidationClippingTests.cs b/tests/Avalonia.Base.UnitTests/Rendering/CompositorInvalidationClippingTests.cs
index c158ff4e75..78a3d3e5bc 100644
--- a/tests/Avalonia.Base.UnitTests/Rendering/CompositorInvalidationClippingTests.cs
+++ b/tests/Avalonia.Base.UnitTests/Rendering/CompositorInvalidationClippingTests.cs
@@ -8,35 +8,35 @@ namespace Avalonia.Base.UnitTests.Rendering;
///
public class CompositorInvalidationClippingTests : CompositorTestsBase
{
- [Fact]
- // Test case: When the ClipToBounds is false, all visuals should be rendered
- public void Siblings_Should_Be_Rendered_On_Invalidate_Without_ClipToBounds()
+ int CountVisuals(Visual visual)
{
- AssertRenderedVisuals(clipToBounds: false, clipGeometry: false, expectedRenderedVisualsCount: 4);
+ int count = 1; // Count the current visual
+ foreach (var child in visual.VisualChildren) count += CountVisuals(child);
+ return count;
}
-
- [Fact]
- // Test case: When the ClipToBounds is true, only visuals within the clipped boundary should be rendered
- public void Siblings_Should_Not_Be_Rendered_On_Invalidate_With_ClipToBounds()
- {
- AssertRenderedVisuals(clipToBounds: true, clipGeometry: false, expectedRenderedVisualsCount: 3);
- }
-
- [Fact]
- // Test case: When the Clip is used, only visuals within the clip geometry should be rendered
- public void Siblings_Should_Not_Be_Rendered_On_Invalidate_With_Clip()
- {
- AssertRenderedVisuals(clipToBounds: false, clipGeometry: true, expectedRenderedVisualsCount: 3);
- }
-
- private void AssertRenderedVisuals(bool clipToBounds, bool clipGeometry, int expectedRenderedVisualsCount)
+
+ [Theory,
+ // If canvas itself has no background, the second render won't draw any visuals at all, since
+ // root visual's subtree bounds will exactly match the second visual
+ InlineData(false, false, false, 1, 0),
+ InlineData(true, false, false, 1, 0),
+ InlineData(false, true, false, 1, 0),
+ // If canvas has background, the second render will draw only the canvas visual itself
+ InlineData(false, false, true, 5, 4),
+ InlineData(true, false, true,5, 4),
+ InlineData(false, true, true, 5, 4),
+ ]
+ public void Do_Not_Re_Render_Unaffected_Visual_Trees(bool clipToBounds, bool clipGeometry,
+ bool canvasHasContent,
+ int expectedVisitedVisualsCount, int expectedRenderedVisualsCount)
{
using (var s = new CompositorCanvas())
{
- //#1 visual is top level
- //#2 visual is s.Canvas
+ // #1 visual is top level
+ // #2 is ContentPresenter
+ // #3 visual is s.Canvas
- //#3 visual is border1
+ //# 4 visual is border1
s.Canvas.Children.Add(new Border()
{
[Canvas.LeftProperty] = 0, [Canvas.TopProperty] = 0,
@@ -46,7 +46,7 @@ public class CompositorInvalidationClippingTests : CompositorTestsBase
Clip = clipGeometry ? new RectangleGeometry(new Rect(new Size(20, 10))) : null
});
- //#4 visual is border2
+ //# 5 visual is border2
s.Canvas.Children.Add(new Border()
{
[Canvas.LeftProperty] = 30, [Canvas.TopProperty] = 50,
@@ -55,14 +55,18 @@ public class CompositorInvalidationClippingTests : CompositorTestsBase
ClipToBounds = clipToBounds,
Clip = clipGeometry ? new RectangleGeometry(new Rect(new Size(20, 10))) : null
});
+ if (canvasHasContent)
+ s.Canvas.Background = Brushes.Green;
s.RunJobs();
s.Events.Reset();
+ if (CountVisuals(s.TopLevel) != 5)
+ Assert.Fail("Layout part of the test is broken, expected 5 visuals in the tree");
//invalidate border1
s.Canvas.Children[0].IsVisible = false;
s.RunJobs();
- s.AssertRenderedVisuals(expectedRenderedVisualsCount);
+ s.AssertRenderedVisuals(expectedVisitedVisualsCount, expectedRenderedVisualsCount);
}
}
}
diff --git a/tests/Avalonia.Base.UnitTests/Styling/SetterTests.cs b/tests/Avalonia.Base.UnitTests/Styling/SetterTests.cs
index 0551fa5bc4..7eb2550e52 100644
--- a/tests/Avalonia.Base.UnitTests/Styling/SetterTests.cs
+++ b/tests/Avalonia.Base.UnitTests/Styling/SetterTests.cs
@@ -143,8 +143,9 @@ namespace Avalonia.Base.UnitTests.Styling
Classes = { "foo" },
};
- var binding = new Binding("Name", BindingMode.OneWay)
+ var binding = new Binding("Name")
{
+ Mode = BindingMode.OneWay,
Converter = new TestConverter(),
RelativeSource = new RelativeSource(RelativeSourceMode.Self),
};
diff --git a/tests/Avalonia.Base.UnitTests/VisualExtensionsTests.cs b/tests/Avalonia.Base.UnitTests/VisualExtensionsTests.cs
index 4863c0fa61..270702f178 100644
--- a/tests/Avalonia.Base.UnitTests/VisualExtensionsTests.cs
+++ b/tests/Avalonia.Base.UnitTests/VisualExtensionsTests.cs
@@ -22,6 +22,23 @@ namespace Avalonia.Base.UnitTests
Assert.Equal(root, target.FindAncestorOfType());
}
+ [Fact]
+ public void FindAncestorOfType_Finds_Visible_Parent()
+ {
+ StackPanel target;
+
+ var root = new TestRoot
+ {
+ Child = new TestRoot
+ {
+ Child = target = new StackPanel(),
+ IsVisible = false
+ }
+ };
+
+ Assert.Equal(root, target.FindAncestorOfType(false, v => v.IsVisible));
+ }
+
[Fact]
public void FindAncestorOfType_Finds_Ancestor_Of_Nested_Child()
{
@@ -85,6 +102,32 @@ namespace Avalonia.Base.UnitTests
Assert.Equal(target, root.FindDescendantOfType
diff --git a/tests/Avalonia.Generators.Tests/Views/ControlWithoutWindow.xml b/tests/Avalonia.Generators.Tests/Views/ControlWithoutWindow.xml
index 485fe93e4c..54e7f156e1 100644
--- a/tests/Avalonia.Generators.Tests/Views/ControlWithoutWindow.xml
+++ b/tests/Avalonia.Generators.Tests/Views/ControlWithoutWindow.xml
@@ -3,6 +3,6 @@
x:Class="Sample.App.ControlWithoutWindow"
Design.Width="300">
+ Placeholder="Username input"
+ UseFloatingPlaceholder="True" />
diff --git a/tests/Avalonia.Generators.Tests/Views/DataTemplates.xml b/tests/Avalonia.Generators.Tests/Views/DataTemplates.xml
index f7e15644aa..c4d587baf2 100644
--- a/tests/Avalonia.Generators.Tests/Views/DataTemplates.xml
+++ b/tests/Avalonia.Generators.Tests/Views/DataTemplates.xml
@@ -3,14 +3,14 @@
x:Class="Sample.App.DataTemplates">
+ Placeholder="Username input"
+ UseFloatingPlaceholder="True" />
+ Placeholder="Templated input"
+ UseFloatingPlaceholder="True" />
diff --git a/tests/Avalonia.Generators.Tests/Views/FieldModifier.xml b/tests/Avalonia.Generators.Tests/Views/FieldModifier.xml
index 3ee5e51466..65fafb414e 100644
--- a/tests/Avalonia.Generators.Tests/Views/FieldModifier.xml
+++ b/tests/Avalonia.Generators.Tests/Views/FieldModifier.xml
@@ -4,20 +4,20 @@
+ Placeholder="Username input"
+ UseFloatingPlaceholder="True" />
+ Placeholder="Username input"
+ UseFloatingPlaceholder="True" />
+ Placeholder="Password input"
+ UseFloatingPlaceholder="True" />
+ Placeholder="Password input"
+ UseFloatingPlaceholder="True" />
diff --git a/tests/Avalonia.Generators.Tests/Views/NamedControl.xml b/tests/Avalonia.Generators.Tests/Views/NamedControl.xml
index 0a3c3d3111..44aa833f3b 100644
--- a/tests/Avalonia.Generators.Tests/Views/NamedControl.xml
+++ b/tests/Avalonia.Generators.Tests/Views/NamedControl.xml
@@ -3,6 +3,6 @@
x:Class="Sample.App.NamedControl">
+ Placeholder="Username input"
+ UseFloatingPlaceholder="True" />
diff --git a/tests/Avalonia.Generators.Tests/Views/NamedControls.xml b/tests/Avalonia.Generators.Tests/Views/NamedControls.xml
index 6083ec794c..fb8d7c4c95 100644
--- a/tests/Avalonia.Generators.Tests/Views/NamedControls.xml
+++ b/tests/Avalonia.Generators.Tests/Views/NamedControls.xml
@@ -3,11 +3,11 @@
x:Class="Sample.App.NamedControls">
+ Placeholder="Username input"
+ UseFloatingPlaceholder="True" />
+ Placeholder="Password input"
+ UseFloatingPlaceholder="True" />
diff --git a/tests/Avalonia.Generators.Tests/Views/NoNamedControls.xml b/tests/Avalonia.Generators.Tests/Views/NoNamedControls.xml
index 751d1574c8..3e9ba157fb 100644
--- a/tests/Avalonia.Generators.Tests/Views/NoNamedControls.xml
+++ b/tests/Avalonia.Generators.Tests/Views/NoNamedControls.xml
@@ -1,6 +1,6 @@
-
+
\ No newline at end of file
diff --git a/tests/Avalonia.Generators.Tests/Views/SignUpView.xml b/tests/Avalonia.Generators.Tests/Views/SignUpView.xml
index a482e1fc5e..128fd0e260 100644
--- a/tests/Avalonia.Generators.Tests/Views/SignUpView.xml
+++ b/tests/Avalonia.Generators.Tests/Views/SignUpView.xml
@@ -5,15 +5,15 @@
+ Placeholder="Please, enter user name..."
+ UseFloatingPlaceholder="True" />
+ Placeholder="Username input"
+ UseFloatingPlaceholder="True" />
diff --git a/tests/Avalonia.Generators.Tests/Views/xNamedControls.xml b/tests/Avalonia.Generators.Tests/Views/xNamedControls.xml
index 00eec9b969..bd9bcccdec 100644
--- a/tests/Avalonia.Generators.Tests/Views/xNamedControls.xml
+++ b/tests/Avalonia.Generators.Tests/Views/xNamedControls.xml
@@ -3,11 +3,11 @@
x:Class="Sample.App.xNamedControls">
+ Placeholder="Username input"
+ UseFloatingPlaceholder="True" />
+ Placeholder="Password input"
+ UseFloatingPlaceholder="True" />
diff --git a/tests/Avalonia.Headless.NUnit.PerAssembly.UnitTests/Avalonia.Headless.NUnit.PerAssembly.UnitTests.csproj b/tests/Avalonia.Headless.NUnit.PerAssembly.UnitTests/Avalonia.Headless.NUnit.PerAssembly.UnitTests.csproj
index a701fcefe8..2a2ad17626 100644
--- a/tests/Avalonia.Headless.NUnit.PerAssembly.UnitTests/Avalonia.Headless.NUnit.PerAssembly.UnitTests.csproj
+++ b/tests/Avalonia.Headless.NUnit.PerAssembly.UnitTests/Avalonia.Headless.NUnit.PerAssembly.UnitTests.csproj
@@ -15,7 +15,8 @@
-
+
+
diff --git a/tests/Avalonia.Headless.NUnit.PerTest.UnitTests/Avalonia.Headless.NUnit.PerTest.UnitTests.csproj b/tests/Avalonia.Headless.NUnit.PerTest.UnitTests/Avalonia.Headless.NUnit.PerTest.UnitTests.csproj
index a701fcefe8..2a2ad17626 100644
--- a/tests/Avalonia.Headless.NUnit.PerTest.UnitTests/Avalonia.Headless.NUnit.PerTest.UnitTests.csproj
+++ b/tests/Avalonia.Headless.NUnit.PerTest.UnitTests/Avalonia.Headless.NUnit.PerTest.UnitTests.csproj
@@ -15,7 +15,8 @@
-
+
+
diff --git a/tests/Avalonia.Headless.UnitTests/AsyncSetupTests.cs b/tests/Avalonia.Headless.UnitTests/AsyncSetupTests.cs
new file mode 100644
index 0000000000..3f23d661ed
--- /dev/null
+++ b/tests/Avalonia.Headless.UnitTests/AsyncSetupTests.cs
@@ -0,0 +1,32 @@
+#if NUNIT
+
+using System.Threading.Tasks;
+
+namespace Avalonia.Headless.UnitTests;
+
+public class AsyncSetupTests
+{
+ private static int s_instanceCount;
+
+ [SetUp]
+ public async Task SetUp()
+ {
+ await Task.Delay(100);
+ ++s_instanceCount;
+ }
+
+ [AvaloniaTest, TestCase(1), TestCase(2)]
+ public void Async_Setup_TearDown_Should_Work(int index)
+ {
+ AssertHelper.Equal(1, s_instanceCount);
+ }
+
+ [TearDown]
+ public async Task TearDown()
+ {
+ await Task.Delay(100);
+ --s_instanceCount;
+ }
+}
+
+#endif
diff --git a/tests/Avalonia.Headless.UnitTests/SetupTests.cs b/tests/Avalonia.Headless.UnitTests/SetupTests.cs
new file mode 100644
index 0000000000..77f8d25842
--- /dev/null
+++ b/tests/Avalonia.Headless.UnitTests/SetupTests.cs
@@ -0,0 +1,45 @@
+using System;
+
+namespace Avalonia.Headless.UnitTests;
+
+public class SetupTests
+#if XUNIT
+ : IDisposable
+#endif
+{
+ private static int s_instanceCount;
+
+#if NUNIT
+ [SetUp]
+ public void SetUp()
+#elif XUNIT
+ public SetupTests()
+#endif
+ {
+ ++s_instanceCount;
+ }
+
+#if NUNIT
+ [AvaloniaTest, TestCase(1), TestCase(2)]
+#elif XUNIT
+ [AvaloniaTheory, InlineData(1), InlineData(2)]
+ [System.Diagnostics.CodeAnalysis.UnconditionalSuppressMessage(
+ "Usage",
+ "xUnit1026:Theory methods should use all of their parameters",
+ Justification = "Used to run the test several times")]
+#endif
+ public void Setup_TearDown_Should_Work(int index)
+ {
+ AssertHelper.Equal(1, s_instanceCount);
+ }
+
+#if NUNIT
+ [TearDown]
+ public void TearDown()
+#elif XUNIT
+ public void Dispose()
+#endif
+ {
+ --s_instanceCount;
+ }
+}
diff --git a/tests/Avalonia.LeakTests/BindingExpressionExtensions.cs b/tests/Avalonia.LeakTests/BindingExpressionExtensions.cs
new file mode 100644
index 0000000000..98ec67e31b
--- /dev/null
+++ b/tests/Avalonia.LeakTests/BindingExpressionExtensions.cs
@@ -0,0 +1,56 @@
+using System;
+using System.Collections.Generic;
+using System.Diagnostics.CodeAnalysis;
+using System.Globalization;
+using System.Linq.Expressions;
+using Avalonia.Data;
+using Avalonia.Data.Converters;
+using Avalonia.Data.Core;
+using Avalonia.Data.Core.ExpressionNodes;
+using Avalonia.Data.Core.Parsers;
+using Avalonia.Utilities;
+
+namespace Avalonia.LeakTests;
+
+///
+/// Test extensions for creating BindingExpression instances from lambda expressions.
+///
+internal static class BindingExpressionExtensions
+{
+ [RequiresUnreferencedCode(TrimmingMessages.ExpressionNodeRequiresUnreferencedCodeMessage)]
+ [RequiresDynamicCode(TrimmingMessages.ExpressionNodeRequiresDynamicCodeMessage)]
+ public static BindingExpression CreateBindingExpression(
+ TIn source,
+ Expression> expression,
+ IValueConverter? converter = null,
+ CultureInfo? converterCulture = null,
+ object? converterParameter = null,
+ bool enableDataValidation = false,
+ Optional fallbackValue = default,
+ BindingMode mode = BindingMode.OneWay,
+ BindingPriority priority = BindingPriority.LocalValue,
+ object? targetNullValue = null,
+ bool allowReflection = true)
+ where TIn : class?
+ {
+ var path = BindingExpressionVisitor.BuildPath(expression);
+ var nodes = new List();
+ path.BuildExpression(nodes, out var _);
+ var fallback = fallbackValue.HasValue ? fallbackValue.Value : AvaloniaProperty.UnsetValue;
+
+ return new BindingExpression(
+ source,
+ nodes,
+ fallback,
+ converter: converter,
+ converterCulture: converterCulture,
+ converterParameter: converterParameter,
+ enableDataValidation: enableDataValidation,
+ mode: mode,
+ priority: priority,
+ targetNullValue: targetNullValue,
+ targetTypeConverter: allowReflection ?
+ TargetTypeConverter.GetReflectionConverter() :
+ TargetTypeConverter.GetDefaultConverter());
+ }
+}
diff --git a/tests/Avalonia.LeakTests/BindingExpressionTests.cs b/tests/Avalonia.LeakTests/BindingExpressionTests.cs
index 5a6eddc869..c5b38e209f 100644
--- a/tests/Avalonia.LeakTests/BindingExpressionTests.cs
+++ b/tests/Avalonia.LeakTests/BindingExpressionTests.cs
@@ -1,6 +1,10 @@
-using System;
+using System;
using System.Collections.Generic;
+using System.Globalization;
+using System.Linq.Expressions;
using Avalonia.Collections;
+using Avalonia.Data;
+using Avalonia.Data.Converters;
using Avalonia.Data.Core;
using Avalonia.UnitTests;
using Xunit;
@@ -16,7 +20,7 @@ namespace Avalonia.LeakTests
{
var list = new AvaloniaList { "foo", "bar" };
var source = new { Foo = list };
- var target = BindingExpression.Create(source, o => o.Foo);
+ var target = CreateBindingExpression(source, o => o.Foo);
target.ToObservable().Subscribe(_ => { });
return new WeakReference(list);
@@ -37,7 +41,7 @@ namespace Avalonia.LeakTests
{
var list = new AvaloniaList { "foo", "bar" };
var source = new { Foo = list };
- var target = BindingExpression.Create(source, o => o.Foo, enableDataValidation: true);
+ var target = CreateBindingExpression(source, o => o.Foo, enableDataValidation: true);
target.ToObservable().Subscribe(_ => { });
return new WeakReference(list);
@@ -58,7 +62,7 @@ namespace Avalonia.LeakTests
{
var indexer = new NonIntegerIndexer();
var source = new { Foo = indexer };
- var target = BindingExpression.Create(source, o => o.Foo);
+ var target = CreateBindingExpression(source, o => o.Foo);
target.ToObservable().Subscribe(_ => { });
return new WeakReference(indexer);
@@ -79,7 +83,7 @@ namespace Avalonia.LeakTests
{
var methodBound = new MethodBound();
var source = new { Foo = methodBound };
- var target = BindingExpression.Create(source, o => (Action)o.Foo.A);
+ var target = CreateBindingExpression(source, o => (Action)o.Foo.A);
target.ToObservable().Subscribe(_ => { });
return new WeakReference(methodBound);
}
@@ -92,6 +96,34 @@ namespace Avalonia.LeakTests
Assert.False(weakSource.IsAlive);
}
+ private static BindingExpression CreateBindingExpression(
+ TIn source,
+ Expression> expression,
+ IValueConverter? converter = null,
+ CultureInfo? converterCulture = null,
+ object? converterParameter = null,
+ bool enableDataValidation = false,
+ Optional fallbackValue = default,
+ BindingMode mode = BindingMode.OneWay,
+ BindingPriority priority = BindingPriority.LocalValue,
+ object? targetNullValue = null,
+ bool allowReflection = true)
+ where TIn : class?
+ {
+ return BindingExpressionExtensions.CreateBindingExpression(
+ source,
+ expression,
+ converter,
+ converterCulture,
+ converterParameter,
+ enableDataValidation,
+ fallbackValue,
+ mode,
+ priority,
+ targetNullValue,
+ allowReflection);
+ }
+
private class MethodBound
{
public void A() { }
diff --git a/tests/Avalonia.Markup.UnitTests/Data/BindingTests.cs b/tests/Avalonia.Markup.UnitTests/Data/BindingTests.cs
index 42dc681f7c..345c4c3b6d 100644
--- a/tests/Avalonia.Markup.UnitTests/Data/BindingTests.cs
+++ b/tests/Avalonia.Markup.UnitTests/Data/BindingTests.cs
@@ -544,8 +544,8 @@ namespace Avalonia.Markup.UnitTests.Data
var root = new Panel { Children = { target1, target2 } };
var source = new Source { Foo = "foo" };
- using (target1.Bind(TextBlock.TextProperty, new Binding("Foo", BindingMode.OneTime)))
- using (target2.Bind(TextBlock.TextProperty, new Binding("Foo", BindingMode.OneWayToSource)))
+ using (target1.Bind(TextBlock.TextProperty, new Binding("Foo") { Mode = BindingMode.OneTime }))
+ using (target2.Bind(TextBlock.TextProperty, new Binding("Foo") { Mode = BindingMode.OneWayToSource }))
{
root.DataContext = source;
}
@@ -643,8 +643,8 @@ namespace Avalonia.Markup.UnitTests.Data
Children = { target1, target2 }
};
- target1.Bind(TextBlock.TextProperty, new Binding("Foo", BindingMode.TwoWay));
- target2.Bind(TextBlock.TextProperty, new Binding("Foo", BindingMode.OneWayToSource));
+ target1.Bind(TextBlock.TextProperty, new Binding("Foo") { Mode = BindingMode.TwoWay });
+ target2.Bind(TextBlock.TextProperty, new Binding("Foo") { Mode = BindingMode.OneWayToSource });
Assert.Equal("OneWayToSource", source.Foo);
diff --git a/tests/Avalonia.Markup.UnitTests/Data/BindingTests_Delay.cs b/tests/Avalonia.Markup.UnitTests/Data/BindingTests_Delay.cs
index a73fbd7bb4..da649bc184 100644
--- a/tests/Avalonia.Markup.UnitTests/Data/BindingTests_Delay.cs
+++ b/tests/Avalonia.Markup.UnitTests/Data/BindingTests_Delay.cs
@@ -29,7 +29,11 @@ public class BindingTests_Delay : ScopedTestBase, IDisposable
_source = new BindingTests.Source { Foo = InitialFooValue };
_target = new TextBox { DataContext = _source };
- _binding = new Binding(nameof(_source.Foo), BindingMode.TwoWay) { Delay = DelayMilliseconds };
+ _binding = new Binding(nameof(_source.Foo))
+ {
+ Mode = BindingMode.TwoWay,
+ Delay = DelayMilliseconds
+ };
_bindingExpr = _target.Bind(TextBox.TextProperty, _binding);
@@ -120,7 +124,12 @@ public class BindingTests_Delay : ScopedTestBase, IDisposable
new TestRoot() { Child = new Panel() { Children = { _target, secondBox } } };
- _target.Bind(TextBox.TextProperty, new Binding(nameof(_source.Foo), BindingMode.TwoWay) { Delay = DelayMilliseconds, UpdateSourceTrigger = UpdateSourceTrigger.LostFocus });
+ _target.Bind(TextBox.TextProperty, new Binding(nameof(_source.Foo))
+ {
+ Mode = BindingMode.TwoWay,
+ Delay = DelayMilliseconds,
+ UpdateSourceTrigger = UpdateSourceTrigger.LostFocus
+ });
Assert.True(_target.Focus());
_target.Text = "bar";
@@ -134,7 +143,11 @@ public class BindingTests_Delay : ScopedTestBase, IDisposable
[Fact]
public void Delayed_Binding_OneWayToSource_DataContext_Change_Should_Update_Source_Immediately()
{
- _target.Bind(TextBlock.TextProperty, new Binding(nameof(_source.Foo), BindingMode.OneWayToSource) { Delay = DelayMilliseconds });
+ _target.Bind(TextBlock.TextProperty, new Binding(nameof(_source.Foo))
+ {
+ Mode = BindingMode.OneWayToSource,
+ Delay = DelayMilliseconds
+ });
_target.Text = "bar";
diff --git a/tests/Avalonia.Markup.UnitTests/Data/BindingTests_Self.cs b/tests/Avalonia.Markup.UnitTests/Data/BindingTests_Self.cs
index cd1e0cd0a2..5281993f1e 100644
--- a/tests/Avalonia.Markup.UnitTests/Data/BindingTests_Self.cs
+++ b/tests/Avalonia.Markup.UnitTests/Data/BindingTests_Self.cs
@@ -34,8 +34,9 @@ namespace Avalonia.Markup.UnitTests.Data
var target = new TextBlock
{
Tag = "Hello World!",
- [!TextBlock.TextProperty] = new Binding("Tag", BindingMode.TwoWay)
+ [!TextBlock.TextProperty] = new Binding("Tag")
{
+ Mode = BindingMode.TwoWay,
RelativeSource = new RelativeSource(RelativeSourceMode.Self)
},
};
diff --git a/tests/Avalonia.Markup.Xaml.UnitTests/Data/BindingTests.cs b/tests/Avalonia.Markup.Xaml.UnitTests/Data/BindingTests.cs
index 0cb587f849..03871d2c84 100644
--- a/tests/Avalonia.Markup.Xaml.UnitTests/Data/BindingTests.cs
+++ b/tests/Avalonia.Markup.Xaml.UnitTests/Data/BindingTests.cs
@@ -71,14 +71,14 @@ namespace Avalonia.Markup.Xaml.UnitTests.Data
-
+
-
+
diff --git a/tests/Avalonia.RenderTests/Controls/BorderTests.cs b/tests/Avalonia.RenderTests/Controls/BorderTests.cs
index 9e2f06ea6a..f7b1a7508f 100644
--- a/tests/Avalonia.RenderTests/Controls/BorderTests.cs
+++ b/tests/Avalonia.RenderTests/Controls/BorderTests.cs
@@ -424,5 +424,38 @@ namespace Avalonia.Skia.RenderTests
await RenderToFile(target);
CompareImages();
}
+
+ [Theory,
+ InlineData(true),
+ InlineData(false)]
+ public async Task Border_Clips_To_Round_Bounds(bool uniform)
+ {
+ var cornerRadius = uniform
+ ? new CornerRadius(20)
+ : new CornerRadius(20, 10, 30, 5);
+
+ Decorator target = new Decorator
+ {
+ Padding = new Thickness(8),
+ Width = 200,
+ Height = 200,
+ Child = new Border
+ {
+ CornerRadius = cornerRadius,
+ Background = Brushes.LightBlue,
+ ClipToBounds = true,
+ Child = new Border
+ {
+ Width = 300,
+ Height = 300,
+ Background = Brushes.Red,
+ }
+ }
+ };
+
+ var testSuffix = nameof(Border_Clips_To_Round_Bounds) + "_" + (uniform ? "Uniform" : "NonUniform");
+ await RenderToFile(target, testSuffix);
+ CompareImages(testSuffix);
+ }
}
}
diff --git a/tests/Avalonia.RenderTests/Controls/TextBoxTests.cs b/tests/Avalonia.RenderTests/Controls/TextBoxTests.cs
new file mode 100644
index 0000000000..8047f2d103
--- /dev/null
+++ b/tests/Avalonia.RenderTests/Controls/TextBoxTests.cs
@@ -0,0 +1,135 @@
+using System.Threading.Tasks;
+using Avalonia.Controls;
+using Avalonia.Controls.Presenters;
+using Avalonia.Controls.Templates;
+using Avalonia.Layout;
+using Avalonia.Media;
+using Xunit;
+
+namespace Avalonia.Skia.RenderTests
+{
+ public class TextBoxTests : TestBase
+ {
+ public TextBoxTests()
+ : base(@"Controls\TextBox")
+ {
+ }
+
+ private static IControlTemplate CreateTextBoxTemplate()
+ {
+ return new FuncControlTemplate((textBox, scope) =>
+ {
+ var border = new Border
+ {
+ Background = textBox.Background,
+ BorderBrush = Brushes.Gray,
+ BorderThickness = new Thickness(1),
+ Padding = new Thickness(4),
+ };
+
+ var panel = new Panel();
+
+ // Use Antialias mode
+ TextOptions.SetTextRenderingMode(panel, TextRenderingMode.Antialias);
+
+ var placeholder = new TextBlock
+ {
+ Name = "PART_Placeholder",
+ [!TextBlock.TextProperty] = textBox[!TextBox.PlaceholderTextProperty],
+ [!TextBlock.ForegroundProperty] = textBox[!TextBox.PlaceholderForegroundProperty],
+ FontFamily = textBox.FontFamily,
+ FontSize = textBox.FontSize,
+ VerticalAlignment = VerticalAlignment.Center,
+ Opacity = 0.5,
+ }.RegisterInNameScope(scope);
+
+ var presenter = new TextPresenter
+ {
+ Name = "PART_TextPresenter",
+ [!TextPresenter.TextProperty] = textBox[!TextBox.TextProperty],
+ [!TextPresenter.CaretIndexProperty] = textBox[!TextBox.CaretIndexProperty],
+ FontFamily = textBox.FontFamily,
+ FontSize = textBox.FontSize,
+ }.RegisterInNameScope(scope);
+
+ panel.Children.Add(placeholder);
+ panel.Children.Add(presenter);
+ border.Child = panel;
+
+ return border;
+ });
+ }
+
+ [Fact]
+ public async Task Placeholder_With_Red_Foreground()
+ {
+ var target = new Border
+ {
+ Padding = new Thickness(8),
+ Width = 200,
+ Height = 50,
+ Background = Brushes.White,
+ Child = new TextBox
+ {
+ Template = CreateTextBoxTemplate(),
+ FontFamily = TestFontFamily,
+ FontSize = 12,
+ Background = Brushes.White,
+ PlaceholderText = "Red placeholder",
+ PlaceholderForeground = Brushes.Red,
+ }
+ };
+
+ await RenderToFile(target);
+ CompareImages();
+ }
+
+ [Fact]
+ public async Task Placeholder_With_Blue_Foreground()
+ {
+ var target = new Border
+ {
+ Padding = new Thickness(8),
+ Width = 200,
+ Height = 50,
+ Background = Brushes.White,
+ Child = new TextBox
+ {
+ Template = CreateTextBoxTemplate(),
+ FontFamily = TestFontFamily,
+ FontSize = 12,
+ Background = Brushes.White,
+ PlaceholderText = "Blue placeholder",
+ PlaceholderForeground = Brushes.Blue,
+ }
+ };
+
+ await RenderToFile(target);
+ CompareImages();
+ }
+
+ [Fact]
+ public async Task Placeholder_With_Default_Foreground()
+ {
+ var target = new Border
+ {
+ Padding = new Thickness(8),
+ Width = 200,
+ Height = 50,
+ Background = Brushes.White,
+ Child = new TextBox
+ {
+ Template = CreateTextBoxTemplate(),
+ FontFamily = TestFontFamily,
+ FontSize = 12,
+ Background = Brushes.White,
+ PlaceholderText = "Default placeholder",
+ PlaceholderForeground = Brushes.Gray,
+ }
+ };
+
+ await RenderToFile(target);
+ CompareImages();
+ }
+ }
+}
diff --git a/tests/Avalonia.RenderTests/OpacityMaskTests.cs b/tests/Avalonia.RenderTests/OpacityMaskTests.cs
index a9348e3512..ea639333f9 100644
--- a/tests/Avalonia.RenderTests/OpacityMaskTests.cs
+++ b/tests/Avalonia.RenderTests/OpacityMaskTests.cs
@@ -33,6 +33,7 @@ namespace Avalonia.Skia.RenderTests
},
Width = 76,
Height = 76,
+ Background = Brushes.Transparent,
Children =
{
new Path
@@ -70,6 +71,7 @@ namespace Avalonia.Skia.RenderTests
RenderTransform = new RotateTransform(90),
Width = 76,
Height = 76,
+ Background = Brushes.Transparent,
Children =
{
new Path
diff --git a/tests/Avalonia.UnitTests/CompositorTestServices.cs b/tests/Avalonia.UnitTests/CompositorTestServices.cs
index 96b3248ed1..e227b9622b 100644
--- a/tests/Avalonia.UnitTests/CompositorTestServices.cs
+++ b/tests/Avalonia.UnitTests/CompositorTestServices.cs
@@ -88,10 +88,11 @@ public class CompositorTestServices : IDisposable
Events.Rects.Clear();
}
- public void AssertRenderedVisuals(int renderVisuals)
+ public void AssertRenderedVisuals(int visitedVisuals, int renderVisuals)
{
RunJobs();
- Assert.Equal(Events.RenderedVisuals, renderVisuals);
+ Assert.Equal(visitedVisuals, Events.VisitedVisuals);
+ Assert.Equal(renderVisuals, Events.RenderedVisuals);
Events.Rects.Clear();
}
@@ -116,22 +117,20 @@ public class CompositorTestServices : IDisposable
{
public List Rects = new();
- public int RenderedVisuals { get; private set; }
+ public int RenderedVisuals { get; set; }
+ public int VisitedVisuals { get; set; }
- public void IncrementRenderedVisuals()
- {
- RenderedVisuals++;
- }
- public void RectInvalidated(Rect rc)
+ public void RectInvalidated(LtrbRect rc)
{
- Rects.Add(rc);
+ Rects.Add(rc.ToRect());
}
public void Reset()
{
Rects.Clear();
RenderedVisuals = 0;
+ VisitedVisuals = 0;
}
}
diff --git a/tests/Avalonia.UnitTests/MockWindowingPlatform.cs b/tests/Avalonia.UnitTests/MockWindowingPlatform.cs
index 9ddcb217ec..024d198967 100644
--- a/tests/Avalonia.UnitTests/MockWindowingPlatform.cs
+++ b/tests/Avalonia.UnitTests/MockWindowingPlatform.cs
@@ -162,5 +162,8 @@ namespace Avalonia.UnitTests
{
return null;
}
+
+ public void GetWindowsZOrder(ReadOnlySpan windows, Span zOrder)
+ => zOrder.Clear();
}
}
diff --git a/tests/TestFiles/Skia/Composition/DirectFb/Should_Only_Update_Clipped_Rects_When_Retained_Fb_Is_Advertised_advertized-True_updated.expected.png b/tests/TestFiles/Skia/Composition/DirectFb/Should_Only_Update_Clipped_Rects_When_Retained_Fb_Is_Advertised_advertized-True_updated.expected.png
index 96fbb171c9..9f616b4724 100644
Binary files a/tests/TestFiles/Skia/Composition/DirectFb/Should_Only_Update_Clipped_Rects_When_Retained_Fb_Is_Advertised_advertized-True_updated.expected.png and b/tests/TestFiles/Skia/Composition/DirectFb/Should_Only_Update_Clipped_Rects_When_Retained_Fb_Is_Advertised_advertized-True_updated.expected.png differ
diff --git a/tests/TestFiles/Skia/Controls/Border/Border_Clips_To_Round_Bounds_NonUniform.expected.png b/tests/TestFiles/Skia/Controls/Border/Border_Clips_To_Round_Bounds_NonUniform.expected.png
new file mode 100644
index 0000000000..e04a3e07bd
Binary files /dev/null and b/tests/TestFiles/Skia/Controls/Border/Border_Clips_To_Round_Bounds_NonUniform.expected.png differ
diff --git a/tests/TestFiles/Skia/Controls/Border/Border_Clips_To_Round_Bounds_Uniform.expected.png b/tests/TestFiles/Skia/Controls/Border/Border_Clips_To_Round_Bounds_Uniform.expected.png
new file mode 100644
index 0000000000..faec852614
Binary files /dev/null and b/tests/TestFiles/Skia/Controls/Border/Border_Clips_To_Round_Bounds_Uniform.expected.png differ
diff --git a/tests/TestFiles/Skia/Controls/TextBox/Placeholder_With_Blue_Foreground.expected.png b/tests/TestFiles/Skia/Controls/TextBox/Placeholder_With_Blue_Foreground.expected.png
new file mode 100644
index 0000000000..d2262f7e52
Binary files /dev/null and b/tests/TestFiles/Skia/Controls/TextBox/Placeholder_With_Blue_Foreground.expected.png differ
diff --git a/tests/TestFiles/Skia/Controls/TextBox/Placeholder_With_Default_Foreground.expected.png b/tests/TestFiles/Skia/Controls/TextBox/Placeholder_With_Default_Foreground.expected.png
new file mode 100644
index 0000000000..770ff257b4
Binary files /dev/null and b/tests/TestFiles/Skia/Controls/TextBox/Placeholder_With_Default_Foreground.expected.png differ
diff --git a/tests/TestFiles/Skia/Controls/TextBox/Placeholder_With_Red_Foreground.expected.png b/tests/TestFiles/Skia/Controls/TextBox/Placeholder_With_Red_Foreground.expected.png
new file mode 100644
index 0000000000..4d2bc5d78b
Binary files /dev/null and b/tests/TestFiles/Skia/Controls/TextBox/Placeholder_With_Red_Foreground.expected.png differ