Skip to content

Releases: CommunityToolkit/Maui

14.2.0: Popup Android Screen Reader Accessibility

02 Jun 17:04
Immutable release. Only release title and notes can be modified.
e9aee22

Choose a tag to compare

CommunityToolkit.Maui v14.2.0

Thanks to @IeuanWalker, Android Screen Reader now properly reads Popup v2! Previously the screen reader would default to the underlying PopupPage, now it defaults directly to the content of your Popup:

Before After
android-before.mp4
android-after.mp4

What's Changed

  • Fix Windows DrawingView image rendering so exported/rendered strokes use the correct (round) line caps by @MFinkBK in #3216
  • Popup: Android screen reader accessibility by @IeuanWalker in #2959

Housekeeping

New Contributors

@MFinkBK made their first contribution in #3216

Full Changelog: 14.1.1...14.2.0

MediaElement v10.0.0: StreamMediaSource

02 Jun 16:56
Immutable release. Only release title and notes can be modified.
e9aee22

Choose a tag to compare

CommunityToolkit.Maui.MediaElement v10.0.0

Introducing MediaSource.FromStream(Stream)

Thanks to @matt-goldman, MediaElement now supports streaming sources!

Use MediaSource.FromStream(Stream) to assign the MediaElement.Source to a Stream:

const string buckBunnyVideo = "https://test-videos.co.uk/vids/bigbuckbunny/mp4/h264/1080/Big_Buck_Bunny_1080_10s_30MB.mp4";

await using var networkStream = await httpClient.GetStreamAsync(buckBunnyVideo);

var sourceStream = new MemoryStream();
await stream.CopyToAsync(sourceStream);

sourceStream.Position = 0;

MediaElement.Source = MediaSource.FromStream(sourceStream);

Learn More:
https://learn.microsoft.com/dotnet/communitytoolkit/maui/views/mediaelement

What's Changed

Full Changelog: 14.1.1...10.0.0-mediaelement

Camera v6.1.0: `IsTorchOn`

02 Jun 16:45
Immutable release. Only release title and notes can be modified.
e9aee22

Choose a tag to compare

CommunityToolkit.Maui.Camera v6.1.0

Introducing IsTorchOn 🔦

Thanks to @MFinkBK, bool CameraView.IsTorchOn { get; set; } is now supported!

When IsTorchOn == true the device's torch (aka flashlight) will turn on; when IsTorchOn == false the device's torch (aka flashlight) will turn off.

https://learn.microsoft.com/dotnet/communitytoolkit/maui/views/camera-view

CameraViewPage.xaml.cs

<toolkit:CameraView
    x:Name="Camera"
    IsTorchOn="{Binding IsTorchOn, Mode=TwoWay}" />

CameraViewViewModel.cs

[ObservableProperty]
public partial bool IsTorchOn { get; set; }

What's Changed

  • CameraView torch support by @MFinkBK in #3211
  • fix: allow camera usage when microphone permission is denied on Windows by @AopBK in #3140

New Contributors

Full Changelog: 14.1.1...6.1.0-camera

14.1.1: Add Popup Extension for `NavigatingFromEventArgs.`, Fix `StatusBar` + `SpeechToText` Auto-timeout bugs

07 May 15:25
Immutable release. Only release title and notes can be modified.
85c32a8

Choose a tag to compare

CommunityToolkit.Maui v14.1.1

New Popup Extension

public static bool IsDestinationPageACommunityToolkitPopupPage(this NavigatingFromEventArgs args);

You can now use NavigatingFromEventArgs to determine if the previous page was a Popup: https://learn.microsoft.com/en-us/dotnet/communitytoolkit/maui/views/popup#lifecycle-behavior

protected override void OnNavigatingFrom(NavigatingFromEventArgs args)
{
    base.OnNavigatingFrom(args);
    if (args.IsDestinationPageACommunityToolkitPopupPage())
    {
        // If true, `OnNavigatingFrom` was called by starting a Popup
    }
}

SpeechToText Bug Fix

  • Fix AutoStopSilenceTimeout for SpeechToTextOptions doesn't work on iOS

StatusBar Bug Fix

  • Fix StatusBar.SetColor() when using StatusBarBehavior
  • Update StatusBar Size On Device Orientation Change

Microsoft.Maui.Controls Dependency

  • Increase dependency to Microsoft.Maui.Controls v10.0.60

What's Changed

Housekeeping

  • Explicitly target iOS and macOS to osx and Windows platforms (only) by @matt-goldman in #3186
  • Bump Microsoft.Testing.Extensions.CodeCoverage from 18.5.2 to 18.6.2 by @dependabot[bot] in #3193
  • Bump System.Formats.Asn1 from 10.0.6 to 10.0.7 by @dependabot[bot] in #3209
  • Bump Microsoft.Extensions.Http.Resilience from 10.4.0 to 10.5.0 by @dependabot[bot] in #3199
  • Bump System.Formats.Asn1 from 10.0.5 to 10.0.6 by @dependabot[bot] in #3201
  • Bump Microsoft.Extensions.Logging.Debug from 10.0.5 to 10.0.6 by @dependabot[bot] in #3200

New Contributors

Full Changelog: 14.1.0...14.1.1

14.1.0: SpeechToText `AutostopSilenceTimeout`, StatusBar Bug Fixes, Popup Bug Fixes, AvatarView Bug Fixes, and Public Exceptions

06 Apr 18:00
Immutable release. Only release title and notes can be modified.

Choose a tag to compare

CommunityToolkit.Maui v14.1.0

SpeechToText

  • We've added SpeechToTextOptions.AutostopSilenceTimeout to allow you to auto-stop ISpeechToText

Public Custom Exceptions

We heard your feedback! The following exceptions are now public allowing you to properly catch them inside a try/catch block:

  • SoftKeyboardException
  • PopupNotFoundException
  • PopupBlockedException
  • InvalidPopupOperationException

StatusBar Bug Fixes

  • StatusBarBehavior now works when used inside a Modal Page on Android
  • StatusBarBehavior now uses the correct height for Android API 36+

Popup Fixes

  • Popup now works when used in a Modal Page

AvatarView

  • AvatarView now correctly updates its size when ImageSource changes

What's Changed

New Contributors

Full Changelog: 14.0.1...14.1.0

MediaElement v9.0.0: UriMediaSource HttpHeaders

06 Apr 18:07
Immutable release. Only release title and notes can be modified.

Choose a tag to compare

CommunityToolkit.Maui.MediaElement v9.0.0

Introducing UriMediaSource.HttpHeaders

We heard your feedback! You can now use Http Headers for UriMediaSource:

var headers = new Dictionary<string, string>
{
    ["Authorization"] = "Bearer my-token"
};
mediaElement.Source = MediaSource.FromUri(new Uri("https://example.com/stream.m3u8"), headers);

What's Changed

New Contributors

Full Changelog: 14.0.1...9.0.0-mediaelement

Camera v6.0.1: Fix Photo + Video Orientation

06 Apr 18:10
Immutable release. Only release title and notes can be modified.

Choose a tag to compare

CommunityToolkit.Maui.Camera v6.0.1

What's Changed

  • CameraView fix for iOS: orientation and video recording by @zhitaop in #3167
  • CameraView fix for Android: video recording and rotation by @zhitaop in #3168

Full Changelog: 14.0.1...6.0.1-camera

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.1: 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