Releases: CommunityToolkit/Maui
14.0.1: Regression Bug Fixes
CommunityToolkit.Maui v14.0.1
Bug Fixes
NavigationBar- Add Support for
NavigationBar.SetColor(Color)on Android 35+ - Fix duplicate values for
ColorAttached Property
- Add Support for
Popup- Fix duplicate instantiation of the ViewModel via
PopupService.ShowPopupAsync<T>' - Fix Padding regression introduced in v14.0.0
- Fix duplicate instantiation of the ViewModel via
StateContainer- Fix duplicate StateContainer ViewState bug
- BindableProperty Attribute
- Resolve CS0436 Warning
DateTimeOffsetConverter- Use
TimeZoneInfoto calculate correct offset
- Use
- Microsoft.Maui.Controls Dependency
- Increase dependency to
Microsoft.Maui.Controls v10.0.41
- Increase dependency to
- Windows Apps
- Downgrade
Microsoft.WindowsAppSDKto v1.8.260101001 from 2.0.0-experimental
- Downgrade
What's Changed
- Add Support for
NavigationBar.SetColor(Color)on Android 35+ by @TheCodeTraveler in #3057 - Bump Microsoft.Testing.Extensions.CodeCoverage from 18.3.2 to 18.4.1 by @dependabot[bot] in #3062
- Reorder popup/view model instantiation by @bijington in #3071
- Resolve CS0436 Warning caused by
[BindableProperty]and[AttachedBindableProperty<T>]by @TheCodeTraveler in #3073 - Downgrade Windows SDK by @VladislavAntonyuk in #3076
- Fix Popup Padding Regression Introduced in v14.0.0 by @TheCodeTraveler in #3074
- Fix DateTimeOffset Converter #2582 by @VladislavAntonyuk in #3077
- Bump Microsoft.Extensions.Http.Resilience from 10.2.0 to 10.3.0 by @dependabot[bot] in #3086
- Bump Microsoft.Extensions.Logging.Debug from 10.0.2 to 10.0.3 by @dependabot[bot] in #3087
- Bump System.Formats.Asn1 from 10.0.2 to 10.0.3 by @dependabot[bot] in #3088
- Fix duplicate state container view states by @TheCodeTraveler in #3095
- Increase
Microsoft.Maui.ControlsDependency to v10.0.41 by @TheCodeTraveler in #3107
Full Changelog: 14.0.0...14.0.1
MediaElement v8.0.0: Fix Android Foreground Service Bug
CommunityToolkit.Maui.MediaElement v8.0.1
This release fixes a bug when opting-out of the Android Foreground Service.
Initializing MediaElement
Opt-In to Android Foreground Service
To use MediaElement with Background Playback and/or Rich Media Notifications, opt-in to the Android Foreground Service when initializing CommunityToolkit.Maui.MediaElement:
.UseMauiCommunityToolkitMediaElement(isAndroidForegroundServiceEnabled: true, static options =>
{
options.SetDefaultAndroidViewType(AndroidViewType.TextureView);
})Opt-out of Android Foreground Service
To use MediaElement without Background Playback and/or Rich Media Notifications, opt out of the Android Foreground Service when initializing CommunityToolkit.Maui.MediaElement:
.UseMauiCommunityToolkitMediaElement(isAndroidForegroundServiceEnabled: false, static options =>
{
options.SetDefaultAndroidViewType(AndroidViewType.TextureView);
})What's Changed
- Fix Android Services not being disabled when set by @ne0rrmatrix in #3104
Full Changelog: 6.0.0-camera...8.0.1-mediaelement
14.0.0: Introducing Bindable Property Source Generators!
CommunityToolkit.Maui v14.0.0
I am excited to debut two new source generators!
[BindableProperty][AttachedBindableProperty<T>]
These new source generators make it easier than ever to create a BindableProperty for your .NET MAUI apps by allowing us to write all the associated boiler-plate code for you. In fact, all Bindable Properties in CommunityToolkit.Maui are now automatically generated using these new source generators!
For an in-depth overview of both [BindableProperty] and [AttachedBindableProperty<T>], check out my comprehensive write-up:
👉 https://codetraveler.io/2026/01/29/introducing-bindable-property-source-generators/
Bug Fixes + New Features
Alongside the new Source Generators, this Release also brings important bug fixes and new features:
StatusBarBehavior- Fixes
StatusBarBehavioron Android 35+
- Fixes
Snackbar- Fixes a memory leak
Popup- Add extension method for
NavigatedFromEventArgs - Fixes tapping issues when using a
CollectionViewinPopup - Fixes a memory leak
- Add extension method for
Introducing Bindable Property Source Generators
Opt-into this Experimental Feature
We have decided to release this feature using the [Experimental] attribute. This allows us to let you try out its features and provide feedback while giving us the flexibility to update it with your feedback over the next few releases.
In the csproj file of your .NET MAUI app, add the following code:
<!-- Opt into Bindable Property Source Generators -->
<PropertyGroup>
<NoWarn>MCTEXP001</NoWarn>
</PropertyGroup>In the mean-time, we will be writing more comprehensive documentation and writing Analyzers, similar to CommunityToolkit.MVVM, to help provide you the best coding experience!
Using [BindableProperty]
To leverage the Bindable Property Source Generator, first ensure you using a partial class. Then, add the partial keyword and attach the [BindableProperty] attribute to your property:
- Add the
partialkeyword to the class - Add the
partialkeyword the Property for which to generate an associated Bindable Property - Add the
[BindableProperty]attribute to the property to make it bindable
using CommunityToolkit.Maui;
namespace BindablePropertySourceGeneratorSample;
public partial class CustomButton : Button
{
[BindableProperty]
public partial int? Number { get; set; }
}The above example generates the following Bindable Property:
public partial class CustomButton
{
/// <summary>
/// BindableProperty for the <see cref = "Number"/> property.
/// </summary>
public static readonly global::Microsoft.Maui.Controls.BindableProperty NumberProperty = global::Microsoft.Maui.Controls.BindableProperty.Create("Number", typeof(int?), typeof(BindablePropertySourceGeneratorSample.CustomButton), null, Microsoft.Maui.Controls.BindingMode.OneWay, null, null, null, null, null);
public partial int? Number { get => (int)GetValue(NumberProperty); set => SetValue(NumberProperty, value); }
}For more in-depth examples see my comprehensive write-up on [BindableProperty]:
👉 https://codetraveler.io/2026/01/29/introducing-bindable-property-source-generators/
Using [AttachedBindableProperty<T>]
Using [AttachedBindableProperty] is a bit different. This attribute is applied to either the Class or the Constructor, not a Property, as Attached Properties are not required to have an associated Property:
.NET Multi-platform App UI (.NET MAUI) attached properties enable an object to assign a value for a property that its own class doesn't define
To leverage the Attached Bindable Property Source Generator, first ensure you using a partial class. Then, add [AttachedBindableProperty<T>] attribute to either the class or constructor:
- Add the
partialkeyword to the class - Add the
[AttachedBindableProperty<T>]attribute to the class or constructor for which to generate an associated Attached Property
using CommunityToolkit.Maui;
namespace BindablePropertySourceGeneratorSample;
[AttachedBindableProperty<int>("Number")]
public partial class CustomButton : Button
{
public CustomButton()
{
}
}Alternatively, the attribute can be attached to the constructor:
namespace BindablePropertySourceGeneratorSample;
public partial class CustomButton : Button
{
[CommunityToolkit.Maui.AttachedBindableProperty<int>("Number")]
public CustomButton()
{
}
}Both examples above generate the following Attached Property along with its associated Get/Set methods:
public partial class CustomButton
{
/// <summary>
/// Attached BindableProperty for the Number property.
/// </summary>
public static readonly global::Microsoft.Maui.Controls.BindableProperty NumberProperty = global::Microsoft.Maui.Controls.BindableProperty.CreateAttached("Number", typeof(int), typeof(BindablePropertySourceGeneratorSample.CustomButton), null, (global::Microsoft.Maui.Controls.BindingMode)0, null, null, null, null, null);
/// <summary>
/// Gets Number for the <paramref name = "bindable"/> child element.
/// </summary>
public static int GetNumber(global::Microsoft.Maui.Controls.BindableObject bindable) => (int)bindable.GetValue(NumberProperty);
/// <summary>
/// Sets Number for the <paramref name = "bindable"/> child element.
/// </summary>
public static void SetNumber(global::Microsoft.Maui.Controls.BindableObject bindable, int value) => bindable.SetValue(NumberProperty, value);
}For more in-depth examples see my comprehensive write-up on [AttachedBindableProperty<T>]:
👉 https://codetraveler.io/2026/01/29/introducing-bindable-property-source-generators/
Breaking Changes
FileSaver
We heard your feedback! You now have more control over which Permissions you require and when you request them.
Developers must now manually request Permissions.StorageRead and Permissions.StorageWrite:
var readPermissionsRequest = await Permissions.RequestAsync<Permissions.StorageRead>();
var writePermissionsRequest = await Permissions.RequestAsync<Permissions.StorageWrite>();FolderPicker
We heard your feedback! You now have more control over which Permissions you require and when you request them.
Developers must now manually request Permissions.StorageRead and Permissions.StorageWrite:
var readPermissionsRequest = await Permissions.RequestAsync<Permissions.StorageRead>();
var writePermissionsRequest = await Permissions.RequestAsync<Permissions.StorageWrite>();SpeechToText
We heard your feedback! You now have more control over which Permissions you require and when you request them.
Developers must now manually request permissions for Permissions.Microphone and manually call ISpeechToText.RequestPermissions():
static async Task<bool> ArePermissionsGranted(ISpeechToText speechToText, CancellationToken token = default)
{
var microphonePermissionStatus = await Permissions.RequestAsync<Permissions.Microphone>();
var isSpeechToTextRequestPermissionsGranted = await speechToText.RequestPermissions(token);
return microphonePermissionStatus is PermissionStatus.Granted
&& isSpeechToTextRequestPermissionsGranted;
}What's Changed
- Fix StatusBar on Android 35+ by @TheCodeTraveler in #2939
- Fixes Obsolete Warnings and NuGet Package Dependency Warnings by @VladislavAntonyuk in #2944
- Update ColorConversionExtensions.shared.cs by @stephenquan in #2945
- Add popup related navigation extension methods by @jamesbrooksbank in #2955
- [Housekeeping] Add
ReferenceAssembliesExtensionsextension forReferenceAssemblies.Net.Net100by @TheCodeTraveler in #2956 - Update
[BindableProperty]Support for Additional Scenarios, AddCommunityToolkit.Maui.SourceGenerators.Internal.UnitTests, Implement[BindableProperty]for Behaviors by @TheCodeTraveler in #2932 - Add
CommunityToolkit.Maui.SourceGenerator.Benchmarks, Reduce Memory Allocations on[BindableProperty]Source Generator by @TheCodeTraveler in #2960 - Use
[BindableProperty]for RatingView by @CliffAgius in #2964 - Cleanup Popup Resources When Closed by @AlejoTorresLeon in #2971
- Add
[Experimental]To[BindableProperty]by @TheCodeTraveler in #2990 - Extend BindableProperty source gen to handle partial property initializers by @stephenquan in #2987
- Add BoxView behind the Popup content to safely handle touch interaction by @bijington in #2997
- Bindable property for Popup by @ne0rrmatrix in #2991
- Remove
BindablePropertyAttribute.DefaultValueby @TheCodeTraveler in #2995 - Refactor
Animationsto use [BindableProperty] partial properties by @ne0rrmatrix in #3013 - Refactor Views to use
[BindableProperties]partial properties by @ne0rrmatrix in #301...
MediaElement v8.0.0: Android Foreground Service is now optional
CommunityToolkit.Maui.MediaElement v8.0.0
We heard your feedback! In this release using the Android Foreground Service is now optional. For developers requiring Background Playback and/or Rich Media Notifications, you'll now opt-in to the Android Foreground Service. Everyone else now has the option to opt-out.
This does come with a breaking change to the way we initialize MediaElement in MauiProgram.cs to either opt-in or opt-out of the Android Foreground Service.
Initializing MediaElement
Opt-In to Android Foreground Service
To use MediaElement with Background Playback and/or Rich Media Notifications, opt-in to the Android Foreground Service when initializing CommunityToolkit.Maui.MediaElement:
.UseMauiCommunityToolkitMediaElement(isAndroidForegroundServiceEnabled: true, static options =>
{
options.SetDefaultAndroidViewType(AndroidViewType.TextureView);
})Opt-out of Android Foreground Service
To use MediaElement without Background Playback and/or Rich Media Notifications, opt out of the Android Foreground Service when initializing CommunityToolkit.Maui.MediaElement:
.UseMauiCommunityToolkitMediaElement(isAndroidForegroundServiceEnabled: false, static options =>
{
options.SetDefaultAndroidViewType(AndroidViewType.TextureView);
})What's Changed
- Implement
[BindableProperty]for MediaElement by @ne0rrmatrix in #2933 - Add missing AudioSessionIdChanged stub to android MediaElement by @ne0rrmatrix in #2992
- Fix MediaElement windows fails to playback by @ne0rrmatrix in #2915
- Add support to make AndroidForegroundService optional to MediaElement by @ne0rrmatrix in #2658
- Fix memory leak by changing now playing artwork request handler by @MarcelStommel in #3051
Full Changelog: 7.0.0-mediaelement...8.0.0-mediaelement
Camera v6.0.0
Breaking Changes
We heard your feedback! You now have more control over which Permissions you require and when you request them.
Permissions.Camera is always required before use of the Camera.Permissions.Microphone is required if you plan to use video recording.
Developers must now manually request Permissions.Camera and/or Permissions.Microphone:
var cameraPermissionsRequest = await Permissions.RequestAsync<Permissions.Camera>();
var microphonePermissionsRequest = await Permissions.RequestAsync<Permissions.Microphone>();What's Changed
- [CameraView][iOS] Favor Photo Formats During Default Resolution Selection by @phunkeler in #2941
- Improve CameraView Performance by @zhitaop in #2909
- Fix camera view regression by @zhitaop in #2951
- Bindable property for camera view by @ne0rrmatrix in #2974
13.0.0: .NET 10 Support is here!
Breaking Changes
- .NET 10 Required
- Removed Deprecated
IPopup - Removed Deprecated
MauiPopup - Removed Deprecated
PopupHandler - Removed Deprecated
PopupExtensions - (CameraView) Developers must manually request
Permissions.CameraandPermissions.Microphone:
var cameraPermissionsRequest = await Permissions.RequestAsync<Permissions.Camera>();
var microphonePermissionsRequest = await Permissions.RequestAsync<Permissions.Microphone>();- (FileSaver) Developers must manually request
Permissions.StorageReadandPermissions.StorageWrite:
var readPermissionStatus = await Permissions.RequestAsync<Permissions.StorageRead>();
var writePermissionStatus = await Permissions.RequestAsync<Permissions.StorageWrite>();- (FolderPicker) Developers must manually request
Permissions.StorageReadandPermissions.StorageWrite:
var readPermissionStatus = await Permissions.RequestAsync<Permissions.StorageRead>();
var writePermissionStatus = await Permissions.RequestAsync<Permissions.StorageWrite>();- (SpeechToText) Developers must manually request permissions for
Permissions.Microphoneand manually callISpeechToText.RequestPermissions():
static async Task<bool> ArePermissionsGranted(ISpeechToText speechToText)
{
var microphonePermissionStatus = await Permissions.RequestAsync<Permissions.Microphone>();
var isSpeechToTextRequestPermissionsGranted = await speechToText.RequestPermissions(CancellationToken.None);
return microphonePermissionStatus is PermissionStatus.Granted
&& isSpeechToTextRequestPermissionsGranted;
}What's Changed
- CarouselViewHandler2
InvalidCastExceptionforMauiMediaElement.macios.cswhen usingCollectionViewHandler2andCarouselViewHandler2by @TheCodeTraveler in #2926 - (Popup) Enable Popup v2 Inside Custom NavigationPage by @pictos in #2919
- Add .NET 10 Support by @TheCodeTraveler in #2902
- Allow Developers to Manually Request Permissions when using
CameraView,FileSaver,FolderPickerandSpeechToTextby @VladislavAntonyuk in #2934
Full Changelog: 12.3.0...13.0.0
7.0.0 MediaElement: .NET 10 support is here!
Breaking Changes
- .NET 10 Required
What's Changed
- Add .NET 10 Support by @TheCodeTraveler in #2902
Full Changelog: 6.1.3-mediaelement...7.0.0-mediaelement
5.0.0 Camera: .NET 10 support is here!
Breaking Changes
- .NET 10 Required
- (CameraView) Developers must manually request
Permissions.CameraandPermissions.Microphone:
var cameraPermissionsRequest = await Permissions.RequestAsync<Permissions.Camera>();
var microphonePermissionsRequest = await Permissions.RequestAsync<Permissions.Microphone>();What's Changed
- Add .NET 10 Support by @TheCodeTraveler in #2902
Full Changelog: 4.0.0-camera...5.0.0-camera
4.0.0 Maps: .NET 10 support is here!
Breaking Changes
- .NET 10 Required
What's Changed
- Add .NET 10 Support by @TheCodeTraveler in #2902
Full Changelog: 3.0.3-maps...4.0.0-maps
12.3.0: Minor fixes and no upper MAUI version restriction
This version brings some minor fixes (but still very important!) and removes the upper version restriction for Microsoft.Maui.Controls. Although it is not officially supported, you may now use the .NET MAUI Community Toolkit with the .NET 10 preview.
Thank you for using the .NET MAUI Community Toolkit!
What's Changed
- Provide an extension method to detect if popup was previous page by @bijington in #2767
- Fix memory leak on popups by @pictos in #2858
- Update BindablePropertySourceGenerator to use partial properties by @pictos in #2835
Requirements
The following tools are now required for CommunityToolkit.Maui:
- Download/install .NET SDK v9.0.306
- Install Xcode 26.0.1 (or higher)
- Read the latest .NET MAUI Release wiki to always find the latest-supported version) of Xcode for .NET MAUI
- We HIGHLY recommend using the open-source tool Xcodes to easily manage your installed Xcode versions
- Update to the latest stable version of Visual Studio (or Jet Brains Rider)
- After installing the latest stable .NET SDK, update to the latest stable version of the .NET MAUI workload:
- On macOS, open the Terminal and enter the following command:
sudo dotnet workload install maui; sudo dotnet workload update - On Windows, open the command prompt (or Powershell) and enter the following command:
dotnet workload install maui && dotnet workload update
- On macOS, open the Terminal and enter the following command:
- Add a
global.jsonfile to your application with the following parameters to ensure you're not using a unsupported preview version of .NET (example below)- The .NET MAUI Community Toolkit does not provide support for preview releases of .NET
global.json
{
"sdk": {
"version": "9.0.306",
"rollForward": "latestFeature",
"allowPrerelease": false
}
}Full Changelog: 12.2.0...12.3.0