This 3.4 release is about adding support for WinUI controls, such as the hierarchical NavigationView, InfoBar, RadioButtons, ItemsRepeater and determinate ProgressRing. We are following the footsteps of the WinUI team to align more of the controls Uno provides with what is supported on Windows.
The combination of controls we are releasing with 3.4 release, the recently-announced Infragistics controls for Uno Platform, and Syncfusion charting, will give you as a developer a great toolset to tackle single-source web, desktop and mobile applications.
As with each release, we have also added significant number of features and fixed many bugs, with the help of members from the community.
Visit our blog post for additional details.
Hierarchical NavigationView support (@MartinZikmund, @dr1rrb, @davidjohnoliver)
Uno Platform has been including a version of the Navigation for quite a while in the Windows.UI.Xaml namespace. Recently, the WinUI team added support for an enhanced experience including hierarchical navigation, with the ability to expand and collapse menu items.
This new control is now available in the Microsoft.UI.Xaml namespace, to match with the Windows version of WinUI. The Windows.UI.Xaml version of the control will stay in Uno, but will not include additional features, only bug fixes as needed.
You can browse the documentation for the NavigationView on Microsoft docs.
Support for the WinUI 2.5 InfoBar control (@MartinZikmund)
The WinUI InfoBar control also has been imported in Uno Platform. It allows for applications to display app wide status messages to the users to be highly visible but non-intrusive, using customizable severity levels.
Here is an example of InfoBar visual:
You can browse the documentation for the InfoBar on Microsoft docs.
Support for WinUI RadioButtons (@jeromelaban, @dr1rrb)
Yet another WinUI control, this time to allow the DataBinding of an items source to a list of RadioButtons, this control lets users select one option from a collection of two or more mutually exclusive, but related, options.
You can browse the documentation for the RadioButtons on Microsoft docs.
Support for ItemsRepeater (@dr1rrb)
The ItemsRepeater is a new control from WinUI 2.x that provides an enhanced developer experience and end user experience when creating custom collection experiences using a flexible layout system, custom views, and virtualization.
We have ported the code from the ItemsRepeater to Uno, and it is useable on all our available platforms. It is used in Uno by the refreshed hierarchical NavigationView control, as well as the RadioButtons control.
Layouts are reusable components for which some (StaggeredLayout, WrapLayout) were released in Windows Community 6.1. Uno did not have support for the ItemsRepeater
at the time, but those will be available soon to be reused in Uno.
You can browse the documentation for the ItemsRepeater on Microsoft docs.
Determinate ProgressRing (@kazo0)
WinUI 2.5 added support for a determinate mode for the progress ring, allowing for an arbitrary progress value to be provided. This control uses Lottie under the hood, and benefits from additional changes we included to get color changes in Lottie files.
You can browse the documentation for the ProgressRing control on Microsoft docs.
Upgrading from previous versions of Uno
There are no breaking changes for this release of Uno, but you'll need to upgrade the Uno.Core package to 2.1 in the UWP project to avoid nuget restore warnings.
This upgrade has been introduced to improve the compatibility of Uno.UI with Visual Studio 2019 16.9 Previews.
Other significant updates
- Support for FileSavePicker on macOS (Thanks @snickler !)
- Drag and Drop support for ListView (WebAssembly and Skia) (@dr1rrb)
- Improved ImageBrush support (WebAssembly) (@carldebilly)
- Support for SvgImageSource (WebAssembly) (@carldebilly)
- TabView for iOS/Android/macOS (@MartinZikmund)
- Memory and execution performance improvements (@jeromelaban)
- Skia templates use .NET 5 by default (@jeromelaban)
- Support for FlyoutPlacementModes (@davidjohnoliver)
- Support for FrameworkElement.EffectiveViewportChanged event (@dr1rrb)
- Support for Frame.SourcePageType and Frame.CurrentSourcePageType (@MartinZikmund)
- Support for synchronized ItemsControl.Items with ItemSource (@MartinZikmund)
- Custom colors support for Lottie files and MUX ProgressRing (@carldebilly)
You can view below the full changelog of this release
Features
- Add a property to launch the debugger for XAML generation f347548
- Add Load/Unload benchmark ba19901
- Hierarchical NavigationView 3e85994
- Improve reference checking memory leaks runtime tests 56245e6
- Update the Skia template to use .NET 5.0 1cbf17a
- WinUI RadioButtons e48de38
- dragdrop: Add ability to raise a routed event only for a portion of the tree e183f1e
- dragdrop: Add re-order support in ListView (managed only for now, i.e. wasm + skia) b79f6d8
- dragdrop: Fix the drag and drop hit testing c2003d4
- dragdrop: Import the ListView D&D event from generated code c43f6d6
- dragdrop: Initial D&D events support on ListView aaf4309
- effectiveviewport: Add support of the FrameworkElement.EffectiveViewportChanged event 4fbdee5
- effectiveviewport: Add support on WASM d66c074
- effectiveviewport: Enable mixins on iOS and fix csproj references d2861ff
- effectiveviewport: Fix invalid parent viewport to local coordinate computation (was not inversed) 649c84e
- effectiveviewport: Make sure to raise the UIElement.EffectiveViewportChanged on Arrange on Skia 3c896e5
- effectiveviewport: Make the WASM layouting algorithm use the new LayoutInformation a0e8a13
- effectiveviewport: Move the UIElement's layout properties to the LayoutInformation e98a417
- effectiveviewport: On skia scrolling is now managed by the SCP and is backed by Visual.AnchorOffset instead of a RenderTransform c8ba949
- effectiveviewport: Reuse the EffectiveViewport code for IFwElt 124c6d3
- flyout: Implement EdgeAligned FlyoutPlacementModes 0941866
- Frame: Support for SourcePageType and CurrentSourcePageType 650ea9b
- imagebrush: Improved the support of ImageBrush on Wasm af15d91
- iOS: Add DatePicker FeatureFlag 4966060
- iOS: Add support for iOS 14 Picker style 9398d1b
- iOS: Add TimePicker Feature Flag c332a25
- iOS: Enabled feature to be toggled from resources 8f46629
- iOS: Move OS version specific code 9171f2e
- itemscontrol: Sync Items with ItemsSource 26cf7ab
- itemsrepeater: [iOS] Enable clipping on the ScrollViewer 6a05d31
- itemsrepeater: Add some missing classes 77dbf85
- itemsrepeater: Brings more C++ code and begin integration with Uno 69bd34e
- itemsrepeater: Do not throw exception for ScrollViewer.CurrentAnchor (always return null) 0cfbe74
- itemsrepeater: First buildable version 🎉 8ea49c5
- itemsrepeater: First item visible cd5c57d
- itemsrepeater: Fix rebase issues 67b3a3c
- itemsrepeater: Fix tracing 08b57ff
- itemsrepeater: Initial import 357a7cc
- itemsrepeater: Make the ItemRepeater available on netstandard 2.0 ec7f73c
- itemsrepeater: Move files to their final place 9f79508
- lottie: Added the ability of LottieVisualSource to download its content and assign it locally. b96d123
- lottie: First implementation of theme properties for lottie files (custom colors) c31c32e
- svg: Added support for SvgImageSource on Wasm 26c0b06
- svg: Fixed for right signature of SvgImageSource.SetSourceAsync() with correct async result 1523a0d
- themable_lottie: Renamed new classes using better names 620ea99
- Implemented FileSavePicker on MacOS cfecbe8
- Implemented FileSavePicker on MacOS a7b8e80
- ItemsSource-bound ItemCollection 2b4d4aa
- Naive implementation of UIElement.UpdateLayout af4370f
- Set TImePicker default style to use legacy 38847a6
- skia: Implement CompositionTarget.Rendering event 9b19af3
Performance Improvements
- NativeFramePresenter: [Android] Don't detach pages in the backstack 7253faf
- [Wasm] Improve DOM routed events dispatch performance f90906d
- Improve the performance by creating temporary hard references in DependencyObjectStore 804e441
Bug Fixes
- contentcontrol: [macOS/iOS] Support binding DataContext in ContentTemplate c72c24e
- dragdrop: Add missing file for ListView drag and drop support 2252868
- dragdrop: Avoid double subscription (since ClearItem not always invoked) + make sure to subscribe event on CanDragItems change 9b135ac
- dragdrop: Don't use the Move on ObservableCollection in reorder (avoid reflection and acts like UWP) + Other mix PR review 95b3438
- dragdrop: Fix iOS compilation issues d23b51a
- dragdrop: Fix NET461 build 353ba00
- dragdrop: Fix possible null ref in Drag and Drop aa9c8b4
- dragdrop: Fix selection lost when reodering items fc475d3
- dragdrop: Fix support of TabView reordering 6157b15
- effectiveviewport: Fix build macOS 1aff65c
- effectiveviewport: Fix effective viewport computation when not top/left aligned 42c8f2d
- effectiveviewport: Fix iOS not computing properly viewport when not top/left aligned 16792f7
- effectiveviewport: Fix LayoutSlot always being at 0,0 on iOS 3f04ec7
- effectiveviewport: Fix tracing compilation issues 2048452
- effectiveviewport: NativeScrollContentPresenter are not intiilaized (do not register for effective viewport propagation) 6c74c32
- events: Fix XAML event registration in DataTemplate 4d8709e
- flyout: [WASM/Skia] Place Flyout correctly when attached to TextBlock 59035b4
- flyout: Use fallback positions correctly aa0366b
- imagesource: Fixed a regression on BitmapSource when using SetStreamAsync() 79e750c
- iOS: [Commandbar] SetNavigationBar throwing exception when null 2340480
- ItemsRepeater: Remove Assert for non-virtualizing layouts f512cb7
- leak: Alter TargetPropertyPath and ElementNameSubject ade644a
- leak: Ensure that ItemCollection is unregistering from ItemSource 2058063
- leak: Memory leak caused by FrameworkTemplate owner reference propagation d3eb2c9
- Leak: iOS Popup is leaking through the popup panel fdf821e
- lottie_android: Reverted to Newtonsoft.Json on Android because of a crash in Com.Airbnb.Android.Lottie 4ca1fd5
- lottie_wasm: Fixed a regression in Lottie support for Wasm -> a generated javascript code was invalid. 6568429
- pointers: Fix handled tapped event are being re-interpretted by parent 7c8f9de
- ScrollViewer: Add missing ScrollViewer resources 75a74db
- [iOS][macOS] SamplesApp should include UNO_HAS_UIELEMENT_IMPLICIT_PINNING ff947ff
- Keep track of current view type even if content is set to null 1850e89
- Missing mime type for icudt.dat for .NET5 support 9ffc959
- SamplesApp runner should unset the DataContext to release registrations b71462d
- listview: Fix bad state when manipulating ListView.Items a3113f2
- SyncGenerator: Properly convert INotifyPropertyChanged b8942dd
- Use ObservableCollection instead on List when needed 3bf9d68
- listview: [iOS] Take padding into account for item breadth 9c5170b
- listview: Don't use recycled container for IsOwnContainer items 4cbecf8
- selector: Support setting SelectedValue when SelectedValuePath is set 31ed853
- TabView: Surface container-related methods 05b42b6
- wasm_customevent: Fixed regression after refactoring of PR #4650 1eca2da
- xBind: Invalid xBind initialization on controls without code-behind base class 3a67db4
- Add proper encoding to lt/gt characters in PackageDiffIgnore 7e95c85
- Added FileTypeChoices setter to PackageDiffIgnore f64fd65
- Adjust non-FrameworkElement support for top-level properties generation 7398dc9
- FileTypeChoices prop to use a private setter 3a381c5
- xaml: Ensure reference equality of x:Name resource by different access methods efcda72
- Adjust Nuget override for Uno.Foundation.Runtime.WebAssembly da2f7c1
- Apply workaround for dotnet/runtime#45078 ede6542
- wasm: Invalid deserialization in registerPointerEventsOnView 660df52
- [Wasm] Adjust assembly loading for .NET 5 58400e5
- Add missing slash character in namespaces declarations referring to Uno URIs 8fa795b
- Fix compilation 42a77a2
- Fix invalid LayoutSlot caching on .net 47f16b0
- Fix keyboard support on skia which raises an exception for unkown keys on WPF 888f84d
- FIxed potential concurrency issue with image subscription to payload. 8192bde
- Remove HasThreadAccessOverride from public shared contract 6e24c4c
- Use NSFileManager for proper folder paths 779a1f2
- Flyout: WASM - Fixed build failing when attempting to create a flyout containing a control using a themeresource 1d56759
- itemrepeater: CI fixes e2bcb53
- itemsreapeater: Not virtualizing + ci issue 2ff75c5
- itemsrepeater: Avoid layout cycling 1d4726a
- itemsrepeater: Build 13a624e
- itemsrepeater: Disable MUX runtime tests on UAP + fix namespace conflict 1074ee4
- itemsrepeater: Do not clear the ClippedFrame until next layout pass 0991018
- itemsrepeater: Fix invalid insert (broke the backward generation) 049ee5e
- itemsrepeater: Fix minor issue with c++ 2 cs 61ae212
- itemsrepeater: Fix rebase issues a600994
- OrientationSensor: fixed orientation sensor not working properly with android versions older than oreo e48c60a
- pointers: Make sure to clear the pressed state of pressed original source 49e9cc4
- wasm_image: Added a way for the HTML to report when are loaded or on error. 4b084aa
- Adjust Uno.Skia package name for WinUI a845112
- TimePicker LightDismissOverlayBackgroundProperty 38246fa
- ViewHelper.Android not considering IgnoreTextScaleFactor at runtime 7bc5961
- itemsrepeater: Few more adjustements b2742ed
- itemsrepeater: Fix build 6fbe5dc
- itemsrepeater: Fix iOS support 96b7c7a
- itemsrepeater: Fix method visibility 67ed183
- itemsrepeater: Fix RELEASE build ad4906d
- itemsrepeater: Minors fixes for CI build 7110cd4
- itemsrepeater: Misc fixes 172a3df
- itemsrepeater: Misc fixes for tests 6cab0b9
- winui: Adjust WebAssembly support for WinUI 3 dotnet new template 6cc152a
- winui: Adjust WebAssembly support for WinUI 3 dotnet new template a132e76
- wizard: UWP project is not set as startup by default f55b36b
- xaml: Resolve markup extensions in Xaml correctly 667fdee
- xLoad: Fix invalid generated code when x:Load, StaticResources and Visibility are used aac07fe
- BindingExpression will now apply the FallbackValue when a Converter returns DependencyProperty.UnsetValue. 3a9b164
- CoreDispatcher.RunAsync with CT (internal) was throwing when invoked from BG thread 1a9b851
- Dispatcher.HasThreadAccess always return true on Skia 9a8e99c
- Do not re-invoke the IFwEltHelper.Initialize in Panel's ctor dc3a83b
- Misc fixes for the ItemsRepeater runtime tests 7fb34e4
- Re-added setter to FileTypeChoices 88114f5