Skip to content

Releases: CommunityToolkit/Maui

14.0.1: Regression Bug Fixes

25 Feb 23:37
Immutable release. Only release title and notes can be modified.

Choose a tag to compare

CommunityToolkit.Maui v14.0.1

Bug Fixes

  • NavigationBar
    • Add Support for NavigationBar.SetColor(Color) on Android 35+
    • Fix duplicate values for Color Attached Property
  • Popup
    • Fix duplicate instantiation of the ViewModel via PopupService.ShowPopupAsync<T>'
    • Fix Padding regression introduced in v14.0.0
  • StateContainer
    • Fix duplicate StateContainer ViewState bug
  • BindableProperty Attribute
    • Resolve CS0436 Warning
  • DateTimeOffsetConverter
    • Use TimeZoneInfo to calculate correct offset
  • Microsoft.Maui.Controls Dependency
    • Increase dependency to Microsoft.Maui.Controls v10.0.41
  • Windows Apps
    • Downgrade Microsoft.WindowsAppSDK to v1.8.260101001 from 2.0.0-experimental

What's Changed

Full Changelog: 14.0.0...14.0.1

MediaElement v8.0.0: Fix Android Foreground Service Bug

25 Feb 23:41
Immutable release. Only release title and notes can be modified.

Choose a tag to compare

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

Full Changelog: 6.0.0-camera...8.0.1-mediaelement

14.0.0: Introducing Bindable Property Source Generators!

29 Jan 10:12
Immutable release. Only release title and notes can be modified.
0215303

Choose a tag to compare

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 StatusBarBehavior on Android 35+
  • Snackbar
    • Fixes a memory leak
  • Popup
    • Add extension method for NavigatedFromEventArgs
    • Fixes tapping issues when using a CollectionView in Popup
    • Fixes a memory leak

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:

  1. Add the partial keyword to the class
  2. Add the partial keyword the Property for which to generate an associated Bindable Property
  3. 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:

  1. Add the partial keyword to the class
  2. 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

Read more

MediaElement v8.0.0: Android Foreground Service is now optional

29 Jan 10:39
Immutable release. Only release title and notes can be modified.

Choose a tag to compare

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

Full Changelog: 7.0.0-mediaelement...8.0.0-mediaelement

Camera v6.0.0

29 Jan 10:43
Immutable release. Only release title and notes can be modified.

Choose a tag to compare

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

13.0.0: .NET 10 Support is here!

12 Nov 20:38
Immutable release. Only release title and notes can be modified.
37e20e1

Choose a tag to compare

Breaking Changes

  • .NET 10 Required
  • Removed Deprecated IPopup
  • Removed Deprecated MauiPopup
  • Removed Deprecated PopupHandler
  • Removed Deprecated PopupExtensions
  • (CameraView) Developers must manually request Permissions.Camera and Permissions.Microphone:
var cameraPermissionsRequest = await Permissions.RequestAsync<Permissions.Camera>();
var microphonePermissionsRequest = await Permissions.RequestAsync<Permissions.Microphone>();
  • (FileSaver) Developers must manually request Permissions.StorageRead and Permissions.StorageWrite:
var readPermissionStatus = await Permissions.RequestAsync<Permissions.StorageRead>();
var writePermissionStatus = await Permissions.RequestAsync<Permissions.StorageWrite>();
  • (FolderPicker) Developers must manually request Permissions.StorageRead and Permissions.StorageWrite:
var readPermissionStatus = await Permissions.RequestAsync<Permissions.StorageRead>();
var writePermissionStatus = await Permissions.RequestAsync<Permissions.StorageWrite>();
  • (SpeechToText) Developers must manually request permissions for Permissions.Microphone and manually call ISpeechToText.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 InvalidCastException for MauiMediaElement.macios.cs when using CollectionViewHandler2 and CarouselViewHandler2 by @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, FolderPicker and SpeechToText by @VladislavAntonyuk in #2934

Full Changelog: 12.3.0...13.0.0

7.0.0 MediaElement: .NET 10 support is here!

12 Nov 20:52
Immutable release. Only release title and notes can be modified.
37e20e1

Choose a tag to compare

Breaking Changes

  • .NET 10 Required

What's Changed

Full Changelog: 6.1.3-mediaelement...7.0.0-mediaelement

5.0.0 Camera: .NET 10 support is here!

12 Nov 20:53
Immutable release. Only release title and notes can be modified.
37e20e1

Choose a tag to compare

Breaking Changes

  • .NET 10 Required
  • (CameraView) Developers must manually request Permissions.Camera and Permissions.Microphone:
var cameraPermissionsRequest = await Permissions.RequestAsync<Permissions.Camera>();
var microphonePermissionsRequest = await Permissions.RequestAsync<Permissions.Microphone>();

What's Changed

Full Changelog: 4.0.0-camera...5.0.0-camera

4.0.0 Maps: .NET 10 support is here!

12 Nov 20:54
Immutable release. Only release title and notes can be modified.
37e20e1

Choose a tag to compare

Breaking Changes

  • .NET 10 Required

What's Changed

Full Changelog: 3.0.3-maps...4.0.0-maps

12.3.0: Minor fixes and no upper MAUI version restriction

04 Nov 08:42
Immutable release. Only release title and notes can be modified.
035d9c9

Choose a tag to compare

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
  • Add a global.json file 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