5.2.80
We are proud to announce the .NET ecosystem’s first and only true Single Project solution, empowering developers with a unified approach across all 9 platform targets, spanning mobile, web, desktop, and embedded apps. This genuine Single Project approach simplifies development, accelerates build times, and facilitates platform-specific development, enhancing your productivity and efficiency.
In addition, the 5.2 release also adds:
• Enhanced Skia renderers, with X11 and macOS support for greater performance benefits and simplicity
• Our highly requested multi-window support
• Improvements to Uno.SDK by introducing Uno.SDK Features
• .NET 9 Preview support
This release is our biggest yet, with a record-breaking 2400+ commits—900 more than our last. It was a massive team effort, and we can’t wait for you to experience the improvements and enjoy a smoother, more productive development workflow.
See our blog post for the full announcement.
Community shout Out
Several community members contributed PRs to this release:
- Documentation updates by @mcNets, @gevart and @SimonCropp
- A Gtk update for background window color by @lindexi
- A Geometry render fix for Skia targets by @lindexi
- The ability to access android Intent for android pickers by @jp-weber
- Updates for SystemFocusVisual positioning by @TopProgrammer77
- Performance updates by @SimonCropp
Thanks for your contributions!
See below for the full changelog of this release!
Features
- add NativeOverlappedPresenter support for macOS/Skia host (ffd1bec)
- adding implicit namespaces (e10ffe3)
- adding implicit packages (e77cc64)
- adding support for AOT Generation (772e702)
- adding support for MacOS and X11 from Skia TFM (284da47)
- adding support for Single Project (3a85523)
- Adjust automatic profile selection (d1771aa)
- Allow freezing of TemplatedParent (6308a3c)
- enable skia target framework (7e6147d)
- Ensure that uno.sdk winappsdk apps include all Assets by default (a607d1b)
- Filter unsupported TargetFrameworks based on current OS (5bfc7de)
- handle more macOS cursors (0333a70)
- INativeOverlappedPresenter X11 implementation (acd6433)
- InteractionTracker pointer wheel support (5769d1e)
- more complete file/folder pickers for macOS/skia (8bf1f41)
- Port ScrollView (da22a4c)
- Provide Intent access for Android pickers (14d4923)
- provide override to disable default UnoResizetizer Items (aaf452e)
- Support for TeachingTip control (97e7b29)
- Support ternary operator and relational operators in ExpressionAnimation (927fed4)
- Update API surface to WinAppSdk 1.4 (7070d86)
- Update to WindowsAppSDK 1.5 (deb86f0)
- composition: IGraphicsEffectD2D1Interop + GraphicsEffectPropertyMapping + EffectType + EffectHelpers (aa7c067)
- composition: Implement AcrylicBrush! (2ec862b)
- composition: Implement AlphaMaskEffect and SaturationEffect + Samples + Refactor (aefc389)
- composition: Implement BlendEffect, CompositeEffect, ColorSourceEffect, and OpacityEffect + Samples (4bf9313)
- composition: Implement ColorMatrixEffect + Sample + Performance improvements (2f4b39d)
- composition: Implement CompositionBackdropBrush (260ebeb)
- composition: Implement ContrastEffect (+ Sample) and ArithmeticCompositeEffect (faf0efd)
- composition: Implement CrossFadeEffect + Sample (c290e67)
- composition: Implement DistantDiffuseEffect + Sample (6a153b5)
- composition: Implement DistantSpecularEffect and SpotDiffuseEffect + Samples (be859be)
- composition: Implement ExposureEffect + Sample (85b301b)
- composition: Implement GammaTransferEffect + Sample (57bcce9)
- composition: Implement grayscale effect + sample (2273c1f)
- composition: Implement HueRotationEffect and TintEffect + Samples (1b3e7e3)
- composition: Implement invert effect (82b8084)
- composition: Implement LuminanceToAlphaEffect and LinearTransferEffect + Samples (3f976ba)
- composition: Implement property listener/updater for the AcrylicBrush + Refactor (81146cb)
- composition: Implement SpotSpecularEffect, PointDiffuseEffect, and PointSpecularEffect + Samples (f53b239)
- composition: Implement TemperatureAndTintEffect + Sample (93643a3)
- composition: Implement Transform2DEffect, BorderEffect, and SepiaEffect + Samples (429bf99)
- composition: Implement WhiteNoiseEffect + Sample + Win2D + Refactor (3dc1fc2)
- composition: Initial work on Composition effects (757dd57)
- composition: More work on Composition effects + working sample (545004e)
- composition: re-add ArithmeticCompositeEffect + Docs (a668ad0)
- Add a simple XAML Playground sample (a4c145a)
- Add AppWindowChangedEventArgs (8408032)
- Add AppWindowPresenter (2485330)
- Add manual tests only filter to Samples app (1ed1e44)
- Add Microsoft.UI.Windowing enums (e0c850b)
- add multi-window support for macOS/skia (96f4bbf)
- Add Skia generic builder (160613b)
- add support for file pickers in X11 (c6470ae)
- Add support for PHPicker on iOS (f0e364b)
- add support for saving files in X11 (d0f78d5)
- add text-based clipboard for macos/skia (7820457)
- adding implicit packages (95c3202)
- adding manifest defaults for WinUI (3a86796)
- adding support for AOT Generation (a93d4d5)
- adding support for MacOS and X11 from Skia TFM (4604354)
- adding support for Single Project (6dcabfa)
- Allow XAML generator to generate Window types (03ce2fe)
- automatically load Directory.Build.props & solution-config.props (8ae433e)
- Basic support for AppWindowPresenters in Android (f907b76)
- Basic support for AppWindowPresenters in iOS (9f93bb1)
- Basic support for AppWindowPresenters in macOS (ac121fd)
- Basic support for AppWindowPresenters in WASM (7361828)
- DisplayInformation per window (b77ce8e)
- DisplayInformationExtension per window (55b0d78)
- enable skia target framework (4ecd345)
- Enable Window enumeration (f155c3a)
- FullScreenPresenter and basic OverlappedPresenter support on GTK (abf7212)
- Implement CompositionAnimation.SetScalarParameter (445b5a3)
- implement UIElement.ProtectedCursor (66224e2)
- InteractionTracker (425d528)
- MacOS/Skia Software-based Renderer (0d238c4)
- Make playground the default sample, include shortcut (d086f51)
- Make the sample title selectable (cda8bd9)
- new skia target for the X Window System (X11) (7e2f586)
- Open new window button in samples app (7291585)
- Restore support for C# Hot Reload for XAML for mobile targets (1936fd3)
- Support accessing CompositionPropertySet in ExpressionAnimation (f16772b)
- Support Clamp in ExpressionAnimation (2ec9a2d)
- Support for AppWindow.Closing (3f8a977)
- Support for FullScreenPresenter (172fd3e)
- Support for touch/pen input in WPF (bb5b8c0)
- Support GestureSettings.ManipulationTranslateRails[X|Y] (d98d0c5)
- Support more types in expression animation binary operators (efa8d60)
- Support nested properties in ExpressionAnimation (cec4076)
- Support parameterless
CreateExpressionAnimation
(546e5d2) - WPF OverlappedPresenter support (f7aad84)
- macOS: remove GTK# / Gtk+ usage from macOS host (6a43ee5)
- macos/skia: add badge support (8a1e244)
- skia: Support
ElementCompositionPreview.SetIsTranslationEnabled
(e8a050d) - Unseal Window to allow for custom derived Window types (f64bf1b)
- XamlIslandRootCollection (aba7251)
Performance Improvements
- macOS: reduce memory usage of metal backend (be39e47)
- Avoid capturing lambdas for BindingPropertyHelper.Convert callsites (88e50a5)
- Avoid HashSet linear search (52fce06)
- Avoid interpreter transition in SetTargetValueSafe (744f6eb)
- Avoid LOH allocations in RenderTargetBitmap (a59e39f)
- Avoid screenshotting twice, and make sure to screenshot samples without a category (7574235)
- Avoid Task.Delay(500) in snapshot tests (ad728fb)
- Avoid using Loaded/Unloaded events that uses Delegate.Combine (2363bf7)
- Correct caching check for reverse enumerator (6c14c9d)
- Don't use Lazy for Wasm DisplayInformation (00a78ac)
- Early returns for inherited DP propagation (e421284)
- Improve Control focus performance (a2e1aab)
- leverage generic enum getvalues (80462b6)
- Make
_childrenBinable
lazy and avoid unnecessary insertions (67e809d) - Make AncestorsDictionary a struct (b8a9b0a)
- Misc Skia performance improvements (86f8e4a)
- Move Loaded/Unloaded to use OnLoaded/OnUnloaded to avoid delegate combine (50c1e6c)
- Move to non-generic cache keys for BindingPropertyHelper (ebee122)
- only create a new XImage when size changes in X11 software rendering (0cc80be)
- Reduce allocations in ShouldMirrorVisual (eb007ca)
- reduce layout invalidations when clearing children when there're none (55cce74)
- Reduce memory used by DependencyPropertyGenerator (326dcc4)
- Reduce TextBlock SelectionDetails allocations on Skia (2eebfd0)
- Update IsTextTrimmed lazily on WASM (0bca5fc)
- use CompositionTarget to only render a specific target (887201b)
- Use DP.UniqueId as its hash code (da53bec)
- Use GeneratedDependencyProperty for commonly read properties (99c97ba)
- combobox: Avoid materializing EditableText unnecessarily (cb728ac)
- samplesapp: Make sure RefreshContainerPage timers are stopped (ee59ded)
Bug Fixes
- add error code prefix to cSpell.json (c08aa9d)
- Add missing TitleBarHeightOption.Collapsed (ea9eb92)
- Add transitive dependency to Xamarin.AndroidX.SwipeRefreshLayout (eac71fc)
- adding empty lib resources for Windows10 targets (eab725a)
- Adjust condition for tf-specific VS debug build (ecfc8f2)
- Adjust environment name (1de4f68)
- Adjust framework filtering on implicit builds (5f40c06)
- Adjust global properties publication (260dd17)
- Adjust global usings suppression for HR (d7b74e6)
- Adjust HR interactions with wasm (d2c14b8)
- Adjust native mac binaries path for packaging (f34f030)
- Adjust not implemented for
PointerWheelChanged
(25bd6cb) - Adjust profile synch and reload on desktop TF selection (4fd1ffb)
- Adjust server project cross-targeted build (9d43812)
- Adjust startup project on forced reload (7043f3d)
- Adjust target framework order for window (a13e4f5)
- Adjust the use of EnableCoreMrtTooling in winappsdk libraries (6f3da83)
- Adjust vs build target framework filtering condition (c7aae14)
- Avoid closing non-light-dismissable flyouts on Window activation (223faac)
- Avoid NRE on WebView navigation (f142978)
- Avoid XAOBS001 in BindableMetadataGenerator (8bb9cf2)
- copy libUnoNativeMac.dylib into Sample.Skia.Generic app (6847d1a)
- Correct
OriginalSourceLocation
for templates (3bc5195) - Delay Flyout.Closed to handle edge case of reopening before closed fully (e3a3f6c)
- DevServer not included for non-runtime version of .NET (14d6b56)
- Disable C# HR on iOS/Catalyst, use XAML Reader instead (b4acaa0)
- do no execute platform code outside that platform (7cd6705)
- do no execute platform code outside that platform (f9221fa)
- Don't reorder TFMs if the uno vsix is not loaded (a8e576e)
- Don't specify a AppDesignerFolder for wasm (cf938d9)
- Don't specify Google Android Material with MAUI Embedding (4f111f9)
- duplicate condition attributes (388c245)
- duplicate condition attributes (2183956)
- Enable HW Accel over RDP for Skia Desktop (40e7807)
- ensure ContentDialog arrange respects visiblebounds (6f31bfb)
- Ensure duplicate usings are removed properly (c367000)
- Ensure XamlRoot is set for resource-loaded elements (8602231)
- explicit Measure calls should invalidate parents if DesiredSize changes (17220cd)
- Fix Julian CalendarView not working (afb379b)
- Fix pointer out not raised when element added above current element (604e67d)
- Fix StackVector not copying elements over when resizing (1e451ae)
- Fix System.Type handling with xmlns (22d6e69)
- fixing issue with Source Generator not recognizing Uno Head (f573aae)
- Grid Column, Row, ColumnSpan and RowSpan can affect Measure (d3dbd79)
- improve TextBlock selection chunking (582ceaf)
- Load and Unload framework elements from resources [Skia,Wasm,Android only] (9d2cab8)
- Make ExpressionAnimation.Expression non-nullable (90089e5)
- MessageDialog samples do not work (b280337)
- Move to rewrite the csproj until vs first-TFM issues are fixed (f6896de)
- ios: Adjust for duplicate gcparams (9838fa6)
- ListView: Fix possible null-ref in selection handling (89d757c)
- add android 30 check (a65e919)
- Add missing package icon (0e1547e)
- add new (missing) file (d2b48b2)
- Adjust CompositionObject.SetProperty equality (f6c5ddd)
- Adjust iOS min version for using hot reload (b088bbc)
- Adjust LayoutRound behavior (9064cf5)
- Avoid using unsupported PackageManger API on Android 33 and newer (7d51931)
- bring the newly focused element into view on tab (7c544aa)
- Call the correct base method on ComboBox (eddb848)
- complete macos/skia pointer/mouse support (90c6d32)
- Consider clip sub-properties as independent animation (4d07f7a)
- disable IDE0051 unused member (1ef2462)
- DropDownPreferredPlacement attached property is not working correctly (b5c11df)
- Emit UTF8 instead of UTF16 (791db33)
- Ensure DesiredPlacement and popup Offsets are taken into account in ComboBox (4eeb1db)
- Ensure license is recognized by GitHub (cdbf0c2)
- Ensure NavigationStarting is executed reliably on Android (72f03e2)
- Ensures that Uno projects enable intellisense even if no wasdk project is present (1e36266)
- Fix button disabled state being overwritten by TemplateBinding (042adef)
- Fix clipping changes not applying (b84cf4c)
- Fix DatePicker crashing and not having correct initial date (1035cb0)
- Fix elements being flagged IsOver=false when capturing pointer (eabfc27)
- fix hit testing on skia when Canvas.ZIndex is used with non-canvas panels (a47d65f)
- Fix missing pointer exit on FF when sibling overlaps an overflowing child (a46e2c2)
- Fix selector item incorrectly going to Normal visual state (a20bd17)
- Fix style application to consider only explicit style when applying default style (91c3c0b)
- fix syntax (cdcc349)
- Fix TreeView not selecting items properly (f6044a2)
- focus should not bring the focused element into view on WASM (8a9a760)
- Handle Animations precedence as in WinUI (00c6bfe)
- Handle interface in XamlFileGenerator.IsType (4e54abb)
- Handle nullable value types correctly in BindableTypeProvidersSourceGenerator (b8b580b)
- Include net7.0-windows as net8.0 to avoid nuget resolution issues (d8c0180)
- initialize visiblebounds earlier on android (74fc072)
- issue with libraries not getting correct resource path (941e81f)
- Make maui caps conditional to mobile targets (848e9ec)
- Make sure to filter ouut the exit event even if capture is done on a nested child (415a874)
- Native iOS Date and Time picker dialogs should follow application theme (aefbb92)
- NETSDK1206 (60782f5)
- NRE on
PickImageFromFile
cancellation (b2c6adf) - Only open ComboBox dropdown when it was previously pressed (ed25804)
- popups should call OnClosing before actually closing (85ced26)
- prevent invalid references when referenced by WinUI head (c8b52aa)
- prevent multiple loading of Skia and Wasm targets (e0d7c66)
- prevent multiple loading of Skia and Wasm targets (98d5f7e)
- Produce OriginalSourceLocation for top-level resource dictionaries (f9d67c3)
- Properly handle InsetClip (49ee933)
- properly lookup the Uno Version from the Manifest (ef2ace1)
- PropertyChanged subscriptions delayed heavily on WASM (73de5dd)
- Re-evaluate visual state setters on theme change (190c390)
- read gtk window height correctly on WSL (e2a680d)
- Reduce log level in framework sync (963f3e6)
- Reload project when going from/to browserwasm (179f0a6)
- Remove legacy singleproject when uno.sdk is present (03cf137)
- Remove removed project (a120dc9)
- removing wasm specific instruction fix When_ThemeChange test in ListViewBase. (42f6bce)
- removing Windows Framework References for desktop libraries (72b56e6)
- Run UnoAssetsGeneration at design time (9b99f96)
- scaling support for X11 (5ad3bdf)
- set unicode value on KeyEventArgs (0b8ed31)
- Skia packages are implicitly included in legacy Wasm head (efe4b83)
- Track startup projects to refresh the profile observer (189b802)
- Uno packages not included for non-runtime target (e6239ff)
- catalyst: FolderOpenPicker on UIThread (6d56f3a)
- catalyst: FolderPicker not returning (e57bcf3)
- catalyst: load required mono component for HR (9cb7937)
- combobox: Don't reset SelectedIndex when changing the itemsource (a3f227a)
- gtk: Fix issue where setting background color in OnLaunched is ineffective on Skia.Gtk platform (99a4e32)
- image: remove all image when iamge source changes (255e023)
- iOS: StorageFile information using PHPicker (ffba912)
- itemsRepeater: Fix an issue where IR might re-position first items if items below are significantly higher (08f9b15)
- macOS: enable code for badge notification (1826f69)
- macos/skia: avoid crashed when closing windows (72e296f)
- passwordbox: reveal button not working (17b8c82)
- pointers: Fix pointer exit not raised on wasm if intermediate element is larger than parent and not hit-testable (2b64bdb)
- selectoritem: dragging wouldn't work if the pointer was pressed near the edge of the item (4216e8c)
- prevent project building on macos (a39298a)
- Remove deprecated test (0acd6bc)
- URI launchers to use the Windows implementation on Windows and the Linux implementation on Linux (3faf589)
- Use UIDocumentPickerViewController if multiple files are picked (5f2a5d7)
- Warn if desktop tf is not first for WSL debugging (dbde71e)
- android: Fix NullReferenceException in ProgressBar for custom templates (fe56160)
- catalyst: FileOpenPicker not on UI Thread (e1ae085)
- catalyst: Launcher.LaunchUriAsync from not UI thread (7dbaebc)
- droid: FileOpenPicker to suggest native media app (ea949b1)
- iOS: MPE round to 1 decimal to keep it closer (993c3a9)
- iOS: MPE sizing loops (e6df6c3)
- mpe: hide video window on unload (66f3b4d)
- reg: Fix VirtualKey regression on Linux (5a6656c)
- repeater: Disable non supported animation (032f2f0)
- skia: Fix TransformToVisual and hit testing to consider Visual.Offset correctly (31c2e6f)
- textblock: fix selection when CRLF is present (1df808a)
- textblock: only open context menu on right tap when IsTextSelectionEnabled (670541f)
- textbox: bring TextBox into view on focus (70e2b52)
- textbox: fix numberpad inputs on WPF (dc82d52)
- textbox: only make cursor IBeam when inside ContentElement (6e3b268)
- [Catalyst] Ensure LottieVisualSource is transparent (3bb6494)
- [iOS] Avoid crash when content size is negative (c7c0acb)
- add MSIX project capabilities for non-SingleProject (8f51153)
- add relative link (8850f88)
- Adjust IDE Channel message serialization (7dfb90f)
- Adjust invariant mode for catalyst samples app (57b519b)
- allow TargetFramework to be set (eb636c9)
- Background image should not adjust area (84f8575)
- Build Maps and Foldable with NetPrevious (net7.0) only (2351284)
- Configure devserver log level, reduce verbosity (501c5be)
- correct call to getSkiaSharpDylib.sh script (950d660)
- Correctly dismiss and track native date and time picker flyouts (1fb0631)
- cursor always starting on IBeam on X11 (51a5b2c)
- Don't include uno binaries in netx.y-windows and uap builds (20daea2)
- Don't run PRI workaround for WinUI on the head project (cfc3a38)
- Ensure root visual roots are removed when content changes (0a70ba9)
- Fix CalendarDatePicker day item corner (b2f98b5)
- Fix CalendarView infinite loop (42049f1)
- fix formatting (b612edf)
- fix formatting (b23cc21)
- Fix navigation view back button styles (0589667)
- Fix RadialGradientBrush on Skia (1fcd30e)
- Fix SV HR tests (2f91c83)
- Fix TextBlock.Foreground LinearGradientBrush not taking exact text width (eda7468)
- Fix x:Bind cast when type is in default namespace (2633f47)
- fixes RuntimeIdentifiers issue on Windows (00ec3f1)
- Force disable template pooling for all platforms (6d92a5b)
- IDE0055 formatting error on CI builds (4d69ce4)
- Include HR element handlers on windows (C# markup only) (2ec7b0a)
- Include netstdref for net7.0 and net8.0 builds (0b552d9)
- Make it possible to retrieve instance of ApplicationView earlier (69718ef)
- make Visibility to Collapsed when parent element is null (b135467)
- metal rendering at 2x (retina) (c255973)
- Playground is not always loading correctly (ea2d134)
- Properly handle
{x:Null}
in an attached DP (d0f327e) - Setting EnableMsixTooling only on windows target (not class library) (6f4d718)
- Specify root mode for root assembly (dd35b12)
- x11 crashing when a scaled window icon is needed (766a94d)
- autosuggestbox: fix suggestion flyout not opening on user input using managed skia textbox (31ac2bc)
- FocusVisual: adjust the focusvisual position (747673d)
- gridview: fix header being placed in wrong orientation (a7bdeba)
- gtk: Align VirtualKey with WinUI (7ff5a48)
- hotreload: inverse Android and iOS/Catalyst versions (3744776)
- iOS: Multi FilePicker implementation (a2262ce)
- macos/skia: avoid crashed when closing windows (a897c0d)
- passwordbox: use a larger bullet glyph to match WinUI (eaded92)
- pointers: Make sure if pointer args is flagged as handled in PointerCaptureLost to not re-dispatch it for pointer exit. (31722e2)
- pointers: Make sure the PointerCapture is raised only once the up has reach the top of the visual tree on iOS (99312a9)
- popup: add a workaround to make popup focusable despite being not IsTabStop (ed3d300)
- reg: Fix regression which make test to fail on wasm (8d830c5)
- skia: Fix ineffective FillRule setting for StreamGeometry on Skia platform (8e249d6)
- textblock: adjust selection to account for surrogate pairs being 2 chars (8acee8b)
- textblock: clear selection on outside clicks, copy/paste and context menu for skia (8b45e45)
- textblock: make hold-and-drag-to-select work outside TextBlock bounds (fa86436)
- textbox: caret color should follow theme (ef9f036)
- textbox: don't change TextBlock selection when inside TextBox (763a898)
- textbox: stop infinite invalidations in TextBox on WPF (40aa49e)
- textbox: Use Command (not Ctrl) for macOS shorcuts (b0a6907)
- Implement IUnoKeyboardInputSource on FrameBuffer (e939007)
- import Project Capabilities (858421a)
- import targets (64e3d4a)
- Invalid TIMEPICKER_MINUTEINCREMENT_MAX (4a9b172)
- load XamlRoot RootElement in UnoIslands (a354c42)
- Move DatePicker cleanup from destructor to Unloaded (e8ced23)
- Native Android Date and Time picker dialogs should follow application theme (80dd424)
- only load capabilities from the Sdk (45d910f)
- output retina quality output on mac/skia software rendering (f8ec0c1)
- Remove SamplesApp.UWP references (b84e12d)
- resizetizer warning (0ae3867)
- resizetizer warning (e3555f8)
- Restore hot reload tests (ecb3add)
- Restore ui test buckets (51b5c90)
- skia textbox overlay not disappearing on unfocus when FeatureConfiguration changes (fcabb50)
- Swallow Style setter exceptions as in WinUI (e34b703)
- tell macOS we handled all keydown events (91f338b)
- Thumb does not prevent scroll (c95c00c)
- TimePickerFlyout is not visible if not opened from TimePicker (837332e)
- Updated StackPanel.Spacing handling (f8aacac)
- window icon in X11 (cd51cc5)
- Workaround CalendarView crash on negative time zones (ae5410b)
- WPF should honor IsAlwaysOnTop flag (214e665)
- textblock: clear selection on outside clicks, copy/paste and context menu for skia (f881e0c)
- textbox: fix BeforeTextChanging cancelling on Wpf (436eee1)
- textbox: shift-arrowkeys shouldn't change the offset of the text inside the ScrollViewer as long as the caret is in view (5620778)
Reverts
- "test: enable and fix Given_Launcher to run on skia" (b713966)