<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~files/atom-premium.xsl"?>
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:feedpress="https://feed.press/xmlns" xmlns:media="http://search.yahoo.com/mrss/" xmlns:podcast="https://podcastindex.org/namespace/1.0">
  <feedpress:locale>en</feedpress:locale>
  <feedpress:newsletterId>telerik-blogs-mobile</feedpress:newsletterId>
  <link rel="hub" href="https://feedpress.superfeedr.com/"/>
  <logo>https://static.feedpress.com/logo/telerik-blogs--mobile-5ab52ba67db9a.jpg</logo>
  <title type="text">Telerik Blogs | Mobile</title>
  <subtitle type="text">The official blog of Progress Telerik - expert articles and tutorials for developers.</subtitle>
  <id>uuid:eae55e3f-ef22-4a7f-970a-ff65330a5f9e;id=31</id>
  <updated>2026-04-11T15:57:40Z</updated>
  <link rel="alternate" href="https://www.telerik.com/"/>
  <link rel="self" type="application/atom+xml" href="https://feeds.telerik.com/blogs/mobile"/>
  <entry>
    <id>urn:uuid:6480f9af-1aef-43f5-959f-cab45ab104fc</id>
    <title type="text">Getting Started with the .NET MAUI Speech-to-Text Button Control</title>
    <summary type="text">Add speech-to-text options to your note-taking, chat, meeting or many other types of apps, so your users can skip manual typing in your .NET MAUI app.</summary>
    <published>2026-04-02T19:58:04Z</published>
    <updated>2026-04-11T15:57:40Z</updated>
    <author>
      <name>Héctor Pérez </name>
    </author>
    <link rel="alternate" href="https://www.telerik.com/blogs/getting-started-net-maui-speech-to-text-button-control"/>
    <content type="text"><![CDATA[<p><span class="featured">Add speech-to-text options to your note-taking, chat, meeting or many other types of apps, so your users can skip manual typing in your .NET MAUI app.</span></p><p>For several years, a common problem for mobile device users has been typing text quickly. Although innovative features such as swipe typing and word autocompletion have been implemented, undoubtedly one of the most comfortable methods remains voice dictation.</p><p>In .NET MAUI, you can take advantage of the Progress Telerik UI for <a target="_blank" href="https://www.telerik.com/maui-ui/speech-to-text-button">.NET MAUI SpeechToTextButton</a> control, which allows converting speech to text. Let&rsquo;s see how to use it in your own .NET MAUI apps!</p><h2 id="getting-to-know-the-telerik-speechtotextbutton-control-for-.net-maui">Getting to Know the Telerik SpeechToTextButton Control for .NET MAUI</h2><p>The SpeechToTextButton control uses platform-specific voice recognition services to perform speech-to-text conversion, including <a target="_blank" href="https://www.telerik.com/maui-ui/documentation/controls/speechtotextbutton/winui-support">WinUI</a>. The structure of the control is simple, and it is based on a button composed of a <strong>SpeechToTextButton Content</strong> and a <strong>SpeechToTextButton</strong>, which you can see in the following image:</p><p><img src="https://www.telerik.com/maui-ui/documentation/assets/e12eb57a64e50c12e588881ba7414605/speechtotextbutton-visual-structure.png" alt="Diagram showing the structure of Telerik’s SpeechToTextButton control for .NET MAUI" /></p><p>Some possible use cases for the control are:</p><ul><li>Voice note-taking</li><li>Chat applications</li><li>Voice search</li><li>Command control via voice</li><li>Meeting transcription</li><li>Among many others</li></ul><p>In reality, the range of use cases is quite large. Now let&rsquo;s analyze the control in more depth.</p><h2 id="creating-a-practical-case">Creating a Practical Case</h2><p>Let&rsquo;s start by creating a demo application, which will help us see the different features of the speech-to-text control. The idea of the application is to be a personal note-taking app that allows actions like editing text, saving notes and sharing them.</p><p>For this example, we&rsquo;ll use the <strong>CommunityToolkit.Mvvm</strong> package, which allows for rapid creation of view models. Below, I show you the initial code for the application in case you want to replicate it, which is as follows:</p><p><strong>TextEditorPage.xaml</strong>:</p><pre class=" language-xml"><code class="prism  language-xml"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>Grid</span>
    <span class="token attr-name">Padding</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>20<span class="token punctuation">"</span></span>
    <span class="token attr-name">RowDefinitions</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>Auto, Auto, *, Auto<span class="token punctuation">"</span></span>
    <span class="token attr-name">RowSpacing</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>16<span class="token punctuation">"</span></span><span class="token punctuation">&gt;</span></span>

    <span class="token comment">&lt;!--  Header Section  --&gt;</span>

    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>Label</span>
        <span class="token attr-name">FontAttributes</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>Bold<span class="token punctuation">"</span></span>
        <span class="token attr-name">FontSize</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>28<span class="token punctuation">"</span></span>
        <span class="token attr-name">Text</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>Fast Note<span class="token punctuation">"</span></span>
        <span class="token attr-name">TextColor</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>#1A1A2E<span class="token punctuation">"</span></span> <span class="token punctuation">/&gt;</span></span>

    <span class="token comment">&lt;!--  Status Bar  --&gt;</span>
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>Border</span>
        <span class="token attr-name">Grid.Row</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>1<span class="token punctuation">"</span></span>
        <span class="token attr-name">Padding</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>16,12<span class="token punctuation">"</span></span>
        <span class="token attr-name">BackgroundColor</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>#F3F4F6<span class="token punctuation">"</span></span>
        <span class="token attr-name">StrokeShape</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>RoundRectangle 12<span class="token punctuation">"</span></span>
        <span class="token attr-name">StrokeThickness</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>0<span class="token punctuation">"</span></span><span class="token punctuation">&gt;</span></span>
        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>Grid</span> <span class="token attr-name">ColumnDefinitions</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>Auto, *, Auto<span class="token punctuation">"</span></span><span class="token punctuation">&gt;</span></span>
            <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>Label</span>
                <span class="token attr-name">Grid.Column</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>2<span class="token punctuation">"</span></span>
                <span class="token attr-name">FontSize</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>12<span class="token punctuation">"</span></span>
                <span class="token attr-name">Text</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>{Binding CharacterCount}<span class="token punctuation">"</span></span>
                <span class="token attr-name">TextColor</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>#9CA3AF<span class="token punctuation">"</span></span>
                <span class="token attr-name">VerticalOptions</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>Center<span class="token punctuation">"</span></span> <span class="token punctuation">/&gt;</span></span>
        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>Grid</span><span class="token punctuation">&gt;</span></span>
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>Border</span><span class="token punctuation">&gt;</span></span>

    <span class="token comment">&lt;!--  Main Editor Area  --&gt;</span>
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>Border</span>
        <span class="token attr-name">Grid.Row</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>2<span class="token punctuation">"</span></span>
        <span class="token attr-name">Padding</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>0<span class="token punctuation">"</span></span>
        <span class="token attr-name">BackgroundColor</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>#FFFFFF<span class="token punctuation">"</span></span>
        <span class="token attr-name">Stroke</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>#E5E7EB<span class="token punctuation">"</span></span>
        <span class="token attr-name">StrokeShape</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>RoundRectangle 16<span class="token punctuation">"</span></span>
        <span class="token attr-name">StrokeThickness</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>1<span class="token punctuation">"</span></span><span class="token punctuation">&gt;</span></span>
        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>Grid</span> <span class="token attr-name">RowDefinitions</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>*, Auto<span class="token punctuation">"</span></span><span class="token punctuation">&gt;</span></span>
            <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>Editor</span>
                <span class="token attr-name"><span class="token namespace">x:</span>Name</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>MainEditor<span class="token punctuation">"</span></span>
                <span class="token attr-name">Margin</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>16<span class="token punctuation">"</span></span>
                <span class="token attr-name">AutoSize</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>TextChanges<span class="token punctuation">"</span></span>
                <span class="token attr-name">BackgroundColor</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>Transparent<span class="token punctuation">"</span></span>
                <span class="token attr-name">FontSize</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>16<span class="token punctuation">"</span></span>
                <span class="token attr-name">Placeholder</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>Start typing or use voice input...<span class="token punctuation">"</span></span>
                <span class="token attr-name">PlaceholderColor</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>#9CA3AF<span class="token punctuation">"</span></span>
                <span class="token attr-name">Text</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>{Binding EditorText, Mode=TwoWay}<span class="token punctuation">"</span></span>
                <span class="token attr-name">TextColor</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>#1F2937<span class="token punctuation">"</span></span> <span class="token punctuation">/&gt;</span></span>

            <span class="token comment">&lt;!--  Editor Toolbar  --&gt;</span>
            <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>Border</span>
                <span class="token attr-name">Grid.Row</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>1<span class="token punctuation">"</span></span>
                <span class="token attr-name">Padding</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>12,0<span class="token punctuation">"</span></span>
                <span class="token attr-name">BackgroundColor</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>#F9FAFB<span class="token punctuation">"</span></span>
                <span class="token attr-name">HeightRequest</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>56<span class="token punctuation">"</span></span>
                <span class="token attr-name">StrokeThickness</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>0<span class="token punctuation">"</span></span><span class="token punctuation">&gt;</span></span>
                <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>Grid</span> <span class="token attr-name">ColumnDefinitions</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>*, Auto, Auto<span class="token punctuation">"</span></span><span class="token punctuation">&gt;</span></span>
                    <span class="token comment">&lt;!--  Word Count  --&gt;</span>
                    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>VerticalStackLayout</span> <span class="token attr-name">VerticalOptions</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>Center<span class="token punctuation">"</span></span><span class="token punctuation">&gt;</span></span>
                        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>Label</span>
                            <span class="token attr-name">FontSize</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>12<span class="token punctuation">"</span></span>
                            <span class="token attr-name">Text</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>{Binding WordCount}<span class="token punctuation">"</span></span>
                            <span class="token attr-name">TextColor</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>#6B7280<span class="token punctuation">"</span></span> <span class="token punctuation">/&gt;</span></span>
                    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>VerticalStackLayout</span><span class="token punctuation">&gt;</span></span>

                    <span class="token comment">&lt;!--  Clear Button  --&gt;</span>
                    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>Button</span>
                        <span class="token attr-name">Grid.Column</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>1<span class="token punctuation">"</span></span>
                        <span class="token attr-name">Padding</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>12,8<span class="token punctuation">"</span></span>
                        <span class="token attr-name">BackgroundColor</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>Transparent<span class="token punctuation">"</span></span>
                        <span class="token attr-name">BorderWidth</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>0<span class="token punctuation">"</span></span>
                        <span class="token attr-name">Command</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>{Binding ClearTextCommand}<span class="token punctuation">"</span></span>
                        <span class="token attr-name">FontSize</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>14<span class="token punctuation">"</span></span>
                        <span class="token attr-name">IsEnabled</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>{Binding HasText}<span class="token punctuation">"</span></span>
                        <span class="token attr-name">Text</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>Clear<span class="token punctuation">"</span></span>
                        <span class="token attr-name">TextColor</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>#EF4444<span class="token punctuation">"</span></span> <span class="token punctuation">/&gt;</span></span>

                    <span class="token comment">&lt;!--  Copy Button  --&gt;</span>
                    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>Button</span>
                        <span class="token attr-name">Grid.Column</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>2<span class="token punctuation">"</span></span>
                        <span class="token attr-name">Padding</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>12,8<span class="token punctuation">"</span></span>
                        <span class="token attr-name">BackgroundColor</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>Transparent<span class="token punctuation">"</span></span>
                        <span class="token attr-name">BorderWidth</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>0<span class="token punctuation">"</span></span>
                        <span class="token attr-name">Command</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>{Binding CopyTextCommand}<span class="token punctuation">"</span></span>
                        <span class="token attr-name">FontSize</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>14<span class="token punctuation">"</span></span>
                        <span class="token attr-name">IsEnabled</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>{Binding HasText}<span class="token punctuation">"</span></span>
                        <span class="token attr-name">Text</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>Copy<span class="token punctuation">"</span></span>
                        <span class="token attr-name">TextColor</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>#3B82F6<span class="token punctuation">"</span></span> <span class="token punctuation">/&gt;</span></span>
                <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>Grid</span><span class="token punctuation">&gt;</span></span>
            <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>Border</span><span class="token punctuation">&gt;</span></span>
        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>Grid</span><span class="token punctuation">&gt;</span></span>
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>Border</span><span class="token punctuation">&gt;</span></span>

    <span class="token comment">&lt;!--  Quick Actions  --&gt;</span>
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>Grid</span>
        <span class="token attr-name">Grid.Row</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>3<span class="token punctuation">"</span></span>
        <span class="token attr-name">ColumnDefinitions</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>*, *, *<span class="token punctuation">"</span></span>
        <span class="token attr-name">ColumnSpacing</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>12<span class="token punctuation">"</span></span><span class="token punctuation">&gt;</span></span>
        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>Button</span>
            <span class="token attr-name">BackgroundColor</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>#E5E7EB<span class="token punctuation">"</span></span>
            <span class="token attr-name">BorderWidth</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>0<span class="token punctuation">"</span></span>
            <span class="token attr-name">Command</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>{Binding NewDocumentCommand}<span class="token punctuation">"</span></span>
            <span class="token attr-name">CornerRadius</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>10<span class="token punctuation">"</span></span>
            <span class="token attr-name">FontSize</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>14<span class="token punctuation">"</span></span>
            <span class="token attr-name">HeightRequest</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>44<span class="token punctuation">"</span></span>
            <span class="token attr-name">IsEnabled</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>{Binding HasText}<span class="token punctuation">"</span></span>
            <span class="token attr-name">Text</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>New<span class="token punctuation">"</span></span>
            <span class="token attr-name">TextColor</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>#374151<span class="token punctuation">"</span></span> <span class="token punctuation">/&gt;</span></span>
        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>Button</span>
            <span class="token attr-name">Grid.Column</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>1<span class="token punctuation">"</span></span>
            <span class="token attr-name">BackgroundColor</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>#10B981<span class="token punctuation">"</span></span>
            <span class="token attr-name">BorderWidth</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>0<span class="token punctuation">"</span></span>
            <span class="token attr-name">Command</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>{Binding SaveTextCommand}<span class="token punctuation">"</span></span>
            <span class="token attr-name">CornerRadius</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>10<span class="token punctuation">"</span></span>
            <span class="token attr-name">FontSize</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>14<span class="token punctuation">"</span></span>
            <span class="token attr-name">HeightRequest</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>44<span class="token punctuation">"</span></span>
            <span class="token attr-name">IsEnabled</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>{Binding HasText}<span class="token punctuation">"</span></span>
            <span class="token attr-name">Text</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>Save<span class="token punctuation">"</span></span>
            <span class="token attr-name">TextColor</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>#FFFFFF<span class="token punctuation">"</span></span> <span class="token punctuation">/&gt;</span></span>
        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>Button</span>
            <span class="token attr-name">Grid.Column</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>2<span class="token punctuation">"</span></span>
            <span class="token attr-name">BackgroundColor</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>#8B5CF6<span class="token punctuation">"</span></span>
            <span class="token attr-name">BorderWidth</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>0<span class="token punctuation">"</span></span>
            <span class="token attr-name">Command</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>{Binding ShareTextCommand}<span class="token punctuation">"</span></span>
            <span class="token attr-name">CornerRadius</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>10<span class="token punctuation">"</span></span>
            <span class="token attr-name">FontSize</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>14<span class="token punctuation">"</span></span>
            <span class="token attr-name">HeightRequest</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>44<span class="token punctuation">"</span></span>
            <span class="token attr-name">IsEnabled</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>{Binding HasText}<span class="token punctuation">"</span></span>
            <span class="token attr-name">Text</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>Share<span class="token punctuation">"</span></span>
            <span class="token attr-name">TextColor</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>#FFFFFF<span class="token punctuation">"</span></span> <span class="token punctuation">/&gt;</span></span>
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>Grid</span><span class="token punctuation">&gt;</span></span>

<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>Grid</span><span class="token punctuation">&gt;</span></span>
</code></pre><p><strong>TextEditorPage.xaml.cs</strong>:</p><pre class=" language-csharp"><code class="prism  language-csharp"><span class="token keyword">public</span> <span class="token keyword">partial</span> <span class="token keyword">class</span> <span class="token class-name">TextEditorPage</span> <span class="token punctuation">:</span> ContentPage
<span class="token punctuation">{</span>
    <span class="token keyword">private</span> <span class="token keyword">readonly</span> TextEditorViewModel _viewModel<span class="token punctuation">;</span>

    <span class="token keyword">public</span> <span class="token function">TextEditorPage</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
    <span class="token punctuation">{</span>
        <span class="token function">InitializeComponent</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        _viewModel <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">TextEditorViewModel</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        BindingContext <span class="token operator">=</span> _viewModel<span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre><p><strong>TextEditorViewModel.cs</strong>:</p><pre class=" language-csharp"><code class="prism  language-csharp"><span class="token keyword">public</span> <span class="token keyword">partial</span> <span class="token keyword">class</span> <span class="token class-name">TextEditorViewModel</span> <span class="token punctuation">:</span> ObservableObject
<span class="token punctuation">{</span>
    <span class="token punctuation">[</span>ObservableProperty<span class="token punctuation">]</span>
    <span class="token punctuation">[</span><span class="token function">NotifyPropertyChangedFor</span><span class="token punctuation">(</span><span class="token function">nameof</span><span class="token punctuation">(</span>CharacterCount<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">]</span>
    <span class="token punctuation">[</span><span class="token function">NotifyPropertyChangedFor</span><span class="token punctuation">(</span><span class="token function">nameof</span><span class="token punctuation">(</span>WordCount<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">]</span>
    <span class="token punctuation">[</span><span class="token function">NotifyPropertyChangedFor</span><span class="token punctuation">(</span><span class="token function">nameof</span><span class="token punctuation">(</span>HasText<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">]</span>
    <span class="token keyword">private</span> <span class="token keyword">string</span> _editorText <span class="token operator">=</span> <span class="token keyword">string</span><span class="token punctuation">.</span>Empty<span class="token punctuation">;</span>

    <span class="token punctuation">[</span>ObservableProperty<span class="token punctuation">]</span>
    <span class="token keyword">private</span> <span class="token keyword">string</span> _statusText <span class="token operator">=</span> <span class="token string">"Ready"</span><span class="token punctuation">;</span>

    <span class="token punctuation">[</span>ObservableProperty<span class="token punctuation">]</span>
    <span class="token keyword">private</span> Color _statusColor <span class="token operator">=</span> Colors<span class="token punctuation">.</span>Gray<span class="token punctuation">;</span>

    <span class="token keyword">public</span> <span class="token keyword">string</span> CharacterCount <span class="token operator">=</span><span class="token operator">&gt;</span> $<span class="token string">"{EditorText?.Length ?? 0} characters"</span><span class="token punctuation">;</span>

    <span class="token keyword">public</span> <span class="token keyword">string</span> WordCount
    <span class="token punctuation">{</span>
        <span class="token keyword">get</span>
        <span class="token punctuation">{</span>
            <span class="token keyword">int</span> words <span class="token operator">=</span> <span class="token keyword">string</span><span class="token punctuation">.</span><span class="token function">IsNullOrWhiteSpace</span><span class="token punctuation">(</span>EditorText<span class="token punctuation">)</span>
                <span class="token operator">?</span> <span class="token number">0</span>
                <span class="token punctuation">:</span> EditorText<span class="token punctuation">.</span><span class="token function">Split</span><span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token string">' '</span><span class="token punctuation">,</span> <span class="token string">'\n'</span><span class="token punctuation">,</span> <span class="token string">'\r'</span><span class="token punctuation">]</span><span class="token punctuation">,</span> StringSplitOptions<span class="token punctuation">.</span>RemoveEmptyEntries<span class="token punctuation">)</span><span class="token punctuation">.</span>Length<span class="token punctuation">;</span>
            <span class="token keyword">return</span> $<span class="token string">"{words} words"</span><span class="token punctuation">;</span>
        <span class="token punctuation">}</span>
    <span class="token punctuation">}</span>

    <span class="token keyword">public</span> <span class="token keyword">bool</span> HasText <span class="token operator">=</span><span class="token operator">&gt;</span> <span class="token operator">!</span><span class="token keyword">string</span><span class="token punctuation">.</span><span class="token function">IsNullOrEmpty</span><span class="token punctuation">(</span>EditorText<span class="token punctuation">)</span><span class="token punctuation">;</span>

    <span class="token preprocessor property">#<span class="token directive keyword">region</span> Commands</span>

    <span class="token punctuation">[</span>RelayCommand<span class="token punctuation">]</span>
    <span class="token keyword">private</span> <span class="token keyword">void</span> <span class="token function">ClearText</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
    <span class="token punctuation">{</span>
        EditorText <span class="token operator">=</span> <span class="token keyword">string</span><span class="token punctuation">.</span>Empty<span class="token punctuation">;</span>
        <span class="token function">UpdateStatus</span><span class="token punctuation">(</span><span class="token string">"Text cleared"</span><span class="token punctuation">,</span> <span class="token keyword">null</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>

    <span class="token punctuation">[</span>RelayCommand<span class="token punctuation">]</span>
    <span class="token keyword">private</span> <span class="token keyword">async</span> Task <span class="token function">CopyTextAsync</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span>HasText<span class="token punctuation">)</span> <span class="token keyword">return</span><span class="token punctuation">;</span>

        <span class="token keyword">await</span> Clipboard<span class="token punctuation">.</span>Default<span class="token punctuation">.</span><span class="token function">SetTextAsync</span><span class="token punctuation">(</span>EditorText<span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token function">UpdateStatus</span><span class="token punctuation">(</span><span class="token string">"Copied to clipboard"</span><span class="token punctuation">,</span> <span class="token string">"#10B981"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

        <span class="token keyword">await</span> Task<span class="token punctuation">.</span><span class="token function">Delay</span><span class="token punctuation">(</span><span class="token number">2000</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token function">UpdateStatus</span><span class="token punctuation">(</span><span class="token string">"Ready"</span><span class="token punctuation">,</span> <span class="token keyword">null</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>

    <span class="token punctuation">[</span>RelayCommand<span class="token punctuation">]</span>
    <span class="token keyword">private</span> <span class="token keyword">async</span> Task <span class="token function">NewDocumentAsync</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">if</span> <span class="token punctuation">(</span>HasText<span class="token punctuation">)</span>
        <span class="token punctuation">{</span>
            <span class="token keyword">if</span> <span class="token punctuation">(</span>Application<span class="token punctuation">.</span>Current<span class="token operator">?</span><span class="token punctuation">.</span>Windows<span class="token punctuation">.</span><span class="token function">FirstOrDefault</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">?</span><span class="token punctuation">.</span>Page <span class="token keyword">is</span> Page page<span class="token punctuation">)</span>
            <span class="token punctuation">{</span>
                <span class="token keyword">bool</span> confirm <span class="token operator">=</span> <span class="token keyword">await</span> page<span class="token punctuation">.</span><span class="token function">DisplayAlertAsync</span><span class="token punctuation">(</span><span class="token string">"New Document"</span><span class="token punctuation">,</span>
                    <span class="token string">"Do you want to create a new document? Current text will be lost."</span><span class="token punctuation">,</span>
                    <span class="token string">"Yes"</span><span class="token punctuation">,</span> <span class="token string">"No"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

                <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span>confirm<span class="token punctuation">)</span> <span class="token keyword">return</span><span class="token punctuation">;</span>
            <span class="token punctuation">}</span>
        <span class="token punctuation">}</span>

        EditorText <span class="token operator">=</span> <span class="token keyword">string</span><span class="token punctuation">.</span>Empty<span class="token punctuation">;</span>
        <span class="token function">UpdateStatus</span><span class="token punctuation">(</span><span class="token string">"New document created"</span><span class="token punctuation">,</span> <span class="token string">"#10B981"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>

    <span class="token punctuation">[</span>RelayCommand<span class="token punctuation">]</span>
    <span class="token keyword">private</span> <span class="token keyword">async</span> Task <span class="token function">SaveTextAsync</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">var</span> page <span class="token operator">=</span> Application<span class="token punctuation">.</span>Current<span class="token operator">?</span><span class="token punctuation">.</span>Windows<span class="token punctuation">.</span><span class="token function">FirstOrDefault</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">?</span><span class="token punctuation">.</span>Page<span class="token punctuation">;</span>
        <span class="token keyword">if</span> <span class="token punctuation">(</span>page <span class="token operator">==</span> <span class="token keyword">null</span><span class="token punctuation">)</span> <span class="token keyword">return</span><span class="token punctuation">;</span>

        <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span>HasText<span class="token punctuation">)</span>
        <span class="token punctuation">{</span>
            <span class="token keyword">await</span> page<span class="token punctuation">.</span><span class="token function">DisplayAlertAsync</span><span class="token punctuation">(</span><span class="token string">"Save"</span><span class="token punctuation">,</span> <span class="token string">"There is no text to save."</span><span class="token punctuation">,</span> <span class="token string">"OK"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
            <span class="token keyword">return</span><span class="token punctuation">;</span>
        <span class="token punctuation">}</span>

        <span class="token keyword">try</span>
        <span class="token punctuation">{</span>
            <span class="token keyword">string</span> fileName <span class="token operator">=</span> $<span class="token string">"VoiceNote_{DateTime.Now:yyyyMMdd_HHmmss}.txt"</span><span class="token punctuation">;</span>
            <span class="token keyword">string</span> filePath <span class="token operator">=</span> Path<span class="token punctuation">.</span><span class="token function">Combine</span><span class="token punctuation">(</span>FileSystem<span class="token punctuation">.</span>AppDataDirectory<span class="token punctuation">,</span> fileName<span class="token punctuation">)</span><span class="token punctuation">;</span>

            <span class="token keyword">await</span> File<span class="token punctuation">.</span><span class="token function">WriteAllTextAsync</span><span class="token punctuation">(</span>filePath<span class="token punctuation">,</span> EditorText<span class="token punctuation">)</span><span class="token punctuation">;</span>

            <span class="token function">UpdateStatus</span><span class="token punctuation">(</span><span class="token string">"Document saved"</span><span class="token punctuation">,</span> <span class="token string">"#10B981"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

            <span class="token keyword">await</span> page<span class="token punctuation">.</span><span class="token function">DisplayAlertAsync</span><span class="token punctuation">(</span><span class="token string">"Saved"</span><span class="token punctuation">,</span> $<span class="token string">"Document saved as {fileName}"</span><span class="token punctuation">,</span> <span class="token string">"OK"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token punctuation">}</span>
        <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">Exception</span> ex<span class="token punctuation">)</span>
        <span class="token punctuation">{</span>
            <span class="token keyword">await</span> page<span class="token punctuation">.</span><span class="token function">DisplayAlertAsync</span><span class="token punctuation">(</span><span class="token string">"Error"</span><span class="token punctuation">,</span> $<span class="token string">"Could not save document: {ex.Message}"</span><span class="token punctuation">,</span> <span class="token string">"OK"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token punctuation">}</span>
    <span class="token punctuation">}</span>

    <span class="token punctuation">[</span>RelayCommand<span class="token punctuation">]</span>
    <span class="token keyword">private</span> <span class="token keyword">async</span> Task <span class="token function">ShareTextAsync</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span>HasText<span class="token punctuation">)</span>
        <span class="token punctuation">{</span>
            <span class="token keyword">if</span> <span class="token punctuation">(</span>Application<span class="token punctuation">.</span>Current<span class="token operator">?</span><span class="token punctuation">.</span>Windows<span class="token punctuation">.</span><span class="token function">FirstOrDefault</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">?</span><span class="token punctuation">.</span>Page <span class="token keyword">is</span> Page page<span class="token punctuation">)</span>
            <span class="token punctuation">{</span>
                <span class="token keyword">await</span> page<span class="token punctuation">.</span><span class="token function">DisplayAlertAsync</span><span class="token punctuation">(</span><span class="token string">"Share"</span><span class="token punctuation">,</span> <span class="token string">"There is no text to share."</span><span class="token punctuation">,</span> <span class="token string">"OK"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
            <span class="token punctuation">}</span>
            <span class="token keyword">return</span><span class="token punctuation">;</span>
        <span class="token punctuation">}</span>

        <span class="token keyword">await</span> Share<span class="token punctuation">.</span>Default<span class="token punctuation">.</span><span class="token function">RequestAsync</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">ShareTextRequest</span>
        <span class="token punctuation">{</span>
            Text <span class="token operator">=</span> EditorText<span class="token punctuation">,</span>
            Title <span class="token operator">=</span> <span class="token string">"Share Voice Note"</span>
        <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>

    <span class="token preprocessor property">#<span class="token directive keyword">endregion</span></span>

    <span class="token preprocessor property">#<span class="token directive keyword">region</span> Helper Methods</span>

    <span class="token keyword">private</span> <span class="token keyword">void</span> <span class="token function">UpdateStatus</span><span class="token punctuation">(</span><span class="token keyword">string</span> text<span class="token punctuation">,</span> <span class="token keyword">string</span><span class="token operator">?</span> colorHex<span class="token punctuation">)</span>
    <span class="token punctuation">{</span>
        StatusText <span class="token operator">=</span> text<span class="token punctuation">;</span>
        StatusColor <span class="token operator">=</span> <span class="token keyword">string</span><span class="token punctuation">.</span><span class="token function">IsNullOrEmpty</span><span class="token punctuation">(</span>colorHex<span class="token punctuation">)</span> <span class="token operator">?</span> Colors<span class="token punctuation">.</span>Gray <span class="token punctuation">:</span> Color<span class="token punctuation">.</span><span class="token function">FromArgb</span><span class="token punctuation">(</span>colorHex<span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>

    <span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">UpdateButtonState</span><span class="token punctuation">(</span>Telerik<span class="token punctuation">.</span>Maui<span class="token punctuation">.</span>SpeechRecognizer<span class="token punctuation">.</span>SpeechRecognizerState state<span class="token punctuation">)</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">switch</span> <span class="token punctuation">(</span>state<span class="token punctuation">)</span>
        <span class="token punctuation">{</span>
            <span class="token keyword">case</span> Telerik<span class="token punctuation">.</span>Maui<span class="token punctuation">.</span>SpeechRecognizer<span class="token punctuation">.</span>SpeechRecognizerState<span class="token punctuation">.</span>Listening<span class="token punctuation">:</span>
                <span class="token function">UpdateStatus</span><span class="token punctuation">(</span><span class="token string">"Listening..."</span><span class="token punctuation">,</span> <span class="token string">"#2563EB"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
                <span class="token keyword">break</span><span class="token punctuation">;</span>
            <span class="token keyword">case</span> Telerik<span class="token punctuation">.</span>Maui<span class="token punctuation">.</span>SpeechRecognizer<span class="token punctuation">.</span>SpeechRecognizerState<span class="token punctuation">.</span>Initializing<span class="token punctuation">:</span>
                <span class="token function">UpdateStatus</span><span class="token punctuation">(</span><span class="token string">"Initializing..."</span><span class="token punctuation">,</span> <span class="token string">"#F59E0B"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
                <span class="token keyword">break</span><span class="token punctuation">;</span>
            <span class="token keyword">default</span><span class="token punctuation">:</span>
                <span class="token function">UpdateStatus</span><span class="token punctuation">(</span><span class="token string">"Ready"</span><span class="token punctuation">,</span> <span class="token keyword">null</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
                <span class="token keyword">break</span><span class="token punctuation">;</span>
        <span class="token punctuation">}</span>
    <span class="token punctuation">}</span>

    <span class="token preprocessor property">#<span class="token directive keyword">endregion</span></span>
<span class="token punctuation">}</span>
</code></pre><p>The above code results in the following application when executed:</p><p><img src="https://d585tldpucybw.cloudfront.net/sfimages/default-source/blogs/2026/2026-03/showing-a-note-taking-app-interface-being-used-through-a-keyboard.gif?sfvrsn=1143ca0e_2" alt="Showing a note-taking app interface being used through a keyboard" /></p><p>In the previous image, you can see the application, which only allows taking notes via the keyboard, which can be tedious, slow and boring. Therefore, we will use the speech-to-text control to improve quick note-taking.</p><h2 id="integrating-the-speechtotextbutton-control-into-the-application">Integrating the SpeechToTextButton Control into the Application</h2><p>The first thing you need to do to use the speech-to-text control is to follow the <a target="_blank" href="https://www.telerik.com/maui-ui/documentation/get-started/first-steps-vs">Telerik .NET MAUI controls installation guide</a>. Once you have done that, add the following namespace in the <code>ContentPage</code> where you want to use the control:</p><pre class=" language-xml"><code class="prism  language-xml">xmlns:telerik="http://schemas.telerik.com/2022/xaml/maui"</code></pre><p>Next, add the control using the <code>RadSpeechToTextButton</code> tag where you want to place it; in our example, it will be located where the <strong>Editor Toolbar</strong> comment is:</p><pre class=" language-xml"><code class="prism  language-xml"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span><span class="token namespace">telerik:</span>RadSpeechToTextButton</span>
    <span class="token attr-name"><span class="token namespace">x:</span>Name</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>SpeechButton<span class="token punctuation">"</span></span>
    <span class="token attr-name">Grid.Column</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>3<span class="token punctuation">"</span></span>
    <span class="token attr-name">VerticalOptions</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>Center<span class="token punctuation">"</span></span> <span class="token punctuation">/&gt;</span></span>
</code></pre><p>Since we will be using the microphone in the app for obtaining the transcription, you need to grant the <a target="_blank" href="https://www.telerik.com/maui-ui/documentation/controls/speechtotextbutton/getting-started#required-permissions">required permissions according to the platform</a> to allow audio recording and voice recognition. For example, for Android, you need to add the following line to <code>AndroidManifest.xml</code>:</p><pre class=" language-xml"><code class="prism  language-xml">&lt;uses-permission android:name="android.permission.RECORD_AUDIO" /&gt;</code></pre><p>The integration of the control provides a button with the necessary functionality to start the speech-to-text process:</p><p><img src="https://d585tldpucybw.cloudfront.net/sfimages/default-source/blogs/2026/2026-03/showing-the-button-that-enables-the-speech-to-text-functionality.gif?sfvrsn=8d2c43db_2" alt="Showing the button that enables the speech-to-text functionality, with the microphone activating automatically" /></p><p>In the image above, you can see that when the button to start recording is pressed, the microphone is automatically activated in the status bar (if it&rsquo;s the first execution, it will likely ask for microphone access), indicating that a recording process has started.</p><p>Now we need to handle the events or commands to obtain the transcription, which we will see next.</p><h2 id="available-events-and-commands-in-the-speech-to-text-control-for-.net-maui">Available Events and Commands in the Speech to Text Control for .NET MAUI</h2><p>The speech to text control has events and commands that we can use to react to different situations. For the events, we have the following available:</p><ul><li><code>SpeechRecognized</code>: This occurs when there is a successful speech recognition and includes an argument <code>SpeechRecognizerSpeechRecognizedEventArgs</code>, which contains the <code>FullText</code> obtained from the recognition and <code>FullTextConfidenceScore</code> indicating the confidence level of the recognition.</li><li><code>ErrorOccurred</code>: This occurs when there is an error in the recognition process, includes the argument <code>SpeechRecognizerErrorOccurredEventArgs</code>, which contains the <code>Message</code> property with the error message, the <code>Exception</code> associated with the error and <code>Handled</code> to determine if the error has been handled.</li><li><code>StateChanged</code>: This is fired as soon as there is a change in the state of the speech recognizer.</li></ul><p>On the other hand, we also have some commands that will allow us to handle events directly from the viewmodel if we need to, as is the case for us. To achieve this, we can modify the label of the <code>RadSpeechToTextButton</code> control by adding the commands <code>SpeechRecognizedCommand</code> and <code>ErrorOccurredCommand</code> as shown in the following example:</p><pre class=" language-xml"><code class="prism  language-xml"> <span class="token comment">&lt;!--  Editor Toolbar  --&gt;</span>
 <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>Border...</span><span class="token punctuation">&gt;</span></span>
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>Grid</span> <span class="token attr-name">ColumnDefinitions</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>*, Auto, Auto, Auto<span class="token punctuation">"</span></span><span class="token punctuation">&gt;</span></span>
        ...
        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span><span class="token namespace">telerik:</span>RadSpeechToTextButton</span>
            <span class="token attr-name"><span class="token namespace">x:</span>Name</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>SpeechButton<span class="token punctuation">"</span></span>
            <span class="token attr-name">Grid.Column</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>3<span class="token punctuation">"</span></span>
            <span class="token attr-name">ErrorOccurredCommand</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>{Binding ErrorOccurredCommand}<span class="token punctuation">"</span></span>
            <span class="token attr-name">SpeechRecognizedCommand</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>{Binding SpeechRecognizedCommand}<span class="token punctuation">"</span></span>
            <span class="token attr-name">VerticalOptions</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>Center<span class="token punctuation">"</span></span> <span class="token punctuation">/&gt;</span></span>
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>Grid</span><span class="token punctuation">&gt;</span></span>
 <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>Border</span><span class="token punctuation">&gt;</span></span>
</code></pre><p>Next, we need to handle the commands from the viewmodel as seen below:</p><pre class=" language-csharp"><code class="prism  language-csharp"><span class="token preprocessor property">#<span class="token directive keyword">region</span> Speech Recognition Commands</span>

<span class="token punctuation">[</span>RelayCommand<span class="token punctuation">]</span>
<span class="token keyword">private</span> <span class="token keyword">void</span> <span class="token function">SpeechRecognized</span><span class="token punctuation">(</span>SpeechToTextButtonSpeechRecognizedCommandContext context<span class="token punctuation">)</span>
<span class="token punctuation">{</span>
    EditorText <span class="token operator">=</span> context<span class="token punctuation">.</span>FullText<span class="token punctuation">;</span>
    <span class="token function">UpdateStatus</span><span class="token punctuation">(</span><span class="token string">"Speech recognized"</span><span class="token punctuation">,</span> <span class="token string">"#10B981"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>

<span class="token punctuation">[</span>RelayCommand<span class="token punctuation">]</span>
<span class="token keyword">private</span> <span class="token keyword">async</span> Task <span class="token function">ErrorOccurredAsync</span><span class="token punctuation">(</span>SpeechToTextButtonErrorOccurredCommandContext context<span class="token punctuation">)</span>
<span class="token punctuation">{</span>
    <span class="token function">UpdateStatus</span><span class="token punctuation">(</span><span class="token string">"Error occurred"</span><span class="token punctuation">,</span> <span class="token string">"#EF4444"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

    <span class="token keyword">if</span> <span class="token punctuation">(</span>Application<span class="token punctuation">.</span>Current<span class="token operator">?</span><span class="token punctuation">.</span>Windows<span class="token punctuation">.</span><span class="token function">FirstOrDefault</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">?</span><span class="token punctuation">.</span>Page <span class="token keyword">is</span> Page page<span class="token punctuation">)</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">await</span> page<span class="token punctuation">.</span><span class="token function">DisplayAlertAsync</span><span class="token punctuation">(</span><span class="token string">"Voice Input Error"</span><span class="token punctuation">,</span>
            $<span class="token string">"Unable to process voice input: {context.Message}"</span><span class="token punctuation">,</span>
            <span class="token string">"OK"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
<span class="token punctuation">}</span>

<span class="token preprocessor property">#<span class="token directive keyword">endregion</span></span>
</code></pre><p>In the previous code, you can see that the commands receive contexts similar to the arguments of the events. The first, <code>SpeechToTextButtonSpeechRecognizedCommandContext</code>, allows obtaining the <code>FullText</code> and <code>FullTextConfidenceScore</code> when there is speech recognition. The second, <code>SpeechToTextButtonErrorOccurredCommandContext</code>, contains the <code>Message</code> and <code>Exception</code> properties when there is an error in the speech recognition.</p><p>You can also see how <code>FullText</code> is assigned to the <code>EditorText</code> property, which is bound to the control of type <code>Editor</code>. This allows the transcription obtained to be displayed in the graphical interface, resulting in the following execution:</p><p><img src="https://d585tldpucybw.cloudfront.net/sfimages/default-source/blogs/2026/2026-03/live-demonstration-of-telerik-speech-to-text-control-for-maui.gif?sfvrsn=a3fc5485_2" alt="Live demonstration of Telerik’s Speech-to-Text control for .NET MAUI, enabling real-time voice transcription" /></p><p>Now we can obtain the transcription; however, there is a need for visual indicators that allow users to know what is happening in the application, and we can solve this through the states of the control. Let&rsquo;s see how.</p><h2 id="states-of-the-speech-to-text-control">States of the Speech-to-Text Control</h2><p>One thing that is appreciated as a developer is that Progress Telerik documentation is very clear regarding the architecture and lifecycle of the .NET MAUI SpeechToTextButton control, as can be seen in the following image:</p><p><img src="https://www.telerik.com/maui-ui/documentation/assets/0b2b21d54845c1079dac37312faab870/speechtotext-architecture.png" alt="Architecture and lifecycle of the SpeechToTextButton control" /></p><p>The diagram above shows us a series of states that we can detect thanks to the <code>StateChanged</code> event as seen below:</p><pre class=" language-xml"><code class="prism  language-xml"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span><span class="token namespace">telerik:</span>RadSpeechToTextButton</span>
    <span class="token attr-name"><span class="token namespace">x:</span>Name</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>SpeechButton<span class="token punctuation">"</span></span>
    <span class="token attr-name">Grid.Column</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>3<span class="token punctuation">"</span></span>
    <span class="token attr-name">ErrorOccurredCommand</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>{Binding ErrorOccurredCommand}<span class="token punctuation">"</span></span>
    <span class="token attr-name">SpeechRecognizedCommand</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>{Binding SpeechRecognizedCommand}<span class="token punctuation">"</span></span>
    <span class="token attr-name">StateChanged</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>OnStateChanged<span class="token punctuation">"</span></span>
    <span class="token attr-name">VerticalOptions</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>Center<span class="token punctuation">"</span></span> <span class="token punctuation">/&gt;</span></span>
</code></pre><p>In the code behind, we can invoke a method from the viewmodel that allows us to determine what to do with the detected state:</p><pre class=" language-csharp"><code class="prism  language-csharp"><span class="token keyword">private</span> <span class="token keyword">void</span> <span class="token function">OnStateChanged</span><span class="token punctuation">(</span><span class="token keyword">object</span> sender<span class="token punctuation">,</span> EventArgs e<span class="token punctuation">)</span>
<span class="token punctuation">{</span>
    <span class="token keyword">if</span> <span class="token punctuation">(</span>sender <span class="token keyword">is</span> RadSpeechToTextButton button<span class="token punctuation">)</span>
    <span class="token punctuation">{</span>
        MainThread<span class="token punctuation">.</span><span class="token function">BeginInvokeOnMainThread</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=</span><span class="token operator">&gt;</span>
        <span class="token punctuation">{</span>
            _viewModel<span class="token punctuation">.</span><span class="token function">UpdateButtonState</span><span class="token punctuation">(</span>button<span class="token punctuation">.</span>State<span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre><p>Within the viewmodel, we will compare the desired state using any of the states defined in the <code>Telerik.Maui.SpeechRecognizer.SpeechRecognizerState</code> enumeration.</p><p>For example, to react to state changes <code>Listening</code> and <code>Initializing</code>, the code would be as follows:</p><pre class=" language-csharp"><code class="prism  language-csharp"><span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">UpdateButtonState</span><span class="token punctuation">(</span>Telerik<span class="token punctuation">.</span>Maui<span class="token punctuation">.</span>SpeechRecognizer<span class="token punctuation">.</span>SpeechRecognizerState state<span class="token punctuation">)</span>
<span class="token punctuation">{</span>        
    <span class="token keyword">switch</span> <span class="token punctuation">(</span>state<span class="token punctuation">)</span>
    <span class="token punctuation">{</span>            
        <span class="token keyword">case</span> Telerik<span class="token punctuation">.</span>Maui<span class="token punctuation">.</span>SpeechRecognizer<span class="token punctuation">.</span>SpeechRecognizerState<span class="token punctuation">.</span>Listening<span class="token punctuation">:</span>
            <span class="token function">UpdateStatus</span><span class="token punctuation">(</span><span class="token string">"Listening..."</span><span class="token punctuation">,</span> <span class="token string">"#2563EB"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
            <span class="token keyword">break</span><span class="token punctuation">;</span>
        <span class="token keyword">case</span> Telerik<span class="token punctuation">.</span>Maui<span class="token punctuation">.</span>SpeechRecognizer<span class="token punctuation">.</span>SpeechRecognizerState<span class="token punctuation">.</span>Initializing<span class="token punctuation">:</span>
            <span class="token function">UpdateStatus</span><span class="token punctuation">(</span><span class="token string">"Initializing..."</span><span class="token punctuation">,</span> <span class="token string">"#F59E0B"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
            <span class="token keyword">break</span><span class="token punctuation">;</span>
        <span class="token keyword">default</span><span class="token punctuation">:</span>
            <span class="token function">UpdateStatus</span><span class="token punctuation">(</span><span class="token string">"Ready"</span><span class="token punctuation">,</span> <span class="token keyword">null</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
            <span class="token keyword">break</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre><p>Finally, in the graphical interface code, we can add visual indicators that provide feedback to the user about the state of the control. In our example, we do this in the comment section <strong>Status Bar</strong>:</p><pre class=" language-xml"><code class="prism  language-xml"><span class="token comment">&lt;!--  Status Bar  --&gt;</span>
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>Border</span>
    <span class="token attr-name">Grid.Row</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>1<span class="token punctuation">"</span></span>
    <span class="token attr-name">Padding</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>16,12<span class="token punctuation">"</span></span>
    <span class="token attr-name">BackgroundColor</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>#F3F4F6<span class="token punctuation">"</span></span>
    <span class="token attr-name">StrokeShape</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>RoundRectangle 12<span class="token punctuation">"</span></span>
    <span class="token attr-name">StrokeThickness</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>0<span class="token punctuation">"</span></span><span class="token punctuation">&gt;</span></span>
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>Grid</span> <span class="token attr-name">ColumnDefinitions</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>Auto, *, Auto<span class="token punctuation">"</span></span><span class="token punctuation">&gt;</span></span>
        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>Ellipse</span>
            <span class="token attr-name">BackgroundColor</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>{Binding StatusColor}<span class="token punctuation">"</span></span>
            <span class="token attr-name">HeightRequest</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>10<span class="token punctuation">"</span></span>
            <span class="token attr-name">VerticalOptions</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>Center<span class="token punctuation">"</span></span>
            <span class="token attr-name">WidthRequest</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>10<span class="token punctuation">"</span></span> <span class="token punctuation">/&gt;</span></span>        
        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>Label</span>
            <span class="token attr-name">Grid.Column</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>1<span class="token punctuation">"</span></span>
            <span class="token attr-name">Margin</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>12,0,0,0<span class="token punctuation">"</span></span>
            <span class="token attr-name">FontSize</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>14<span class="token punctuation">"</span></span>
            <span class="token attr-name">Text</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>{Binding StatusText}<span class="token punctuation">"</span></span>
            <span class="token attr-name">TextColor</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>#374151<span class="token punctuation">"</span></span>
            <span class="token attr-name">VerticalOptions</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>Center<span class="token punctuation">"</span></span> <span class="token punctuation">/&gt;</span></span>
        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>Label</span>
            <span class="token attr-name">Grid.Column</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>2<span class="token punctuation">"</span></span>
            <span class="token attr-name">FontSize</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>12<span class="token punctuation">"</span></span>
            <span class="token attr-name">Text</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>{Binding CharacterCount}<span class="token punctuation">"</span></span>
            <span class="token attr-name">TextColor</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>#9CA3AF<span class="token punctuation">"</span></span>
            <span class="token attr-name">VerticalOptions</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>Center<span class="token punctuation">"</span></span> <span class="token punctuation">/&gt;</span></span>
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>Grid</span><span class="token punctuation">&gt;</span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>Border</span><span class="token punctuation">&gt;</span></span>
</code></pre><p>Once the previous code has been replaced, we will graphically see the state changes, to indicate to users that the component is ready to start transcription, if it is listening to speech or if speech has been recognized correctly:</p><p><img src="https://d585tldpucybw.cloudfront.net/sfimages/default-source/blogs/2026/2026-03/handling-the-state-validation-of-the-speech-to-text-control.gif?sfvrsn=4bfd00e8_2" alt="Handling the state validation of the Speech-to-Text control, providing user feedback about what is happening in the application" /></p><p>In the above image, you can see the state changes in action, according to the actions performed by the user on the speech to text control.</p><h2 id="conclusion">Conclusion</h2><p>Throughout this article, you have been able to learn about the SpeechToTextButton control from Telerik for .NET MAUI applications.</p><p>Implementing this type of component in your mobile applications can greatly simplify the friction that exists with users when it comes to entering lengthy or rapid text, something very trendy today with AI-based apps. I encourage you to try it out and help your users get the most out of your applications.</p><p>If you aren&rsquo;t already using Telerik UI for .NET MAUI, it comes with a free 30-day trial:</p><p><a target="_blank" href="https://www.telerik.com/try/ui-for-maui" class="Btn">Try Now</a></p>]]></content>
  </entry>
  <entry>
    <id>urn:uuid:81ae8790-39c7-475d-9a30-6d8910a1d815</id>
    <title type="text">Getting Started with the BottomSheet Component for .NET MAUI</title>
    <summary type="text">If your mobile app needs a slide-up section to appear from the bottom of the screen, check out the .NET MAUI BottomSheet component.</summary>
    <published>2026-03-23T21:49:40Z</published>
    <updated>2026-04-11T15:57:40Z</updated>
    <author>
      <name>Héctor Pérez </name>
    </author>
    <link rel="alternate" href="https://www.telerik.com/blogs/getting-started-bottomsheet-component-net-maui"/>
    <content type="text"><![CDATA[<p><span class="featured">If your mobile app needs a slide-up section to appear from the bottom of the screen, check out the .NET MAUI BottomSheet component.</span></p><p>In some modern mobile applications, we can see a component called Bottom Sheet in action, which allows the user to slide a section up from the bottom of the application to display actions or information without changing the screen.</p><p>This type of component does not exist as part of the native .NET MAUI controls. Fortunately, the Progress Telerik suite of controls for .NET MAUI offers the <a target="_blank" href="https://www.telerik.com/maui-ui/bottomsheet">.NET MAUI BottomSheet</a> component, which we will analyze during this post. Let&rsquo;s get started!</p><h2 id="discovering-the-telerik-.net-maui-bottomsheet-component-for-.net-maui">Discovering the Telerik .NET MAUI BottomSheet Component for .NET MAUI</h2><p>We will explore different features of the Bottom Sheet component, for which I will show you a window created with XAML code that could well represent a section of a real application. Next, I will show you how to implement the Bottom Sheet control to display selection options to users in the same window.</p><h2 id="creating-an-example-project">Creating an Example Project</h2><p>Suppose we have a project that allows users to order food from restaurants through an application. For the creation of the XAML page, I have used different controls from the Telerik UI for .NET MAUI suite, which enable the quick creation of custom graphical interfaces:</p><pre class=" language-xml"><code class="prism  language-xml"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>Grid</span><span class="token punctuation">&gt;</span></span>
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>Grid.RowDefinitions</span><span class="token punctuation">&gt;</span></span>
        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>RowDefinition</span> <span class="token attr-name">Height</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>.2*<span class="token punctuation">"</span></span> <span class="token punctuation">/&gt;</span></span>
        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>RowDefinition</span> <span class="token attr-name">Height</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>.8*<span class="token punctuation">"</span></span> <span class="token punctuation">/&gt;</span></span>
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>Grid.RowDefinitions</span><span class="token punctuation">&gt;</span></span>

    <span class="token comment">&lt;!--  Header Section  --&gt;</span>
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>VerticalStackLayout</span> <span class="token attr-name">Padding</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>25,25,25,0<span class="token punctuation">"</span></span> <span class="token attr-name">Spacing</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>10<span class="token punctuation">"</span></span><span class="token punctuation">&gt;</span></span>
        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>Label</span>
            <span class="token attr-name">FontAttributes</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>Bold<span class="token punctuation">"</span></span>
            <span class="token attr-name">FontSize</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>12<span class="token punctuation">"</span></span>
            <span class="token attr-name">Text</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>DELIVERY ADDRESS<span class="token punctuation">"</span></span>
            <span class="token attr-name">TextColor</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>White<span class="token punctuation">"</span></span> <span class="token punctuation">/&gt;</span></span>

        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>Grid</span><span class="token punctuation">&gt;</span></span>
            <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>Grid.ColumnDefinitions</span><span class="token punctuation">&gt;</span></span>
                <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>ColumnDefinition</span> <span class="token attr-name">Width</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>*<span class="token punctuation">"</span></span> <span class="token punctuation">/&gt;</span></span>
                <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>ColumnDefinition</span> <span class="token attr-name">Width</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>Auto<span class="token punctuation">"</span></span> <span class="token punctuation">/&gt;</span></span>
            <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>Grid.ColumnDefinitions</span><span class="token punctuation">&gt;</span></span>
            <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>Grid.GestureRecognizers</span><span class="token punctuation">&gt;</span></span>
                <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>TapGestureRecognizer</span> <span class="token attr-name">Tapped</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>OnAddressTapped<span class="token punctuation">"</span></span> <span class="token punctuation">/&gt;</span></span>
            <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>Grid.GestureRecognizers</span><span class="token punctuation">&gt;</span></span>

            <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>Label</span>
                <span class="token attr-name"><span class="token namespace">x:</span>Name</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>CurrentAddressLabel<span class="token punctuation">"</span></span>
                <span class="token attr-name">FontSize</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>16<span class="token punctuation">"</span></span>
                <span class="token attr-name">Text</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>123 Main Street, City<span class="token punctuation">"</span></span>
                <span class="token attr-name">TextColor</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>White<span class="token punctuation">"</span></span>
                <span class="token attr-name">VerticalOptions</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>Center<span class="token punctuation">"</span></span> <span class="token punctuation">/&gt;</span></span>

            <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>Label</span>
                <span class="token attr-name">Grid.Column</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>1<span class="token punctuation">"</span></span>
                <span class="token attr-name">Margin</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>10,0,0,0<span class="token punctuation">"</span></span>
                <span class="token attr-name">FontSize</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>14<span class="token punctuation">"</span></span>
                <span class="token attr-name">Text</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>▼<span class="token punctuation">"</span></span>
                <span class="token attr-name">TextColor</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>White<span class="token punctuation">"</span></span>
                <span class="token attr-name">VerticalOptions</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>Center<span class="token punctuation">"</span></span> <span class="token punctuation">/&gt;</span></span>
        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>Grid</span><span class="token punctuation">&gt;</span></span>

        <span class="token comment">&lt;!--  Search Bar  --&gt;</span>
        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span><span class="token namespace">telerik:</span>RadBorder</span>
            <span class="token attr-name">Padding</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>10<span class="token punctuation">"</span></span>
            <span class="token attr-name">BackgroundColor</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>#6B5BAF<span class="token punctuation">"</span></span>
            <span class="token attr-name">CornerRadius</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>10<span class="token punctuation">"</span></span><span class="token punctuation">&gt;</span></span>
            <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>Grid</span> <span class="token attr-name">ColumnDefinitions</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>Auto,*<span class="token punctuation">"</span></span><span class="token punctuation">&gt;</span></span>
                <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>Label</span>
                    <span class="token attr-name">Margin</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>0,0,10,0<span class="token punctuation">"</span></span>
                    <span class="token attr-name">FontSize</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>16<span class="token punctuation">"</span></span>
                    <span class="token attr-name">Text</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span><span class="token punctuation">"</span></span>
                    <span class="token attr-name">VerticalOptions</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>Center<span class="token punctuation">"</span></span> <span class="token punctuation">/&gt;</span></span>
                <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span><span class="token namespace">telerik:</span>RadEntry</span>
                    <span class="token attr-name"><span class="token namespace">x:</span>Name</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>StoreSearchEntry<span class="token punctuation">"</span></span>
                    <span class="token attr-name">Grid.Column</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>1<span class="token punctuation">"</span></span>
                    <span class="token attr-name">BackgroundColor</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>Transparent<span class="token punctuation">"</span></span>
                    <span class="token attr-name">BorderThickness</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>0<span class="token punctuation">"</span></span>
                    <span class="token attr-name">ClearButtonVisibility</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>WhileEditing<span class="token punctuation">"</span></span>
                    <span class="token attr-name">Placeholder</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>Search a restaurant or dish<span class="token punctuation">"</span></span>
                    <span class="token attr-name">PlaceholderColor</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>#B8B0D0<span class="token punctuation">"</span></span>
                    <span class="token attr-name">TextColor</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>White<span class="token punctuation">"</span></span> <span class="token punctuation">/&gt;</span></span>
            <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>Grid</span><span class="token punctuation">&gt;</span></span>
        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span><span class="token namespace">telerik:</span>RadBorder</span><span class="token punctuation">&gt;</span></span>
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>VerticalStackLayout</span><span class="token punctuation">&gt;</span></span>

    <span class="token comment">&lt;!--  Store List  --&gt;</span>
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span><span class="token namespace">telerik:</span>RadBorder</span>
        <span class="token attr-name">Grid.Row</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>1<span class="token punctuation">"</span></span>
        <span class="token attr-name">Margin</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>0,10,0,0<span class="token punctuation">"</span></span>
        <span class="token attr-name">BackgroundColor</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>#F2F1F6<span class="token punctuation">"</span></span>
        <span class="token attr-name">CornerRadius</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>25,25,0,0<span class="token punctuation">"</span></span><span class="token punctuation">&gt;</span></span>
        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span><span class="token namespace">telerik:</span>RadCollectionView</span>
            <span class="token attr-name"><span class="token namespace">x:</span>Name</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>StoresCollection<span class="token punctuation">"</span></span>
            <span class="token attr-name">Margin</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>15<span class="token punctuation">"</span></span>
            <span class="token attr-name">SelectionChanged</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>OnStoreSelected<span class="token punctuation">"</span></span>
            <span class="token attr-name">SelectionMode</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>Single<span class="token punctuation">"</span></span><span class="token punctuation">&gt;</span></span>
            <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span><span class="token namespace">telerik:</span>RadCollectionView.ItemsLayout</span><span class="token punctuation">&gt;</span></span>
                <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span><span class="token namespace">telerik:</span>CollectionViewLinearLayout</span> <span class="token attr-name">ItemSpacing</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>15<span class="token punctuation">"</span></span> <span class="token punctuation">/&gt;</span></span>
            <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span><span class="token namespace">telerik:</span>RadCollectionView.ItemsLayout</span><span class="token punctuation">&gt;</span></span>
            <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span><span class="token namespace">telerik:</span>RadCollectionView.ItemTemplate</span><span class="token punctuation">&gt;</span></span>
                <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>DataTemplate</span><span class="token punctuation">&gt;</span></span>
                    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>Border</span>
                        <span class="token attr-name">Padding</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>0<span class="token punctuation">"</span></span>
                        <span class="token attr-name">BackgroundColor</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>White<span class="token punctuation">"</span></span>
                        <span class="token attr-name">StrokeShape</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>RoundRectangle 15<span class="token punctuation">"</span></span>
                        <span class="token attr-name">StrokeThickness</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>0<span class="token punctuation">"</span></span><span class="token punctuation">&gt;</span></span>
                        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>Border.Shadow</span><span class="token punctuation">&gt;</span></span>
                            <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>Shadow</span>
                                <span class="token attr-name">Brush</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>#CFD0D4<span class="token punctuation">"</span></span>
                                <span class="token attr-name">Opacity</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>0.5<span class="token punctuation">"</span></span>
                                <span class="token attr-name">Radius</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>10<span class="token punctuation">"</span></span>
                                <span class="token attr-name">Offset</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>5,5<span class="token punctuation">"</span></span> <span class="token punctuation">/&gt;</span></span>
                        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>Border.Shadow</span><span class="token punctuation">&gt;</span></span>
                        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>Grid</span> <span class="token attr-name">Padding</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>0<span class="token punctuation">"</span></span> <span class="token attr-name">RowDefinitions</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>150,Auto<span class="token punctuation">"</span></span><span class="token punctuation">&gt;</span></span>
                            <span class="token comment">&lt;!--  Store Header Image  --&gt;</span>
                            <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>Grid</span><span class="token punctuation">&gt;</span></span>
                                <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>Grid.RowDefinitions</span><span class="token punctuation">&gt;</span></span>
                                    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>RowDefinition</span> <span class="token attr-name">Height</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>.6*<span class="token punctuation">"</span></span> <span class="token punctuation">/&gt;</span></span>
                                    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>RowDefinition</span> <span class="token attr-name">Height</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>.4*<span class="token punctuation">"</span></span> <span class="token punctuation">/&gt;</span></span>
                                <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>Grid.RowDefinitions</span><span class="token punctuation">&gt;</span></span>
                                <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>Grid.ColumnDefinitions</span><span class="token punctuation">&gt;</span></span>
                                    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>ColumnDefinition</span> <span class="token attr-name">Width</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>.4*<span class="token punctuation">"</span></span> <span class="token punctuation">/&gt;</span></span>
                                    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>ColumnDefinition</span> <span class="token attr-name">Width</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>.2*<span class="token punctuation">"</span></span> <span class="token punctuation">/&gt;</span></span>
                                    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>ColumnDefinition</span> <span class="token attr-name">Width</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>.4*<span class="token punctuation">"</span></span> <span class="token punctuation">/&gt;</span></span>
                                <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>Grid.ColumnDefinitions</span><span class="token punctuation">&gt;</span></span>

                                <span class="token comment">&lt;!--  Header Image  --&gt;</span>
                                <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>Image</span>
                                    <span class="token attr-name">Grid.RowSpan</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>2<span class="token punctuation">"</span></span>
                                    <span class="token attr-name">Grid.ColumnSpan</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>3<span class="token punctuation">"</span></span>
                                    <span class="token attr-name">Aspect</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>AspectFill<span class="token punctuation">"</span></span>
                                    <span class="token attr-name">Source</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>{Binding Header}<span class="token punctuation">"</span></span> <span class="token punctuation">/&gt;</span></span>

                                <span class="token comment">&lt;!--  Logo with gradient border  --&gt;</span>
                                <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>Grid</span>
                                    <span class="token attr-name">Grid.Row</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>1<span class="token punctuation">"</span></span>
                                    <span class="token attr-name">Grid.Column</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>0<span class="token punctuation">"</span></span>
                                    <span class="token attr-name">Margin</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>10,0,0,0<span class="token punctuation">"</span></span>
                                    <span class="token attr-name">HeightRequest</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>70<span class="token punctuation">"</span></span>
                                    <span class="token attr-name">HorizontalOptions</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>Start<span class="token punctuation">"</span></span>
                                    <span class="token attr-name">VerticalOptions</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>End<span class="token punctuation">"</span></span>
                                    <span class="token attr-name">WidthRequest</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>70<span class="token punctuation">"</span></span><span class="token punctuation">&gt;</span></span>
                                    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>Border</span>
                                        <span class="token attr-name">HeightRequest</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>65<span class="token punctuation">"</span></span>
                                        <span class="token attr-name">HorizontalOptions</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>Center<span class="token punctuation">"</span></span>
                                        <span class="token attr-name">StrokeShape</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>Ellipse<span class="token punctuation">"</span></span>
                                        <span class="token attr-name">StrokeThickness</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>3<span class="token punctuation">"</span></span>
                                        <span class="token attr-name">WidthRequest</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>65<span class="token punctuation">"</span></span><span class="token punctuation">&gt;</span></span>
                                        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>Border.Stroke</span><span class="token punctuation">&gt;</span></span>
                                            <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>LinearGradientBrush</span> <span class="token attr-name">EndPoint</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>0,1<span class="token punctuation">"</span></span><span class="token punctuation">&gt;</span></span>
                                                <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>GradientStop</span> <span class="token attr-name">Offset</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>0.0<span class="token punctuation">"</span></span> <span class="token attr-name">Color</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>#FEFEEF<span class="token punctuation">"</span></span> <span class="token punctuation">/&gt;</span></span>
                                                <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>GradientStop</span> <span class="token attr-name">Offset</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>0.25<span class="token punctuation">"</span></span> <span class="token attr-name">Color</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>#EBD570<span class="token punctuation">"</span></span> <span class="token punctuation">/&gt;</span></span>
                                                <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>GradientStop</span> <span class="token attr-name">Offset</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>0.5<span class="token punctuation">"</span></span> <span class="token attr-name">Color</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>#FF94C3<span class="token punctuation">"</span></span> <span class="token punctuation">/&gt;</span></span>
                                                <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>GradientStop</span> <span class="token attr-name">Offset</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>0.75<span class="token punctuation">"</span></span> <span class="token attr-name">Color</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>#A573E4<span class="token punctuation">"</span></span> <span class="token punctuation">/&gt;</span></span>
                                                <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>GradientStop</span> <span class="token attr-name">Offset</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>1.0<span class="token punctuation">"</span></span> <span class="token attr-name">Color</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>#A9E2EE<span class="token punctuation">"</span></span> <span class="token punctuation">/&gt;</span></span>
                                            <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>LinearGradientBrush</span><span class="token punctuation">&gt;</span></span>
                                        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>Border.Stroke</span><span class="token punctuation">&gt;</span></span>
                                        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>Image</span>
                                            <span class="token attr-name">Aspect</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>AspectFill<span class="token punctuation">"</span></span>
                                            <span class="token attr-name">HorizontalOptions</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>Center<span class="token punctuation">"</span></span>
                                            <span class="token attr-name">Source</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>{Binding Logo}<span class="token punctuation">"</span></span> <span class="token punctuation">/&gt;</span></span>
                                    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>Border</span><span class="token punctuation">&gt;</span></span>
                                <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>Grid</span><span class="token punctuation">&gt;</span></span>

                                <span class="token comment">&lt;!--  Rating Badge  --&gt;</span>
                                <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>Border</span>
                                    <span class="token attr-name">Grid.Row</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>1<span class="token punctuation">"</span></span>
                                    <span class="token attr-name">Grid.Column</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>2<span class="token punctuation">"</span></span>
                                    <span class="token attr-name">Margin</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>0,0,10,10<span class="token punctuation">"</span></span>
                                    <span class="token attr-name">Padding</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>10,5<span class="token punctuation">"</span></span>
                                    <span class="token attr-name">BackgroundColor</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>#F8F8F7<span class="token punctuation">"</span></span>
                                    <span class="token attr-name">HeightRequest</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>35<span class="token punctuation">"</span></span>
                                    <span class="token attr-name">HorizontalOptions</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>Center<span class="token punctuation">"</span></span>
                                    <span class="token attr-name">StrokeShape</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>RoundRectangle 10<span class="token punctuation">"</span></span>
                                    <span class="token attr-name">StrokeThickness</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>0<span class="token punctuation">"</span></span>
                                    <span class="token attr-name">VerticalOptions</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>End<span class="token punctuation">"</span></span>
                                    <span class="token attr-name">WidthRequest</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>70<span class="token punctuation">"</span></span><span class="token punctuation">&gt;</span></span>
                                    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>HorizontalStackLayout</span>
                                        <span class="token attr-name">HorizontalOptions</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>Center<span class="token punctuation">"</span></span>
                                        <span class="token attr-name">Spacing</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>8<span class="token punctuation">"</span></span>
                                        <span class="token attr-name">VerticalOptions</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>Center<span class="token punctuation">"</span></span><span class="token punctuation">&gt;</span></span>
                                        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>Label</span>
                                            <span class="token attr-name">FontSize</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>14<span class="token punctuation">"</span></span>
                                            <span class="token attr-name">Text</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>⭐<span class="token punctuation">"</span></span>
                                            <span class="token attr-name">VerticalOptions</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>Center<span class="token punctuation">"</span></span> <span class="token punctuation">/&gt;</span></span>
                                        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>Label</span>
                                            <span class="token attr-name">FontAttributes</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>Bold<span class="token punctuation">"</span></span>
                                            <span class="token attr-name">FontSize</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>14<span class="token punctuation">"</span></span>
                                            <span class="token attr-name">Text</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>{Binding Rating}<span class="token punctuation">"</span></span>
                                            <span class="token attr-name">TextColor</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>Black<span class="token punctuation">"</span></span>
                                            <span class="token attr-name">VerticalOptions</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>Center<span class="token punctuation">"</span></span> <span class="token punctuation">/&gt;</span></span>
                                    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>HorizontalStackLayout</span><span class="token punctuation">&gt;</span></span>
                                <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>Border</span><span class="token punctuation">&gt;</span></span>
                            <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>Grid</span><span class="token punctuation">&gt;</span></span>

                            <span class="token comment">&lt;!--  Store Info  --&gt;</span>
                            <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>VerticalStackLayout</span>
                                <span class="token attr-name">Grid.Row</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>1<span class="token punctuation">"</span></span>
                                <span class="token attr-name">Padding</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>15<span class="token punctuation">"</span></span>
                                <span class="token attr-name">Spacing</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>8<span class="token punctuation">"</span></span><span class="token punctuation">&gt;</span></span>
                                <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>Label</span>
                                    <span class="token attr-name">FontAttributes</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>Bold<span class="token punctuation">"</span></span>
                                    <span class="token attr-name">FontSize</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>18<span class="token punctuation">"</span></span>
                                    <span class="token attr-name">Text</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>{Binding Name}<span class="token punctuation">"</span></span>
                                    <span class="token attr-name">TextColor</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>Black<span class="token punctuation">"</span></span> <span class="token punctuation">/&gt;</span></span>

                                <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>Grid</span> <span class="token attr-name">ColumnDefinitions</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>*,*,*<span class="token punctuation">"</span></span><span class="token punctuation">&gt;</span></span>
                                    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>Label</span>
                                        <span class="token attr-name">FontSize</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>13<span class="token punctuation">"</span></span>
                                        <span class="token attr-name">Text</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>{Binding Minimum, StringFormat=<span class="token punctuation">'</span>${0} min<span class="token punctuation">'</span>}<span class="token punctuation">"</span></span>
                                        <span class="token attr-name">TextColor</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>#666666<span class="token punctuation">"</span></span> <span class="token punctuation">/&gt;</span></span>
                                    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>Label</span>
                                        <span class="token attr-name">Grid.Column</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>1<span class="token punctuation">"</span></span>
                                        <span class="token attr-name">FontSize</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>13<span class="token punctuation">"</span></span>
                                        <span class="token attr-name">HorizontalOptions</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>Center<span class="token punctuation">"</span></span>
                                        <span class="token attr-name">Text</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>{Binding ServiceFee, StringFormat=<span class="token punctuation">'</span>Fee: ${0}<span class="token punctuation">'</span>}<span class="token punctuation">"</span></span>
                                        <span class="token attr-name">TextColor</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>#666666<span class="token punctuation">"</span></span> <span class="token punctuation">/&gt;</span></span>
                                    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>Label</span>
                                        <span class="token attr-name">Grid.Column</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>2<span class="token punctuation">"</span></span>
                                        <span class="token attr-name">FontSize</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>13<span class="token punctuation">"</span></span>
                                        <span class="token attr-name">HorizontalOptions</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>End<span class="token punctuation">"</span></span>
                                        <span class="token attr-name">Text</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>{Binding DeliveryTime}<span class="token punctuation">"</span></span>
                                        <span class="token attr-name">TextColor</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>#666666<span class="token punctuation">"</span></span> <span class="token punctuation">/&gt;</span></span>
                                <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>Grid</span><span class="token punctuation">&gt;</span></span>
                            <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>VerticalStackLayout</span><span class="token punctuation">&gt;</span></span>
                        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>Grid</span><span class="token punctuation">&gt;</span></span>
                    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>Border</span><span class="token punctuation">&gt;</span></span>
                <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>DataTemplate</span><span class="token punctuation">&gt;</span></span>
            <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span><span class="token namespace">telerik:</span>RadCollectionView.ItemTemplate</span><span class="token punctuation">&gt;</span></span>
        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span><span class="token namespace">telerik:</span>RadCollectionView</span><span class="token punctuation">&gt;</span></span>
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span><span class="token namespace">telerik:</span>RadBorder</span><span class="token punctuation">&gt;</span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>Grid</span><span class="token punctuation">&gt;</span></span>
</code></pre><p>The result is a beautiful graphical interface that showcases some fictional restaurants, along with additional controls like a search bar and a physical address selector:</p><p><img src="https://d585tldpucybw.cloudfront.net/sfimages/default-source/blogs/2026/2026-03/screenshot-of-a-food-ordering-stores-page-built-using-telerik-ui-components-for-net-maui.png?sfvrsn=7724c601_2" alt="Screenshot of a food ordering stores page built using Telerik UI components for .NET MAUI" /></p><p>In the screenshot above, you can see some Telerik components used, such as the following:</p><ul><li><code>RadEntry</code>: For the store search bar</li><li><code>RadBorder</code>: To enhance the appearance of the search bar and list items</li><li><code>RadCollection</code>: To display the list of stores</li></ul><p>At the top of the app, I have placed a fictional address below the text <strong>Delivery Address</strong>. Ideally, users should be able to select a different delivery address if needed without leaving the current screen. This is an excellent use case for a Bottom Sheet.</p><h2 id="getting-to-know-the-telerik-bottomsheet-component">Getting to Know the Telerik BottomSheet Component</h2><p>To implement the Bottom Sheet component, it&rsquo;s essential to understand that it consists of three parts that we can configure:</p><ul><li><strong>BottomSheet Main Content</strong>: Container for the graphic content that will be visible before displaying the Bottom Sheet.</li><li><strong>BottomSheet Content</strong>: Content that fills the Bottom Sheet and that we will show as options or additional information to the user.</li><li><strong>BottomSheet Handle</strong>: A visual cue that indicates to the user that they can drag the Bottom Sheet.</li></ul><p>You can see the location of each of these parts graphically below:</p><p><img src="https://www.telerik.com/maui-ui/documentation/assets/e969b13abd4921187e78b87b013681f9/bottomsheet-visual-structure.png" alt="Visual structure of a Telerik BottomSheet control for .NET MAUI" /></p><p>Now that we have this information, let&rsquo;s proceed to add a Bottom Sheet to the project.</p><h2 id="adding-the-bottomsheet-component-to-a-.net-maui-project">Adding the BottomSheet Component to a .NET MAUI Project</h2><p>Once we are familiar with the main parts of the Bottom Sheet control, the next step is to migrate the existing UI content into the <strong>BottomSheet Main Content</strong> section, using the <code>Content</code> property as follows:</p><pre class=" language-xml"><code class="prism  language-xml"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span><span class="token namespace">telerik:</span>RadBottomSheet</span> <span class="token attr-name"><span class="token namespace">x:</span>Name</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>AddressBottomSheet<span class="token punctuation">"</span></span><span class="token punctuation">&gt;</span></span>
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span><span class="token namespace">telerik:</span>RadBottomSheet.Content</span><span class="token punctuation">&gt;</span></span>
        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>Grid</span><span class="token punctuation">&gt;</span></span>
            ...
        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>Grid</span><span class="token punctuation">&gt;</span></span>
     <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span><span class="token namespace">telerik:</span>RadBottomSheet.Content</span><span class="token punctuation">&gt;</span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span><span class="token namespace">telerik:</span>RadBottomSheet</span><span class="token punctuation">&gt;</span></span>

</code></pre><p>The above will determine the content over which the Bottom Sheet will appear. Next, we need to specify the <code>BottomSheetContent</code> tag, where we will define the content that will be shown to the user when the Bottom Sheet appears:</p><pre class=" language-xml"><code class="prism  language-xml">    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span><span class="token namespace">telerik:</span>RadBottomSheet</span> <span class="token attr-name"><span class="token namespace">x:</span>Name</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>AddressBottomSheet<span class="token punctuation">"</span></span><span class="token punctuation">&gt;</span></span>
        ...
        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span><span class="token namespace">telerik:</span>RadBottomSheet.BottomSheetContent</span><span class="token punctuation">&gt;</span></span>
            <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>Grid</span>
                <span class="token attr-name">Padding</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>20,20,20,60<span class="token punctuation">"</span></span>
                <span class="token attr-name">RowDefinitions</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>Auto,Auto,*,Auto<span class="token punctuation">"</span></span>
                <span class="token attr-name">RowSpacing</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>15<span class="token punctuation">"</span></span><span class="token punctuation">&gt;</span></span>

                <span class="token comment">&lt;!--  Header  --&gt;</span>
                <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>Grid</span> <span class="token attr-name">ColumnDefinitions</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>*,Auto<span class="token punctuation">"</span></span><span class="token punctuation">&gt;</span></span>
                    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>VerticalStackLayout</span><span class="token punctuation">&gt;</span></span>
                        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>Label</span>
                            <span class="token attr-name">FontAttributes</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>Bold<span class="token punctuation">"</span></span>
                            <span class="token attr-name">FontSize</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>22<span class="token punctuation">"</span></span>
                            <span class="token attr-name">Text</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span> Delivery Address<span class="token punctuation">"</span></span>
                            <span class="token attr-name">TextColor</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>#333333<span class="token punctuation">"</span></span> <span class="token punctuation">/&gt;</span></span>
                        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>Label</span>
                            <span class="token attr-name">Margin</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>0,5,0,0<span class="token punctuation">"</span></span>
                            <span class="token attr-name">FontSize</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>13<span class="token punctuation">"</span></span>
                            <span class="token attr-name">Text</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>Select or add a new delivery address<span class="token punctuation">"</span></span>
                            <span class="token attr-name">TextColor</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>#888888<span class="token punctuation">"</span></span> <span class="token punctuation">/&gt;</span></span>
                    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>VerticalStackLayout</span><span class="token punctuation">&gt;</span></span>
                    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span><span class="token namespace">telerik:</span>RadTemplatedButton</span>
                        <span class="token attr-name">Grid.Column</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>1<span class="token punctuation">"</span></span>
                        <span class="token attr-name">BackgroundColor</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>Transparent<span class="token punctuation">"</span></span>
                        <span class="token attr-name">Clicked</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>OnCloseBottomSheet<span class="token punctuation">"</span></span>
                        <span class="token attr-name">Content</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>✕<span class="token punctuation">"</span></span>
                        <span class="token attr-name">CornerRadius</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>20<span class="token punctuation">"</span></span>
                        <span class="token attr-name">FontSize</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>20<span class="token punctuation">"</span></span>
                        <span class="token attr-name">HeightRequest</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>40<span class="token punctuation">"</span></span>
                        <span class="token attr-name">TextColor</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>#666666<span class="token punctuation">"</span></span>
                        <span class="token attr-name">WidthRequest</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>40<span class="token punctuation">"</span></span> <span class="token punctuation">/&gt;</span></span>
                <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>Grid</span><span class="token punctuation">&gt;</span></span>

                <span class="token comment">&lt;!--  Search Address  --&gt;</span>
                <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span><span class="token namespace">telerik:</span>RadBorder</span>
                    <span class="token attr-name">Grid.Row</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>1<span class="token punctuation">"</span></span>
                    <span class="token attr-name">Padding</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>12<span class="token punctuation">"</span></span>
                    <span class="token attr-name">BackgroundColor</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>#EAEAEA<span class="token punctuation">"</span></span>
                    <span class="token attr-name">CornerRadius</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>12<span class="token punctuation">"</span></span><span class="token punctuation">&gt;</span></span>
                    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>Grid</span> <span class="token attr-name">ColumnDefinitions</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>Auto,*<span class="token punctuation">"</span></span><span class="token punctuation">&gt;</span></span>
                        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>Label</span>
                            <span class="token attr-name">Margin</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>0,0,10,0<span class="token punctuation">"</span></span>
                            <span class="token attr-name">FontSize</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>16<span class="token punctuation">"</span></span>
                            <span class="token attr-name">Text</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span><span class="token punctuation">"</span></span>
                            <span class="token attr-name">VerticalOptions</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>Center<span class="token punctuation">"</span></span> <span class="token punctuation">/&gt;</span></span>
                        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span><span class="token namespace">telerik:</span>RadEntry</span>
                            <span class="token attr-name"><span class="token namespace">x:</span>Name</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>AddressSearchEntry<span class="token punctuation">"</span></span>
                            <span class="token attr-name">Grid.Column</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>1<span class="token punctuation">"</span></span>
                            <span class="token attr-name">BackgroundColor</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>Transparent<span class="token punctuation">"</span></span>
                            <span class="token attr-name">Placeholder</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>Search your addresses...<span class="token punctuation">"</span></span>
                            <span class="token attr-name">PlaceholderColor</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>#999999<span class="token punctuation">"</span></span>
                            <span class="token attr-name">BorderThickness</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>0<span class="token punctuation">"</span></span>
                            <span class="token attr-name">ClearButtonVisibility</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>WhileEditing<span class="token punctuation">"</span></span>
                            <span class="token attr-name">TextChanged</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>OnAddressSearchTextChanged<span class="token punctuation">"</span></span> <span class="token punctuation">/&gt;</span></span>
                    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>Grid</span><span class="token punctuation">&gt;</span></span>
                <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span><span class="token namespace">telerik:</span>RadBorder</span><span class="token punctuation">&gt;</span></span>

                <span class="token comment">&lt;!--  Address List --&gt;</span>
                <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span><span class="token namespace">telerik:</span>RadCollectionView</span>
                    <span class="token attr-name"><span class="token namespace">x:</span>Name</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>AddressesCollectionView<span class="token punctuation">"</span></span>
                    <span class="token attr-name">Grid.Row</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>2<span class="token punctuation">"</span></span>
                    <span class="token attr-name">SelectionChanged</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>OnAddressSelectionChanged<span class="token punctuation">"</span></span>
                    <span class="token attr-name">SelectionMode</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>Single<span class="token punctuation">"</span></span><span class="token punctuation">&gt;</span></span>
                    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span><span class="token namespace">telerik:</span>RadCollectionView.ItemsLayout</span><span class="token punctuation">&gt;</span></span>
                        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span><span class="token namespace">telerik:</span>CollectionViewLinearLayout</span> <span class="token attr-name">ItemSpacing</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>10<span class="token punctuation">"</span></span> <span class="token punctuation">/&gt;</span></span>
                    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span><span class="token namespace">telerik:</span>RadCollectionView.ItemsLayout</span><span class="token punctuation">&gt;</span></span>
                    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span><span class="token namespace">telerik:</span>RadCollectionView.ItemTemplate</span><span class="token punctuation">&gt;</span></span>
                        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>DataTemplate</span><span class="token punctuation">&gt;</span></span>
                            <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>Border</span><span class="token style-attr language-css"><span class="token attr-name"> <span class="token attr-name">Style</span></span><span class="token punctuation">="</span><span class="token attr-value"><span class="token punctuation">{</span>StaticResource AddressItemStyle<span class="token punctuation">}</span></span><span class="token punctuation">"</span></span><span class="token punctuation">&gt;</span></span>
                                <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>Grid</span> <span class="token attr-name">ColumnDefinitions</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>*,Auto<span class="token punctuation">"</span></span> <span class="token attr-name">ColumnSpacing</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>12<span class="token punctuation">"</span></span><span class="token punctuation">&gt;</span></span>
                                    <span class="token comment">&lt;!--  Address Details  --&gt;</span>
                                    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>VerticalStackLayout</span> <span class="token attr-name">Spacing</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>2<span class="token punctuation">"</span></span> <span class="token attr-name">VerticalOptions</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>Center<span class="token punctuation">"</span></span><span class="token punctuation">&gt;</span></span>
                                        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>Label</span>
                                            <span class="token attr-name">FontAttributes</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>Bold<span class="token punctuation">"</span></span>
                                            <span class="token attr-name">FontSize</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>15<span class="token punctuation">"</span></span>
                                            <span class="token attr-name">Text</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>{Binding Label}<span class="token punctuation">"</span></span>
                                            <span class="token attr-name">TextColor</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>#333333<span class="token punctuation">"</span></span> <span class="token punctuation">/&gt;</span></span>
                                        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>Label</span>
                                            <span class="token attr-name">FontSize</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>13<span class="token punctuation">"</span></span>
                                            <span class="token attr-name">LineBreakMode</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>TailTruncation<span class="token punctuation">"</span></span>
                                            <span class="token attr-name">Text</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>{Binding FullAddress}<span class="token punctuation">"</span></span>
                                            <span class="token attr-name">TextColor</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>#888888<span class="token punctuation">"</span></span> <span class="token punctuation">/&gt;</span></span>
                                    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>VerticalStackLayout</span><span class="token punctuation">&gt;</span></span>

                                    <span class="token comment">&lt;!--  Selection Indicator  --&gt;</span>
                                    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>Border</span>
                                        <span class="token attr-name">Grid.Column</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>1<span class="token punctuation">"</span></span>
                                        <span class="token attr-name">BackgroundColor</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>{Binding SelectionColor}<span class="token punctuation">"</span></span>
                                        <span class="token attr-name">HeightRequest</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>24<span class="token punctuation">"</span></span>
                                        <span class="token attr-name">Stroke</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>{Binding SelectionBorderColor}<span class="token punctuation">"</span></span>
                                        <span class="token attr-name">StrokeShape</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>RoundRectangle 12<span class="token punctuation">"</span></span>
                                        <span class="token attr-name">StrokeThickness</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>2<span class="token punctuation">"</span></span>
                                        <span class="token attr-name">VerticalOptions</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>Center<span class="token punctuation">"</span></span>
                                        <span class="token attr-name">WidthRequest</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>24<span class="token punctuation">"</span></span><span class="token punctuation">&gt;</span></span>
                                        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>Label</span>
                                            <span class="token attr-name">FontSize</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>14<span class="token punctuation">"</span></span>
                                            <span class="token attr-name">HorizontalOptions</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>Center<span class="token punctuation">"</span></span>
                                            <span class="token attr-name">Text</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>{Binding CheckMark}<span class="token punctuation">"</span></span>
                                            <span class="token attr-name">TextColor</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>White<span class="token punctuation">"</span></span>
                                            <span class="token attr-name">VerticalOptions</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>Center<span class="token punctuation">"</span></span> <span class="token punctuation">/&gt;</span></span>
                                    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>Border</span><span class="token punctuation">&gt;</span></span>
                                <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>Grid</span><span class="token punctuation">&gt;</span></span>
                            <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>Border</span><span class="token punctuation">&gt;</span></span>
                        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>DataTemplate</span><span class="token punctuation">&gt;</span></span>
                    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span><span class="token namespace">telerik:</span>RadCollectionView.ItemTemplate</span><span class="token punctuation">&gt;</span></span>
                <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span><span class="token namespace">telerik:</span>RadCollectionView</span><span class="token punctuation">&gt;</span></span>

                <span class="token comment">&lt;!--  Action Buttons  --&gt;</span>
                <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>VerticalStackLayout</span> <span class="token attr-name">Grid.Row</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>3<span class="token punctuation">"</span></span> <span class="token attr-name">Spacing</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>12<span class="token punctuation">"</span></span><span class="token punctuation">&gt;</span></span>
                    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span><span class="token namespace">telerik:</span>RadButton</span>
                        <span class="token attr-name"><span class="token namespace">x:</span>Name</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>SelectAddressButton<span class="token punctuation">"</span></span>
                        <span class="token attr-name">BackgroundColor</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>#FB7647<span class="token punctuation">"</span></span>
                        <span class="token attr-name">Clicked</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>OnSelectAddressClicked<span class="token punctuation">"</span></span>
                        <span class="token attr-name">CornerRadius</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>12<span class="token punctuation">"</span></span>
                        <span class="token attr-name">FontAttributes</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>Bold<span class="token punctuation">"</span></span>
                        <span class="token attr-name">HeightRequest</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>54<span class="token punctuation">"</span></span>
                        <span class="token attr-name">IsEnabled</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>False<span class="token punctuation">"</span></span>
                        <span class="token attr-name">Text</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>Select Address<span class="token punctuation">"</span></span>
                        <span class="token attr-name">TextColor</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>White<span class="token punctuation">"</span></span> <span class="token punctuation">/&gt;</span></span>
                    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span><span class="token namespace">telerik:</span>RadButton</span>
                        <span class="token attr-name">BackgroundColor</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>#4F3F9B<span class="token punctuation">"</span></span>
                        <span class="token attr-name">Clicked</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>OnAddNewAddressClicked<span class="token punctuation">"</span></span>
                        <span class="token attr-name">CornerRadius</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>12<span class="token punctuation">"</span></span>
                        <span class="token attr-name">FontAttributes</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>Bold<span class="token punctuation">"</span></span>
                        <span class="token attr-name">HeightRequest</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>54<span class="token punctuation">"</span></span>
                        <span class="token attr-name">Text</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>Add new address<span class="token punctuation">"</span></span>
                        <span class="token attr-name">TextColor</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>White<span class="token punctuation">"</span></span> <span class="token punctuation">/&gt;</span></span>
                <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>VerticalStackLayout</span><span class="token punctuation">&gt;</span></span>
            <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>Grid</span><span class="token punctuation">&gt;</span></span>            
        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span><span class="token namespace">telerik:</span>RadBottomSheet.BottomSheetContent</span><span class="token punctuation">&gt;</span></span>
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span><span class="token namespace">telerik:</span>RadBottomSheet</span><span class="token punctuation">&gt;</span></span>        
</code></pre><p>With the above code, we have prepared the Bottom Sheet content to be displayed to the user when we indicate it.</p><h2 id="showing-the-bottomsheet-to-the-user">Showing the BottomSheet to the User</h2><p>Once we have the content of the Bottom Sheet ready, the next step is to display it.</p><p>There are several ways to achieve this; we will use the method <code>GoToBottomSheetState</code>, which allows for transitioning to a specific state. A state refers to how much screen space the Bottom Sheet will occupy, with possible values being <code>Hidden</code> (default), <code>Minimal</code> (25%), <code>Partial</code> (50%) and <code>Full</code> (90%). It is also possible to create <a target="_blank" href="https://www.telerik.com/maui-ui/documentation/controls/bottomsheet/configuration#custom-states">custom states</a>.</p><p>Knowing the above, in my example I will use the <code>TapGestureRecognizer</code>, which is part of the container that displays the current address, to show the Bottom Sheet from there:</p><pre class=" language-csharp"><code class="prism  language-csharp"><span class="token keyword">private</span> <span class="token keyword">void</span> <span class="token function">OnAddressTapped</span><span class="token punctuation">(</span><span class="token keyword">object</span> sender<span class="token punctuation">,</span> EventArgs e<span class="token punctuation">)</span>
<span class="token punctuation">{</span>
   AddressBottomSheet<span class="token punctuation">.</span><span class="token function">GoToBottomSheetState</span><span class="token punctuation">(</span>BottomSheetState<span class="token punctuation">.</span>FullState<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
</code></pre><p>In the same way that the Bottom Sheet can be shown at will, it can also be hidden using the same method, <code>GoToBottomSheetState</code>:</p><pre class=" language-csharp"><code class="prism  language-csharp"><span class="token keyword">private</span> <span class="token keyword">void</span> <span class="token function">OnCloseBottomSheet</span><span class="token punctuation">(</span><span class="token keyword">object</span> sender<span class="token punctuation">,</span> EventArgs e<span class="token punctuation">)</span>
<span class="token punctuation">{</span>
   AddressBottomSheet<span class="token punctuation">.</span><span class="token function">GoToBottomSheetState</span><span class="token punctuation">(</span>BottomSheetState<span class="token punctuation">.</span>HiddenState<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
</code></pre><p>The execution of the above changes results in the following:</p><p><img src="https://d585tldpucybw.cloudfront.net/sfimages/default-source/blogs/2026/2026-03/bottomsheet-control-in-action-allowing-users-to-select-a-different-delivery-address-for-an-order.gif?sfvrsn=2e2648cc_2" alt="BottomSheet control in action, allowing users to select a different delivery address for an order" /></p><p>In the image above, you can see how it is possible to select a different address thanks to the use of the Bottom Sheet, with a spectacular appearance, all without leaving the current window.</p><h2 id="customizing-the-bottom-sheet">Customizing the Bottom Sheet</h2><p>The Telerik BottomSheet control for .NET MAUI offers several properties that allow for the customization of the control. For example, the property <code>Width</code> allows you to specify the horizontal space that the Bottom Sheet will occupy, either through an absolute value or a percentage:</p><p><img src="https://www.telerik.com/maui-ui/documentation/assets/857c771af2dd2af7a4d8c510d3ddd8a0/bottomsheet-width.gif" alt="Demonstration of horizontal size adjustment of the Bottom Sheet using the Width property" /></p><p>Similarly, if you want to prevent the user from dragging up or down on the BottomSheet Handle, you can configure the property <code>IsSwipeEnabled</code> with a value <code>false</code>.</p><p>In addition, it is also possible to modify the animation of the Bottom Sheet, enabling or disabling it with the property <code>IsAnimationEnabled</code>, and adjusting both the duration of the animation and the easing function used through the properties <code>AnimationDuration</code> and <code>AnimationEasing</code>.</p><p>You can also change features such as the border, corner radius and background color of the Bottom Sheet through the property <code>BottomSheetContentStyle</code>. Additionally, you can modify the properties of the BottomSheet Handle using the property <code>HandleStyle</code>.</p><p>Below, I show you an example of the aforementioned properties applied to the Bottom Sheet:</p><pre class=" language-xml"><code class="prism  language-xml">
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>ContentPage...</span><span class="token punctuation">&gt;</span></span>

    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>ContentPage.Resources</span><span class="token punctuation">&gt;</span></span>
        <span class="token comment">&lt;!--  BottomSheet Content Style  --&gt;</span>
        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>Style</span> <span class="token attr-name"><span class="token namespace">x:</span>Key</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>BottomSheetContentStyle<span class="token punctuation">"</span></span> <span class="token attr-name">TargetType</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>telerik:BottomSheetContentView<span class="token punctuation">"</span></span><span class="token punctuation">&gt;</span></span><span class="token style language-css">
            &lt;Setter Property=<span class="token string">"BackgroundColor"</span> Value=<span class="token string">"#F7F7F7"</span> /&gt;
            &lt;Setter Property=<span class="token string">"CornerRadius"</span> Value=<span class="token string">"25,25,0,0"</span> /&gt;
            &lt;Setter Property=<span class="token string">"BorderColor"</span> Value=<span class="token string">"#4F3F9B"</span> /&gt;
            &lt;Setter Property=<span class="token string">"BorderThickness"</span> Value=<span class="token string">"5"</span> /&gt;
        </span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>Style</span><span class="token punctuation">&gt;</span></span>

        <span class="token comment">&lt;!--  BottomSheet Handle Style  --&gt;</span>
        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>Style</span> <span class="token attr-name"><span class="token namespace">x:</span>Key</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>HandleStyle<span class="token punctuation">"</span></span> <span class="token attr-name">TargetType</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>telerik:BottomSheetHandle<span class="token punctuation">"</span></span><span class="token punctuation">&gt;</span></span><span class="token style language-css">
            &lt;Setter Property=<span class="token string">"BackgroundColor"</span> Value=<span class="token string">"#4F3F9B"</span> /&gt;
            &lt;Setter Property=<span class="token string">"HeightRequest"</span> Value=<span class="token string">"5"</span> /&gt;
            &lt;Setter Property=<span class="token string">"WidthRequest"</span> Value=<span class="token string">"60"</span> /&gt;
            &lt;Setter Property=<span class="token string">"CornerRadius"</span> Value=<span class="token string">"3"</span> /&gt;
        </span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>Style</span><span class="token punctuation">&gt;</span></span>
        ...
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>ContentPage.Resources</span><span class="token punctuation">&gt;</span></span>

    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span><span class="token namespace">telerik:</span>RadBottomSheet</span>
        <span class="token attr-name"><span class="token namespace">x:</span>Name</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>AddressBottomSheet<span class="token punctuation">"</span></span>
        <span class="token attr-name">AnimationDuration</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>300<span class="token punctuation">"</span></span>
        <span class="token attr-name">AnimationEasing</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>{x:Static Easing.CubicOut}<span class="token punctuation">"</span></span>
        <span class="token attr-name">BottomSheetContent</span><span class="token style-attr language-css"><span class="token attr-name"><span class="token attr-name">Style</span></span><span class="token punctuation">="</span><span class="token attr-value"><span class="token punctuation">{</span>StaticResource BottomSheetContentStyle<span class="token punctuation">}</span></span><span class="token punctuation">"</span></span>
        <span class="token attr-name">BottomSheetContentWidth</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>100%<span class="token punctuation">"</span></span>
        <span class="token attr-name">Handle</span><span class="token style-attr language-css"><span class="token attr-name"><span class="token attr-name">Style</span></span><span class="token punctuation">="</span><span class="token attr-value"><span class="token punctuation">{</span>StaticResource HandleStyle<span class="token punctuation">}</span></span><span class="token punctuation">"</span></span>
        <span class="token attr-name">IsAnimationEnabled</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>True<span class="token punctuation">"</span></span>
        <span class="token attr-name">IsSwipeEnabled</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>True<span class="token punctuation">"</span></span>
        <span class="token attr-name">State</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>Hidden<span class="token punctuation">"</span></span>
        <span class="token attr-name">StateChanging</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>OnBottomSheetStateChanging<span class="token punctuation">"</span></span><span class="token punctuation">&gt;</span></span>
        ...
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span><span class="token namespace">telerik:</span>RadBottomSheet</span><span class="token punctuation">&gt;</span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>ContentPage</span><span class="token punctuation">&gt;</span></span>    
</code></pre><p>The result of executing with the previous changes applied provides greater customization of the Bottom Sheet:</p><p><img src="https://d585tldpucybw.cloudfront.net/sfimages/default-source/blogs/2026/2026-03/customization-of-the-bottom-sheet-and-the-bottom-sheet-handle.png?sfvrsn=96d75829_2" alt="Customization of the Bottom Sheet and the Bottom Sheet handle" /></p><p>With this, we achieve a visual improvement that better centers the user on the content of the Bottom Sheet.</p><h2 id="conclusion">Conclusion</h2><p>Throughout this article, you have learned about the BottomSheet component of the Telerik UI for .NET MAUI control suite, understanding its purpose and how to customize it to show users additional options without leaving the current screen.</p><p>Undoubtedly, adding this type of component to your applications can enhance the user experience by allowing them to perform quick actions or obtain information easily.</p><p>Want to try this out for yourself? Telerik UI for Blazor comes with a free 30-day trial. </p><p><a href="https://www.telerik.com/try/ui-for-maui" target="_blank" class="Btn">Download Now</a></p>]]></content>
  </entry>
  <entry>
    <id>urn:uuid:5b2a3c79-efa5-4bc4-b24c-1cd5b9ea13e5</id>
    <title type="text">Accessibility (A11y) in .NET MAUI: What It Is and How to Implement It</title>
    <summary type="text">It’s time to add accessibility into the early stages of your .NET MAUI development cycle. The POUR principles can help.</summary>
    <published>2026-03-16T18:26:50Z</published>
    <updated>2026-04-11T15:57:40Z</updated>
    <author>
      <name>Leomaris Reyes </name>
    </author>
    <link rel="alternate" href="https://www.telerik.com/blogs/accessibility-net-maui-what-how-to-implement"/>
    <content type="text"><![CDATA[<p><span class="featured">It&rsquo;s time to add accessibility into the early stages of your .NET MAUI development cycle. The POUR principles can help.</span></p><p>Developing applications that can be used by everyone is a goal that any app should keep in mind. When I say &ldquo;for everyone,&rdquo; I mean that our applications should be able to communicate a clear and understandable purpose, so that people with or without disabilities can use them without issues. In other words, it&rsquo;s not just about &ldquo;making it work,&rdquo; nor about limiting it to a single way of use (such as only being understandable if you can read the buttons).</p><p>You&rsquo;ve probably heard the term <strong>A11y,</strong> and maybe you&rsquo;ve stopped to think&hellip; What does it mean?  A11y refers to the <strong>accessibility</strong> of our applications. While it&rsquo;s much more common to hear this term in the web space, mobile applications should also take it into account to offer a better product.</p><p>In this article, you&rsquo;ll learn more about accessibility, some guidelines you can follow to apply it correctly in <strong>.NET MAUI</strong>, the aspects you should start paying attention to and why <strong>A11y is not an extra</strong>, but a fundamental part of the quality of a well-built application.</p><h2 id="let’s-talk-more-about-a11y">Let&rsquo;s Talk More About A11y</h2><p><strong>A11y</strong> is an abbreviated form of the word <strong>accessibility</strong>, and its goal is to allow people with or without visual, auditory, motor or cognitive disabilities to use your apps. A11Y is a type of abbreviation very common in technology, and it is known as a <strong>numeronym.</strong></p><p><img src="https://d585tldpucybw.cloudfront.net/sfimages/default-source/blogs/2026/2026-03/01_accessibilitysample.png?sfvrsn=2429b72_2" alt="A c c e s s i b i l i t y : Diagram showing why ‘Accessibility’ is abbreviated as A11y, with 11 letters between A and Y." /></p><p>It works as follows:</p><ul><li><strong>A:</strong> is the first letter of the word.</li><li><strong>11:</strong> is the number of characters that come after the first letter and before the last one. In Accessibility, specifically in &ldquo;ccessibilit,&rdquo; there are 11 letters.</li><li><strong>Y:</strong> is the last letter of the word.</li></ul><p>That&rsquo;s why it is abbreviated as: <strong>A11y.</strong> This method makes it much more convenient to write long terms in a faster way and helps standardize lengthy terminology.</p><h2 id="how-can-we-apply-a11y-in-our-apps">How Can We Apply A11y in Our Apps?</h2><p>To implement this in our applications, there are accessibility guidelines such as <strong>WCAG,</strong> which instruct us on how to adapt the tools that mobile devices already provide so they can work together with our apps.</p><p>The <strong><a target="_blank" href="https://www.w3.org/TR/WCAG22/">Web Content Accessibility Guidelines (WCAG)</a></strong> are a set of international guidelines created by the <strong>World Wide Web Consortium (W3C).</strong> Although web is part of their name, I always recommend applying these practices to all types of applications, including mobile. Our users will thank us for it.</p><p>In fact, the official documentation states the following:</p><blockquote><p>&ldquo;These guidelines address accessibility of web content on any kind of device (including desktops, laptops, kiosks, and mobile devices).&rdquo;</p></blockquote><p>The WCAG are built on <strong>four fundamental principles,</strong> known as <strong>POUR.</strong> WCAG defines what an application must comply with to be accessible, while POUR helps us understand how to think about accessibility from a development perspective.</p><p>These four criteria that make up <strong>POUR</strong> are:</p><ul><li><strong>P</strong>erceivable</li><li><strong>O</strong>perable</li><li><strong>U</strong>nderstandable</li><li><strong>R</strong>obust</li></ul><p>Let&rsquo;s take a closer look at <strong>POUR</strong>&mdash;what each principle means and some examples of how we can translate them into our <strong>.NET MAUI</strong> applications:</p><h2 id="perceivable">Perceivable</h2><p>This principle indicates that all the information in the app (including text and UI components) must be <strong>perceivable by the user</strong>, regardless of how they interact with the device. In other words, our app should not be based solely on visual information.</p><p>This is especially important for users who:</p><ul><li>Use screen readers such as <strong>TalkBack</strong> or <strong>VoiceOver</strong></li><li>Have low vision or use larger text sizes</li></ul><p>In <strong>.NET MAUI</strong>, we have <strong>SemanticProperties</strong>, which help us a lot with this aspect.</p><p> Semantic properties are the Microsoft-recommended approach in .NET MAUI to provide accessibility values in applications. This allows us to add a description to our visual elements so that they can be read by the screen reader.</p><p>Additionally, I recommend exploring <strong><a target="_blank" href="https://www.telerik.com/blogs/exploring-semanticorderview-net-maui-community-toolkit">SemanticOrderView</a></strong>. While the individual reading of each visual element is important, being able to provide the user with a <strong>reading order</strong> so that this reading is coherent greatly enhances a good user experience. For this, we can use <strong>SemanticOrderView</strong> from the <strong>.NET MAUI Community Toolkit</strong>.</p><p>Let&rsquo;s explore some examples of implementing the Percievable principle in .NET MAUI:</p><h3 id="alternative-text-for-images-and-icons">Alternative Text for Images and Icons</h3><p>Images and icons are very common in mobile apps, but for a screen reader, an image without a description is <strong>100% invisible</strong>. That&rsquo;s why it&rsquo;s recommended to tell the screen reader that there is something there and <strong>what it should read</strong>.</p><p>In the following example, you can see the <strong>warning.png</strong> image used in the UI. When navigating the app with VoiceOver or TalkBack, this image will be announced as &ldquo;Warning icon.&rdquo; For this reason, I recommend being as specific as possible when defining its description.</p><pre class=" language-xml"><code class="prism  language-xml">&lt;Image Source="warning.png"
 SemanticProperties.Description="Warning icon" /&gt;
</code></pre><h3 id="what-about-decorative-images">What About Decorative Images?</h3><p>Not all images provide information. In these cases, we can <strong>remove them from the accessibility tree</strong> so the screen reader ignores them (meaning it won&rsquo;t read them):</p><pre class=" language-xml"><code class="prism  language-xml">&lt;Image Source="divider.png"
 AutomationProperties.IsInAccessibleTree="False" /&gt;
</code></pre><p>This helps keep the experience cleaner and prevents the screen reader from reading unnecessary elements.</p><h3 id="headings">Headings</h3><p>Screen readers don&rsquo;t just &ldquo;read in order&rdquo; and stop there; they also allow users to <strong>navigate by sections</strong>. For this reason, it&rsquo;s important to mark titles or main sections as <strong>semantic headings</strong>.</p><pre class=" language-xml"><code class="prism  language-xml">&lt;Label Text="Payment Settings" 
 FontSize="24" 
 SemanticProperties.HeadingLevel="Level1" /&gt;
</code></pre><p>This way, the screen reader recognizes this element as a heading and makes navigation within the screen much easier.</p><h3 id="supporting-scalable-text">Supporting Scalable Text</h3><p>In addition to screen readers, there is also a significant number of users with low vision. You may have noticed that some people use very large text on their phones; that&rsquo;s probably why.</p><p>As developers, we can contribute to making our app more accessible by allowing it to adapt to the text size users feel most comfortable with.</p><p>For this, in .NET MAUI we have <strong>FontAutoScalingEnabled</strong>, a property that allows the text in our app to automatically scale according to the system preferences.</p><pre class=" language-xml"><code class="prism  language-xml">&lt;Label Text="Payment Settings" 
 FontSize="24" 
 FontAutoScalingEnabled="True" /&gt;
</code></pre><p>With this, if the user increases the text size from the device settings, the Label will scale accordingly, improving readability and aligning with the <strong>Perceivable</strong> principle.</p><h2 id="operable">Operable</h2><p>The Operable principle states that users must be able to interact with the app without difficulty, regardless of the way they use the device.</p><p>In other words, not all users interact in the same way. Some use screen readers, others use a keyboard or assisted navigation. For this reason, the app should not rely solely on complex gestures or interactions that do not provide a clear alternative.</p><p>In mobile applications, this principle basically translates into:</p><ul><li>Easy-to-tap controls</li><li>Clear and predictable navigation</li><li>Avoiding interactions that require extreme precision</li></ul><p>In .NET MAUI, many of these best practices can be applied directly using the components we already work with. Let&rsquo;s see NET MAUI some Operable examples we can apply:</p><h3 id="appropriate-size-for-interactive-elements">Appropriate Size for Interactive Elements</h3><p>A very common problem is having <strong>icons or buttons that are too small</strong>, which limits interaction and can make the app difficult&mdash;or even impossible&mdash;to use for some users.</p><p>For this reason, it is recommended to respect minimum sizes for interactive elements:</p><ul><li><p><strong>iOS:</strong> minimum <strong>44 &times; 44 pt</strong><br />This recommendation comes from Apple&rsquo;s Human Interface Guidelines, where this minimum size is established for interactive elements such as buttons or tappable icons.</p></li><li><p><strong>Android</strong>: minimum <strong>48 &times; 48 dp</strong><br />On Android, this recommendation comes from the Android Accessibility Guidelines and Material Design.</p></li></ul><p>In .NET MAUI, we can apply this easily, for example:</p><pre class=" language-xml"><code class="prism  language-xml">&lt;Button Text="Continue" 
 HeightRequest="48" 
 Padding="16,12" /&gt;
</code></pre><p>Or for icon ImageButton:</p><pre class=" language-xml"><code class="prism  language-xml">&lt;ImageButton Source="close.png" 
 WidthRequest="48" 
 HeightRequest="48" 
 Padding="12" 
 SemanticProperties.Description="Close" /&gt;
</code></pre><h2 id="understandable">Understandable</h2><p>This principle states that the information and interactions within our app must be <strong>easy to understand</strong>.</p><p>Why is this important?</p><ul><li>Not all users have the same technical level.</li><li>Some may have cognitive difficulties.</li><li>Others are simply using the app for the first time.</li></ul><p>In mobile applications, this principle mainly translates into:</p><ul><li>Clear and direct text</li><li>Consistent navigation</li><li>Predictable actions</li><li>Error messages that explain what happened and what to do next</li></ul><p>Some examples of Understandable in .NET MAUI:</p><h3 id="clear-language-in-text-and-labels">Clear Language in Text and Labels</h3><p>Avoid ambiguous or overly technical texts (I&rsquo;ve literally seen &ldquo;state error&rdquo; in apps &hellip; that should not happen), especially in buttons and important messages.</p><p>For example, for a save button, use text that clearly describes the action:</p><pre class=" language-xml"><code class="prism  language-xml">&lt;Button Text="Save changes" /&gt;
</code></pre><p>Once the save action is executed, if an error occurs, <strong>don&rsquo;t leave the user guessing or hanging</strong>. Tell them exactly what happened.</p><p>❌ Saving changes failed</p><p>✅ The name field cannot contain special characters</p><p>The idea is for the user to understand what happened and what the next step is, without having to interpret technical messages.</p><h2 id="robust">Robust</h2><p>This principle states that the app must be <strong>robust enough</strong> to work correctly across different environments or devices. In other words, the app should continue to work when:</p><ul><li>It runs on different versions of the operating system</li><li>It is used with screen readers such as TalkBack or VoiceOver</li><li>It is used across different platforms</li><li>It adapts to different screen sizes (small, medium and large) without affecting usability or content clarity</li></ul><p>An example of the Robust principle in <strong>.NET MAUI</strong> is the use of <strong>OnPlatform</strong>.</p><h3 id="onplatform">OnPlatform</h3><p>Although .NET MAUI abstracts many platform differences&mdash;and personally, I try to use OnPlatform as little as possible to keep maintenance easier across Android and iOS, always looking for visual elements that give me the same result&mdash;in some cases, Android and iOS behave differently, and using it becomes necessary.</p><p>If you run into that situation, you can use OnPlatform to keep the behavior on both platforms exactly how you want it:</p><pre class=" language-xml"><code class="prism  language-xml">&lt;Button Text="Continue" 
 HeightRequest="{OnPlatform iOS=44, Android=48}" 
 Padding="{OnPlatform iOS='16,12', Android='16,14'}" /&gt;
</code></pre><p>This way, you respect each platform&rsquo;s recommendations while keeping an accessible and consistent experience, aligned with the <strong>Robust</strong> principle.</p><h2 id="conclusion">Conclusion</h2><p>And that&rsquo;s it!  In this article, we talked about <strong>A11y</strong> and why accessibility should be part of how we build mobile apps with <strong>.NET MAUI,</strong> not something added at the end. By understanding the <strong>POUR principles</strong> we saw how accessibility can be applied through small, intentional UI decisions.</p><p>From making content perceivable and interactions operable, to keeping things understandable and keeping our apps robust across platforms, each choice helps create a better experience for more users.</p><p>Remember: users may not know what A11Y is, but they definitely feel it when an app is accessible. </p><p>See you in the next article! &zwj;♀️✨</p><aside><hr data-sf-ec-immutable="" /><div class="row"><div class="col-4 u-normal-full u-small-mb0"><h4 class="u-fs20 u-fw5 u-lh125 u-mb0">The Next Development Discipline Is ADD</h4></div><div class="col-8"><p class="u-fs16 u-mb0"><a target="_blank" href="https://www.telerik.com/blogs/next-development-discipline-add">Accessibility-Driven Development turns WCAG into a discipline.</a> With the EU Accessibility Act as the deadline, ADD is the next discipline to drive quality.</p></div></div></aside>]]></content>
  </entry>
  <entry>
    <id>urn:uuid:d14754de-590c-4eae-a95c-5390383b1082</id>
    <title type="text">5 UX Tips for .NET MAUI Developers</title>
    <summary type="text">Following these five UX tips as a .NET MAUI developer can help keep your app user-friendly and polished.</summary>
    <published>2026-03-10T16:30:34Z</published>
    <updated>2026-04-11T15:57:40Z</updated>
    <author>
      <name>Leomaris Reyes </name>
    </author>
    <link rel="alternate" href="https://www.telerik.com/blogs/5-ux-tips-net-maui-developers"/>
    <content type="text"><![CDATA[<p><span class="featured">Following these five UX tips as a .NET MAUI developer can help keep your app user-friendly and polished.</span></p><p>Creating a pleasant app experience doesn&rsquo;t always depend on having the most complex designs, the most harmonious colors, or the best user experience (UX). Obviously, all of this carries a lot of weight, but many times that whole system can be overshadowed by the lack of small details that can make a big difference between an average app and one that feels fast and familiar for your user.</p><p>As developers, we make UI decisions every day while writing code, and this can happen without us fully realizing it.</p><p>The day-to-day work of a developer involves making important decisions to build great applications. In this article, we&rsquo;ll focus a bit on the UI side. While we usually have design teams that decide what the app&rsquo;s colors will be, where and how buttons will be placed, developers also have the responsibility of making the right technical decisions so that the required design is implemented following best practices.</p><p>The best practics span from making decisions like which screen layout to use, whether to use an icon or an image, how to display certain information on screen, to complying with accessibility rules. UI decisions are not made only for aesthetics; they are made based on the reason behind each element we use, since they can directly impact performance and the overall experience, not just the visual aspect.</p><p>Even going a bit further, it&rsquo;s also valid for developers to add design suggestions that design teams might not think about, such as using a Lottie instead of a heavier file (besides impacting visuals, it also impacts performance), supporting dark mode, among others.</p><p>In this article, I&rsquo;ll share five design-impacting recommendations for .NET MAUI development that can help your users love using your apps.</p><h2 id="avoid-nested-layouts-as-much-as-possible">1. Avoid Nested Layouts As Much As Possible</h2><p>It&rsquo;s important to understand the potential of each layout before you start building a UI. This is because, in most cases, you can achieve exactly the same visual result using different types of layouts.</p><p>For example, the same design can be built using combinations of <code>HorizontalStackLayout</code> and <code>VerticalStackLayout</code> as by using a single grid. Visually the result may be the same, but the impact on performance is probably quite different.</p><p>Each additional layout involves more measurement and layout calculations on screen, and that, accumulated over time, ends up impacting the overall fluidity of the application.</p><p>To make this easier to understand, let&rsquo;s look at it this way: if you need to go to a place that is 10 km away, you have three options:</p><ul><li>Go by private vehicle</li><li>Go by public transportation</li><li>Go on foot</li></ul><p>All three options will allow you to reach the same destination, but not in the same way. If you walk, it will take much longer and you will arrive tired. If you use public transportation, you will spend extra time waiting and moving between stops. While if you go by private vehicle, you will arrive faster and more efficiently.</p><p>The same thing happens with layouts in an application. You can achieve the same visual result using different layout combinations, but not all of them are equally efficient. Using nested unnecessarily layouts generates more layout calculations, directly affecting performance.</p><p>One recommendation I always give is to review Grid. This layout allows you to create complex designs using a single layout, reducing the number of layouts and, therefore, the processing load.</p><p>There are also scenarios where StackLayout is completely valid. In those cases, make sure to use the one that matches your orientation&mdash;<strong>VerticalStackLayout</strong> or <strong>HorizontalStackLayout</strong>&mdash;and avoid nesting them without a clear reason.</p><p>For example, if we want to achieve a three-column, three-row layout, an example of doing it with StackLayout would be as follows:</p><pre class=" language-xml"><code class="prism  language-xml">&lt;VerticalStackLayout Padding="16" Spacing="8"&gt; 
    &lt;HorizontalStackLayout Spacing="8"&gt; 
    &lt;BoxView Color="Red" HeightRequest="40" WidthRequest="40" /&gt; 
    &lt;BoxView Color="Green" HeightRequest="40" WidthRequest="40" /&gt; 
    &lt;BoxView Color="Blue" HeightRequest="40" WidthRequest="40" /&gt; 
    &lt;/HorizontalStackLayout&gt;
     
    &lt;HorizontalStackLayout Spacing="8"&gt; 
    &lt;BoxView Color="Orange" HeightRequest="40" WidthRequest="40" /&gt; 
    &lt;BoxView Color="Purple" HeightRequest="40" WidthRequest="40" /&gt; 
    &lt;BoxView Color="Pink" HeightRequest="40" WidthRequest="40" /&gt; 
    &lt;/HorizontalStackLayout&gt;
      
    &lt;HorizontalStackLayout Spacing="8"&gt; 
    &lt;BoxView Color="Gray" HeightRequest="40" WidthRequest="40" /&gt; 
    &lt;BoxView Color="Brown" HeightRequest="40" WidthRequest="40" /&gt; 
    &lt;BoxView Color="Black" HeightRequest="40" WidthRequest="40" /&gt; 
    &lt;/HorizontalStackLayout&gt; 
&lt;/VerticalStackLayout&gt;
</code></pre><p>But if we use a Grid, it would look like this:</p><pre class=" language-xml"><code class="prism  language-xml">&lt;Grid 
    RowDefinitions="Auto,Auto,Auto" 
    ColumnDefinitions="*,*,*" 
    Padding="16" 
    RowSpacing="8" 
    ColumnSpacing="8"&gt;
 
    &lt;!-- Row 1 --&gt; 
    &lt;BoxView Grid.Row="0" Grid.Column="0" Color="Red" HeightRequest="40" /&gt; 
    &lt;BoxView Grid.Row="0" Grid.Column="1" Color="Green" HeightRequest="40" /&gt; 
    &lt;BoxView Grid.Row="0" Grid.Column="2" Color="Blue" HeightRequest="40" /&gt;
    
    &lt;!-- Row 2 --&gt; 
    &lt;BoxView Grid.Row="1" Grid.Column="0" Color="Orange" HeightRequest="40" /&gt; 
    &lt;BoxView Grid.Row="1" Grid.Column="1" Color="Purple" HeightRequest="40" /&gt; 
    &lt;BoxView Grid.Row="1" Grid.Column="2" Color="Pink" HeightRequest="40" /&gt;
    
    &lt;!-- Row 3 --&gt; 
    &lt;BoxView Grid.Row="2" Grid.Column="0" Color="Gray" HeightRequest="40" /&gt; 
    &lt;BoxView Grid.Row="2" Grid.Column="1" Color="Brown" HeightRequest="40" /&gt; 
    &lt;BoxView Grid.Row="2" Grid.Column="2" Color="Black" HeightRequest="40" /&gt;

&lt;/Grid&gt;
</code></pre><aside><hr /><div class="row"><div class="col-4 u-normal-full u-small-mb0"><h4 class="u-fs20 u-fw5 u-lh125 u-mb0">Ready to explore a more powerful grid?</h4></div><div class="col-8"><p class="u-fs16 u-mb0">Check out the Progress Telerik UI for <a target="_blank" href="https://www.telerik.com/maui-ui/datagrid">.NET MAUI DataGrid</a>, a premium prebuilt grid with tons of customization options. The whole library is available to try free for 30 days.</p></div></div><hr class="u-mb3" /></aside><h2 id="add-accessibility-to-your-apps">2. Add Accessibility to Your Apps</h2><p>Sometimes we forget about what we don&rsquo;t notice, but just because we don&rsquo;t notice it doesn&rsquo;t mean it isn&rsquo;t important. Accessibility in apps allows us to adapt our applications for people with various impairments.</p><p>One quick win is to use <strong>SemanticProperties</strong>, which basically allow you to define text to be spoken out loud when a screen reader is employed. This way, if a person visually can&rsquo;t read the text, they can listen to it and stay aware of what is happening in the app.</p><p>You can add SemanticProperties to all the visual elements you&rsquo;re working with, as I show in the following example.</p><pre class=" language-xml"><code class="prism  language-xml">&lt;Entry x:Name="lastName" SemanticProperties.Description="Last name"/&gt;
</code></pre><p>For more information, I recommend reading the article &ldquo;<a target="_blank" href="https://www.telerik.com/blogs/creating-accessible-apps-semantic-properties-dotnet-maui">Creating Accessible Apps with Semantic Properties in .NET MAUI</a>.&rdquo;</p><h2 id="use-native-gradients-instead-of-gradient-images">3. Use Native Gradients Instead of Gradient Images</h2><p><img src="https://d585tldpucybw.cloudfront.net/sfimages/default-source/blogs/2026/2026-02/gradients-sample.png?sfvrsn=833b330_2" title="Gradients sample" alt="Gradients sample" /><br /><span style="font-size:11px;">Images obtained from the <a target="_blank" href="https://docs.microsoft.com/en-us/dotnet/maui/user-interface/brushes/lineargradient">official documentation</a>.</span></p><p>I&rsquo;ve noticed that many times images are added just to simulate gradients. However, with .NET MAUI we can create our own gradients using <strong>Brushes</strong>, which allows us to avoid adding unnecessary resources that can be heavier than a definition in C# or XAML.</p><p>Using native gradients allows us to play more with colors and achieve the desired design, but they also offer great benefits such as:</p><ul><li>Reducing the size of the application by avoiding additional images</li><li>Getting a more flexible UI</li><li>Gradients adapt better to different screen sizes; whereas images can look different on some devices, which forces us to maintain multiple versions of the same image</li><li>More flexibility when handling dark mode or light mode</li></ul><p>Additionally, <strong>Brushes</strong> in .NET MAUI allow us to define linear, radial or solid gradients in a simple way, reuse them through resources and maintain greater visual consistency across the application, all with a lower performance impact compared to images.</p><p>Example in code:</p><pre class=" language-xml"><code class="prism  language-xml">&lt;Border HeightRequest="120"&gt; 
    &lt;Border.Background&gt; 
    &lt;LinearGradientBrush StartPoint="0,0" EndPoint="1,1"&gt; 
    &lt;GradientStop Color="#4FACFE" Offset="0.0" /&gt; 
    &lt;GradientStop Color="#00F2FE" Offset="1.0" /&gt; 
    &lt;/LinearGradientBrush&gt; 
    &lt;/Border.Background&gt; 
&lt;/Border&gt;
</code></pre><p>To dive deeper into this topic, I recommend reading the article &ldquo;<a target="_blank" href="https://www.telerik.com/blogs/getting-started-brushes-dotnet-maui">Getting Started With Brushes in .NET MAUI</a>.&rdquo;</p><h2 id="use-preferences-correctly">4. Use Preferences Correctly</h2><p>Basically, Preferences are used to store simple information on the device, allowing faster access. A very common example of using Preferences is when we select the &ldquo;remember my email&rdquo; option when logging into an app.</p><p>What happens is that, in some cases, Preferences may be used incorrectly. Let&rsquo;s look at some common scenarios:</p><ul><li><p><strong>Storing information that should be in the database.</strong><br />My advice is to only store simple information in Preferences&mdash;data that you need at the moment and that helps you save time by avoiding unnecessary calls to an API or the database.</p></li><li><p><strong>Storing sensitive information without protection.</strong><br />In some cases, we need to store data that could be sensitive; if this is your case, always remember to <strong>encrypt</strong> the information. This way, if someone manages to access the Preferences, they won&rsquo;t be able to read the user&rsquo;s data in plain text.</p></li></ul><p>⚠️ Keep in mind that you should only store this type of information if it is <strong>absolutely necessary</strong>. Otherwise, it&rsquo;s better not to do so.</p><p>Using Preferences is very simple. You just need the following:</p><p>A <strong>Set</strong> to store the information:</p><pre class=" language-csharp"><code class="prism  language-csharp">Preferences.Default.Set("user_name", "Leo");
</code></pre><p>A <strong>Get</strong> to retrieve it:</p><pre class=" language-csharp"><code class="prism  language-csharp">string userName = Preferences.Default.Get("user_name", "Unknown");
</code></pre><p>To dive deeper into this topic, I recommend reading the article &ldquo;<a target="_blank" href="https://www.telerik.com/blogs/exploring-preferences-net-maui">Exploring Preferences in .NET MAUI</a>.&rdquo;</p><h2 id="use-fontimagesource-instead-of-icons">5. Use FontImageSource Instead of Icons</h2><p>Devs are always thinking about better performance, so here&rsquo;s a tip. Instead of using .png icons, consider using icon fonts through FontImageSource. This allows you to continue displaying icons in your UI while keeping your app lighter, since these icons behave like text rather than images.</p><p>This brings many benefits to your application, including:</p><ul><li>Font-based icons are much easier to customize. You can change their color, size and adapt them to light or dark mode without the need to create multiple versions of the same icon.</li><li>It allows you to have fewer resources in the app, reducing its size and making UI maintenance easier.</li></ul><p>To use FontImageSource, you only need the icon code you want to work with, and you can implement it as follows:</p><pre class=" language-xml"><code class="prism  language-xml">&lt;ImageButton&gt; 
    &lt;ImageButton.Source&gt; 
    &lt;FontImageSource 
    FontFamily="MaterialIcons" 
    Glyph="&amp;#xE87C;" 
    Color="Black" 
    Size="24" /&gt; 
    &lt;/ImageButton.Source&gt; 
&lt;/ImageButton&gt;
</code></pre><p>The Glyph represents the icon that will be rendered. There are several portals where you can explore icons; as an example, you can use FontAwesome.</p><p>For example, you can go to <a target="_blank" href="https://fontawesome.com/search">https://fontawesome.com/search</a>, select an icon and in the top-right corner you&rsquo;ll see the Unicode that you can copy and paste directly into your project.
</p><h2 id="conclusion">Conclusion</h2><p>And that&rsquo;s it!  In this article, we explored how UI decisions in .NET MAUI can make a big difference in performance and maintainability. Here are some key takeaways:</p><ul><li>From choosing the right layout and avoiding unnecessary nesting, to using gradients, icon fonts, accessibility features and storing data correctly, each decision adds up.</li><li>Building a good UI is not only about how it looks, but also about how it&rsquo;s implemented. Clean, thoughtful choices help your app feel faster, lighter and more polished&mdash;without adding unnecessary complexity.</li><li>Remember: users may not notice these decisions, but they definitely feel them. </li></ul><p>See you in the next article! &zwj;♀️✨</p>]]></content>
  </entry>
  <entry>
    <id>urn:uuid:84b9377c-41cc-4bdd-a54e-463dad1ec10d</id>
    <title type="text">.NET 10: Secondary Toolbar Items for iOS and macOS in .NET MAUI</title>
    <summary type="text">As of .NET 10, iOS and macOS support secondary toolbar items, which are found in overflow menus and make a .NET MAUI app feel more native to the Apple user experience.</summary>
    <published>2026-03-02T18:21:06Z</published>
    <updated>2026-04-11T15:57:40Z</updated>
    <author>
      <name>Leomaris Reyes </name>
    </author>
    <link rel="alternate" href="https://www.telerik.com/blogs/net-10-secondary-toolbar-items-ios-macos-net-maui"/>
    <content type="text"><![CDATA[<p><span class="featured">As of .NET 10, iOS and macOS support secondary toolbar items, which are found in overflow menus and make a .NET MAUI app feel more native to the Apple user experience.</span></p><p>When we talk about technology, we think of a world of constant changes that each day focuses on improving the previous one. In the case of .NET MAUI, this is no exception; in .NET 10, many very interesting improvements were released to make our work as devs increasingly more efficient.</p><p>This is the case with secondary toolbar Items, an improvement focused directly on the user experience. Previously, their behavior was not consistent across all platforms, especially on iOS and macOS. Now, we have support that allows secondary actions to behave in a more natural way and align with the Apple conventions, making our applications feel much more native.</p><h2 id="what-are-secondary-toolbar-items">What Are Secondary Toolbar Items?</h2><p>These are options that live in the toolbar. Instead of being displayed directly in the toolbar, they are grouped inside a secondary menu that is shown when selecting their primary action.</p><p>For example: Location &rarr; North America.</p><p>This way, only the most important actions remain visible in the main toolbar, which helps reduce visual clutter and improves the user experience.</p><p><strong>From .NET 10 onward, the official documentation states:</strong></p><p>&ldquo;iOS and macOS now support secondary toolbar items, providing better alignment with platform conventions.&rdquo; </p><p>This improvement is not just a visual change; it introduces several important enhancements for iOS and macOS that directly impact how secondary toolbar items behave and integrate with the platform, making them feel much more native, such as:</p><h2 id="automatic-detection">Automatic Detection</h2><pre class=" language-xml"><code class="prism  language-xml">&lt;ToolbarItem Text="Copy" Order="Secondary" /&gt;
&lt;ToolbarItem Text="Paste" Order="Secondary"/&gt;
</code></pre><p>When configuring <strong>ToolbarItems</strong>, we need to define whether they will be primary or secondary. With this improvement, all items marked in the <code>Order</code> property with the value <code>Secondary</code> are automatically grouped into the secondary menu, which means we don&rsquo;t need to add any extra configuration or write additional code for it to work.</p><p>This is especially valuable when we want to maintain a native experience in our applications.</p><h2 id="modern-ios-pattern">Modern iOS Pattern</h2><pre class=" language-xml"><code class="prism  language-xml">&lt;ToolbarItem Text="Share" Order="Secondary" /&gt;
</code></pre><p>.NET MAUI now uses iOS 13+ APIs, which means it displays a modern menu design to present secondary options. This design follows the established rules and respects the <strong>Human Interface Guidelines</strong>.</p><p>The <strong>Human Interface Guidelines (HIG)</strong> are a set of design recommendations created by Apple, which align a unique and consistent experience across its platforms, indicating how applications should look and behave.</p><p><strong>You can define the order of your items!</strong> </p><pre class=" language-xml"><code class="prism  language-xml">&lt;ToolbarItem Text="Go to document" Order="Secondary" Priority="0" /&gt;
</code></pre><p>Keeping a logical order in your items is also important. When adding a ToolbarItem, there is a property called <code>Priority</code>, which is responsible for defining the order in which the options will be displayed in the menu, both primary and secondary.</p><p>Items are ordered numerically, from lowest to highest, starting at 0. This allows us to decide which actions should appear first, helping maintain a clear hierarchy of what we want to present to the user.</p><h2 id="how-is-the-positioning-handled">How Is the Positioning Handled?</h2><p>The secondary menu is displayed by default on the <strong>right</strong> side of the toolbar. It also has the ability to automatically adapt when <strong>Right-To-Left (RTL)</strong> is enabled in your app.</p><p>In case you didn&rsquo;t know, <strong>RTL</strong> refers to the reading and writing direction of certain languages. This means your .NET MAUI app respects the conventions of each language, providing a more accessible and adaptable user experience. This behavior applies to all visual elements, including the secondary menu.</p><h2 id="customizable-icon">Customizable Icon</h2><p>By default, secondary toolbar items are grouped into a pull-down menu that uses the system <strong>ellipsis (⋯)</strong> icon (<code>UIImage.GetSystemImage("ellipsis.circle")</code>). This icon, defined by <strong>Apple</strong> in its <strong>Human Interface Guidelines</strong>, is used to represent additional, secondary or less frequent actions, so that the menu looks and behaves like any other native menu on iOS and macOS.</p><p>Although this icon is recommended, it is not mandatory. If your app requires a different visual representation, .NET MAUI allows you to customize the icon, enabling the secondary menu to better align with your app&rsquo;s visual requirements while preserving its native behavior.</p><p>⚠️ My recommendation is that whenever this icon needs to be changed, it&rsquo;s important for the design team to be aligned and aware that a rule defined by Apple is being modified. There&rsquo;s nothing wrong with changing it, but it&rsquo;s essential to have a clear <strong>WHY</strong> behind the decision.</p><p>Another important detail to highlight is that this menu is <strong>dynamic</strong>. If the menu is open and any of an item&rsquo;s properties change at runtime&mdash;such as its text, enabled state or visibility&mdash;the system automatically rebuilds and closes the menu to reflect those updates.</p><p>This allows users to always see up-to-date and consistent information, preventing invalid actions and maintaining a reliable, native user experience.</p><h2 id="in-summary">In Summary</h2><ul><li><strong>Primary toolbar items</strong> are displayed directly in the toolbar.</li><li><strong>Secondary toolbar items</strong> are grouped inside the overflow (secondary) menu.</li></ul><p> The official documentation recommends <strong>keeping label text short</strong> so it fits in the dropdown menu, thus reducing the risk of cross-platform inconsistencies.</p><p>A basic XAML implementation about a ToolbarItems implementation, would look like the following example:</p><pre class=" language-xml"><code class="prism  language-xml">&lt;ContentPage.ToolbarItems&gt;
    &lt;!-- Primary toolbar items --&gt;
    &lt;ToolbarItem Text="Save" Order="Primary" Priority="0" /&gt;
    &lt;ToolbarItem Text="Edit" Order="Primary" Priority="1" /&gt;
    
    &lt;!-- Secondary toolbar items --&gt;
    &lt;ToolbarItem Text="Share" Order="Secondary" Priority="0" /&gt;
    &lt;ToolbarItem Text="Delete" Order="Secondary" Priority="1" /&gt;
    &lt;ToolbarItem Text="Settings" Order="Secondary" Priority="2" /&gt;
&lt;/ContentPage.ToolbarItems&gt;
</code></pre><p><span style="font-size:11px;">Example obtained from official documentation.</span></p><p>And that&rsquo;s it!  With .NET 10, <strong>secondary toolbar items</strong> in .NET MAUI take an important step forward, especially on iOS and macOS. These improvements bring a more native, consistent and predictable behavior by aligning toolbar actions with platform conventions, that is why it&rsquo;s important to keep you up to date with the news!</p><p>If you have any questions or would like me to dive deeper into related topics, feel free to leave a comment&mdash;I&rsquo;ll be happy to help! </p><p>See you in the next article! &zwj;♀️✨</p><h3 id="references">References</h3><p>The explanation was based on the official documentation:</p><ul><li><a href="https://learn.microsoft.com/en-us/dotnet/maui/whats-new/dotnet-10?view=net-maui-10.0">https://learn.microsoft.com/en-us/dotnet/maui/whats-new/dotnet-10?view=net-maui-10.0</a></li></ul><aside><hr data-sf-ec-immutable="" /><div class="row"><div class="col-4 u-normal-full u-small-mb0"><h4 class="u-fs20 u-fw5 u-lh125 u-mb0">.NET 10 on iOS: Updates and Notes for .NET MAUI Developers</h4></div><div class="col-8"><p class="u-fs16 u-mb0">Here&rsquo;s what else you may have missed in <a target="_blank" href="https://www.telerik.com/blogs/net-10-ios-updates-notes-net-maui-developers">.NET 10 for .NET MAUI</a> if you&rsquo;re a developer targeting iOS.</p></div></div></aside>]]></content>
  </entry>
  <entry>
    <id>urn:uuid:74e39893-76ea-4619-9839-60136b04bf11</id>
    <title type="text">Simplifying Grid Layout in .NET MAUI Using Extension Methods</title>
    <summary type="text">The grid extension methods from the Community Toolkit can make working with grids in .NET MAUI cleaner. Learn more!</summary>
    <published>2026-02-23T21:13:59Z</published>
    <updated>2026-04-11T15:57:40Z</updated>
    <author>
      <name>Leomaris Reyes </name>
    </author>
    <link rel="alternate" href="https://www.telerik.com/blogs/simplifying-grid-layout-net-maui-using-extension-methods"/>
    <content type="text"><![CDATA[<p><span class="featured">The grid extension methods from the Community Toolkit can make working with grids in .NET MAUI cleaner. Learn more!</span></p><p>The grid is one of the layouts that provides the best performance for your .NET MAUI apps, and I love it because it&rsquo;s also very flexible. You can create designs that look complex, and a grid even works as a replacement for the old <strong>RelativeLayout</strong>.</p><p>But beyond all its advantages, today we&rsquo;ll talk about some <strong>tips and tricks</strong> to help you get the most out of it using the <strong>extension methods</strong> that the Maui.Community.Toolkit provides for the grid.</p><h2 id="what-is-an-extension-method-">What Is an Extension Method? </h2><p>An extension method is a C# feature that allows you to add methods to an existing type, such as classes, interfaces or structs. Thanks to them, you don&rsquo;t need to inherit from a class or modify its original code to use new functionality. It&rsquo;s like giving superpowers to a class that already exists.</p><p>For example, if the grid originally didn&rsquo;t have a method called <code>Rows()</code>, you could create an extension method to add it, and it would behave as if that method were part of the grid itself.</p><h2 id="what-are-grid-extension-methods">What Are Grid Extension Methods?</h2><p>Grid extensions are a set of extensions specifically designed for the grid included in the Maui.Community.Toolkit. Let&rsquo;s explore which extensions are available and what each of them does!</p><h3 id="row">Row</h3><p>Its purpose is to set the <code>Grid.Row</code> value and, optionally, the <code>RowSpan</code> (<code>Grid.RowSpan</code>) if you want an element to extend horizontally across multiple rows.</p><p>This method can be used with any element that inherits from BindableObject, such as Label, Button, Image, etc.</p><p>Here&rsquo;s an example of how to implement it:</p><h4 id="❌-without-extension-methods">❌ Without Extension Methods</h4><pre class=" language-csharp"><code class="prism  language-csharp">var button = new Button { Text = "This Button is in Row 1 and spans 5 rows" }; 
    Grid.SetRow(button, 1); 
    Grid.SetRowSpan(button, 5); 
var grid = new Grid { Children = { button } };
</code></pre><h4 id="✅-using-extension-methods">✅ Using Extension Methods</h4><pre class=" language-csharp"><code class="prism  language-csharp">new Grid { Children = { new Button().Text("This Button is in Row 1 and spans 5 rows").Row(1, 5) } };
</code></pre><h3 id="column">Column</h3><p>Its purpose is to set the <code>Grid.Column</code> value and, optionally, the <code>ColumnSpan</code> (<code>Grid.ColumnSpan</code>) if you want an element to extend vertically across multiple columns. This method can be used with any element that inherits from BindableObject.</p><p>Here&rsquo;s an example of how to implement it:</p><h4 id="❌-without-extension-methods-1">❌ Without Extension Methods</h4><pre class=" language-csharp"><code class="prism  language-csharp">var button = new Button { Text = "This Button is in Column 2 and spans 4 columns" }; 
    Grid.SetColumn(button, 2); 
    Grid.SetColumnSpan(button, 4); 
var grid = new Grid { Children = { button } };
</code></pre><h4 id="✅-using-extension-methods-1">✅ Using Extension Methods</h4><pre class=" language-csharp"><code class="prism  language-csharp">new Grid { Children = { new Button().Text("This Button is in Column 2 and spans 4 columns").Column(2, 4) } };
</code></pre><h3 id="defining-rows--columns">Defining Rows &amp; Columns</h3><p>The Toolkit provides an extension that lets you define your Grid&rsquo;s rows and columns in a simpler and more direct way, offering <strong>shorter, more expressive equivalents for common GridLength values</strong>. This is possible thanks to the following helpers:</p><ul><li><code>Columns.Define</code></li><li><code>Rows.Define</code></li></ul><p>To use them, you just need to add the following line at the top of your class:</p><pre class=" language-csharp"><code class="prism  language-csharp"><span class="token keyword">using</span> <span class="token keyword">static</span> CommunityToolkit<span class="token punctuation">.</span>Maui<span class="token punctuation">.</span>Markup<span class="token punctuation">.</span>GridRowsColumns<span class="token punctuation">;</span>
</code></pre><p>This <strong><code>using static</code></strong> allows you to replace long expressions like <strong><code>GridLength.Auto</code></strong> or new <strong><code>GridLength(2, GridLength.Star)</code></strong> with their shorter forms such as Auto, Star, Stars(2), etc.</p><p>For better clarity, here&rsquo;s a comparison table:</p><p><img src="https://d585tldpucybw.cloudfront.net/sfimages/default-source/blogs/2026/2026-02/01_comparison.png?sfvrsn=650444e1_2" alt="Comparison table: What you would normally write: GridLength.Auto - With Grid extensions: Auto - Meaning: Adjusts to the content size - What you would normally write: new GridLength(1, GridLength.Star) - With Grid extensions: Star - Meaning: Takes available space (1*) - What you would normally write: new GridLength(2, GridLength.Star) - With Grid extensions: Stars(2) - Meaning: Takes 2× the available space (2*) - What you would normally write: new GridLength(20, GridLength.Absolute) - With Grid extensions: 20 - Meaning: Absolute size of 20**" /></p><p>And here&rsquo;s how that translates into code:</p><h4 id="❌-without-extension-methods-2">❌ Without Extension Methods</h4><pre class=" language-csharp"><code class="prism  language-csharp">ColumnDefinitions = new ColumnDefinitionCollection 
{ 
    new ColumnDefinition { Width = new GridLength(20, GridLength.Absolute) }, 
    new ColumnDefinition { Width = new GridLength(1, GridLength.Star) }, 
    new ColumnDefinition { Width = new GridLength(2, GridLength.Star) } 
};
</code></pre><h4 id="✅-using-extension-methods-2">✅ Using Extension Methods</h4><pre class=" language-csharp"><code class="prism  language-csharp">ColumnDefinitions = Columns.Define(20, Star, Stars(2));
</code></pre><p> When you compare both versions, look at everything you gain:</p><ul><li>Far less code&mdash;from six lines down to <strong>just one</strong></li><li>Much more readable and expressive</li><li>And the best part: <strong>way easier to maintain</strong></li></ul><h3 id="defining-rows--columns-using-enums">Defining Rows &amp; Columns Using Enums</h3><p>This is my favorite one!  Normally, when defining the rows and columns of a grid, you use numeric values: row 2, column 2, etc. But the more rows and columns you have, the harder it becomes to identify, read and maintain that layout.</p><p>Now imagine that instead of numbers, you could use names. Well, now you can! </p><p>The Community Toolkit allows you to name your rows and columns using enums (for example: <code>Row.Username</code>, <code>Column.UserInput</code>). This makes your code so much more readable, easier to understand and incredibly simple when identifying or modifying any coordinate inside the Grid.</p><p>And now, let&rsquo;s see how to do it!</p><h4 id="step-1-import-the-required-helpers">Step 1: Import the Required Helpers</h4><pre class=" language-csharp"><code class="prism  language-csharp">using static CommunityToolkit.Maui.Markup.GridRowsColumns;
</code></pre><h4 id="step-2-create-your-enum-for-both-rows-and-columns">Step 2: Create Your Enum for Both Rows and Columns</h4><p>First, the rows:</p><pre class=" language-csharp"><code class="prism  language-csharp">enum Row { Username, Password, Submit }
</code></pre><p>Then the columns:</p><pre class=" language-csharp"><code class="prism  language-csharp">enum enum Column { Description, UserInput }
</code></pre><h4 id="step-3-use-the-enum">Step 3: Use the Enum</h4><p>Now that we&rsquo;ve created our enums, let&rsquo;s define the grid&rsquo;s rows and columns using them, just like in the following example:</p><pre class=" language-csharp"><code class="prism  language-csharp">RowDefinitions = Rows.Define( 
(Row.Username, 30), 
(Row.Password, 30), 
(Row.Submit, Star)), 

ColumnDefinitions = Columns.Define( 
(Column.Description, Star), 
(Column.UserInput, Star)),
</code></pre><p>You can also use the enum to position your controls.</p><p>Instead of doing something like this:</p><pre class=" language-csharp"><code class="prism  language-csharp">.Row(0).Column(1)
</code></pre><p>You can simply do:</p><pre class=" language-csharp"><code class="prism  language-csharp">.Row(Row.Username).Column(Column.Description)
</code></pre><p>That&rsquo;s it!!  Much cleaner, more expressive and easier to understand at a glance.</p><h3 id="rowspan--columnspan">RowSpan &amp; ColumnSpan</h3><p><code>RowSpan</code> and <code>ColumnSpan</code> are extension methods that allow you to define the number of rows or columns, respectively, that the grid should occupy. For example, if my grid has three rows and two columns, you would have something like this:</p><pre class=" language-csharp"><code class="prism  language-csharp">new Button() 
  .Text("Button to test")  
  .RowSpan(3) 
  .ColumnSpan(2)
</code></pre><p>And you can get even more out of your enum by using these special helpers:</p><p>➖ <code>All&lt;TEnum&gt;()</code> &ndash; This indicates that the control should occupy all the rows and/or columns defined in your enum, respectively. For example, if I have the following enums:</p><pre class=" language-csharp"><code class="prism  language-csharp">enum Row { Username, Password, Submit }
enum Column { Description, UserInput }
</code></pre><p>My definition would look like this:</p><pre class=" language-csharp"><code class="prism  language-csharp">new Button() 
   .Text("Button to test") 
   .RowSpan(All&lt;Row&gt;()) 
   .ColumnSpan(All&lt;Column&gt;())
</code></pre><p>➖ <code>Last&lt;TEnum&gt;</code> &ndash; Allows you to place a control in the last row or last column defined in your enum. You can do it as follows:</p><p>⚠️ For this example, we&rsquo;ll use the enums defined above (Rows and Columns). In the code, a button is added to the last row and last column of the grid.</p><pre class=" language-csharp"><code class="prism  language-csharp">new Button() 
   .Text("Button to test") 
   .Row(Last&lt;Row&gt;()) 
   .Column(Last&lt;Column&gt;());
</code></pre><h2 id="conclusion">Conclusion</h2><p>And that&rsquo;s it!  In this article, you explored how the grid extension methods from the <strong>CommunityToolkit.Maui.Markup</strong> make working with grids in .NET MAUI simpler, cleaner and much more expressive. You learned what each helper does, how to define rows and columns with a shorter syntax, and how the Row/Column extension methods improve readability and reduce boilerplate.</p><p>Now you have the tools to make grid extensions your ally&mdash;helping you build layouts faster, write more maintainable UI code and create interfaces that are both easier to understand and easier to evolve over time.</p><p>If you have any questions or want me to cover more related topics, feel free to leave a comment. I&rsquo;d be happy to help you!  See you in the next article! &zwj;♀️✨</p><h3 id="references">References</h3><p>The explanation was based on the official documentation:</p><ul><li><a target="_blank" href="https://learn.microsoft.com/en-us/dotnet/communitytoolkit/maui/markup/extensions/grid-extensions">https://learn.microsoft.com/en-us/dotnet/communitytoolkit/maui/markup/extensions/grid-extensions</a></li></ul><hr /><h3 id="need-a-more-robust-grid">Need a More Robust Grid?</h3><p>The Progress Telerik UI for <a target="_blank" href="https://www.telerik.com/maui-ui/datagrid">.NET MAUI DataGrid</a> is one of the most powerful native MAUI grids available. It comes with 70+ other components in a free 30-day trial if you want to explore it in detail.</p><p><a target="_blank" href="https://www.telerik.com/try/ui-for-maui" class="Btn">Try Telerik UI for .NET MAUI</a></p>]]></content>
  </entry>
  <entry>
    <id>urn:uuid:f02f5e8b-9832-4ad7-8082-c2f72ce4b29b</id>
    <title type="text">Next Productivity Leap: Telerik and Kendo UI 2026 Q1 Release Is Here</title>
    <summary type="text">With new agentic tools for document processing, RAG-powered workflows, improved accessibility in MCP tools and a new set of AI‑ready UI components, the 2026 Q1 release lets you bring intelligence directly into your applications using the same .NET and JavaScript components you already rely on.</summary>
    <published>2026-02-18T17:25:28Z</published>
    <updated>2026-04-11T15:57:40Z</updated>
    <author>
      <name>Iva Borisova </name>
    </author>
    <link rel="alternate" href="https://www.telerik.com/blogs/next-productivity-leap-telerik-kendo-ui-2026-q1-release"/>
    <content type="text"><![CDATA[<p><span class="featured">With new agentic tools for document processing, RAG-powered workflows, improved accessibility in MCP tools and a new set of AI‑ready UI components, the 2026 Q1 release lets you bring intelligence directly into your applications using the same .NET and JavaScript components you already rely on.</span></p><p>The Progress Telerik and Kendo UI 2026 Q1 release continues to bring AI directly into everyday application workflows, moving it more and more into practical, real-world scenarios, including improved accessibility in AI‑generated UIs.</p><p>At the same time, this first release of 2026 strengthens the core foundations you rely on, with latest framework support and integrations, enhanced UI customization tools and a growing set of new and improved components that make it easier to design, build and evolve complex applications.</p><p>Let the release speak for itself! Here&rsquo;s a closer look at the key highlights shaping the Telerik and Kendo UI 2026 Q1 release.</p><h2 id="ai-powered-development-and-document-workflows">AI-Powered Development and Document Workflows</h2><h3 id="preview-agentic-tools-for-telerik-document-processing-libraries">[Preview] Agentic Tools for Telerik Document Processing Libraries (DPL)</h3><p>Build intelligent document processing workflows with ease. The <a target="_blank" href="https://docs.telerik.com/devtools/document-processing/ai-tools/agent-tools/overview">DPL Agentic Tools</a> let users extract structured data, edit content, convert formats, generate new Excel or PDF files and perform analysis on Excel documents directly inside .NET apps with no separate services required.</p><p>DPL Agentic Tools are available with a <a target="_blank" href="https://www.telerik.com/purchase.aspx?filter=web#subscription">Telerik or Kendo UI subscription</a>.</p><h3>New Agentic RAG .NET SDK</h3><p>New Agentic RAG .NET SDK: .NET developers now have a straightforward way to integrate retrieval‑augmented generation workflows into their applications. Powered by our own <a target="_blank" href="https://www.progress.com/agentic-rag">Progress Agentic RAG</a>, the SDK provides a stable foundation for creating context‑aware AI solutions. Available as a <a target="_blank" href="https://www.nuget.org/packages/Progress.Nuclia/1.0.0-preview1">public NuGet package</a> with sample integrations for <a target="_blank" href="https://github.com/telerik/telerik-blazor-progress-rag-demo">Blazor</a>, and <a target="_blank" href="https://github.com/telerik/telerik-maui-progress-rag-demo">.NET MAUI</a>, the SDK makes it easy to ingest data, run semantic search, and build AI‑powered app experiences using familiar .NET patterns.</p><h3 id="improved-accessibility-in-telerik-agentic-ui-generator">Improved Accessibility in Telerik Agentic UI Generator</h3><p>The <a target="_blank" href="https://www.telerik.com/mcp-servers">Agentic UI Generator</a> now emphasizes the Telerik and Kendo UI component‑specific accessibility implementation details. It helps you apply these patterns consistently across your UI and surfaces relevant accessibility API references for the specific components you&rsquo;re using.</p><p>The Agentic UI Generator is available with a Telerik or Kendo UI subscription.</p><h3 id="ai-coding-assistants-improvements">AI Coding Assistants Improvements</h3><p>The Telerik UI for Blazor validator tool is now available to help reduce hallucinations and improve overall code reliability. A new icons generation tool for existing and custom icons is also introduced with this release. The Telerik UI for ASP.NET Core/MVC and Blazor assistants are transitioned to native .NET NuGet distributions, making installation and adoption simpler and more enterprise friendly.</p><p>AI Coding Assistants are available with a Telerik or Kendo UI subscription.</p><h2 id="ai-interface-and-smart-components">AI Interface and Smart Components</h2><h3 id="new-ai-smart-paste-component">New AI Smart Paste Component</h3><p>Reduce manual typing and speed up data entry in your apps. The AI Smart Paste automatically converts unstructured text into structured inputs by mapping content from emails, documents or messages to the right fields with zero extra effort.</p><p>Learn more:</p><ul><li><a target="_blank" href="https://www.telerik.com/kendo-angular-ui/components/buttons/smartpastebutton">Kendo UI for Angular AI Smart Paste</a></li><li><a target="_blank" href="https://www.telerik.com/kendo-react-ui/components/buttons/smartpaste">KendoReact AI Smart Paste</a></li><li><a target="_blank" href="https://demos.telerik.com/kendo-ui/smartpastebutton/index">Kendo UI for jQuery AI Smart Paste</a></li><li><a target="_blank" href="https://demos.telerik.com/blazor-ui/smartpastebutton/overview">Telerik UI for Blazor AI Smart Paste</a></li><li><a target="_blank" href="https://demos.telerik.com/aspnet-core/smartpastebutton">Telerik UI for ASP.NET Core AI Smart Paste</a></li><li><a target="_blank" href="https://demos.telerik.com/aspnet-mvc/smartpastebutton">Telerik UI for ASP.NET MVC AI Smart Paste</a></li><li><a target="_blank" href="https://demos.telerik.com/aspnet-ajax/smartpastebutton/overview/defaultcs.aspx">Telerik UI for ASP.NET AJAX AI Smart Paste</a></li></ul><h3 id="new-promptbox-component">New PromptBox Component</h3><p>Designed for seamless interaction with AI‑powered workflows, the PromptBox component provides a dedicated space where users can craft prompts, send messages and engage naturally with AI language models.</p><p>Learn more: </p><ul><li><a target="_blank" href="https://www.telerik.com/kendo-angular-ui/components/conversational-ui/promptbox">Kendo UI for Angular PromptBox</a></li><li><a target="_blank" href="https://www.telerik.com/kendo-react-ui/components/conversationalui/promptbox">KendoReact PromptBox</a></li><li><a target="_blank" href="https://demos.telerik.com/kendo-ui/promptbox/index">Kendo UI for jQuery PromptBox</a></li><li><a target="_blank" href="https://demos.telerik.com/blazor-ui/promptbox/overview">Telerik UI for Blazor PromptBox</a></li><li><a target="_blank" href="https://demos.telerik.com/aspnet-core/promptbox">Telerik UI for ASP.NET Core PromptBox</a></li><li><a target="_blank" href="https://demos.telerik.com/aspnet-mvc/promptbox">Telerik UI for ASP.NET MVC PromptBox</a></li></ul><h3 id="smartbox--semantic-search-and-prompting-in-telerik-and-kendo-ui-datagrid">SmartBox: Semantic Search and Prompting in Telerik and Kendo UI DataGrid</h3><p>An AI-enabled DataGrid feature that combines natural-language prompting, keyword search and semantic search into a single experience, allowing users to query, filter and manipulate grid data using the interaction option that best fits their needs. Users can control the grid through prompts to apply actions such as filtering, sorting, highlighting and grouping. </p><p>Semantic Search enhances discovery by understanding intent and context, returning relevant results even when the exact search terms are not present in the data.</p><p>Learn more: </p><ul><li><a target="_blank" href="https://www.telerik.com/kendo-angular-ui/components/grid/smart-grid/ai-toolbar-tool">Kendo UI for Angular Grid SmartBox</a></li><li><a target="_blank" href="https://www.telerik.com/kendo-react-ui/components/grid/smart/basic-operations">KendoReact SmartBox</a></li><li><a target="_blank" href="https://demos.telerik.com/kendo-ui/grid/ai-smartbox">Kendo UI for jQuery Grid SmartBox</a></li><li><a target="_blank" href="https://demos.telerik.com/blazor-ui/grid/ai-smart-box">Telerik UI for Blazor Grid SmartBox</a></li><li><a target="_blank" href="https://demos.telerik.com/aspnet-core/grid/ai-smartbox">Telerik UI for ASP.NET Core Grid SmartBox</a></li><li><a target="_blank" href="https://demos.telerik.com/aspnet-mvc/grid/ai-smartbox">Telerik UI for ASP.NET MVC Grid SmartBox</a></li></ul><h3 id="smart-grid-ai-chat-integration-demo">Smart Grid: AI Chat Integration Demo</h3><p>See how integrating the Telerik and Kendo UI AI Chat with the Data Grid delivers a complete, end-to-end AI prompting experience over the grid multi-step flows and contextual interactions driven through the Chat component.</p><p>Learn more: </p><ul><li><a target="_blank" href="https://www.telerik.com/kendo-angular-ui/components/grid/smart-grid/ai-chat-assistant">Kendo UI for Angular Grid AI Chat Integration</a></li><li><a target="_blank" href="https://www.telerik.com/kendo-react-ui/components/grid/smart/ai-chat-assistant">KendoReact Grid AI Chat Integration</a></li><li><a target="_blank" href="https://demos.telerik.com/kendo-ui/grid/ai-chat-integration">Kendo UI for jQuery Grid AI Chat Integration Demo</a></li><li><a target="_blank" href="https://demos.telerik.com/blazor-ui/grid/ai-chat-assistant">Telerik UI for Blazor Grid AI Chat Integration Demo</a></li><li><a target="_blank" href="https://demos.telerik.com/aspnet-core/grid/ai-chat-integration">Telerik UI for ASP.NET Core Grid AI Chat Integration Demo</a></li><li><a target="_blank" href="https://demos.telerik.com/aspnet-mvc/grid/ai-chat-integration">Telerik UI for ASP.NET MVC Grid AI Chat Integration Demo</a> </li><li><a target="_blank" href="https://www.telerik.com/maui-ui/documentation/controls/datagrid/smart-ai-features/ai-assistant/overview">Telerik UI for .NET MAUI Grid AI Chat Integration</a></li></ul><h3 id="telerik-ui-for-blazor-microsoft.extensions.ai-chat-component-integration">Telerik UI for Blazor: Microsoft.Extensions.AI Chat Component Integration</h3><p>With native Microsoft.Extensions.AI integration, the Telerik UI for Blazor Chat now delivers an AI‑ready experience out of the box, automatically sending messages to a configured IChatClient and returning responses through the built‑in AI pipeline.</p><h2 id="richer-ui-customization">Richer UI Customization</h2><h3 id="performance-updates-in-progress-themebuilder">Performance Updates in Progress ThemeBuilder</h3><p>The UI customization tool loads and applies changes noticeably faster, so teams can preview, iterate and ship themes with less waiting and fewer interruptions.</p><h3 id="pixel‑accurate-component-previews">Pixel‑Accurate Component Previews</h3><p>Kendo UI components in ThemeBuilder now match production output, reducing styling surprises so what you design is what users see across variants and interaction states.</p><h3 id="enhanced-customization">Enhanced Customization</h3><p>Templates have been enhanced to expose more parts, states and variations, giving designers and developers finer control over visual details without custom workarounds.</p><h2 id="new-classic-components">New Classic Components</h2><h3 id="new-dropdowntree-in-telerik-ui-for-blazor">New DropDownTree in Telerik UI for Blazor</h3><p>By combining the familiar structure of a TreeView with the convenience of a dropdown, the new <a target="_blank" href="https://demos.telerik.com/blazor-ui/dropdowntree/overview">Blazor DropDownTree component</a> offers an intuitive, space‑efficient interface that makes browsing, expanding and selecting nested items effortless.</p><h3 id="new-editor-in-telerik-ui-for-.net-maui">New Editor in Telerik UI for .NET MAUI</h3><p>Gain a richer, more flexible text‑input experience designed for scenarios that go beyond a simple entry field. Offering a multiline editor with built‑in scrolling, the new <a target="_blank" href="https://www.telerik.com/maui-ui/documentation/controls/editor/overview">MAUI Editor</a> makes it easy for users to draft longer text, edit content and work comfortably within constrained mobile and desktop layouts.</p><h3 id="new-speech-to-text-button-in-desktop-products">New Speech-to-Text Button in Desktop Products</h3><p>Already available in all Telerik and Kendo UI web and mobile libraries, the Speech-to-Text Button is now ready to empower desktop users, too. They can convert speech into text with a single click, making it easy to add voice input to forms, search bars, chat interfaces and other interactive scenarios.</p><p>Learn more:</p><ul><li><a target="_blank" href="https://www.telerik.com/products/wpf/documentation/controls/radbuttons/features/speech-to-text-button">Telerik UI for WPF Speech-to-Text Button</a></li><li><a target="_blank" href="https://www.telerik.com/products/winforms/documentation/controls/speechtotextbutton/overview">Telerik UI for WinForms Speech-to-Text Button</a></li></ul><h2 id="feature-improvements-beyond-ai">Feature Improvements Beyond AI</h2><h3 id="additional-datagrid-enhancements">Additional DataGrid Enhancements</h3><p>Alongside the new smart features, this release brings developer‑focused improvements to the traditional DataGrid experience.</p><p>Features like CSV export, stacked layout modes and column min/max width constraints in KendoReact give more control over how data is presented and consumed.</p><p>The customizable keyboard shortcuts and improved sorting performance make the Telerik UI for Blazor Grid feel faster and easier to tailor to complex scenarios. Data interaction with grouping‑sort behavior allows grouped data to be reordered directly from the UI.</p><h3 id="chat-ui-improvements-across-the-board">Chat UI Improvements Across the Board</h3><p>Users can now quickly jump to the most recent messages with a dedicated scroll-to-bottom button. Message delivery is also more transparent with improved status indicators that can display text, icons or both, along with a new failed message state that allows users to easily resend messages with a single click.</p><p>Suggestions have also been refined. Clicked items can optionally disappear from the list and can now be inserted into the input for editing before sending.</p><p>These enhancements are powered by a more capable input experience, supporting single-line, multiline and auto-expand modes, customizable prefix and suffix content, and built-in actions like speech-to-text and file selection, making the Chat control more flexible, modern and user-friendly.</p><p>All these features make the component equally well suited for AI-to-human interactions and traditional human-to-human conversations.</p><h3 id="diagram-interaction-enhancements">Diagram Interaction Enhancements</h3><p>You can now add text directly to connections with flexible positioning options, display tooltips on nodes and connections, and benefit from larger grab points that make starting new connections more precise.</p><p>Interaction is smoother with resizable connection segments, improved snapping between shapes and connectors, and automatic scrollbars when the canvas exceeds the viewport.</p><p>Additional upgrades such as keyboard navigation and resizable shapes contribute to a more polished and accessible diagramming experience.</p><h3 id="new-in-kendo-ui-for-angular-spreadsheet-scheduler-and-pdfviewer">New in Kendo UI for Angular Spreadsheet, Scheduler and PDFViewer</h3><p><strong><a target="_blank" href="https://www.telerik.com/kendo-angular-ui/components/scheduler">Angular Scheduler</a></strong> gains more flexible calendar control with options to show or hide days, weekends and other non‑working periods, along with improved slot styling.</p><p>The <strong><a target="_blank" href="https://www.telerik.com/kendo-angular-ui/components/spreadsheet">Angular Spreadsheet</a></strong> now enables Excel‑like filtering, sorting with visual indicators and comprehensive copy/paste/cut event handling.</p><p>Meanwhile, the <strong><a target="_blank" href="https://www.telerik.com/kendo-angular-ui/components/pdfviewer">Angular PDFViewer</a></strong> introduces support for form filling and blank pages and reuses the modern Toolbar component.</p><h3 id="telerik-reporting-and-report-server-updates">Telerik Reporting and Report Server Updates</h3><p>With this release, Telerik reporting tools include inline image support in HtmlTextBox, repeat‑on‑every‑page table group headers, improved .NET‑based serialization and full Unicode BiDi text handling for accurate multilingual rendering&mdash;all designed to boost performance, readability and global accessibility. Developers also gain access to the downloadable .NET reporting source code, making debugging, customization and exploration easier.</p><h3 id="core-document-processing-enhancements">Core Document Processing Enhancements</h3><p>New MIME type support for embedded files allows developers to explicitly define how attachments like XML, JSON or CSV payloads are represented inside PDFs, while automatic file‑format detection makes it easier to load documents from byte arrays. Compliance is further improved through EU DSS‑aligned digital signing, helping validate PDFs against official European Commission standards. Additionally, Timestamp Server support in PdfStreamSigner enables trusted, verifiable timestamps that support long‑term signature validity.</p><h2 id="modern-framework-support-and-integrations">Modern Framework Support and Integrations</h2><h3 id="angular-v21-adoption">Angular v21 Adoption</h3><p><a target="_blank" href="https://www.telerik.com/blogs/angular-21-my-favorite-new-features-quick-demo-look-whats-next">Kendo UI for Angular is fully aligned with Angular v21</a>, enabling seamless compatibility with the latest framework updates and giving developers immediate access to improved performance, modern APIs and long‑term platform stability.</p><h3 id="net-11-preview-1-compatibility">.NET 11 Preview 1 Compatibility</h3><p>Telerik UI libraries and tools are compatible with .NET 11 Preview 1, allowing early adopters to start experimenting with the latest .NET platform updates.</p><h3 id="jquery-4.0.0-support">jQuery 4.0.0 Support</h3><p>After almost a decade, jQuery 4.0.0 has arrived, removing legacy browser support, dropping deprecated APIs, aligning event behavior with modern standards and overall modernizing the codebase. <a target="_blank" href="https://www.telerik.com/blogs/jquery-4-support-whats-new-how-kendo-ui-has-you-covered">Kendo UI for jQuery is fully compatible and ready for jQuery 4</a>.</p><h3 id="justmock-gitlab-integration">JustMock-GitLab integration</h3><p><a target="_blank" href="https://www.telerik.com/products/justmock/documentation/integration/continuous-integration/gitlab">JustMock now integrates with GitLab CI/CD</a>, enabling teams to run and automate JustMock‑based unit tests directly within their GitLab pipelines.</p><h2 id="what’s-new--release-history">What&rsquo;s New &amp; Release History</h2><p>To see everything that is new in 2026 Q1, visit the <a target="_blank" href="https://www.telerik.com/support/whats-new">What&rsquo;s New in Telerik and Kendo UI</a> page. For a deeper dive into each product, follow the links below.</p><table><style>table,
 th,
        td {
            border: 1px;
            border-color: #bdbdba;
            border-style: dotted;
            border-collapse: collapse;
            margin-right: auto;
            text-align: left;
        }
    </style>
 <thead><tr><th style="width:33.3333%;padding:5px;"><strong>Product</strong></th><th style="width:33.3333%;padding:5px;"><strong>What&rsquo;s New</strong></th><th style="width:33.3333%;padding:5px;"><strong>Release History</strong></th></tr></thead><tbody><tr><td style="width:33.3333%;padding:5px;">Kendo UI for Angular</td><td style="width:33.3333%;padding:5px;"><a target="_blank" href="https://www.telerik.com/support/whats-new/kendo-angular-ui/2026-q1">What&rsquo;s New in Kendo UI for Angular</a></td><td style="width:33.3333%;padding:5px;"><a target="_blank" href="https://www.telerik.com/kendo-angular-ui/components/changelogs/kendo-angular-ui#v23.0.1">Kendo UI for Angular Release History</a></td></tr><tr><td style="width:33.3333%;padding:5px;">KendoReact</td><td style="width:33.3333%;padding:5px;"><a target="_blank" href="https://www.telerik.com/support/whats-new/kendo-react-ui/2026-q1">What&rsquo;s New in KendoReact</a></td><td style="width:33.3333%;padding:5px;"><a target="_blank" href="https://www.telerik.com/kendo-react-ui/components/changelogs/ui-for-react#v14.0.0">KendoReact Release History</a></td></tr><tr><td style="width:33.3333%;padding:5px;">Kendo UI for Vue</td><td style="width:33.3333%;padding:5px;"><a target="_blank" href="https://www.telerik.com/support/whats-new/kendo-vue-ui/2026-q1">What&rsquo;s New in Kendo UI for Vue</a></td><td style="width:33.3333%;padding:5px;"><a target="_blank" href="https://www.telerik.com/kendo-vue-ui/components/changelogs/ui-for-vue#v8.0.0">Kendo UI for Vue Release History</a></td></tr><tr><td style="width:33.3333%;padding:5px;">Kendo UI for jQuery</td><td style="width:33.3333%;padding:5px;"><a target="_blank" href="https://www.telerik.com/support/whats-new/kendo-jquery-ui/2026-q1">What&rsquo;s New in Kendo UI for jQuery</a></td><td style="width:33.3333%;padding:5px;"><a target="_blank" href="https://www.telerik.com/support/whats-new/kendo-ui/release-history/kendo-ui-for-jquery-2026-1-212-(2026-q1)">Kendo UI for jQuery Release History</a></td></tr><tr><td style="width:33.3333%;padding:5px;">Telerik UI for Blazor</td><td style="width:33.3333%;padding:5px;"><a target="_blank" href="https://www.telerik.com/support/whats-new/blazor-ui/2026-q1">What&rsquo;s New in Telerik UI for Blazor</a></td><td style="width:33.3333%;padding:5px;"><a target="_blank" href="https://www.telerik.com/support/whats-new/blazor-ui/release-history/telerik-ui-for-blazor-13-0-0-(2026-q1)">Telerik UI for Blazor Release History</a></td></tr><tr><td style="width:33.3333%;padding:5px;">Telerik UI for ASP.NET Core</td><td style="width:33.3333%;padding:5px;"><a target="_blank" href="https://www.telerik.com/support/whats-new/aspnet-core-ui/2026-q1">What&rsquo;s New in Telerik UI for ASP.NET Core</a></td><td style="width:33.3333%;padding:5px;"><a target="_blank" href="https://www.telerik.com/support/whats-new/aspnet-core-ui/release-history/telerik-ui-for-asp-net-core-2026-1-212-(2026-q1)">Telerik UI for ASP.NET Core Release History</a></td></tr><tr><td style="width:33.3333%;padding:5px;">Telerik UI for ASP.NET MVC</td><td style="width:33.3333%;padding:5px;"><a target="_blank" href="https://www.telerik.com/support/whats-new/aspnet-mvc/2026-q1">What&rsquo;s New in Telerik UI for ASP.NET MVC</a></td><td style="width:33.3333%;padding:5px;"><a target="_blank" href="https://www.telerik.com/support/whats-new/aspnet-mvc/release-history/telerik-ui-for-asp-net-mvc-2026-1-212-(2026-q1)">Telerik UI for ASP.NET MVC Release History</a></td></tr><tr><td style="width:33.3333%;padding:5px;">Telerik UI for ASP.NET AJAX</td><td style="width:33.3333%;padding:5px;"><a target="_blank" href="https://www.telerik.com/support/whats-new/aspnet-ajax/2026-q1">What&rsquo;s New in Telerik UI for ASP.NET AJAX</a></td><td style="width:33.3333%;padding:5px;"><a target="_blank" href="https://www.telerik.com/support/whats-new/aspnet-ajax/release-history/telerik-ui-for-asp-net-ajax-2026-1-211-(2026-q1)">Telerik UI for ASP.NET AJAX Release History</a></td></tr><tr><td style="width:33.3333%;padding:5px;">Telerik UI for .NET MAUI</td><td style="width:33.3333%;padding:5px;"><a target="_blank" href="https://www.telerik.com/support/whats-new/maui-ui/2026-q1">What&rsquo;s New in Telerik UI for .NET MAUI</a></td><td style="width:33.3333%;padding:5px;"><a target="_blank" href="https://www.telerik.com/support/whats-new/maui-ui/release-history/telerik-ui-for-net-maui-13-0-0-(2026-q1)">Telerik UI for .NET MAUI Release History</a></td></tr><tr><td style="width:33.3333%;padding:5px;">Telerik UI for WPF</td><td style="width:33.3333%;padding:5px;"><a target="_blank" href="https://www.telerik.com/support/whats-new/wpf/2026-q1">What&rsquo;s New in Telerik UI for WPF</a></td><td style="width:33.3333%;padding:5px;"><a target="_blank" href="https://www.telerik.com/support/whats-new/wpf/release-history/telerik-ui-for-wpf-2026-1-211-(2026-q1)">Telerik UI for WPF Release History</a></td></tr><tr><td style="width:33.3333%;padding:5px;">Telerik UI for WinForms</td><td style="width:33.3333%;padding:5px;"><a target="_blank" href="https://www.telerik.com/support/whats-new/winforms/2026-q1">What&rsquo;s New in Telerik UI for WinForms</a></td><td style="width:33.3333%;padding:5px;"><a target="_blank" href="https://www.telerik.com/support/whats-new/winforms/release-history/telerik-ui-for-winforms-2026-1-210-(2026-q1)">Telerik UI for WinForms Release History</a></td></tr><tr><td style="width:33.3333%;padding:5px;">ThemeBuilder</td><td style="width:33.3333%;padding:5px;"><a target="_blank" href="https://www.telerik.com/support/whats-new/themebuilder/2026-q1">What&rsquo;s New in ThemeBuilder</a></td><td style="width:33.3333%;padding:5px;"><a target="_blank" href="https://docs.telerik.com/themebuilder/release-notes#11022026">ThemeBuilder Release Notes</a></td></tr><tr><td style="width:33.3333%;padding:5px;">Telerik Reporting</td><td style="width:33.3333%;padding:5px;"><a target="_blank" href="https://www.telerik.com/support/whats-new/reporting/2026-q1">What&rsquo;s New in Telerik Reporting</a></td><td style="width:33.3333%;padding:5px;"><a target="_blank" href="https://www.telerik.com/support/whats-new/reporting/release-history/progress-telerik-reporting-2026-q1-(20-0-26-211)">Telerik Reporting Release History</a></td></tr><tr><td style="width:33.3333%;padding:5px;">Telerik Report Server</td><td style="width:33.3333%;padding:5px;"><a target="_blank" href="https://www.telerik.com/support/whats-new/report-server/2026-q1">What&rsquo;s New in Telerik Report Server</a></td><td style="width:33.3333%;padding:5px;"><a target="_blank" href="https://www.telerik.com/support/whats-new/report-server/release-history/progress-telerik-report-server-2026-q1-(12-0-26-211)">Telerik Report Server Release History</a></td></tr><tr><td style="width:33.3333%;padding:5px;">Telerik Document Processing</td><td style="width:33.3333%;padding:5px;"><a target="_blank" href="https://www.telerik.com/document-processing-libraries">What&rsquo;s New in Telerik DPL</a></td><td style="width:33.3333%;padding:5px;"><a target="_blank" href="https://www.telerik.com/support/whats-new/telerik-document-processing/release-history/progress-telerik-document-processing-2026-1-210">Telerik DPL Release History</a></td></tr><tr><td style="width:33.3333%;padding:5px;">Telerik JustMock</td><td style="width:33.3333%;padding:5px;"><a target="_blank" href="https://www.telerik.com/support/whats-new/justmock/2026-q1">What&rsquo;s New in Telerik JustMock</a></td><td style="width:33.3333%;padding:5px;"><a target="_blank" href="https://www.telerik.com/support/whats-new/justmock/release-history/justmock-2026-q1-(2026-1-211-494)">Telerik JustMock Release History</a></td></tr></tbody></table>]]></content>
  </entry>
  <entry>
    <id>urn:uuid:ef2fed66-adbb-442e-90a1-a45ab5b4e2db</id>
    <title type="text">Exploring Compiled Bindings in .NET MAUI</title>
    <summary type="text">Learn about compiled bindings in .NET MAUI and how they affect performance and debugging.</summary>
    <published>2026-02-11T19:03:47Z</published>
    <updated>2026-04-11T15:57:40Z</updated>
    <author>
      <name>Leomaris Reyes </name>
    </author>
    <link rel="alternate" href="https://www.telerik.com/blogs/exploring-compiled-bindings-net-maui"/>
    <content type="text"><![CDATA[<p><span class="featured">Learn about compiled bindings in .NET MAUI and how they affect performance and debugging.</span></p><p>Imagine you&rsquo;re about to buy a house &hellip; but you can only discover its defects once you&rsquo;re already living in it.</p><p>You&rsquo;d definitely want to know that information beforehand to make better decisions, right? ️</p><p>The same thing happens in applications: depending on the mechanism we choose, some processes can be slower, consume more resources and&mdash;even worse&mdash;show errors way too late.</p><p>Today, you&rsquo;ll learn what <strong>Compiled Bindings</strong> are and the latest enhancements available in .NET MAUI to boost performance and avoid unpleasant surprises when the app is already in the users&rsquo; hands. </p><h2 id="data-bindings-in-.net-maui">Data Bindings in .NET MAUI</h2><p>In .NET MAUI, we usually work with <strong>data bindings,</strong> but when using them, it&rsquo;s important to keep two key points in mind:</p><ul><li><p><strong>There&rsquo;s no compile-time validation of binding expressions</strong>, which means that if a binding is invalid, we&rsquo;ll only find out when the app is already running. This can cost us valuable time, when we could have detected the issue during the compilation process.</p></li><li><p><strong>And another point</strong>, related to the one above, is that runtime verification bindings aren&rsquo;t very efficient in terms of performance, since they do all their work while the app is running.  To &ldquo;check&rdquo; the information they need, they must inspect objects over and over again. This makes the process slower and, of course, increases resource consumption.</p></li></ul><p>Compiled bindings enhance the performance of data bindings in .NET MAUI by resolving binding expressions during compile time instead of waiting until the app is running. This allows the system to detect issues early, so if a binding is incorrect, it will show up as a build error. As a result, debugging becomes easier and you avoid dealing with unexpected binding failures at runtime.</p><h2 id="compile-time-vs.-runtime-">Compile Time vs. Runtime </h2><p>We&rsquo;ve been talking a lot about compile time and runtime, so if those terms still feel a bit blurry for you, here&rsquo;s a simple explanation to make everything clearer.</p><p>➖ <strong>Compile Time:</strong> This is the moment when your code is checked to make sure everything is correct before the app can run. Here is where issues like typos in property names, missing variables, or incompatible types are detected. If something is wrong, the build stops and alerts you so you can fix it first. This saves a lot of headaches&mdash;it&rsquo;s always better to catch errors at this stage rather than later on.</p><p>➖ <strong>Runtime:</strong> This occurs when the app is already running. If an error appears at this point, it can definitely be fixed&mdash;but it may take a bit more time, since you often need to analyze more carefully to understand exactly what caused the issue. And worst of all, it can <strong>crash or freeze the app right in front of the user</strong>.</p><p>Summarizing it in a table, these would be the differences between the two:</p><p><img src="https://d585tldpucybw.cloudfront.net/sfimages/default-source/blogs/2026/2026-01/01_compiletime_and_runtime.png?sfvrsn=b1dee264_2" alt="Description: Compile Time, When does it happen? Before running the app, If there’s an error?: It stops the build and alerts you - Description: Runtime, When does it happen? While the app is running, If there’s an error? The app may crash while it’s running" /></p><h2 id="ways-to-use-compiled-bindings">Ways to Use Compiled Bindings</h2><p>There are two ways to use compiled bindings in .NET MAUI: you can apply them directly in your XAML files or configure them through C# code.</p><p>Let&rsquo;s explore each one of them:</p><h3 id="compiled-bindings-in-xaml">Compiled Bindings in XAML</h3><p>In .NET MAUI 8, compiled bindings aren&rsquo;t applied when a XAML binding uses the Source property, and they also don&rsquo;t support multi-bindings.</p><p>Starting in .NET MAUI 9, the compiler now shows warnings when bindings aren&rsquo;t using compiled bindings by default. You can learn more about this behavior in the article: <a target="_blank" href="https://learn.microsoft.com/en-us/dotnet/maui/fundamentals/data-binding/compiled-bindings?view=net-maui-9.0&amp;preserve-view=true#xaml-compiled-bindings-warnings">XAML compiled binding warnings</a>.</p><h3 id="compiled-bindings-in-c-code">Compiled Bindings in C# Code</h3><p>Working with compiled bindings brings many benefits. One of the biggest ones&mdash;besides performance improvements&mdash;is that it gives us a much better experience as developers. It saves us a lot of time by showing problems <strong>before</strong> running the application. Otherwise, we would have to debug, investigate exactly where the issue happens, identify the error and then fix it. Now, IntelliSense can warn us right away.</p><p>When using bindings on C#, we normally rely on string-based property paths, such as <code>"Text"</code>.</p><p>These paths are resolved at runtime using reflection, and that process consumes resources. On top of that, the performance cost can vary depending on the platform where the app is running (Android, iOS, Windows, etc.).</p><p>Example:</p><pre class=" language-csharp"><code class="prism  language-csharp">// .NET 8
MyLabel.SetBinding(Label.TextProperty, "Text");
</code></pre><p>Now, in <strong>.NET MAUI 9,</strong> a new <code>SetBinding</code> extension method was introduced that allows defining bindings using a lambda expression (<strong>Func</strong>) instead of a string.</p><p>Like this:</p><pre class=" language-csharp"><code class="prism  language-csharp">// .NET 9 
MyLabel.SetBinding(Label.TextProperty, static (Entry entry) =&gt; entry.Text);
</code></pre><p>When using <code>SetBinding</code>, you need to be careful with the lambda expressions you define. Only simple property access expressions are allowed. This is because compiled bindings need to know exactly which property is being bound in order to generate the optimized binding code at compile time.</p><p>A valid example would be directly accessing the <code>Name</code> property:</p><pre class=" language-csharp"><code class="prism  language-csharp"><span class="token keyword">static</span> <span class="token punctuation">(</span>PersonViewModel vm<span class="token punctuation">)</span> <span class="token operator">=</span><span class="token operator">&gt;</span> vm<span class="token punctuation">.</span>Name<span class="token punctuation">;</span>
</code></pre><p><strong>Besides property access, you can also use:</strong></p><p> Array or list index access</p><pre class=" language-xml"><code class="prism  language-xml">static (PersonViewModel vm) =&gt; vm.PhoneNumbers[0];
</code></pre><p> Indexer access (<code>[]</code>)</p><pre class=" language-xml"><code class="prism  language-xml">static (PersonViewModel vm) =&gt; vm.Config["Font"];
</code></pre><p> Casts to access the correct property</p><pre class=" language-xml"><code class="prism  language-xml">static (Label label) =&gt; (label.BindingContext as PersonViewModel).Name;

static (Label label) =&gt; ((PersonViewModel)label.BindingContext).Name;
</code></pre><p><strong>❌ What is not allowed?</strong></p><p>Just as it&rsquo;s important to know what is supported, it&rsquo;s equally important to understand what isn&rsquo;t. Here are some examples:</p><p>➖ Method calls</p><pre class=" language-xml"><code class="prism  language-xml">static (PersonViewModel vm) =&gt; vm.GetAddress();
</code></pre><p>➖ Creating new values by combining multiple properties</p><pre class=" language-xml"><code class="prism  language-xml">static (PersonViewModel vm) =&gt; vm.Address?.Street + " " + vm.Address?.City;
</code></pre><p>➖ String interpolation</p><pre class=" language-xml"><code class="prism  language-xml">static (PersonViewModel vm) =&gt; $"Name: {vm.Name}";
</code></pre><h2 id="bindingbase.create">BindingBase.Create</h2><p>Another improvement in .NET MAUI 9 is BindingBase.Create.</p><p>In addition to using lambda expressions directly with <code>SetBinding</code>, .NET MAUI 9 also adds a helper called <code>BindingBase.Create</code>. This is useful for more complex bindings, such as a <code>MultiBinding</code>.</p><p>Example:</p><p><strong>.NET 8</strong></p><pre class=" language-csharp"><code class="prism  language-csharp">myEntry.SetBinding(Entry.TextProperty, new MultiBinding 
{ 
    Bindings = new Collection&lt;BindingBase&gt; 
    { 
    new Binding(nameof(Entry.FontFamily), source: RelativeBindingSource.Self), 
    new Binding(nameof(Entry.FontSize), source: RelativeBindingSource.Self), 
    new Binding(nameof(Entry.FontAttributes), source: RelativeBindingSource.Self), 
    }, 
Converter = new StringConcatenationConverter()

});
</code></pre><p><strong>Now in .NET 9</strong></p><pre class=" language-csharp"><code class="prism  language-csharp">// in .NET 9

myEntry.SetBinding(Entry.TextProperty, new MultiBinding 
    { 
    Bindings = new Collection&lt;BindingBase&gt; 
    { 
    Binding.Create(static (Entry entry) =&gt; entry.FontFamily, source: RelativeBindingSource.Self), 
    Binding.Create(static (Entry entry) =&gt; entry.FontSize, source: RelativeBindingSource.Self), 
    Binding.Create(static (Entry entry) =&gt; entry.FontAttributes, source: RelativeBindingSource.Self), 
    }, 
    Converter = new StringConcatenationConverter() 
    });
</code></pre><h2 id="compiler-error">Compiler Error</h2><p>⚠️ <strong>Important:</strong> The official documentation says: &ldquo;A CS0272 compiler error will occur if the set accessor for a property or indexer is inaccessible. If this occurs, increase the accessibility of the accessor.&rdquo;</p><p><strong>Let&rsquo;s understand it in a simpler way.</strong></p><p>This error may appear when you try to assign a value to a property or indexer, but its set accessor isn&rsquo;t accessible. For example:</p><pre class=" language-csharp"><code class="prism  language-csharp">public string Name { get; private set; }
</code></pre><p>Here, the <code>Name</code> property can be read, but the set is private&mdash;so if you try to assign a value, it won&rsquo;t be possible:</p><pre class=" language-csharp"><code class="prism  language-csharp">person.Name = "Leo"; // ❌ CS0272
</code></pre><p><strong>And what would be the solution to avoid a CS0272 error?</strong> Just change the accessibility of the set so that it can be modified when needed, for example:</p><pre class=" language-csharp"><code class="prism  language-csharp">public string Name { get; set; } // ✅ Now it can be updated
</code></pre><h2 id="conclusion">Conclusion</h2><p>And that&rsquo;s it!  Now you know what compiled bindings are, why they matter for performance and debugging, and how to use them in C#&mdash;including the enhancements introduced in .NET MAUI 9. </p><p>By applying compiled bindings, your apps become faster, more reliable and much easier to troubleshoot &hellip; before your users ever see an error. I hope this guide helps you improve the quality and performance of your applications starting today!</p><p>If you have any questions or want to see more related topics, feel free to leave them in the comments&mdash;I&rsquo;d love to help you! </p><p>See you in the next article! &zwj;♀️</p><h3 id="references">References</h3><p>The explanation was based on the official documentation, and includes most of the code examples presented there.</p><ul><li><a target="_blank" href="https://learn.microsoft.com/en-us/dotnet/maui/whats-new/dotnet-9?view=net-maui-9.0">https://learn.microsoft.com/en-us/dotnet/maui/whats-new/dotnet-9?view=net-maui-9.0</a></li></ul><aside><hr data-sf-ec-immutable="" /><div class="row"><div class="col-4 u-normal-full u-small-mb0"><h4 class="u-fs20 u-fw5 u-lh125 u-mb0">Adding External Fonts in .NET MAUI</h4></div><div class="col-8"><p class="u-fs16 u-mb0">Change your font, change your app. Here&rsquo;s how to use an <a target="_blank" href="https://www.telerik.com/blogs/adding-external-fonts-net-maui">external font inside your .NET MAUI</a> app to match your branding and style.</p></div></div></aside>]]></content>
  </entry>
  <entry>
    <id>urn:uuid:f52458cd-0570-40b3-9484-6fac69dafe2c</id>
    <title type="text">Replicating a Valentine-Inspired Login UI in .NET MAUI</title>
    <summary type="text">Learn how to build a Valentine-inspired login interface with .NET MAUI. We’ll go through the process step by step!</summary>
    <published>2026-02-05T16:49:46Z</published>
    <updated>2026-04-11T15:57:40Z</updated>
    <author>
      <name>Leomaris Reyes </name>
    </author>
    <link rel="alternate" href="https://www.telerik.com/blogs/replicating-valentine-inspired-login-ui-net-maui"/>
    <content type="text"><![CDATA[<p><span class="featured">Learn how to build a Valentine-inspired login interface with .NET MAUI. We&rsquo;ll go through the process step by step!</span></p><p>We find love in many forms: in the people around us, in that hobby we enjoy so much, in wearing clothes that make us feel good &hellip; and also in every step of our professional growth.</p><p>Yes, even in that love for creating beautiful, functional and well-thought-out user interfaces using XAML.</p><p>For many, designing UI can be a challenge. But like everything in development, that challenge is overcome by learning, practicing and daring to create. That&rsquo;s why in this article we&rsquo;re going to build a Valentine&rsquo;s-inspired UI, taking as reference a design found on <a target="_blank" href="https://dribbble.com/shots/22000659-Sign-in-Sign-up-UI-design-Valentine-s-Day-Style">Dribbble</a> and adapting it into an implementation using .NET MAUI.</p><p>We&rsquo;ll build step by step a registration and a login screen. We&rsquo;ll break down each section with its corresponding code blocks, so you can walk away not only with a visually appealing interface, but also with practical ideas you can apply to your own projects.</p><p>So get ready, because today we&rsquo;re putting a little love into code. ❤️</p><h2 id="explanation--insights">Explanation &amp; Insights</h2><p>Before we get started, let&rsquo;s go over a few key points that will help you better understand and replicate the UI:</p><ul><li><strong>Visual guide:</strong> Before we begin, I&rsquo;ll share a preview of the UI we want to achieve. This image will be divided into color-coded blocks to make it easier to identify each section throughout the article.</li><li><strong>Code blocks:</strong> Each block will be explained separately. Every section will include a textual explanation, a code snippet with the exact code you need to write to achieve the result, and a screenshot showing how the UI evolves step by step.</li><li><strong>No styles:</strong> For the moment, we won&rsquo;t use styles. This way, even developers who are just starting to build UIs can follow along more easily and understand the core structure without extra complexity. ❤️</li></ul><h2 id="breaking-down-the-dribbble-design-into-blocks">Breaking Down the Dribbble Design into Blocks</h2><p>To make this easier to follow, I&rsquo;ve divided the original design into clear blocks. We&rsquo;ll build each part one at a time, in the order you see below.</p><p><img src="https://d585tldpucybw.cloudfront.net/sfimages/default-source/blogs/2026/2026-01/01_main_structure.png?sfvrsn=5241b8a5_2&amp;Culture=en" /></p><h2 id="main-structure">Main Structure</h2><p>To create the first screen, we&rsquo;ll start by creating a file called SignInPage.xaml. This file will contain the elements corresponding to blocks one and two of the block-based structure shown earlier.</p><p>Before we begin adding elements, it&rsquo;s important to define an efficient structure, and this is where the layout comes into play. Choosing the right layout allows us to organize elements more easily within the screen. Since this is a simple example with a single vertical column of elements, we&rsquo;ll use VerticalStackLayout as the main layout.</p><p>The <strong>VerticalStackLayout</strong> allows the elements to be vertically centered. Additionally, I added <strong>30 of horizontal padding</strong> and a <strong>spacing of 40</strong> between all the elements contained on this screen.</p><pre class=" language-xml"><code class="prism  language-xml">&lt;ScrollView&gt; 
    &lt;VerticalStackLayout 
    VerticalOptions="Center" 
    Padding="30,0" 
    Spacing="40"&gt;
     
    &lt;!-- Add all the code here &rarr;
     
    &lt;/VerticalStackLayout&gt; 
&lt;/ScrollView&gt;
</code></pre><p> <strong>Tip:</strong> We&rsquo;ll also wrap this layout inside a ScrollView, so that on devices with smaller screens, users can scroll through the content without it being cut off or overflowing the screen.</p><p>If you want to know more information about VerticalStackLayout, I invite you to read the article <a target="_blank" href="https://www.telerik.com/blogs/exploring-layout-options-dotnet-maui">Exploring Layout Options in .NET MAUI</a>.</p><p><strong>Adding a background to the ContentPage:</strong> To give the page a uniform background color, we add the <strong>BackgroundColor</strong> property to the <strong>ContentPage</strong> and assign it the value <strong>#FFF8F8</strong>.</p><h2 id="header-block">Header Block</h2><p>Now we&rsquo;re ready! Let&rsquo;s start building the first block.</p><p>Before creating a UI, I like to analyze all the elements that make it up. This helps me clearly identify which components I&rsquo;ll need and avoid having to rewrite code later on.</p><p>In this first block, the elements we see on the screen are:</p><ul><li>A horizontally centered image &rarr; we&rsquo;ll use an <code>&lt;Image&gt;</code> component</li><li>A red title &rarr; we&rsquo;ll use a <code>&lt;Label&gt;</code></li><li>A description or subtitle in black &rarr; we&rsquo;ll use a <code>&lt;Label&gt;</code></li></ul><p>Let&rsquo;s start by adding the image </p><pre class=" language-xml"><code class="prism  language-xml">&lt;Image 
    Source="heart" 
    HeightRequest="100" 
    Aspect="AspectFit" 
    SemanticProperties.Description="Header image" /&gt;

&lt;!-- Add the next code block below --&gt;
</code></pre><p>Here are a few important points to highlight:</p><p>➖ <strong>AspectFit:</strong> We added the image using the <strong>Aspect</strong> property with the value <strong>AspectFit</strong>, which allows the image to fit entirely within the available display area without being distorted. You can learn more about the differences between the various <a target="_blank" href="https://askxammy.com/image-scaling-in-net-maui/">image aspect options in this article</a>.</p><p>➖ <strong>SemanticProperties:</strong> We added a <strong>semantic description</strong>, which helps screen readers understand what element is being displayed on the screen. You can read more about this topic in the article <a target="_blank" href="https://www.telerik.com/blogs/creating-accessible-apps-semantic-properties-dotnet-maui">Creating Accessible Apps with Semantic Properties in .NET MAUI</a>.</p><p>Let&rsquo;s continue adding the Label with the title:</p><pre class=" language-xml"><code class="prism  language-xml">&lt;Label 
    Text="Sign In" 
    FontSize="20" 
    FontAttributes="Bold" 
    TextColor="#d14361" 
    SemanticProperties.Description="Sign In" /&gt; 
&lt;!-- Add the next code block below --&gt;
</code></pre><p>And to finish this first block, let&rsquo;s add the description or subtitle:</p><pre class=" language-xml"><code class="prism  language-xml">&lt;Label 
    Text=&rdquo;Welcome! Please sign in to access your account and explore a world of possibilities." 
    TextColor="#121111" 
    FontSize="15" 
    SemanticProperties.Description="Welcome!"/&gt; 
&lt;!-- Add the next code block below --&gt;
</code></pre><p><strong>At this point, your UI should look similar to the following example:</strong></p><p><img src="https://d585tldpucybw.cloudfront.net/sfimages/default-source/blogs/2026/2026-01/03_block_01_demo.png?sfvrsn=fd0748c5_2&amp;Culture=en" /></p><h2 id="sign-in-content-block">Sign-in Content Block</h2><p>Continuing with the second block, let&rsquo;s take a look at the elements that make up this component:</p><ul><li><strong>Two input fields:</strong> One for the username and one for the password</li><li><strong>Two buttons:</strong> The first with the fields, &ldquo;Login&rdquo;; and the second for &ldquo;Create an account&rdquo;</li><li><strong>Two labels:</strong> One for the &ldquo;Forgot your password&rdquo; message and another for &ldquo;Don&rsquo;t have an account&rdquo;</li></ul><p>Let&rsquo;s start with the two fields for the username and password </p><p>Here, in addition to the username <strong>Entry</strong>, we add a password <strong>Entry</strong> and set the <strong>IsPassword</strong> property to <strong>True</strong> so the characters are hidden as the user types.</p><pre class=" language-xml"><code class="prism  language-xml">&lt;Entry Placeholder="Username"/&gt; 
&lt;Entry IsPassword="True" Placeholder="Password"/&gt;
&lt;!-- Add the next code block below --&gt;
</code></pre><h3 id="the-login-button">The Login Button</h3><pre class=" language-xml"><code class="prism  language-xml">&lt;Button BackgroundColor="#d14361" 
    CornerRadius="50" 
    FontAttributes="Bold" 
    HeightRequest="50" 
    Text="LOGIN"/&gt;
&lt;!-- Add the next code block below --&gt;
</code></pre><h3 id="forgot-your-password-label">Forgot Your Password Label</h3><p>This text is composed of two different styles, and since a simple <strong>&lt;Label&gt;</strong> cannot handle multiple styles at the same time, we&rsquo;ll use <strong>&lt;Label.FormattedText&gt;</strong> to achieve this.</p><pre class=" language-xml"><code class="prism  language-xml">&lt;Label&gt; 
    &lt;Label.FormattedText&gt; 
    &lt;FormattedString&gt; 
    &lt;Span Text="Forgot password? " TextColor="#555351" /&gt; 
    &lt;Span Text=" Reset here" TextColor="#d14361" FontAttributes="Bold"/&gt; 
    &lt;/FormattedString&gt; 
    &lt;/Label.FormattedText&gt; 
&lt;/Label&gt; 
&lt;!-- Add the next code block below --&gt;
</code></pre><h3 id="don’t-have-an-account-label">Don&rsquo;t Have an Account Label</h3><pre class=" language-xml"><code class="prism  language-xml">&lt;Label Text=" Don't have an account?" 
    HorizontalOptions="Center" 
    TextColor="Gray"/&gt; 
&lt;!-- Add the next code block below --&gt;
</code></pre><h3 id="create-an-account-button">Create an Account Button</h3><pre class=" language-xml"><code class="prism  language-xml">&lt;Button BackgroundColor="#9A8687" 
    CornerRadius="50" 
    HeightRequest="50" 
    FontAttributes="Bold" 
    Text="CREATE AN ACCOUNT"/&gt;
</code></pre><p><strong>And that&rsquo;s it!</strong>  We&rsquo;ve completed this second section, which means the first screen is now finished. At this point, your result should look like the following:</p><p><img src="https://d585tldpucybw.cloudfront.net/sfimages/default-source/blogs/2026/2026-01/05_block_02_demo.png?sfvrsn=f6f6d484_2&amp;Culture=en" /></p><h2 id="create-account-page">Create Account Page</h2><p>We&rsquo;ve reached the final stretch! And the last screen! </p><p>Since this is a new screen, we&rsquo;ll create a file called CreateAccountPage.xaml. Just like on the previous screen, we&rsquo;ll use a VerticalStackLayout as the main layout.</p><pre class=" language-xml"><code class="prism  language-xml">&lt;ScrollView&gt; 
    &lt;VerticalStackLayout 
    VerticalOptions="Center" 
    Padding="30,0" 
    Spacing="40"&gt; 
    
    &lt;!-- Add all the code here &rarr;
     
    &lt;/VerticalStackLayout&gt; 
&lt;/ScrollView&gt;
</code></pre><p>✍️ Here, we will also add the <strong>BackgroundColor</strong> property to the ContentPage, setting its value to <strong>#FFF8F8</strong>.</p><p>This screen contains several elements&mdash;let&rsquo;s start with the title and the description labels:</p><pre class=" language-xml"><code class="prism  language-xml">&lt;Label 
    Text="Create an account" 
    FontSize="20" 
    FontAttributes="Bold" 
    TextColor="#d14361"/&gt; 
    
&lt;Label 
    Text="Join us on an exciting journey! Create your account and embark on a path filled with discovery and opportunities." 
    TextColor="#121111" 
    FontSize="15"/&gt;

&lt;!-- Add the next code block below --&gt;
</code></pre><p>Let&rsquo;s continue with the username, email and password input fields. To keep this example simple, we won&rsquo;t add a show/hide password feature.</p><pre class=" language-xml"><code class="prism  language-xml">&lt;Entry Placeholder="Username"/&gt;

&lt;Entry Placeholder="Email"/&gt;

&lt;Entry IsPassword="True" Placeholder="Password"/&gt;
</code></pre><p>Finally, let&rsquo;s add a button, text for the terms and conditions, and another button to navigate to the Sign Up action.</p><pre class=" language-xml"><code class="prism  language-xml">&lt;Button BackgroundColor="#d14361" 
    CornerRadius="50" 
    FontAttributes="Bold" 
    HeightRequest="50" 
    Text="SIGN UP"/&gt;
 
&lt;Label&gt; 
    &lt;Label.FormattedText&gt; 
    &lt;FormattedString&gt; 
    &lt;Span Text="By tapping 'Sign In' you accept out " TextColor="#555351" /&gt; 
    &lt;Span Text=" terms" TextColor="#d14361" FontAttributes="Bold"/&gt; 
    &lt;Span Text=" and " TextColor="#555351" /&gt; 
    &lt;Span Text=" conditions" TextColor="#d14361" FontAttributes="Bold"/&gt; 
    &lt;/FormattedString&gt; 
    &lt;/Label.FormattedText&gt; 
&lt;/Label&gt;
 
&lt;Label&gt; 
    &lt;Label.FormattedText&gt; 
    &lt;FormattedString&gt; 
    &lt;Span Text="Already have an account? " TextColor="#555351" /&gt; 
    &lt;Span Text=" Sign Up here" TextColor="#d14361" FontAttributes="Bold"/&gt; 
    &lt;/FormattedString&gt; 
    &lt;/Label.FormattedText&gt; 
&lt;/Label&gt;
</code></pre><p>And the final result should look like the following:</p><p><img src="https://d585tldpucybw.cloudfront.net/sfimages/default-source/blogs/2026/2026-01/07_block_03_demo.png?sfvrsn=cc66a46c_2&amp;Culture=en" /></p><p>With these simple steps, you&rsquo;ve learned how to work with various .NET MAUI components and have successfully built your first two screens! </p><h2 id="conclusion">Conclusion</h2><p>And that&rsquo;s it!  In this article, we explored how to build a Valentine-inspired login and sign-up UI using .NET MAUI with XAML. By breaking the UI into clear blocks and working step by step, you were able to focus on layout, and components without adding unnecessary complexity.</p><p>Remember, creating beautiful interfaces is not just about visuals&mdash;it&rsquo;s about crafting experiences users will enjoy interacting with.</p><p>If you have any questions or would like me to dive deeper into specific topics, feel free to leave a comment&mdash;I&rsquo;ll be happy to help! </p><p>See you in the next article! &zwj;♀️</p><aside><hr data-sf-ec-immutable="" /><div class="row"><div class="col-4 u-normal-full u-small-mb0"><h4 class="u-fs20 u-fw5 u-lh125 u-mb0">6 .NET MAUI Properties You Didn&rsquo;t Know Work with Buttons</h4></div><div class="col-8"><p class="u-fs16 u-mb0">Learn several useful properties to help you customize and enhance your <a target="_blank" href="https://www.telerik.com/blogs/6-net-maui-properties-you-didnt-know-work-buttons"> buttons in .NET MAUI</a>, like rounding the corners buttons and enabling automatic scaling.</p></div></div></aside>]]></content>
  </entry>
  <entry>
    <id>urn:uuid:91d6507d-2b7c-41fb-a4ba-c78b4fa78bc3</id>
    <title type="text">6 .NET MAUI Properties You Didn’t Know Work with Buttons</title>
    <summary type="text">Learn several useful properties to help you customize and enhance your buttons in .NET MAUI, like rounding the corners buttons and enabling automatic scaling.</summary>
    <published>2026-01-26T15:23:32Z</published>
    <updated>2026-04-11T15:57:40Z</updated>
    <author>
      <name>Leomaris Reyes </name>
    </author>
    <link rel="alternate" href="https://www.telerik.com/blogs/6-net-maui-properties-you-didnt-know-work-buttons"/>
    <content type="text"><![CDATA[<p><span class="featured">Learn several useful properties to help you customize and enhance your buttons in .NET MAUI, like rounding the corners buttons and enabling automatic scaling.</span></p><p>Buttons are one of the most important visual elements in any application. Through them, users can perform key actions that move the app&rsquo;s flow forward, like navigating to another page or calling an API. That&rsquo;s why it&rsquo;s essential to understand their different properties.</p><p>There are several interesting properties that you might not even know are available for the Button in .NET MAUI, but learning about them will help you create more precise and visually appealing designs.</p><p>In this article, you&rsquo;ll discover six of those properties, understand how they work and see how to implement them. But before diving into each one, let&rsquo;s take a quick preview of what&rsquo;s coming. </p><ul><li>TextTransform</li><li>FontAutoScalingEnabled</li><li>CharacterSpacing</li><li>CornerRadius</li><li>FontFamily</li><li>LineBreakMode</li></ul><h2 id="texttransform">1. TextTransform</h2><p><img src="https://d585tldpucybw.cloudfront.net/sfimages/default-source/blogs/2026/2026-01/01_texttransform.png?sfvrsn=bb3875ba_2" alt="TextTransform - CLICK HERE: Uppercase, click here: Lowercase, cLICK heRe: None" /></p><p>This property defines how the text inside your button will be displayed&mdash;whether it appears in uppercase, lowercase or exactly as you wrote it. This property accepts the following values:</p><ul><li><strong>Lowercase:</strong> Displays all the text in lowercase letters.</li><li><strong>Uppercase:</strong> Displays all the text in uppercase letters.</li><li><strong>None:</strong> Displays the text exactly as you wrote it.</li></ul><p>So &hellip; how do we actually use it in a button? Let&rsquo;s check it out: </p><pre class=" language-xml"><code class="prism  language-xml"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>Button</span> <span class="token attr-name">Text</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>cLICK heRe<span class="token punctuation">"</span></span> 
  <span class="token attr-name">TextTransform</span><span class="token attr-value"><span class="token punctuation">=</span>"Lowercase"</span> <span class="token punctuation">/&gt;</span></span>
</code></pre><h2 id="fontautoscalingenabled">2. FontAutoScalingEnabled</h2><p>This one&rsquo;s super important!  When you go to your device Settings, you can adjust how you want text to appear&mdash;larger, smaller or anywhere in between. The system shows a list of size options for you to choose from.</p><p>With the <code>FontAutoScalingEnabled</code> property, .NET MAUI lets us control whether our app should follow those text-size preferences that the user has already set on their device.</p><p>For example, you&rsquo;ve probably seen people who have really large system text.  If this option is enabled, your .NET MAUI apps will also adapt and display text in the same way.</p><p>This property allows you to decide whether to enable or disable that behavior in your button:</p><ul><li>If set to <strong>true</strong>, the button text adjusts to the device&rsquo;s font-scaling preferences.</li><li>If set to <strong>false</strong>, the text stays fixed, completely ignoring the system configuration.</li></ul><p>All right, let&rsquo;s see it in action!</p><pre class=" language-xml"><code class="prism  language-xml"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>Button</span> <span class="token attr-name">Text</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>Hello!! <span class="token punctuation">"</span></span> 
  <span class="token attr-name">FontAutoScalingEnabled</span><span class="token attr-value"><span class="token punctuation">=</span>"false"</span> <span class="token punctuation">/&gt;</span></span>
</code></pre><h3 id="but-…-how-do-i-set-up-the-preferences-on-my-device">But &hellip; How Do I Set Up the Preferences on My Device? ️</h3><p>To test these settings on your own device, here&rsquo;s how you can make the text larger or smaller on both iOS and Android.</p><ul><li> <strong>On iOS:</strong> Go to <strong>Settings</strong> &rarr; <strong>Accessibility</strong> &rarr; <strong>Display &amp; Text Size</strong> &rarr; <strong>Larger Text</strong> and adjust the slider to set the text size you prefer.</li><li><strong>On Android:</strong> Go to <strong>Settings</strong> &rarr; <strong>Display</strong> &rarr; <strong>Font size and style</strong> and use the preview slider to adjust the text size.</li></ul><p>After following the steps above, you should see a screen similar to the one shown below:</p><p><img src="https://d585tldpucybw.cloudfront.net/sfimages/default-source/blogs/2026/2026-01/02_texttransform_settings.png?sfvrsn=5e1b0901_2" alt="FontScaling settings: iOS & Android" /></p><h2 id="characterspacing">3. CharacterSpacing</h2><p><img src="https://d585tldpucybw.cloudfront.net/sfimages/default-source/blogs/2026/2026-01/03_characterspacing.png?sfvrsn=d36a55b_2" alt="CharacterSpacing sample" /></p><p>Defines the amount of space between each character of the <strong>button&rsquo;s text</strong> and takes a value of type double. This property allows us to play with the visual rhythm of the button. You can either <strong>increase</strong> or <strong>decrease</strong> the spacing between characters depending on the style you want to achieve:</p><ul><li>If you want to increase the spacing, use a positive value.</li><li>If you want to create a design or stylistic effect by reducing the spacing, you can use negative values.</li></ul><p>Let&rsquo;s bring it to life inside a button!</p><pre class=" language-xml"><code class="prism  language-xml"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>Button</span> 
  <span class="token attr-name">Text</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>CLICK HERE<span class="token punctuation">"</span></span> 
  <span class="token attr-name">CharacterSpacing</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>5<span class="token punctuation">"</span></span> <span class="token punctuation">/&gt;</span></span>
</code></pre><h2 id="cornerradius">4. CornerRadius</h2><p><img src="https://d585tldpucybw.cloudfront.net/sfimages/default-source/blogs/2026/2026-01/04_cornerradius.png?sfvrsn=d9e7b275_2" alt="CornerRadius sample" /></p><p>This property lets you define how rounded the corners of your button will be. (It takes a value of type <code>int</code>.) The higher the value, the more rounded the corners will appear, and the lower the value, the sharper they&rsquo;ll look.</p><blockquote><p> <strong>Pro Tip:</strong> If you want to create a circular button, simply set the <strong>WidthRequest</strong> and <strong>HeightRequest</strong> properties to the same value, and assign the <strong>CornerRadius</strong> property to half of that value.</p></blockquote><p>For example:</p><pre class=" language-xml"><code class="prism  language-xml"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>Button</span> 
  <span class="token attr-name">WidthRequest</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>80<span class="token punctuation">"</span></span> 
  <span class="token attr-name">HeightRequest</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>80<span class="token punctuation">"</span></span> 
  <span class="token attr-name">CornerRadius</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>40<span class="token punctuation">"</span></span> <span class="token punctuation">/&gt;</span></span>
</code></pre><h2 id="fontfamily">5. FontFamily</h2><p>With this property, you can define the font that your button will use, which helps your button maintain a consistent visual identity with the overall style of your app. By default, it uses <strong>Open Sans</strong>.</p><p><strong>How to use it?</strong></p><pre class=" language-xml"><code class="prism  language-xml"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>Button</span> 
  <span class="token attr-name">Text</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>Click here<span class="token punctuation">"</span></span> 
  <span class="token attr-name">FontFamily</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>MontserratBold<span class="token punctuation">"</span></span> <span class="token punctuation">/&gt;</span></span>
</code></pre><h2 id="linebreakmode">6. LineBreakMode</h2><p>This property is responsible for organizing how the text will be displayed on the button when it spans more than one line. It takes values from the <code>LineBreakMode</code> enum; depending on the value you choose, your text will be displayed in different ways. The values you can use are as follows:</p><p>➖ <strong>NoWrap:</strong> Regardless of the text length, it stays on a single line and only displays the number of characters that fit within the button&rsquo;s width.</p><p>➖ <strong>WordWrap:</strong> Automatically moves the text to the next line once it reaches the button&rsquo;s boundaries. Keep in mind that the line break happens after the last full word that can fit; if a word doesn&rsquo;t fit completely, it is moved to the next line.</p><p>➖ <strong>CharacterWrap:</strong> Automatically moves the text to the next line. This may cause a word to be split if there&rsquo;s only enough space for a few characters. For example, if the word &ldquo;Hello&rdquo; only has space for the first two letters, it will break and place the remaining letters on the next line.</p><p>➖ <strong>HeadTruncation:</strong> Displays the text on a single line and only shows the final part of the text.</p><p>➖ <strong>MiddleTruncation:</strong> Displays the beginning and the end of the text, separated by an ellipsis (&hellip;), all within a single line.</p><p>➖ <strong>TailTruncation:</strong> Displays only the beginning of the text and hides the rest.</p><p>Let&rsquo;s use a visual example to better understand how each one behaves:</p><p><img src="https://d585tldpucybw.cloudfront.net/sfimages/default-source/blogs/2026/2026-01/05_linebreakmode.png?sfvrsn=ae559286_2" title="LineBreakMode samples" alt="LineBreakMode samples: – Sample text: Click this button to open the configuration settings for your account and manage preferences. | NoWrap: Click this button to open the configuration | WordWrap: Click this button to open the configuration settings for your account and manage preferences. | CharacterWrap: Click this button to open the configuration settings for your account and manage preferences. | HeadTruncation: ...tings for your account and manage preferences. | MiddleTruncation: Click this button... and manage preferences. | TailTruncation: Click this button to open the configuration..." /></p><p>Let&rsquo;s make it come alive with a button example!</p><pre class=" language-xml"><code class="prism  language-xml"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>Button</span> <span class="token attr-name">Text</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>Hello!! <span class="token punctuation">"</span></span> 
  <span class="token attr-name">LineBreakMode</span><span class="token attr-value"><span class="token punctuation">=</span>"TailTruncation"</span> <span class="token punctuation">/&gt;</span></span>
</code></pre><h2 id="bonus-information">✍️ Bonus Information</h2><p>There&rsquo;s also another property called <code>ContentLayout</code>, which allows you to control the position of icons within your buttons. If you&rsquo;d like to learn how to use it, I recommend checking out the article <a target="_blank" href="https://www.telerik.com/blogs/beyond-basics-easy-icon-placement-net-maui-buttons">Beyond the Basics: Easy Icon Placement on .NET MAUI Buttons</a>.</p><h2 id="conclusion">Conclusion</h2><p>And that&rsquo;s it!  Now you know several useful properties that can help you customize and enhance your buttons in .NET MAUI&mdash;from <code>TextTransform</code> and <code>CharacterSpacing</code> to rounding your buttons and enabling automatic scaling.</p><p>I hope this guide helps you discover new ways to make your buttons more dynamic and visually consistent across your apps.</p><p>If you have any questions or would like me to dive deeper into other controls or properties, feel free to leave a comment&mdash;I&rsquo;d love to help you! </p><p>See you in the next article! &zwj;♀️✨</p><h3 id="references">References</h3><p>The explanation was based on the official documentation:</p><ul><li><a target="_blank" href="https://learn.microsoft.com/en-us/dotnet/maui/user-interface/controls/button?view=net-maui-9.0">https://learn.microsoft.com/en-us/dotnet/maui/user-interface/controls/button?view=net-maui-9.0</a></li></ul>]]></content>
  </entry>
  <entry>
    <id>urn:uuid:af065969-e5b6-4576-a5b7-937712278e8e</id>
    <title type="text">Adding External Fonts in .NET MAUI</title>
    <summary type="text">Change your font, change your app. Here’s how to use an external font inside your .NET MAUI app to match your branding and style.</summary>
    <published>2026-01-20T17:17:13Z</published>
    <updated>2026-04-11T15:57:40Z</updated>
    <author>
      <name>Leomaris Reyes </name>
    </author>
    <link rel="alternate" href="https://www.telerik.com/blogs/adding-external-fonts-net-maui"/>
    <content type="text"><![CDATA[<p><span class="featured">Change your font, change your app. Here&rsquo;s how to use an external font inside your .NET MAUI app to match your branding and style.</span></p><p><strong>Did you know that changing a font can improve the perception of the user experience in your app?</strong> Of course! Because if you use a font that is very hard to read, the user will end up feeling frustrated and discouraged.</p><p>In app development, there is a whole team working together to prevent these kinds of issues. Besides developers, one super important role is the designer&mdash;the person who creates that &ldquo;picture&rdquo; of how the app should look: colors, styles, EVERYTHING! And within this, the designer also specifies which <strong>fonts we should use in the app</strong>.</p><p>As developers, we are responsible for making those design decisions happen&mdash;even if that means adding an external font to the project!</p><p>And that&rsquo;s exactly why, in this article, you&rsquo;ll learn how to add external fonts in .NET MAUI in a super quick and easy way</p><p>So grab your cup of coffee (or hot chocolate) and let&rsquo;s get to work! ☕✨</p><h2 id="net-maui-font-handling">.NET MAUI Font Handling</h2><p>When you add a component that displays text, .NET MAUI already includes a default font called Open Sans for all platforms. This means that if you don&rsquo;t want to add a different font, .NET MAUI will handle it for you automatically.</p><p>However, you can also add external fonts whenever you need them. A single font can include multiple visual styles&mdash;such as bold, italic or different weights and sizes.</p><p>All these variations can be controlled through properties like <strong>FontAttributes and FontSize</strong> in .NET MAUI. Even when using external fonts, you can still apply these properties to easily adjust the appearance and style of your text.</p><p><strong>So &hellip; what do you need to do to add external fonts to your .NET MAUI project? </strong></p><p>Relax! We can do it in just a few simple steps. This explanation will be divided into the following points:</p><p>1️⃣ Adding the font to your project</p><p>2️⃣ Registering the font</p><p>3️⃣ And using it in your app!</p><p>Now let&rsquo;s dive into the explanation of each step!</p><h2 id="step-1-adding-the-font-to-your-project">Step 1: Adding the Font to Your Project</h2><p>⚠️ Before adding a font to your project, make sure it uses a format supported by .NET MAUI:</p><ul><li><strong>TrueType (.ttf):</strong> The most common font format, widely supported across platforms</li><li><strong>OpenType (.otf):</strong> Very similar to TTF, but with more advanced style options like ligatures, alternate characters and extended symbol support</li></ul><p>If you don&rsquo;t have a font available right now, don&rsquo;t worry! To practice, I recommend <a target="_blank" href="https://www.dafont.com/es/">DaFont</a>, it has tons of super cool fonts you can use! ✨ - For this example, I downloaded the <a target="_blank" href="https://www.dafont.com/es/super-joyful.font"><strong>Super Joyful font</strong></a>.</p><p><img src="https://d585tldpucybw.cloudfront.net/sfimages/default-source/blogs/2026/2026-01/01_step1_selecting_font.png?sfvrsn=14022112_2" title="Super Joyful font" alt="Super Joyful font" /></p><p>Once you&rsquo;ve downloaded the font, go to your project and navigate to the <strong>Resources/Fonts directory</strong>. Place the font file there.</p><p><img src="https://d585tldpucybw.cloudfront.net/sfimages/default-source/blogs/2026/2026-01/02_step1_adding_the_font.png?sfvrsn=d1d7c507_1" title="Resources/Fonts directory" alt="Resources/Fonts directory: 1. Open folder  - 2. Paste your font here" /></p><p>This step automatically sets the Build Action to <strong>MauiFont,</strong> which registers the font in your project. However, I always recommend double-checking just to be sure.</p><p>Open the font properties in the Solution Explorer. Then, locate the <strong>Build Action</strong> setting and verify it is set to <strong>MauiFont.</strong> This confirms that the font is correctly registered in your project. If it&rsquo;s not, just select it&mdash;and you&rsquo;re all set!</p><p>Below is an image that illustrates the configuration:</p><p><img src="https://d585tldpucybw.cloudfront.net/sfimages/default-source/blogs/2026/2026-01/03_step1_build_action_.png?sfvrsn=eed64e77_2" title="Resources/Fonts directory" alt="Resources/Fonts directory: 1. Click in the font - 2. Build action: MauiFont." /></p><p>This registration will be reflected in your .csproj file as you can see in the following example:</p><pre class=" language-xml"><code class="prism  language-xml"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>ItemGroup</span><span class="token punctuation">&gt;</span></span> 
  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>MauiFont</span> <span class="token attr-name">Include</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>Resources\Fonts\*<span class="token punctuation">"</span></span> <span class="token punctuation">/&gt;</span></span> 
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>ItemGroup</span><span class="token punctuation">&gt;</span></span>
</code></pre><h2 id="step-2-now-it’s-time-to-register-the-font-">Step 2: Now It&rsquo;s Time to Register the Font! </h2><p>Open the <strong>MauiProgram</strong> class in your project and locate the <strong>CreateMauiApp</strong> method. There, we&rsquo;ll call the <strong>ConfigureFonts</strong> method on the MauiAppBuilder instance.</p><p>Using the <strong>IFontCollection</strong> object, call the <strong>AddFont</strong> method. This allows you to include your font file. It accepts the following parameters:</p><ul><li><strong>Font file name:</strong> The exact name of your font file as it appears in the project</li><li><strong>Alias <em>(optional)</em>:</strong> A convenient name you can use to reference the font</li></ul><p>In code, your <strong>MauiProgram</strong> class should look similar to the following example:</p><pre><code>namespace MyMauiApp 
{ 
    public static class MauiProgram 
    { 
    public static MauiApp CreateMauiApp() 
    { 
    var builder = MauiApp.CreateBuilder();  
    builder 
    .UseMauiApp&lt;App&gt;() 
    .ConfigureFonts(fonts =&gt; 
    { 
    fonts.AddFont("Super Joyful.ttf", "SuperJ"); 
    });
    
    return builder.Build(); 
    } 
    } 
}
</code></pre><h2 id="step-3-how-to-use-the-previously-added-font-">Step 3: How to Use the Previously Added Font? </h2><p>To use your external font, simply use the <code>FontFamily</code> property. You can reference the font either by the file name included in the project or by the alias you defined during registration.</p><p><strong>For example:</strong></p><p><em><strong>Using the font file name:</strong></em></p><pre><code>&lt;Label Text="Hello .NET MAUI!" 
    FontFamily="Super Joyful.ttf" /&gt;
</code></pre><p><em><strong>Using the alias:</strong></em></p><pre><code>&lt;Label Text="Hello .NET MAUI!" 
    FontFamily="SuperJ" /&gt;
</code></pre><p>Done!  We&rsquo;ve successfully integrated the Super Joyful font&mdash;now let&rsquo;s take a look at how it appears in a UI example! ✨</p><p><img src="https://d585tldpucybw.cloudfront.net/sfimages/default-source/blogs/2026/2026-01/04_demo.png?sfvrsn=ef4bb32c_2" title="Font Demo in .NET MAUI" alt="Font Demo in .NET MAUI" /></p><h2 id="✍️-platform-tips">✍️ Platform Tips</h2><p><img src="https://d585tldpucybw.cloudfront.net/sfimages/default-source/blogs/2026/2026-01/05_android_icon.png?sfvrsn=42bac2c_2" alt="Android icon" /></p><p>On <strong>Android,</strong> besides the default Open Sans, there are several fonts already installed on the device. Thanks to this, .NET MAUI allows you to use them without adding any font files to the Fonts folder and without registering them in the project.</p><p>To reference these system fonts, all you need to do is set their name as the value of the <code>FontFamily</code> property.  Fonts that include hyphens can be referenced <strong>with or without the hyphen</strong>, and they will work exactly the same!</p><p><strong>The available fonts are:</strong></p><p><img src="https://d585tldpucybw.cloudfront.net/sfimages/default-source/blogs/2026/2026-01/06_android_available_fonts.png?sfvrsn=22d9cb24_2" title="Android available fonts" alt="Android available fonts:  monospace, serif, sans-serif (or sansserif), sans-serif-black (or sansserif-black), sans-serif-condensed (or sansserif-condensed), sans-serif-condensed-light (or sansserif-condensed-light),sans-serif-light (or sansserif-light), sans-serif-medium (or sansserif-medium)" /></p><p><strong>And you can use them in your project exactly the same way as any other font!</strong></p><pre><code>&lt;Label Text="Hello .NET MAUI" 
    FontFamily="monospace" /&gt;
</code></pre><h2 id="conclusion">Conclusion</h2><p>And that 's it!  In just a few simple steps, you&rsquo;ve learned how to add external fonts to your .NET MAUI apps and how to take advantage of the system fonts that Android already provides. Now you&rsquo;re ready to give your UI a more personalized and polished look! ✨</p><p>I hope this guide helps you enhance the visual experience in your applications starting today.</p><p>If you have any questions, feel free to leave them in the comments. I&rsquo;d love to help! ✨ See you in the next article! &zwj;♀️</p><h3 id="references">References</h3><ul><li><a target="_blank" href="https://learn.microsoft.com/en-us/dotnet/maui/user-interface/fonts?view=net-maui-9.0">https://learn.microsoft.com/en-us/dotnet/maui/user-interface/fonts?view=net-maui-9.0</a></li></ul><aside><hr data-sf-ec-immutable="" /><div class="row"><div class="col-4 u-normal-full u-small-mb0"><h4 class="u-fs20 u-fw5 u-lh125 u-mb0">.NET 10: Quick UI Changes Worth Noticing in .NET MAUI</h4></div><div class="col-8"><p class="u-fs16 u-mb0"><a target="_blank" href="https://www.telerik.com/blogs/net-10-quick-ui-changes-worth-noticing-net-maui">.NET 10 for .NET MAUI</a> brings several improvements to existing controls&mdash;and even a few deprecations&mdash;that you should keep in mind.</p></div></div></aside>]]></content>
  </entry>
  <entry>
    <id>urn:uuid:89d7a33b-17e3-4eb7-86f0-fc903c6212fd</id>
    <title type="text">Gauge Controls: Real-time Performance Tracking, Player Stats in .NET MAUI</title>
    <summary type="text">Gauge controls for video games? Yes! Health bars, hit strength, energy or mana bars, progress indicators. These are all gauges! See how to use them in .NET MAUI.</summary>
    <published>2026-01-13T16:00:02Z</published>
    <updated>2026-04-11T15:57:40Z</updated>
    <author>
      <name>Leomaris Reyes </name>
    </author>
    <link rel="alternate" href="https://www.telerik.com/blogs/gauge-controls-real-time-performance-tracking-player-stats"/>
    <content type="text"><![CDATA[<p><span class="featured">Gauge controls for video games? Yes! Health bars, hit strength, energy or mana bars, progress indicators. These are all gauges! See how to use them in .NET MAUI.</span></p><p>I&rsquo;ll admit it&mdash;in my free time, I love playing video games.  And what matters most to me is knowing how I&rsquo;m performing during the match. It feels so exciting to understand my progress in just a few seconds, especially when a graphic explains it to me with colors&mdash;no need to stop and read numbers, because that would cost me precious time to beat my opponents.</p><p>All of this is part of the experience that game developers and designers create to make players feel comfortable. And for that reason, I also see it as my responsibility to replicate this kind of experience in the apps I build.</p><p>There&rsquo;s a component that lets us represent numeric values within a defined range in a <strong>graphical and intuitive way</strong>. Unlike simply showing a number on the screen, this visualization conveys valuable information through shapes, colors and movement. It&rsquo;s perfect for gaming scenarios where you need a quick view of what&rsquo;s happening without losing time.</p><p>Today, you&rsquo;ll get to know the <a target="_blank" href="https://www.telerik.com/maui-ui/gauge">.NET MAUI Gauge Chart</a> from the Progress Telerik UI for .NET MAUI component library. ☕ Grab a coffee (or hot chocolate if that&rsquo;s more your vibe), and let&rsquo;s explore it together!</p><h2 id="what-is-the-telerik-gauge-chart-for-.net-maui">What Is the Telerik Gauge Chart for .NET MAUI?</h2><p>The Telerik UI for .NET MAUI Gauge Chart is one of the main data visualization controls for .NET MAUI. Its primary purpose is to represent numeric values within a defined range in a clear, animated and intuitive way. In addition, it supports multiple visualization styles&mdash;<strong>vertical, horizontal and radial (or circular)</strong>&mdash;allowing it to adapt to different types of scenarios.</p><p>Here&rsquo;s an example of how it would look in each of its different styles:</p><p><img src="https://d585tldpucybw.cloudfront.net/sfimages/default-source/blogs/2025/2025-10/01_gauge_types.png?sfvrsn=f3d8d982_2" alt="Gauge Types for .NET MAUI" /></p><p>✍️ This control is part of the Telerik UI for <a target="_blank" href="https://www.telerik.com/maui-ui">.NET MAUI library</a>, which offers more than 60 professionally designed UI components&mdash;ideal for building modern, cross-platform applications with a polished user experience.</p><h2 id="real-time-performance">Real-time Performance</h2><p>The ability to capture data at the exact moment it happens, process it immediately and provide feedback is what we call real-time performance.</p><p>When you&rsquo;re in a video game, the magic of real-time performance is that you get instant feedback about what&rsquo;s happening with your character. That immediacy makes all the difference: you know right away if your health bar drops, if your energy is running out or if your progress is moving forward. There&rsquo;s no guessing or waiting&mdash;everything flows in sync with your actions, making the experience far more immersive and exciting.</p><h2 id="player-stats-with-gauge-controls">Player Stats with Gauge Controls</h2><p>So, how can Gauge Controls really make a difference in a video game?</p><p><img src="https://d585tldpucybw.cloudfront.net/sfimages/default-source/blogs/2025/2025-10/02_gauce_game_sample.png?sfvrsn=e50ce876_2" alt="Gauge Game Sample" /></p><p><strong>Gauge</strong> controls have <strong>HUGE</strong> potential  because they allow us to deliver processed information in real time&mdash;which is exactly what a player needs to understand instantly, instead of pausing to read digits on a screen. But let&rsquo;s talk about some specific use cases you can measure if your app integrates a gauge control:</p><h3 id="➖-measuring-the-player’s-health">➖ Measuring the Player&rsquo;s Health</h3><p>Yeahh!! As we saw earlier, there are different gauge styles, and each one works for different scenarios. Here, the <strong>circular gauge</strong> is perfect. I love how I can see my avatar&rsquo;s energy just through colors. Imagine it going quickly from <strong>green &rarr; yellow &rarr; red</strong> &hellip; although, of course, I&rsquo;d always prefer to keep it green, haha. That helps me know when I can perform certain actions in the game!</p><h3 id="➖-measuring-energy-or-stamina">➖ Measuring Energy or Stamina</h3><p>This is the strength to run, jump or perform special actions. Every time the player uses this energy, the gauge goes down, and when they rest, it fills back up again.</p><h3 id="➖-measuring-progress">➖ Measuring Progress</h3><p>A gauge that fills up as you advance through a level or a world. When it reaches 100%, you&rsquo;ve completed the goal! Personally, I love this one because it tells me how much I still have left before winning (or losing, haha).</p><p>And of course, we could keep mentioning many other scenarios, but the key point is to see how&mdash;with just one control&mdash;you can unlock so many possibilities. It gives your users a <strong>highly satisfying experience</strong>, because imagine playing a game without knowing your progress, your energy or your health.  It just wouldn&rsquo;t be that exciting!</p><h2 id="types-of-gauge-controls">Types of Gauge Controls</h2><p>After exploring different use cases for the .NET MAUI Gauge, let&rsquo;s take a deeper look at how to implement each one of them!</p><h3 id="radial-circular-gauge">Radial (Circular) Gauge</h3><p><img src="https://d585tldpucybw.cloudfront.net/sfimages/default-source/blogs/2025/2025-10/03_radial_gauge.png?sfvrsn=cae45bb0_2" alt="Radial Gauge" /></p><p>The Radial Gauge is responsible for displaying a range of values in a circular form (like a speedometer or tachometer).</p><h4 id="rotation-and-radius-in-a-radial-gauge">Rotation and Radius in a Radial Gauge</h4><p>Depending on your needs, you may not always want a full circle&mdash;you may need a half circle or even a quarter. You can control this behavior with four key properties:</p><ul><li><strong>AxisRadiusFactor:</strong> Controls how large the radius of the gauge is</li><li><strong>StartAngle:</strong> Defines the angle where the arc begins</li><li><strong>SweepAngle:</strong> Specifies how far the arc extends</li><li><strong>SweepDirection:</strong> Determines whether the arc is drawn clockwise or counter-clockwise</li></ul><p>Below is an example of how you could implement this in code:</p><pre class=" language-xml"><code class="prism  language-xml">&lt;telerik:RadRadialGauge x:Name="gauge"&gt; 
    &lt;telerik:RadRadialGauge.Axis&gt; 
    &lt;telerik:GaugeLinearAxis Maximum="200" 
    Minimum="0" 
    Step="25" /&gt; 
    &lt;/telerik:RadRadialGauge.Axis&gt; 
    &lt;telerik:RadRadialGauge.Indicators&gt; 
    &lt;telerik:GaugeNeedleIndicator Offset="30" Value="60" /&gt; 
    &lt;/telerik:RadRadialGauge.Indicators&gt; 
    &lt;telerik:RadRadialGauge.Ranges&gt; 
    &lt;telerik:GaugeRangesDefinition&gt; 
    &lt;telerik:GaugeRange Color="Green" 
    From="0" 
    To="150" /&gt; 
    &lt;telerik:GaugeGradientRange From="150" To="200"&gt; 
    &lt;telerik:RadGradientStop Offset="150" Color="Yellow" /&gt; 
    &lt;telerik:RadGradientStop Offset="200" Color="Red" /&gt; 
    &lt;/telerik:GaugeGradientRange&gt; 
    &lt;/telerik:GaugeRangesDefinition&gt; 
    &lt;/telerik:RadRadialGauge.Ranges&gt; 
&lt;/telerik:RadRadialGauge&gt;
</code></pre><h3 id="vertical-gauge">Vertical Gauge</h3><p><img src="https://d585tldpucybw.cloudfront.net/sfimages/default-source/blogs/2025/2025-10/04_vertical_gauge.png?sfvrsn=3cb1af21_2" alt="Vertical Gauge" /></p><p>The Vertical Gauge is responsible for displaying values along a linear scale with a vertical orientation.</p><p>Below is an example of how you could implement this in code:</p><pre class=" language-xml"><code class="prism  language-xml">&lt;telerik:RadVerticalGauge x:Name="gauge"&gt; 
    &lt;telerik:RadVerticalGauge.Axis&gt; 
    &lt;telerik:GaugeLinearAxis Maximum="200" 
    Minimum="0" 
    Step="25" /&gt; 
&lt;/telerik:RadVerticalGauge.Axis&gt; 
    &lt;telerik:RadVerticalGauge.Indicators&gt; 
&lt;telerik:GaugeShapeIndicator Value="90" /&gt; 
&lt;/telerik:RadVerticalGauge.Indicators&gt; 
    &lt;telerik:RadVerticalGauge.Ranges&gt; 
    &lt;telerik:GaugeRangesDefinition&gt; 
    &lt;telerik:GaugeRange Color="Green" 
    From="0" 
    To="150" /&gt; 
    &lt;telerik:GaugeGradientRange From="150" To="200"&gt; 
    &lt;telerik:RadGradientStop Offset="150" Color="Yellow" /&gt; 
    &lt;telerik:RadGradientStop Offset="200" Color="Red" /&gt; 
&lt;/telerik:GaugeGradientRange&gt; 
&lt;/telerik:GaugeRangesDefinition&gt; 
&lt;/telerik:RadVerticalGauge.Ranges&gt; 
&lt;/telerik:RadVerticalGauge&gt;
</code></pre><h3 id="horizontal-gauge">Horizontal Gauge</h3><p><img src="https://d585tldpucybw.cloudfront.net/sfimages/default-source/blogs/2025/2025-10/05_horizontal_gauge.png?sfvrsn=7783ea99_2" alt="Horizontal Gauge" /></p><p>The Horizontal Gauge is responsible for displaying values along a linear scale with a horizontal orientation.</p><p>Below is an example of how you could implement this in code:</p><pre class=" language-xml"><code class="prism  language-xml">&lt;telerik:RadHorizontalGauge x:Name="gauge"&gt; 
    &lt;telerik:RadHorizontalGauge.Axis&gt; 
    &lt;telerik:GaugeLinearAxis Maximum="200" 
    Minimum="0" 
    Step="25" /&gt; 
&lt;/telerik:RadHorizontalGauge.Axis&gt; 
    &lt;telerik:RadHorizontalGauge.Indicators&gt; 
    &lt;telerik:GaugeShapeIndicator Value="90" /&gt; 
&lt;/telerik:RadHorizontalGauge.Indicators&gt; 
    &lt;telerik:RadHorizontalGauge.Ranges&gt; 
    &lt;telerik:GaugeRangesDefinition&gt; 
    &lt;telerik:GaugeRange Color="Green" 
    From="0" 
    To="150" /&gt; 
    &lt;telerik:GaugeGradientRange From="150" To="200"&gt; 
    &lt;telerik:RadGradientStop Offset="150" Color="Yellow" /&gt; 
    &lt;telerik:RadGradientStop Offset="200" Color="Red" /&gt; 
&lt;/telerik:GaugeGradientRange&gt; 
&lt;/telerik:GaugeRangesDefinition&gt; 
&lt;/telerik:RadHorizontalGauge.Ranges&gt; 
&lt;/telerik:RadHorizontalGauge&gt;
</code></pre><h2 id="conclusion">Conclusion</h2><p>✨ <strong>See how in just a few seconds you&rsquo;ve learned about the Gauge control?</strong> This kind of approach helps us discover scenarios we might not have even thought about, yet they&rsquo;re incredibly useful when building apps!</p><p>I invite you to explore it and try out new experiences with this control! Give Telerik UI for .NET MAUI a try&mdash;it comes with a free 30-day trial:</p><p><a target="_blank" href="https://www.telerik.com/try/ui-for-maui" class="Btn">Try Now</a></p><p>If you have any questions, feel free to leave a comment or reach out&mdash;I&rsquo;m happy to help!</p><p>See you in the next one! &zwj;♀️</p><h3 id="references">References</h3><p>The code explanations have been taken from the official documentation:</p><ul><li><a target="_blank" href="https://www.telerik.com/maui-ui/gauge">https://www.telerik.com/maui-ui/gauge</a></li><li><a target="_blank" href="https://www.telerik.com/maui-ui/documentation/controls/gauge/gauge-types/radial">https://www.telerik.com/maui-ui/documentation/controls/gauge/gauge-types/radial</a></li><li><a target="_blank" href="https://www.telerik.com/maui-ui/documentation/controls/gauge/gauge-types/vertical">https://www.telerik.com/maui-ui/documentation/controls/gauge/gauge-types/vertical</a></li><li><a target="_blank" href="https://www.telerik.com/maui-ui/documentation/controls/gauge/gauge-types/horizontal">https://www.telerik.com/maui-ui/documentation/controls/gauge/gauge-types/horizontal</a></li></ul>]]></content>
  </entry>
  <entry>
    <id>urn:uuid:dcb263c4-9d74-40ac-9c07-abc0a90639fa</id>
    <title type="text">Exploring Marshal Methods in .NET MAUI</title>
    <summary type="text">Marshal methods are key for interacting with native features in .NET MAUI. Here’s what’s new for them in .NET 10, especially for Android.</summary>
    <published>2026-01-07T17:58:27Z</published>
    <updated>2026-04-11T15:57:40Z</updated>
    <author>
      <name>Leomaris Reyes </name>
    </author>
    <link rel="alternate" href="https://www.telerik.com/blogs/exploring-marshal-methods-net-maui"/>
    <content type="text"><![CDATA[<p><span class="featured">Marshal methods are key for interacting with native features in .NET MAUI. Here&rsquo;s what&rsquo;s new for them in .NET 10, especially for Android.</span></p><p>Picture this: You finally arrive in the country of your dreams, but most people there speak a language you don&rsquo;t understand. Maybe at the shopping malls you&rsquo;ll find someone who speaks your language and helps you have a smooth experience &hellip; but you still want to interact with everyone else, because they&rsquo;re essential to enjoy the full adventure you imagined.</p><p>So, what do you do? Leave? No way! </p><p>You simply need a translator&mdash;someone who understands your language, converts it into the local one, interacts on your behalf and then brings the response back to you. Problem solved!</p><p>Well&hellip; that&rsquo;s exactly what <strong>marshal methods</strong> do. ✨ They act as translators between .NET and the operating system&rsquo;s native integrations. In this article, we&rsquo;ll explore what they are, why they matter and what&rsquo;s new in <strong>.NET 10 for .NET MAUI</strong>.</p><h2 id="what-exactly-are-marshal-methods-">What Exactly Are Marshal Methods? </h2><p>Marshal methods are special features in .NET that act as a bridge, allowing two different worlds to communicate: the managed programming model and the unmanaged one.</p><p>In simpler terms, they enable data exchange between the code running inside .NET (C#, managed) and the native code of the operating system (C/C++, system APIs, third-party native libraries).</p><p>You can think of them as a <strong>translator</strong> that makes it possible to integrate and use native capabilities inside our app&mdash;sending information and receiving results back. Practically speaking, without them, we wouldn&rsquo;t be able to interact with many of the built-in features provided by each operating system.</p><h2 id="managed-vs.-unmanaged-code—what’s-the-difference-">Managed vs. Unmanaged Code&mdash;What&rsquo;s the Difference? </h2><h3 id="managed-code">Managed Code</h3><p>Imagine you&rsquo;re building an app using C# in .NET MAUI: The managed environment allows you to work more comfortably because .NET handles many internal tasks for you. You don&rsquo;t have to manually free memory or worry about dangerous memory-related errors.</p><p>In short, this type of code provides:</p><ul><li><strong>Garbage Collection:</strong> Automatically cleans up memory that is no longer in use.</li><li><strong>Type Safety:</strong> .NET verifies that variables and objects are used correctly, helping prevent critical errors.</li><li><strong>Automatic Memory Management:</strong> The runtime can reorganize, move and optimize objects in the heap without requiring manual intervention.</li></ul><p>All of this runs inside the <strong>.NET runtime</strong>, meaning it operates in a secure environment separate from the operating system. This improves security, stability and portability across platforms.</p><h3 id="unmanaged-code">Unmanaged Code</h3><p>On the opposite side of managed code, we have unmanaged code. This is code that does not run under the control of the .NET runtime. Instead, it belongs directly to the operating system.</p><p>This includes native device features such as the microphone, location/GPS and others. And unlike what we get with managed code&mdash;like garbage collection, type safety and automatic memory management&mdash;none of those protections apply here.</p><h2 id="lets-talk-more-specifically-about-marshal-methods-in-.net-maui">Let&rsquo;s Talk More Specifically About Marshal Methods in .NET MAUI</h2><p>When we build an application with .NET MAUI, all the code we write in C# runs as <strong>managed code</strong>. However, sooner or later we need to access device features such as the camera, sensors, Bluetooth and so on.</p><p>And all of that doesn&rsquo;t belong to the .NET world. Those capabilities are provided by the operating system itself, implemented using native technologies&mdash;which means they are considered <strong>unmanaged code</strong>.</p><p>That&rsquo;s where <strong>marshal methods</strong> come into play. They take what we request in C#, translate it into the corresponding native language, wait for the response and bring it back so we can continue handling it as a normal C# object&mdash;completely seamless to us.</p><p>Let&rsquo;s look at a simple example: accessing the camera. Even though the intention is exactly the same&mdash;<em>&ldquo;I want to take a picture&rdquo;</em>&mdash;each platform implements that functionality differently:</p><p><img src="https://d585tldpucybw.cloudfront.net/sfimages/default-source/blogs/2026/2026-01/01_platform_samples.png?sfvrsn=70d65d78_2" alt="Platform: Android , Native Technology:  Java/Kotlin + native calls (JNI/NDK - Platform: iOS/macOS, Native Technology:  Objective-C / Swift + native frameworks - Platform: Windows, Native Technology:  Win32 API in C/C++" /></p><p>Meanwhile, in your .NET code you can simply write:</p><pre class=" language-csharp"><code class="prism  language-csharp"><span class="token keyword">var</span> photo <span class="token operator">=</span> <span class="token keyword">await</span> MediaPicker<span class="token punctuation">.</span><span class="token function">CapturePhotoAsync</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre><p>And &ldquo;under the hood,&rdquo; .NET MAUI takes care of detecting the platform, calling the correct native API, converting the response and giving it back to you as a C# object.</p><h2 id="what’s-new-in-.net-10-about-marshal-methods-for-.net-maui-">What&rsquo;s New in .NET 10 About Marshal Methods for .NET MAUI? </h2><h3 id="marshal-methods-enabled-by-default">Marshal Methods Enabled by Default</h3><p>In .NET 9, a new mechanism for generating marshal methods was introduced, improving Android app startup performance. However, this feature was <strong>not enabled by default</strong>, and developers had to turn it on manually.</p><p>Starting with <strong>.NET 10</strong>, these optimized marshal methods are <strong>enabled by default</strong>, which results in faster app startup.</p><p>But in some cases, this change may cause the application to freeze or take too long to launch when running on Android. If you notice this behavior in .NET 10 previews&mdash;and it didn&rsquo;t happen on .NET 9&mdash;you can temporarily disable this feature by adding the following MSBuild property to your project&rsquo;s .<strong>csproj</strong> file:</p><pre class=" language-xml"><code class="prism  language-xml"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>PropertyGroup</span><span class="token punctuation">&gt;</span></span>  
  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>AndroidEnableMarshalMethods</span><span class="token punctuation">&gt;</span></span>false<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>AndroidEnableMarshalMethods</span><span class="token punctuation">&gt;</span></span> 
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>PropertyGroup</span><span class="token punctuation">&gt;</span></span>
</code></pre><h3 id="-artifactfilename-metadata-for-androidmavenlibrary-item"> ArtifactFilename Metadata for @(AndroidMavenLibrary) Item</h3><p>Since .NET 9, there has been an MSBuild item called <code>@(AndroidMavenLibrary)</code> that allows .NET to automatically download a Java/Android library from Maven and include it in your Android project.</p><p>The expected naming convention for the file inside Maven usually follows something like:<br /><strong>{artifact.Id}-{artifact.Version}.[jar|aar]</strong>.
</p><p>However, many libraries <strong>do not follow a standard naming format</strong>. Some add custom names, extra suffixes, alternate build tags, etc.</p><p>For example:</p><p><img src="https://d585tldpucybw.cloudfront.net/sfimages/default-source/blogs/2026/2026-01/02_artifactfilename.png?sfvrsn=6179b2d_2" alt="✅ What .NET would expect: react-android-0.76.0.aar - ❌ What actually exists in Maven: react-android-0.76.0-release.aar" /></p><p>As a result, the download could fail. </p><p>With <strong>.NET 10</strong>, this is no longer a problem. You can now manually specify the <strong>exact filename</strong> of the library. This allows .NET to know precisely which file to look for and avoids unexpected failures when binding Maven dependencies.</p><p>You can do this by adding the <strong>ArtifactFilename</strong> metadata to the <code>@(AndroidMavenLibrary)</code> MSBuild item, allowing an alternative filename to be provided.</p><p>For example:</p><pre class=" language-xml"><code class="prism  language-xml">&lt;ItemGroup&gt; 
    &lt;AndroidMavenLibrary 
    Include="com.facebook.react:react-android" 
    Version="0.76.0" 
    ArtifactFilename="react-android-0.76.0-release.aar" /&gt; 
&lt;/ItemGroup&gt;
</code></pre><p>In case you are not familiar with Maven &hellip;</p><p><strong>Maven</strong> is a dependency management and build tool, meaning that it allows projects to automatically download libraries from online repositories. It is mainly used in the Java and Android ecosystems.</p><h2 id="conclusion">Conclusion</h2><p>And that 's it!  Now you know what marshal methods are, why they are key for interacting with native features in .NET MAUI and what&rsquo;s new in .NET 10 for them&mdash;especially for Android performance. </p><p>I hope this guide helps you better understand what&rsquo;s happening &ldquo;behind the scenes&rdquo; and gives you more confidence when working with native device features in your MAUI apps.</p><p>If you have any questions or want me to cover more related topics, feel free to leave a comment&mdash;I&rsquo;d be happy to help you! </p><p>See you in the next article! &zwj;♀️✨</p><h3 id="references">References</h3><p>The explanation was based on the official documentation:</p><ul><li><a target="_blank" href="https://learn.microsoft.com/en-us/dotnet/maui/whats-new/dotnet-10?view=net-maui-9.0">https://learn.microsoft.com/en-us/dotnet/maui/whats-new/dotnet-10?view=net-maui-9.0</a></li></ul><aside><hr data-sf-ec-immutable="" /><div class="row"><div class="col-4 u-normal-full u-small-mb0"><h4 class="u-fs20 u-fw5 u-lh125 u-mb0">Recap: What&rsquo;s New in .NET MAUI for .NET 10</h4></div><div class="col-8"><p class="u-fs16 u-mb0">See what other <a target="_blank" href="https://www.telerik.com/blogs/recap-whats-new-net-maui-net-10">.NET 10 updates for .NET MAUI</a> you may have missed.</p></div></div></aside>]]></content>
  </entry>
  <entry>
    <id>urn:uuid:b2eaf93f-bf11-445d-a9e6-82d476b53a9b</id>
    <title type="text">.NET 10 on iOS: Updates and Notes for .NET MAUI Developers</title>
    <summary type="text">Developers targeting iOS: Here’s what you may have missed in .NET 10 for .NET MAUI.</summary>
    <published>2025-12-30T15:21:01Z</published>
    <updated>2026-04-11T15:57:40Z</updated>
    <author>
      <name>Leomaris Reyes </name>
    </author>
    <link rel="alternate" href="https://www.telerik.com/blogs/net-10-ios-updates-notes-net-maui-developers"/>
    <content type="text"><![CDATA[<p><span class="featured">D</span>evelopers targeting iOS:&nbsp;<span class="featured">Here&rsquo;s what you may have missed in .NET 10 for .NET MAUI.</span></p><p>The new features in <a href="https://www.telerik.com/blogs/recap-whats-new-net-maui-net-10" target="_blank">.NET 10 for .NET MAUI</a> don&rsquo;t stop !  In this article, we&rsquo;ll dive into the iOS-specific updates introduced in .NET 10&mdash;improvements that directly impact performance, reliability and the overall development experience for mobile apps.</p><p>We&rsquo;ll break down what&rsquo;s changed, what&rsquo;s been optimized and what you, as a .NET MAUI developer targeting iOS, should keep in mind to get the most out of this release.</p><h2 id="-supported-platforms"> Supported Platforms</h2><p>One of the first questions I recommend asking when adopting a new version&mdash;specifically in this case for .NET iOS (although it applies to everything)&mdash;is knowing which versions are officially supported.</p><p>Why? Because this tells you which device and/or emulator versions your environment must match in order to fully take advantage of the new features!</p><p>For <strong>iOS, tvOS, Mac Catalyst and macOS</strong>, the following versions are supported:</p><ul><li>iOS 18.2</li><li>tvOS 18.2</li><li>Mac Catalyst 18.2</li><li>macOS 15.2</li></ul><h3 id="preview-7-xcode-26-beta-4">Preview 7: Xcode 26 Beta 4</h3><p>For now, Preview 7 still doesn&rsquo;t include full builds for .NET 10, but it does introduce initial compatibility with <strong>Xcode 26 Beta 4</strong>, focused on <strong>.NET 9 projects</strong>.</p><p>Putting this into practice, to use the new APIs/bindings from iOS 26 (Xcode 26), you must add two important elements inside your <code>&lt;PropertyGroup&gt;</code> tag:</p><p>➖ <strong>Add the TargetFramework tag:</strong></p><p>It specifies the version of the development environment, for example:</p><pre class=" language-xml"><code class="prism  language-xml"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>TargetFramework</span><span class="token punctuation">&gt;</span></span>net9.0-ios26<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>TargetFramework</span><span class="token punctuation">&gt;</span></span>
</code></pre><p>➖ <strong>Then you must add a NoWarn:</strong></p><pre class=" language-xml"><code class="prism  language-xml"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>NoWarn</span><span class="token punctuation">&gt;</span></span>$(NoWarn);XCODE_26_0_PREVIEW<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>NoWarn</span><span class="token punctuation">&gt;</span></span>
</code></pre><p>⚠️ This <code>NoWarn</code> is necessary because Xcode 26 is still in Beta, and it prevents the project from showing compatibility warnings.</p><p>A complete example would look like this:</p><pre class=" language-xml"><code class="prism  language-xml">&lt;Project Sdk="Microsoft.NET.Sdk"&gt; 
    &lt;PropertyGroup&gt; 
    &lt;TargetFramework&gt;net9.0-ios26&lt;/TargetFramework&gt; 
    &lt;NoWarn&gt;$(NoWarn);XCODE_26_0_PREVIEW&lt;/NoWarn&gt; 
    &lt;!-- rest of your configuration --&gt; 
    &lt;/PropertyGroup&gt; 
&lt;/Project&gt;
</code></pre><h3 id="net-maui-shell-rendering-issues">.NET MAUI Shell Rendering Issues</h3><p>⚠️ Previously, there was an issue with <strong>.NET MAUI Shell</strong> rendering on iOS 26. You can now be confident that this problem has been resolved in <strong>.NET MAUI 9 Service Release 11</strong> and <strong>.NET MAUI 10 RC1</strong>.</p><h3 id="previews-extra-information">Previews: Extra Information</h3><p>To learn more about .NET 10 on iOS, tvOS, Mac Catalyst and macOS, the official documentation recommends reviewing the <a target="_blank" href="https://github.com/dotnet/macios/wiki/Known-issues-in-.NET10">known issues in .NET 10</a>.</p><p>You can also explore the release notes for the .NET 10.0.1xx Preview versions:</p><ul><li><a target="_blank" href="https://github.com/dotnet/macios/releases/tag/dotnet-10.0.1xx-rc.1-10727">Release Candidate 1</a></li><li><a target="_blank" href="https://github.com/dotnet/macios/releases/tag/dotnet-10.0.1xx-preview7-10601">Preview 7</a></li><li><a target="_blank" href="https://github.com/dotnet/macios/releases/tag/dotnet-10.0.1xx-preview6-10451">Preview 6</a></li><li><a target="_blank" href="https://github.com/dotnet/macios/releases/tag/dotnet-10.0.1xx-preview5-10622">Preview 5</a></li><li><a target="_blank" href="https://github.com/dotnet/macios/releases/tag/dotnet-10.0.1xx-preview4-10471">Preview 4</a></li><li><a target="_blank" href="https://github.com/dotnet/macios/releases/tag/dotnet-10.0.1xx-preview3-10695">Preview 3</a></li><li><a target="_blank" href="https://github.com/dotnet/macios/releases/tag/dotnet-10.0.1xx-preview2-10552">Preview 2</a></li><li><a target="_blank" href="https://github.com/dotnet/macios/releases/tag/dotnet-10.0.1xx-preview1-10322">Preview 1</a></li></ul><h2 id="trimmer">Trimmer</h2><p>The trimmer is a .NET tool that performs a sort of &ldquo;cleanup operation&rdquo; on your app&rsquo;s code. It analyzes your project, detects unused code and removes it. In other words, it helps your app become lighter, more efficient and much faster to load.</p><p>In .NET 10, two important improvements related to its behavior have been introduced.</p><h3 id="trimmer-enabled-in-more-configurations">1. Trimmer Enabled in More Configurations</h3><p>With .NET 10, this &ldquo;smart cleaner&rdquo;&mdash;the Trimmer&mdash;can now be enabled by default in more scenarios, such as:</p><ul><li>iOS Simulator/arm64 (all configurations)</li><li>tvOS Simulator/arm64 (all configurations)</li><li>Mac Catalyst/arm64 (all configurations)</li></ul><p>When you see <strong>all configurations</strong>, this means it applies to different build configurations such as <strong>Debug</strong>, <strong>Release</strong> and others.</p><h3 id="trimmer-warnings-enabled-by-default">2. Trimmer Warnings Enabled by Default</h3><p>Previously, trimmer warnings were disabled by default. This was because the base class library produced its own trimmer warnings, making it impossible for the developer to fix all the warnings detected.</p><p>The good news is that in .NET 9, all iOS-related trimmer warnings were resolved, and thanks to that, trimmer warnings are now enabled by default.</p><p>However, if for some reason you want to disable them, you can do it very easily. Just add the <strong>SuppressTrimAnalysisWarnings</strong> property to your .csproj file as follows:</p><pre class=" language-xml"><code class="prism  language-xml">&lt;PropertyGroup&gt;  
    &lt;SuppressTrimAnalysisWarnings&gt;true&lt;/SuppressTrimAnalysisWarnings&gt; 
&lt;/PropertyGroup&gt;
</code></pre><h2 id="bundling-original-resources-in-libraries">Bundling Original Resources in Libraries</h2><p>Library projects can contain different types of resources, such as:</p><ul><li>Storyboards</li><li>XIBs</li><li>Property lists (plist)</li><li>Images</li><li>CoreML models</li><li>And others</li></ul><p>These resources require processing tasks like compiling storyboards or XIBs, optimizing plist files and more. This processing comes with some important considerations, such as:</p><ul><li>Running on a Mac, because compiling storyboards/XIBs is only possible on macOS.</li><li>Using Apple&rsquo;s toolchain (xcodebuild, ibtool, actool, etc.).</li></ul><p>All of these requirements can complicate building libraries because:</p><ul><li>You don&rsquo;t always have access to a Mac.</li><li>You cannot make decisions in the final app based on the original resources, because they were already &ldquo;processed.&rdquo;</li><li>You only get the processed version.</li><li>And, therefore, this limits the flexibility of the project consuming the library.</li></ul><h3 id="but-now-we-have-an-improvement-">But Now We Have an Improvement </h3><p><strong>In .NET 9</strong>, optional support (opt-in) was introduced that allowed including the original resources inside the library without processing them.</p><p><strong>In .NET 10</strong>, things get even better!  This support is now the default behavior (opt-out).</p><p>This makes our apps more flexible, removes the hard dependency on having a Mac available and results in much more consistent CI/CD builds.</p><h3 id="how-do-i-enable-or-disable-this-option">How Do I Enable or Disable This Option?</h3><p>If for some reason you want to revert this default behavior&mdash;meaning you don&rsquo;t want to include the original resources and prefer the library to contain the processed ones&mdash;you can do so by adding the following tag in your project file:</p><pre class=" language-xml"><code class="prism  language-xml">&lt;PropertyGroup&gt; 
    &lt;BundleOriginalResources&gt;false&lt;/BundleOriginalResources&gt; 
&lt;/PropertyGroup&gt;
</code></pre><h2 id="build-binding-projects-on-windows">Build Binding Projects on Windows</h2><p>Before, binding projects depended on Apple&rsquo;s ecosystem tools (meaning you needed a Mac to compile them).</p><p><strong> With .NET 10, this changed!</strong></p><p>Binding projects can now be built <strong>entirely on Windows</strong>, without requiring a Mac or any remote connection. This results in <strong>much faster builds on Windows</strong>. Woohoo! </p><p>This is a <strong>VERY</strong> big improvement for anyone working on Windows devices!</p><h2 id="-nsurlsessionhandler-no-longer-sets-minimum-tls-protocol-automatically"> NSUrlSessionHandler No Longer Sets Minimum TLS Protocol Automatically</h2><p>In case you didn&rsquo;t know, <strong>TLS (Transport Layer Security)</strong> is a security protocol that protects communication between two endpoints&mdash;for example, your app and the server.</p><p>Previously, we had behavior like this:</p><ul><li><code>NSUrlSessionHandler</code> relied on the value of <code>ServicePointManager.SecurityProtocol</code> to determine the minimum TLS protocol to use.</li><li>But that approach is now deprecated, because <code>ServicePointManager</code> is no longer used.</li></ul><p>So starting with .NET 10, if you want to define the minimum TLS protocol, you must do it manually before creating the <code>NSUrlSessionHandler</code>, as shown below:</p><pre class=" language-csharp"><code class="prism  language-csharp"><span class="token keyword">var</span> sessionConfiguration <span class="token operator">=</span> NSUrlSessionConfiguration<span class="token punctuation">.</span>DefaultSessionConfiguration<span class="token punctuation">;</span>
    
sessionConfiguration<span class="token punctuation">.</span>TlsMinimumSupportedProtocolVersion <span class="token operator">=</span> TlsProtocolVersion<span class="token punctuation">.</span>Tls13<span class="token punctuation">;</span>
    
<span class="token keyword">var</span> handler <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">NSUrlSessionHandler</span><span class="token punctuation">(</span>sessionConfiguration<span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre><h2 id="-the-nsurlsessionhandler.bypassbackgroundsessioncheck-property-is-now-ignored"> The NSUrlSessionHandler.BypassBackgroundSessionCheck Property Is Now Ignored</h2><p>This property existed as a workaround for an old issue in the Mono runtime. Since it&rsquo;s no longer needed, the property is now ignored.</p><h2 id="conclusion">Conclusion</h2><p>And that&rsquo;s it!  In this article, you explored the key improvements that .NET 10 brings to iOS, tvOS, macOS and Mac Catalyst development. From expanded trimmer support and improved resource handling to faster Windows-based binding builds and updated networking defaults, these changes work together to create a more efficient, consistent and modern development experience.</p><p>Now you have a clearer understanding of how these updates impact your workflow&mdash;helping you build lighter apps, reduce platform-specific friction and take full advantage of what .NET 10 offers for Apple platforms.</p><p>If you have any questions or want me to cover more related topics, feel free to leave a comment&mdash;I&rsquo;d be happy to help you! </p><p>See you in the next article! &zwj;♀️✨</p><h3 id="references">References</h3><p>The explanation was based on the official documentation:</p><ul><li><a target="_blank" href="https://learn.microsoft.com/en-us/dotnet/maui/whats-new/dotnet-10?view=net-maui-10.0">https://learn.microsoft.com/en-us/dotnet/maui/whats-new/dotnet-10?view=net-maui-10.0</a></li></ul><aside><hr data-sf-ec-immutable="" /><div class="row"><div class="col-4 u-normal-full u-small-mb0"><h4 class="u-fs20 u-fw5 u-lh125 u-mb0">Recap: What&rsquo;s New in .NET MAUI for .NET 10</h4></div><div class="col-8"><p class="u-fs16 u-mb0">See what other <a target="_blank" href="https://www.telerik.com/blogs/recap-whats-new-net-maui-net-10">.NET 10 updates for .NET MAUI</a> you may have missed.</p></div></div></aside>]]></content>
  </entry>
  <entry>
    <id>urn:uuid:e12efdb9-bcb7-4443-8d01-b2056f2e71cc</id>
    <title type="text">.NET 10 for .NET MAUI: Exploring the New Diagnostics and Metrics</title>
    <summary type="text">OK, MAUI devs, ICYMI here are the diagnostics and metrics tracking updates to .NET MAUI released with .NET 10 that you need to know!</summary>
    <published>2025-12-18T12:03:00Z</published>
    <updated>2026-04-11T15:57:40Z</updated>
    <author>
      <name>Leomaris Reyes </name>
    </author>
    <link rel="alternate" href="https://www.telerik.com/blogs/net-10-maui-exploring-new-diagnostics-metrics"/>
    <content type="text"><![CDATA[<p><span class="featured">OK, MAUI devs, ICYMI here are the diagnostics and metrics tracking updates to .NET MAUI released with .NET 10 that you need to know!</span></p><p>The most important tool for making decisions is data: metrics, statistics and real numbers that tell you what you&rsquo;re doing well and what you need to improve. Without them, you&rsquo;re literally guessing.</p><p>Imagine going to the doctor for an eye exam and, when he arrives, he decides to give you a diagnosis without evaluating you, without tests, without anything.</p><p><strong>Would you trust that result? Of course not. &zwj;♀️</strong></p><p>But if that same doctor sends you for tests, evaluates, compares and explains exactly what&rsquo;s going on? Then you&rsquo;d feel more confident, because you know there&rsquo;s real data behind the diagnosis.</p><p>The same thing happens with our applications: you can&rsquo;t optimize, improve or fix what you can&rsquo;t observe. If you don&rsquo;t have metrics that tell you how often a screen fails, how long it takes to display its elements or where time is being lost during the layout cycle, you&rsquo;re working blindly.</p><p>Having clear metrics not only helps you as a developer detect issues faster, but it also allows you to provide a better service to your users, because you can anticipate problems even before your user or client notices something is wrong.</p><p>In this article, we&rsquo;ll talk about the new <strong>comprehensive diagnostics and metrics tracking for .NET MAUI</strong>&mdash;incredibly useful for identifying performance issues and understanding what&rsquo;s really happening inside the layout cycle.</p><h2 id="first-of-all-a-quick-.net-aspire-review">First of All, A Quick .NET Aspire Review</h2><p>Before diving into diagnostics, it&rsquo;s important to understand, at a high level, what .NET Aspire provides, because it&rsquo;s the environment where you&rsquo;ll be able to see your saved diagnostic data.</p><p>It&rsquo;s a new application model in the .NET ecosystem, and .NET MAUI for .NET 10 now includes a project template that creates a .NET Aspire service defaults project.</p><p>This project introduces extension methods that automatically wire up telemetry and service discovery in your app. In practice, this means:</p><ul><li><strong>Telemetry</strong> enables your app to collect, measure and emit runtime data for monitoring and analysis.</li><li><strong>Service Discovery</strong> allows your app to locate and communicate with other services without relying on hardcoded URLs. Instead of pointing to fixed endpoints, your app connects using a service name.</li></ul><h2 id="diagnostics">Diagnostics</h2><p>Microsoft added a full diagnostics and metrics system for .NET MAUI apps. Its main focus is monitoring layout performance&mdash;how views are measured and arranged on the screen&mdash;and it&rsquo;s built on an extensible architecture that can easily support future observability features.</p><p>Basically, the core diagnostic infrastructure includes these three main points:</p><h3 id="activitysource-microsoft.maui">ActivitySource: &ldquo;Microsoft.Maui&rdquo;</h3><p>This is responsible for emitting activities (traces) when .NET MAUI performs layout operations. Thanks to this, we can know things like:</p><ul><li>When a <code>Measure()</code> or <code>Arrange()</code> operation starts and ends</li><li>How long each operation takes</li><li>Which view triggered it</li></ul><p>In summary, <strong>ActivitySource records every step of the layout process with detailed timing information.</strong></p><p>⚠️ As important context:</p><ul><li><strong>Measure</strong> is the process where .NET MAUI calculates and determines how much space a view needs.</li><li><strong>Arrange</strong>, which happens after Measure, is where .NET MAUI positions the view on the screen with its final size and location.</li></ul><h3 id="metrics-microsoft.maui">Metrics: &ldquo;Microsoft.Maui&rdquo;</h3><p>Through a <strong>meter</strong> (a component of the .NET metrics system), this exposes metrics in different formats, such as:</p><ul><li><strong>Counters:</strong> To identify how many times an event occurs</li><li><strong>Histograms:</strong> To measure how long an operation takes or how its values are distributed</li></ul><p>Basically, <strong>metrics are responsible for providing the raw numbers needed to analyze performance</strong>.</p><h3 id="feature-switch-meter.issupported">Feature Switch: Meter.IsSupported</h3><p>This allows metrics to be enabled or disabled at runtime for AOT/trimming. In other words, it works like a switch that lets you turn your metrics collection system on or off depending on your needs.</p><h2 id="layout-performance-tracking">Layout Performance Tracking</h2><p>Basically, this is where the most important UI operations&mdash;<code>Measure()</code> and <code>Arrange()</code>&mdash; are instrumented. In simple terms, it takes care of:</p><h3 id="instrumenting-iview.measure-and-iview.arrange">Instrumenting IView.Measure() and IView.Arrange()</h3><p>This means that .NET MAUI now injects internal measurements into these methods&mdash;as explained earlier.</p><p>When we talk about &ldquo;instrumenting,&rdquo; we mean adding metrics, logs, or traces inside the code so we can measure, monitor, diagnose or analyze how these operations behave.</p><h3 id="tracks-timing-counts-and-detailed-context">Tracks Timing, Counts and Detailed Context</h3><p>It records how long each <code>Measure()</code> and <code>Arrange()</code> operation takes and how many times they were executed, and&mdash;most importantly&mdash;adds rich tags and context such as which screen it happened on, which layout triggered it and which view was involved. This gives you much more precision when diagnosing and resolving issues.</p><h3 id="zero-allocation-instrumentation-for-optimal-performance">Zero-Allocation Instrumentation for Optimal Performance</h3><p>This means that all the instrumentation added to track <code>Measure()</code> and <code>Arrange()</code> is implemented using structs and a using pattern, so it generates zero heap allocations. In simple terms, the diagnostics system doesn&rsquo;t create extra garbage or slow down your app while measuring performance. It records everything efficiently without impacting the UI&rsquo;s responsiveness.</p><h2 id="-metrics-collected"> Metrics Collected</h2><p>All the concepts explained above are ultimately exposed through a set of specific metrics:</p><p><img src="https://d585tldpucybw.cloudfront.net/sfimages/default-source/blogs/2025/2025-12/01_metricscollected.png?sfvrsn=9bd6fb5_2" alt="Metrics Collected - Metric name: maui.layout.measure_count, type: Counter, description: Number of measure operations; Metric name: maui.layout.measure_duration, type: Histogram, description: Time spent measuring (ns); Metric name: maui.layout.arrange_count, type: Counter, description: Number of arrange operations; Metric name: maui.layout.arrange_duration, type: Histogram, description: Time spent arranging (ns)." /><br /><span style="font-size:11px;">Data from the official documentation.</span></p><h2 id="️-diagnostic-tags">️ Diagnostic Tags</h2><p><strong>Diagnostic Tags</strong> are labels automatically added by .NET MAUI to metrics and traces. Their purpose is to provide additional context about the view responsible for executing a <code>Measure()</code> or <code>Arrange()</code> operation.</p><p>In simple terms, these tags tell you which control triggered the operation, where it was located and its size.</p><p>The available tags are:</p><h3 id="all-views">All Views</h3><p>These apply to any view in .NET MAUI.</p><p><strong>Tag: element.type &mdash; Full type name</strong></p><p>Represents the full type name of the visual element that triggered the operation.</p><p>For example:</p><ul><li>Microsoft.Maui.Controls.Button</li><li>Microsoft.Maui.Controls.Label</li></ul><p>This tag helps you identify whether a specific control is causing multiple <code>Measure()</code> or <code>Arrange()</code> calls.</p><h3 id="controls-element--visualelement">Controls (Element / VisualElement)</h3><p>These tags are added to all controls that inherit from <code>Element</code> or <code>VisualElement</code>. They include:</p><ul><li><strong><a target="_blank" href="http://element.id">element.id</a>:</strong> Internal ID assigned by MAUI</li><li><strong>element.automation_id:</strong> A custom ID defined by you (optional), commonly used for testing and accessibility</li><li><strong>element.class_id:</strong> The control&rsquo;s ClassId</li><li><strong>element.style_id:</strong> Internal ID associated with applied styles</li><li><strong>element.class:</strong> Describes the visual characteristics of the control; helps you understand what style, template or visual category it had at the time</li><li><strong>element.frame:</strong> Represents the final position and size of the control on the screen (for example: x=0, y=34, width=260, height=55)</li></ul><h3 id="where-can-you-find-these-metrics">Where Can You Find These Metrics?</h3><p>Remember at the beginning of the article when we talked about <strong>.NET Aspire?</strong></p><p>Well, that&rsquo;s exactly where you can view all these metrics.</p><aside><hr data-sf-ec-immutable="" /><div class="row"><div class="col-4 u-normal-full u-small-mb0"><h4 class="u-fs20 u-fw5 u-lh125 u-mb0">What Is .NET Aspire?</h4></div><div class="col-8"><p class="u-fs16 u-mb0">Learn more in this <a target="_blank" href="https://www.telerik.com/blogs/net-aspire-1-what-is-net-aspire">six-part series on .NET Aspire</a>. Explore this opinionated toolkit that allows developers to work with cloud-native applications.</p></div></div><hr class="u-mb3" /></aside><p>Below, I&rsquo;ve included images from the official documentation so you can visualize how this looks in practice.</p><p><img src="https://d585tldpucybw.cloudfront.net/sfimages/default-source/blogs/2025/2025-12/02_aspire.png?sfvrsn=6e86894a_2" alt=".NET Aspire Sample image" /></p><p><img src="https://d585tldpucybw.cloudfront.net/sfimages/default-source/blogs/2025/2025-12/03_aspire.png?sfvrsn=f27417c2_2" alt=".NET Aspire Sample image" /></p><p>✍️ If you want to dive deeper into the topic, I recommend checking out the pull request for <a target="_blank" href="https://github.com/dotnet/maui/pull/31058">&ldquo;[v3] Add Diagnostics Metrics Tracking to MAUI Applications&rdquo;</a>.</p><h2 id="conclusion">Conclusion</h2><p>And that&rsquo;s it!  In this article, you explored how the new diagnostics system in .NET 10 enhances observability in .NET MAUI apps. You learned what each component does, how layout operations are instrumented, and how metrics are exposed so you can better understand your app&rsquo;s performance.</p><p>Now you have the tools to make diagnostics your ally&mdash;helping you detect issues faster, optimize your UI more confidently and build apps that are both smoother and easier to maintain.</p><p>If you have any questions or want me to cover more related topics, feel free to leave a comment&mdash;I&rsquo;d be happy to help you! </p><p>See you in the next article! &zwj;♀️✨</p><h3 id="references">References</h3><p>The explanation was based on the official documentation:</p><ul><li><a target="_blank" href="https://learn.microsoft.com/en-us/dotnet/maui/whats-new/dotnet-10?view=net-maui-10.0">https://learn.microsoft.com/en-us/dotnet/maui/whats-new/dotnet-10?view=net-maui-10.0</a></li><li><a target="_blank" href="https://github.com/dotnet/maui/pull/31058">https://github.com/dotnet/maui/pull/31058</a></li></ul>]]></content>
  </entry>
</feed>
