<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Devs School</title><link>https://devs.school</link><description>Become an expert in software development</description><language>en-US</language><item><title>Create Viral Videos with SORA in .NET MAUI</title><link>https://devs.school/create-viral-videos-with-sora-in-net-maui/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=create-viral-videos-with-sora-in-net-maui</link><guid isPermaLink="false">https://devs.school/?p=8962</guid><pubDate>Tue, 22 Jul 2025 16:12:34 GMT</pubDate><description>Building a .NET MAUI app that uses Azure OpenAI SORA to generate videos. Step-by-step guide for devs interested in AI, UI, and automation.</description><content:encoded>		&lt;div class=&quot;elementor elementor-8962&quot;&gt;
									&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-660a1878 elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-23340cb2&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-5d87bb3c elementor-widget elementor-widget-text-editor&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
							
&lt;p&gt;Hello devs! I'm so excited to be part of the &lt;a href=&quot;https://goforgoldman.com/posts/mauiuijuly-25/&quot;&gt;.NET MAUI UI July – 2025 calendar&lt;/a&gt;! I invite you to explore all the fabulous posts that other authors have published on topics related to .NET MAUI.&lt;/p&gt;

&lt;p&gt;In this post, I'm going to show you how I created an application that connects to the SORA service of Azure OpenAI for generating stunning videos. This project is just a part of a more complex system that I developed some time ago that allows for automated YouTube video generation. Personally, it's a topic that I'm passionate about, and I found it interesting to share it with you. I should add that I made extensive use of the VS Code agent to speed up the demo development. Let's get started!&lt;/p&gt;
						&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-47de543 elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-133424e&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-4cc4532 elementor-widget elementor-widget-heading&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
			&lt;h2 class=&quot;elementor-heading-title elementor-size-default&quot; id=&quot;general-overview-of-the-video-generator-using-sora&quot;&gt;General Overview of the Video Generator Using SORA&lt;/h2&gt;		&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-6519432 elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-873b1df&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-bf5fbc3 elementor-widget elementor-widget-text-editor&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
							&lt;div&gt;
&lt;div&gt;The video generation project contains 4 main pages that guide the user through the process of generating a video. These pages are as follows:&lt;/div&gt;
&lt;br&gt;
&lt;div&gt;&lt;strong&gt;AddVideoIdeaPage.xaml&lt;/strong&gt;: Page to enter the video prompt and configuration&lt;/div&gt;
&lt;div&gt;&lt;strong&gt;SettingsPage.xaml&lt;/strong&gt;: Page to add the keys for the Azure OpenAI services&lt;/div&gt;
&lt;div&gt;&lt;strong&gt;VideoDisplayPage.xaml&lt;/strong&gt;: Page that displays the generated video&lt;/div&gt;
&lt;div&gt;&lt;strong&gt;VideoPromptsPage.xaml&lt;/strong&gt;: Page that creates the enhanced prompt for video generation&lt;/div&gt;
&lt;br&gt;
&lt;div&gt;Next, I'll show you each of the pages:&lt;/div&gt;
&lt;/div&gt;						&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-12a61fe elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-f9f1a0e&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-41541f8 elementor-widget elementor-widget-heading&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
			&lt;h2 class=&quot;elementor-heading-title elementor-size-default&quot; id=&quot;creating-the-settings-page&quot;&gt;Creating the Settings Page&lt;/h2&gt;		&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-3ceaec3 elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-70bcc6e&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-fd93f13 elementor-widget elementor-widget-text-editor&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
							&lt;div&gt;
&lt;div&gt;Let's start with the simplest page, which is the settings page for entering keys to connect the app with the Azure OpenAI services. In this case, the definition of the XAML page looks as follows:&lt;/div&gt;
&lt;/div&gt;						&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-a715150 elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-28c45fb&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-dbdc872 elementor-widget elementor-widget-code-highlight&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
					&lt;div class=&quot;prismjs-default copy-to-clipboard&quot;&gt;
			&lt;pre class=&quot;highlight-height language-xml line-numbers&quot;&gt;
				&lt;code class=&quot;language-xml&quot;&gt;
					&lt;span class=&quot;legacy-code-literal&quot;&gt;&amp;lt;ScrollView&amp;gt;
    &amp;lt;VerticalStackLayout Padding=&quot;20&quot; Spacing=&quot;25&quot;&amp;gt;

        &amp;lt;!--  Page Header  --&amp;gt;
        &amp;lt;VerticalStackLayout Spacing=&quot;5&quot;&amp;gt;
            &amp;lt;Label
                FontAttributes=&quot;Bold&quot;
                FontSize=&quot;28&quot;
                HorizontalOptions=&quot;Center&quot;
                Text=&quot;App Settings&quot;
                TextColor=&quot;{AppThemeBinding Light={StaticResource Primary},
                                            Dark={StaticResource White}}&quot; /&amp;gt;

            &amp;lt;Label
                FontSize=&quot;14&quot;
                HorizontalOptions=&quot;Center&quot;
                Text=&quot;Configure your AI services connections&quot;
                TextColor=&quot;{AppThemeBinding Light={StaticResource Gray600},
                                            Dark={StaticResource Gray300}}&quot; /&amp;gt;
        &amp;lt;/VerticalStackLayout&amp;gt;

        &amp;lt;!--  Azure LLM Configuration Section  --&amp;gt;
        &amp;lt;Border
            Padding=&quot;20&quot;
            BackgroundColor=&quot;{AppThemeBinding Light={StaticResource White},
                                                Dark={StaticResource Gray900}}&quot;
            Stroke=&quot;{AppThemeBinding Light={StaticResource Gray200},
                                        Dark={StaticResource Gray600}}&quot;
            StrokeShape=&quot;RoundRectangle 12&quot;
            StrokeThickness=&quot;1&quot;&amp;gt;

            &amp;lt;VerticalStackLayout Spacing=&quot;15&quot;&amp;gt;

                &amp;lt;!--  Section Header  --&amp;gt;
                &amp;lt;Grid ColumnDefinitions=&quot;Auto,*,Auto&quot; ColumnSpacing=&quot;10&quot;&amp;gt;
                    &amp;lt;Border
                        Grid.Column=&quot;0&quot;
                        BackgroundColor=&quot;{AppThemeBinding Light={StaticResource Primary},
                                                            Dark={StaticResource Primary}}&quot;
                        HeightRequest=&quot;32&quot;
                        StrokeShape=&quot;RoundRectangle 8&quot;
                        VerticalOptions=&quot;Center&quot;
                        WidthRequest=&quot;32&quot;&amp;gt;
                        &amp;lt;Label
                            FontSize=&quot;16&quot;
                            HorizontalOptions=&quot;Center&quot;
                            Text=&quot;🧠&quot;
                            TextColor=&quot;White&quot;
                            VerticalOptions=&quot;Center&quot; /&amp;gt;
                    &amp;lt;/Border&amp;gt;

                    &amp;lt;VerticalStackLayout Grid.Column=&quot;1&quot; VerticalOptions=&quot;Center&quot;&amp;gt;
                        &amp;lt;Label
                            FontAttributes=&quot;Bold&quot;
                            FontSize=&quot;18&quot;
                            Text=&quot;Azure LLM Service&quot;
                            TextColor=&quot;{AppThemeBinding Light={StaticResource Black},
                                                        Dark={StaticResource White}}&quot; /&amp;gt;
                        &amp;lt;Label
                            FontSize=&quot;12&quot;
                            Text=&quot;Configure your Azure Language Model connection&quot;
                            TextColor=&quot;{AppThemeBinding Light={StaticResource Gray600},
                                                        Dark={StaticResource Gray400}}&quot; /&amp;gt;
                    &amp;lt;/VerticalStackLayout&amp;gt;

                    &amp;lt;Button
                        Grid.Column=&quot;2&quot;
                        BackgroundColor=&quot;Transparent&quot;
                        BorderColor=&quot;{AppThemeBinding Light={StaticResource Primary},
                                                        Dark={StaticResource White}}&quot;
                        BorderWidth=&quot;1&quot;
                        Command=&quot;{Binding TestAzureLlmConnectionCommand}&quot;
                        CornerRadius=&quot;8&quot;
                        FontSize=&quot;12&quot;
                        HeightRequest=&quot;32&quot;
                        IsEnabled=&quot;{Binding IsAzureLlmConfigComplete}&quot;
                        Text=&quot;Test&quot;
                        TextColor=&quot;{AppThemeBinding Light={StaticResource Primary},
                                                    Dark={StaticResource White}}&quot;
                        WidthRequest=&quot;60&quot; /&amp;gt;
                &amp;lt;/Grid&amp;gt;

                &amp;lt;!--  Endpoint Field  --&amp;gt;
                &amp;lt;VerticalStackLayout Spacing=&quot;5&quot;&amp;gt;
                    &amp;lt;Label
                        FontAttributes=&quot;Bold&quot;
                        FontSize=&quot;14&quot;
                        Text=&quot;Endpoint URL&quot;
                        TextColor=&quot;{AppThemeBinding Light={StaticResource Black},
                                                    Dark={StaticResource White}}&quot; /&amp;gt;

                    &amp;lt;Border
                        Stroke=&quot;{AppThemeBinding Light={StaticResource Gray300},
                                                    Dark={StaticResource Gray500}}&quot;
                        StrokeShape=&quot;RoundRectangle 8&quot;
                        StrokeThickness=&quot;1&quot;&amp;gt;
                        &amp;lt;Entry
                            FontSize=&quot;14&quot;
                            Placeholder=&quot;https://your-resource.openai.azure.com/&quot;
                            PlaceholderColor=&quot;{AppThemeBinding Light={StaticResource Gray400},
                                                                Dark={StaticResource Gray500}}&quot;
                            Text=&quot;{Binding AzureLlmEndpoint}&quot;
                            TextColor=&quot;{AppThemeBinding Light={StaticResource Black},
                                                        Dark={StaticResource White}}&quot; /&amp;gt;
                    &amp;lt;/Border&amp;gt;
                &amp;lt;/VerticalStackLayout&amp;gt;

                &amp;lt;!--  API Key Field  --&amp;gt;
                &amp;lt;VerticalStackLayout Spacing=&quot;5&quot;&amp;gt;
                    &amp;lt;Label
                        FontAttributes=&quot;Bold&quot;
                        FontSize=&quot;14&quot;
                        Text=&quot;API Key&quot;
                        TextColor=&quot;{AppThemeBinding Light={StaticResource Black},
                                                    Dark={StaticResource White}}&quot; /&amp;gt;

                    &amp;lt;Border
                        Stroke=&quot;{AppThemeBinding Light={StaticResource Gray300},
                                                    Dark={StaticResource Gray500}}&quot;
                        StrokeShape=&quot;RoundRectangle 8&quot;
                        StrokeThickness=&quot;1&quot;&amp;gt;
                        &amp;lt;Grid ColumnDefinitions=&quot;*,Auto&quot;&amp;gt;
                            &amp;lt;Entry
                                Grid.Column=&quot;0&quot;
                                FontSize=&quot;14&quot;
                                IsPassword=&quot;{Binding IsAzureLlmApiKeyVisible, Converter={StaticResource InvertedBoolConverter}}&quot;
                                Placeholder=&quot;Enter your Azure API key&quot;
                                PlaceholderColor=&quot;{AppThemeBinding Light={StaticResource Gray400},
                                                                    Dark={StaticResource Gray500}}&quot;
                                Text=&quot;{Binding AzureLlmApiKey}&quot;
                                TextColor=&quot;{AppThemeBinding Light={StaticResource Black},
                                                            Dark={StaticResource White}}&quot; /&amp;gt;

                            &amp;lt;Button
                                Grid.Column=&quot;1&quot;
                                BackgroundColor=&quot;Transparent&quot;
                                Command=&quot;{Binding ToggleAzureLlmApiKeyVisibilityCommand}&quot;
                                FontSize=&quot;16&quot;
                                Padding=&quot;5&quot;
                                Text=&quot;{Binding AzureLlmApiKeyToggleIcon}&quot;
                                TextColor=&quot;{AppThemeBinding Light={StaticResource Gray600},
                                                            Dark={StaticResource Gray400}}&quot; /&amp;gt;
                        &amp;lt;/Grid&amp;gt;
                    &amp;lt;/Border&amp;gt;
                &amp;lt;/VerticalStackLayout&amp;gt;

                &amp;lt;!--  Deployment Name Field  --&amp;gt;
                &amp;lt;VerticalStackLayout Spacing=&quot;5&quot;&amp;gt;
                    &amp;lt;Label
                        FontAttributes=&quot;Bold&quot;
                        FontSize=&quot;14&quot;
                        Text=&quot;Deployment Name&quot;
                        TextColor=&quot;{AppThemeBinding Light={StaticResource Black},
                                                    Dark={StaticResource White}}&quot; /&amp;gt;

                    &amp;lt;Border
                        Stroke=&quot;{AppThemeBinding Light={StaticResource Gray300},
                                                    Dark={StaticResource Gray500}}&quot;
                        StrokeShape=&quot;RoundRectangle 8&quot;
                        StrokeThickness=&quot;1&quot;&amp;gt;
                        &amp;lt;Entry
                            FontSize=&quot;14&quot;
                            Placeholder=&quot;gpt-4, gpt-35-turbo, etc.&quot;
                            PlaceholderColor=&quot;{AppThemeBinding Light={StaticResource Gray400},
                                                                Dark={StaticResource Gray500}}&quot;
                            Text=&quot;{Binding AzureLlmDeployment}&quot;
                            TextColor=&quot;{AppThemeBinding Light={StaticResource Black},
                                                        Dark={StaticResource White}}&quot; /&amp;gt;
                    &amp;lt;/Border&amp;gt;
                &amp;lt;/VerticalStackLayout&amp;gt;

            &amp;lt;/VerticalStackLayout&amp;gt;
        &amp;lt;/Border&amp;gt;

        &amp;lt;!--  SORA Configuration Section  --&amp;gt;
        &amp;lt;Border
            Padding=&quot;20&quot;
            BackgroundColor=&quot;{AppThemeBinding Light={StaticResource White},
                                                Dark={StaticResource Gray900}}&quot;
            Stroke=&quot;{AppThemeBinding Light={StaticResource Gray200},
                                        Dark={StaticResource Gray600}}&quot;
            StrokeShape=&quot;RoundRectangle 12&quot;
            StrokeThickness=&quot;1&quot;&amp;gt;

            &amp;lt;VerticalStackLayout Spacing=&quot;15&quot;&amp;gt;

                &amp;lt;!--  Section Header  --&amp;gt;
                &amp;lt;Grid ColumnDefinitions=&quot;Auto,*,Auto&quot; ColumnSpacing=&quot;10&quot;&amp;gt;
                    &amp;lt;Border
                        Grid.Column=&quot;0&quot;
                        BackgroundColor=&quot;{AppThemeBinding Light={StaticResource Primary},
                                                            Dark={StaticResource Primary}}&quot;
                        HeightRequest=&quot;32&quot;
                        StrokeShape=&quot;RoundRectangle 8&quot;
                        VerticalOptions=&quot;Center&quot;
                        WidthRequest=&quot;32&quot;&amp;gt;
                        &amp;lt;Label
                            FontSize=&quot;16&quot;
                            HorizontalOptions=&quot;Center&quot;
                            Text=&quot;🎬&quot;
                            TextColor=&quot;White&quot;
                            VerticalOptions=&quot;Center&quot; /&amp;gt;
                    &amp;lt;/Border&amp;gt;

                    &amp;lt;VerticalStackLayout Grid.Column=&quot;1&quot; VerticalOptions=&quot;Center&quot;&amp;gt;
                        &amp;lt;Label
                            FontAttributes=&quot;Bold&quot;
                            FontSize=&quot;18&quot;
                            Text=&quot;SORA Video Service&quot;
                            TextColor=&quot;{AppThemeBinding Light={StaticResource Black},
                                                        Dark={StaticResource White}}&quot; /&amp;gt;
                        &amp;lt;Label
                            FontSize=&quot;12&quot;
                            Text=&quot;Configure your SORA video generation connection&quot;
                            TextColor=&quot;{AppThemeBinding Light={StaticResource Gray600},
                                                        Dark={StaticResource Gray400}}&quot; /&amp;gt;
                    &amp;lt;/VerticalStackLayout&amp;gt;

                    &amp;lt;Button
                        Grid.Column=&quot;2&quot;
                        BackgroundColor=&quot;Transparent&quot;
                        BorderColor=&quot;{AppThemeBinding Light={StaticResource Primary},
                                                        Dark={StaticResource White}}&quot;
                        BorderWidth=&quot;1&quot;
                        Command=&quot;{Binding TestSoraConnectionCommand}&quot;
                        CornerRadius=&quot;8&quot;
                        FontSize=&quot;12&quot;
                        HeightRequest=&quot;32&quot;
                        IsEnabled=&quot;{Binding IsSoraConfigComplete}&quot;
                        Text=&quot;Test&quot;
                        TextColor=&quot;{AppThemeBinding Light={StaticResource Primary},
                                                    Dark={StaticResource White}}&quot;
                        WidthRequest=&quot;60&quot; /&amp;gt;
                &amp;lt;/Grid&amp;gt;

                &amp;lt;!--  Endpoint Field  --&amp;gt;
                &amp;lt;VerticalStackLayout Spacing=&quot;5&quot;&amp;gt;
                    &amp;lt;Label
                        FontAttributes=&quot;Bold&quot;
                        FontSize=&quot;14&quot;
                        Text=&quot;Endpoint URL&quot;
                        TextColor=&quot;{AppThemeBinding Light={StaticResource Black},
                                                    Dark={StaticResource White}}&quot; /&amp;gt;

                    &amp;lt;Border
                        Stroke=&quot;{AppThemeBinding Light={StaticResource Gray300},
                                                    Dark={StaticResource Gray500}}&quot;
                        StrokeShape=&quot;RoundRectangle 8&quot;
                        StrokeThickness=&quot;1&quot;&amp;gt;
                        &amp;lt;Entry
                            FontSize=&quot;14&quot;
                            Placeholder=&quot;https://api.openai.com/v1/sora/&quot;
                            PlaceholderColor=&quot;{AppThemeBinding Light={StaticResource Gray400},
                                                                Dark={StaticResource Gray500}}&quot;
                            Text=&quot;{Binding SoraEndpoint}&quot;
                            TextColor=&quot;{AppThemeBinding Light={StaticResource Black},
                                                        Dark={StaticResource White}}&quot; /&amp;gt;
                    &amp;lt;/Border&amp;gt;
                &amp;lt;/VerticalStackLayout&amp;gt;

                &amp;lt;!--  API Key Field  --&amp;gt;
                &amp;lt;VerticalStackLayout Spacing=&quot;5&quot;&amp;gt;
                    &amp;lt;Label
                        FontAttributes=&quot;Bold&quot;
                        FontSize=&quot;14&quot;
                        Text=&quot;API Key&quot;
                        TextColor=&quot;{AppThemeBinding Light={StaticResource Black},
                                                    Dark={StaticResource White}}&quot; /&amp;gt;

                    &amp;lt;Border
                        Stroke=&quot;{AppThemeBinding Light={StaticResource Gray300},
                                                    Dark={StaticResource Gray500}}&quot;
                        StrokeShape=&quot;RoundRectangle 8&quot;
                        StrokeThickness=&quot;1&quot;&amp;gt;
                        &amp;lt;Grid ColumnDefinitions=&quot;*,Auto&quot;&amp;gt;
                            &amp;lt;Entry
                                Grid.Column=&quot;0&quot;
                                FontSize=&quot;14&quot;
                                IsPassword=&quot;{Binding IsSoraApiKeyVisible, Converter={StaticResource InvertedBoolConverter}}&quot;
                                Placeholder=&quot;Enter your SORA API key&quot;
                                PlaceholderColor=&quot;{AppThemeBinding Light={StaticResource Gray400},
                                                                    Dark={StaticResource Gray500}}&quot;
                                Text=&quot;{Binding SoraApiKey}&quot;
                                TextColor=&quot;{AppThemeBinding Light={StaticResource Black},
                                                            Dark={StaticResource White}}&quot; /&amp;gt;

                            &amp;lt;Button
                                Grid.Column=&quot;1&quot;
                                BackgroundColor=&quot;Transparent&quot;
                                Command=&quot;{Binding ToggleSoraApiKeyVisibilityCommand}&quot;
                                FontSize=&quot;16&quot;
                                Padding=&quot;5&quot;
                                Text=&quot;{Binding SoraApiKeyToggleIcon}&quot;
                                TextColor=&quot;{AppThemeBinding Light={StaticResource Gray600},
                                                            Dark={StaticResource Gray400}}&quot; /&amp;gt;
                        &amp;lt;/Grid&amp;gt;
                    &amp;lt;/Border&amp;gt;
                &amp;lt;/VerticalStackLayout&amp;gt;

                &amp;lt;!--  Deployment Name Field  --&amp;gt;
                &amp;lt;VerticalStackLayout Spacing=&quot;5&quot;&amp;gt;
                    &amp;lt;Label
                        FontAttributes=&quot;Bold&quot;
                        FontSize=&quot;14&quot;
                        Text=&quot;Model Name&quot;
                        TextColor=&quot;{AppThemeBinding Light={StaticResource Black},
                                                    Dark={StaticResource White}}&quot; /&amp;gt;

                    &amp;lt;Border
                        Stroke=&quot;{AppThemeBinding Light={StaticResource Gray300},
                                                    Dark={StaticResource Gray500}}&quot;
                        StrokeShape=&quot;RoundRectangle 8&quot;
                        StrokeThickness=&quot;1&quot;&amp;gt;
                        &amp;lt;Entry
                            FontSize=&quot;14&quot;
                            Placeholder=&quot;sora-1.0, sora-turbo, etc.&quot;
                            PlaceholderColor=&quot;{AppThemeBinding Light={StaticResource Gray400},
                                                                Dark={StaticResource Gray500}}&quot;
                            Text=&quot;{Binding SoraDeployment}&quot;
                            TextColor=&quot;{AppThemeBinding Light={StaticResource Black},
                                                        Dark={StaticResource White}}&quot; /&amp;gt;
                    &amp;lt;/Border&amp;gt;
                &amp;lt;/VerticalStackLayout&amp;gt;

            &amp;lt;/VerticalStackLayout&amp;gt;
        &amp;lt;/Border&amp;gt;

        &amp;lt;!--  Action Buttons  --&amp;gt;
        &amp;lt;Grid ColumnDefinitions=&quot;*,*&quot; ColumnSpacing=&quot;15&quot; Margin=&quot;0,10,0,0&quot;&amp;gt;

            &amp;lt;Button
                Grid.Column=&quot;0&quot;
                BackgroundColor=&quot;Transparent&quot;
                BorderColor=&quot;#DC3545&quot;
                BorderWidth=&quot;2&quot;
                Command=&quot;{Binding ClearSettingsCommand}&quot;
                CornerRadius=&quot;25&quot;
                FontAttributes=&quot;Bold&quot;
                FontSize=&quot;16&quot;
                HeightRequest=&quot;50&quot;
                Text=&quot;Clear All&quot;
                TextColor=&quot;#DC3545&quot; /&amp;gt;

            &amp;lt;Button
                Grid.Column=&quot;1&quot;
                BackgroundColor=&quot;{StaticResource Primary}&quot;
                Command=&quot;{Binding SaveSettingsCommand}&quot;
                CornerRadius=&quot;25&quot;
                FontAttributes=&quot;Bold&quot;
                FontSize=&quot;16&quot;
                HeightRequest=&quot;50&quot;
                IsEnabled=&quot;{Binding IsSaving, Converter={StaticResource InvertedBoolConverter}}&quot;
                Text=&quot;Save Settings&quot;
                TextColor=&quot;White&quot; /&amp;gt;

        &amp;lt;/Grid&amp;gt;

        &amp;lt;!--  Loading Indicator  --&amp;gt;
        &amp;lt;VerticalStackLayout IsVisible=&quot;{Binding IsSaving}&quot; 
                        Padding=&quot;20&quot;
                        HorizontalOptions=&quot;Center&quot; 
                        VerticalOptions=&quot;Center&quot;
                        Spacing=&quot;15&quot;&amp;gt;
            
            &amp;lt;ActivityIndicator IsRunning=&quot;{Binding IsSaving}&quot;
                                Color=&quot;{StaticResource Primary}&quot;
                                HeightRequest=&quot;40&quot;
                                WidthRequest=&quot;40&quot;
                                HorizontalOptions=&quot;Center&quot; /&amp;gt;
            
            &amp;lt;Label Text=&quot;Saving Configuration...&quot; 
                    FontSize=&quot;16&quot; 
                    FontAttributes=&quot;Bold&quot; 
                    HorizontalOptions=&quot;Center&quot; 
                    TextColor=&quot;{AppThemeBinding Light={StaticResource Primary}, Dark={StaticResource Primary}}&quot; /&amp;gt;
            
            &amp;lt;Label Text=&quot;Validating and storing your settings&quot; 
                    FontSize=&quot;14&quot; 
                    HorizontalOptions=&quot;Center&quot; 
                    TextColor=&quot;{AppThemeBinding Light={StaticResource Gray600}, Dark={StaticResource Gray400}}&quot; /&amp;gt;
            
        &amp;lt;/VerticalStackLayout&amp;gt;

    &amp;lt;/VerticalStackLayout&amp;gt;
&amp;lt;/ScrollView&amp;gt;&lt;/span&gt;
				&lt;/code&gt;
			&lt;/pre&gt;
		&lt;/div&gt;
				&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-7c04906 elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-646886b&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-5a4a2bf elementor-widget elementor-widget-text-editor&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
							&lt;div&gt;
&lt;div&gt;This page is linked to a ViewModel called SettingsViewModel, which looks like this:&lt;/div&gt;
&lt;/div&gt;						&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-74b9462 elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-4c5493c&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-a491aac elementor-widget elementor-widget-code-highlight&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
					&lt;div class=&quot;prismjs-default copy-to-clipboard&quot;&gt;
			&lt;pre class=&quot;highlight-height language-csharp line-numbers&quot;&gt;
				&lt;code class=&quot;language-csharp&quot;&gt;
					&lt;span class=&quot;legacy-code-literal&quot;&gt;public partial class SettingsViewModel : ObservableObject
{
    // Constants for Preferences keys
    private const string AZURE_LLM_ENDPOINT_KEY = &quot;AzureLlmEndpoint&quot;;
    private const string AZURE_LLM_API_KEY = &quot;AzureLlmApiKey&quot;;
    private const string AZURE_LLM_DEPLOYMENT_KEY = &quot;AzureLlmDeployment&quot;;
    private const string SORA_ENDPOINT_KEY = &quot;SoraEndpoint&quot;;
    private const string SORA_API_KEY = &quot;SoraApiKey&quot;;
    private const string SORA_DEPLOYMENT_KEY = &quot;SoraDeployment&quot;;

    [ObservableProperty]
    private string azureLlmEndpoint = string.Empty;

    [ObservableProperty]
    private string azureLlmApiKey = string.Empty;

    [ObservableProperty]
    private string azureLlmDeployment = string.Empty;

    [ObservableProperty]
    private string soraEndpoint = string.Empty;

    [ObservableProperty]
    private string soraApiKey = string.Empty;

    [ObservableProperty]
    private string soraDeployment = string.Empty;

    [ObservableProperty]
    private bool isAzureLlmApiKeyVisible = false;

    [ObservableProperty]
    private bool isSoraApiKeyVisible = false;

    [ObservableProperty]
    private string azureLlmApiKeyToggleIcon = &quot;👁️&quot;;

    [ObservableProperty]
    private string soraApiKeyToggleIcon = &quot;👁️&quot;;

    [ObservableProperty]
    private bool isSaving = false;

    // Reference to the page for displaying alerts
    private Page? _page;

    public SettingsViewModel()
    {
        LoadSettings();
    }

    public void SetPage(Page page)
    {
        _page = page;
    }

    /// &amp;lt;summary&amp;gt;
    /// Loads saved settings from Preferences
    /// &amp;lt;/summary&amp;gt;
    public void LoadSettings()
    {
        AzureLlmEndpoint = Preferences.Default.Get(AZURE_LLM_ENDPOINT_KEY, string.Empty);
        AzureLlmApiKey = Preferences.Default.Get(AZURE_LLM_API_KEY, string.Empty);
        AzureLlmDeployment = Preferences.Default.Get(AZURE_LLM_DEPLOYMENT_KEY, string.Empty);
        
        SoraEndpoint = Preferences.Default.Get(SORA_ENDPOINT_KEY, string.Empty);
        SoraApiKey = Preferences.Default.Get(SORA_API_KEY, string.Empty);
        SoraDeployment = Preferences.Default.Get(SORA_DEPLOYMENT_KEY, string.Empty);
    }

    /// &amp;lt;summary&amp;gt;
    /// Command to toggle visibility of Azure LLM API key
    /// &amp;lt;/summary&amp;gt;
    [RelayCommand]
    private void ToggleAzureLlmApiKeyVisibility()
    {
        IsAzureLlmApiKeyVisible = !IsAzureLlmApiKeyVisible;
        AzureLlmApiKeyToggleIcon = IsAzureLlmApiKeyVisible ? &quot;🙈&quot; : &quot;👁️&quot;;
    }

    /// &amp;lt;summary&amp;gt;
    /// Command to toggle visibility of SORA API key
    /// &amp;lt;/summary&amp;gt;
    [RelayCommand]
    private void ToggleSoraApiKeyVisibility()
    {
        IsSoraApiKeyVisible = !IsSoraApiKeyVisible;
        SoraApiKeyToggleIcon = IsSoraApiKeyVisible ? &quot;🙈&quot; : &quot;👁️&quot;;
    }

    /// &amp;lt;summary&amp;gt;
    /// Command to save all settings
    /// &amp;lt;/summary&amp;gt;
    [RelayCommand]
    private async Task SaveSettings()
    {
        IsSaving = true;

        try
        {
            // Validate settings before saving
            if (!ValidateSettings())
            {
                return;
            }

            // Save Azure LLM settings
            Preferences.Default.Set(AZURE_LLM_ENDPOINT_KEY, AzureLlmEndpoint.Trim());
            Preferences.Default.Set(AZURE_LLM_API_KEY, AzureLlmApiKey.Trim());
            Preferences.Default.Set(AZURE_LLM_DEPLOYMENT_KEY, AzureLlmDeployment.Trim());

            // Save SORA settings
            Preferences.Default.Set(SORA_ENDPOINT_KEY, SoraEndpoint.Trim());
            Preferences.Default.Set(SORA_API_KEY, SoraApiKey.Trim());
            Preferences.Default.Set(SORA_DEPLOYMENT_KEY, SoraDeployment.Trim());

            if (_page != null)
            {
                await _page.DisplayAlert(&quot;Settings Saved&quot;, &quot;All settings have been saved successfully!&quot;, &quot;OK&quot;);
            }
        }
        catch (Exception ex)
        {
            if (_page != null)
            {
                await _page.DisplayAlert(&quot;Error&quot;, $&quot;Failed to save settings: {ex.Message}&quot;, &quot;OK&quot;);
            }
        }
        finally
        {
            IsSaving = false;
        }
    }

    /// &amp;lt;summary&amp;gt;
    /// Command to clear all settings
    /// &amp;lt;/summary&amp;gt;
    [RelayCommand]
    private async Task ClearSettings()
    {
        if (_page != null)
        {
            bool confirmed = await _page.DisplayAlert(
                &quot;Clear Settings&quot;,
                &quot;Are you sure you want to clear all settings? This action cannot be undone.&quot;,
                &quot;Clear&quot;,
                &quot;Cancel&quot;);

            if (!confirmed)
                return;
        }

        try
        {
            // Clear from Preferences
            Preferences.Default.Remove(AZURE_LLM_ENDPOINT_KEY);
            Preferences.Default.Remove(AZURE_LLM_API_KEY);
            Preferences.Default.Remove(AZURE_LLM_DEPLOYMENT_KEY);
            Preferences.Default.Remove(SORA_ENDPOINT_KEY);
            Preferences.Default.Remove(SORA_API_KEY);
            Preferences.Default.Remove(SORA_DEPLOYMENT_KEY);

            // Clear from UI
            AzureLlmEndpoint = string.Empty;
            AzureLlmApiKey = string.Empty;
            AzureLlmDeployment = string.Empty;
            SoraEndpoint = string.Empty;
            SoraApiKey = string.Empty;
            SoraDeployment = string.Empty;

            if (_page != null)
            {
                await _page.DisplayAlert(&quot;Settings Cleared&quot;, &quot;All settings have been cleared successfully!&quot;, &quot;OK&quot;);
            }
        }
        catch (Exception ex)
        {
            if (_page != null)
            {
                await _page.DisplayAlert(&quot;Error&quot;, $&quot;Failed to clear settings: {ex.Message}&quot;, &quot;OK&quot;);
            }
        }
    }

    /// &amp;lt;summary&amp;gt;
    /// Command to test Azure LLM connection
    /// &amp;lt;/summary&amp;gt;
    [RelayCommand]
    private async Task TestAzureLlmConnection()
    {
        if (string.IsNullOrWhiteSpace(AzureLlmEndpoint) || 
            string.IsNullOrWhiteSpace(AzureLlmApiKey) || 
            string.IsNullOrWhiteSpace(AzureLlmDeployment))
        {
            if (_page != null)
            {
                await _page.DisplayAlert(&quot;Incomplete Configuration&quot;, 
                    &quot;Please fill in all Azure LLM fields before testing.&quot;, &quot;OK&quot;);
            }
            return;
        }

        // TODO: Implement actual connection test
        if (_page != null)
        {
            await _page.DisplayAlert(&quot;Test Connection&quot;, 
                &quot;Azure LLM connection test functionality will be implemented soon!&quot;, &quot;OK&quot;);
        }
    }

    /// &amp;lt;summary&amp;gt;
    /// Command to test SORA connection
    /// &amp;lt;/summary&amp;gt;
    [RelayCommand]
    private async Task TestSoraConnection()
    {
        if (string.IsNullOrWhiteSpace(SoraEndpoint) || 
            string.IsNullOrWhiteSpace(SoraApiKey) || 
            string.IsNullOrWhiteSpace(SoraDeployment))
        {
            if (_page != null)
            {
                await _page.DisplayAlert(&quot;Incomplete Configuration&quot;, 
                    &quot;Please fill in all SORA fields before testing.&quot;, &quot;OK&quot;);
            }
            return;
        }

        // TODO: Implement actual connection test
        if (_page != null)
        {
            await _page.DisplayAlert(&quot;Test Connection&quot;, 
                &quot;SORA connection test functionality will be implemented soon!&quot;, &quot;OK&quot;);
        }
    }

    /// &amp;lt;summary&amp;gt;
    /// Validates all settings before saving
    /// &amp;lt;/summary&amp;gt;
    private bool ValidateSettings()
    {
        var errors = new List&amp;lt;string&amp;gt;();

        // Validate Azure LLM settings
        if (string.IsNullOrWhiteSpace(AzureLlmEndpoint))
            errors.Add(&quot;Azure LLM Endpoint is required&quot;);
        else if (!Uri.TryCreate(AzureLlmEndpoint, UriKind.Absolute, out _))
            errors.Add(&quot;Azure LLM Endpoint must be a valid URL&quot;);

        if (string.IsNullOrWhiteSpace(AzureLlmApiKey))
            errors.Add(&quot;Azure LLM API Key is required&quot;);

        if (string.IsNullOrWhiteSpace(AzureLlmDeployment))
            errors.Add(&quot;Azure LLM Deployment name is required&quot;);

        // Validate SORA settings
        if (string.IsNullOrWhiteSpace(SoraEndpoint))
            errors.Add(&quot;SORA Endpoint is required&quot;);
        else if (!Uri.TryCreate(SoraEndpoint, UriKind.Absolute, out _))
            errors.Add(&quot;SORA Endpoint must be a valid URL&quot;);

        if (string.IsNullOrWhiteSpace(SoraApiKey))
            errors.Add(&quot;SORA API Key is required&quot;);

        if (string.IsNullOrWhiteSpace(SoraDeployment))
            errors.Add(&quot;SORA Deployment name is required&quot;);

        if (errors.Count &amp;gt; 0 &amp;amp;&amp;amp; _page != null)
        {
            Task.Run(async () =&amp;gt; await _page.DisplayAlert(&quot;Validation Error&quot;, 
                string.Join(&quot;\n&quot;, errors), &quot;OK&quot;));
            return false;
        }

        return true;
    }

    /// &amp;lt;summary&amp;gt;
    /// Checks if all required settings are configured
    /// &amp;lt;/summary&amp;gt;
    public bool AreSettingsComplete =&amp;gt;
        !string.IsNullOrWhiteSpace(AzureLlmEndpoint) &amp;amp;&amp;amp;
        !string.IsNullOrWhiteSpace(AzureLlmApiKey) &amp;amp;&amp;amp;
        !string.IsNullOrWhiteSpace(AzureLlmDeployment) &amp;amp;&amp;amp;
        !string.IsNullOrWhiteSpace(SoraEndpoint) &amp;amp;&amp;amp;
        !string.IsNullOrWhiteSpace(SoraApiKey) &amp;amp;&amp;amp;
        !string.IsNullOrWhiteSpace(SoraDeployment);

    /// &amp;lt;summary&amp;gt;
    /// Checks if Azure LLM settings are complete
    /// &amp;lt;/summary&amp;gt;
    public bool IsAzureLlmConfigComplete =&amp;gt;
        !string.IsNullOrWhiteSpace(AzureLlmEndpoint) &amp;amp;&amp;amp;
        !string.IsNullOrWhiteSpace(AzureLlmApiKey) &amp;amp;&amp;amp;
        !string.IsNullOrWhiteSpace(AzureLlmDeployment);

    /// &amp;lt;summary&amp;gt;
    /// Checks if SORA settings are complete
    /// &amp;lt;/summary&amp;gt;
    public bool IsSoraConfigComplete =&amp;gt;
        !string.IsNullOrWhiteSpace(SoraEndpoint) &amp;amp;&amp;amp;
        !string.IsNullOrWhiteSpace(SoraApiKey) &amp;amp;&amp;amp;
        !string.IsNullOrWhiteSpace(SoraDeployment);
}&lt;/span&gt;
				&lt;/code&gt;
			&lt;/pre&gt;
		&lt;/div&gt;
				&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-5b80836 elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-4af2c6d&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-0a7590a elementor-widget elementor-widget-text-editor&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
							&lt;div&gt;
&lt;div&gt;When using &lt;strong&gt;MVVM Toolkit&lt;/strong&gt;, the task has been greatly simplified. Similarly, you can see that I make use of the &lt;strong&gt;Preferences&lt;/strong&gt; class to store these keys and read them in case they exist previously.&lt;/div&gt;
&lt;br&gt;
&lt;div&gt;The result of this page can be seen below:&lt;/div&gt;
&lt;/div&gt;						&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-a0f9f70 elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-275a2fb&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-1b5a9df elementor-widget elementor-widget-image&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
															&lt;img width=&quot;375&quot; height=&quot;835&quot; class=&quot;attachment-large size-large&quot; alt=&quot;The settings page in action&quot; src=&quot;https://devs.school/wp-content/uploads/2025/07/The-settings-page-in-action.gif&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;															&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-fd2e5c3 elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-3e73865&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-b190928 elementor-widget elementor-widget-heading&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
			&lt;h2 class=&quot;elementor-heading-title elementor-size-default&quot; id=&quot;creating-the-parameters-page-for-video-generation&quot;&gt;Creating the parameters page for video generation&lt;/h2&gt;		&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-bca694f elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-4d9d56d&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-393d061 elementor-widget elementor-widget-text-editor&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
							&lt;div&gt;
&lt;div&gt;The second page created is called AddVideoIdeaPage.xaml. This page is designed for the user to enter their viral video idea to be generated:&lt;/div&gt;
&lt;/div&gt;						&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-62a0836 elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-f29e354&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-87ebdae elementor-widget elementor-widget-image&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
															&lt;img width=&quot;372&quot; height=&quot;379&quot; class=&quot;attachment-large size-large&quot; alt=&quot;The prompt box for users to describe the video they want to create&quot; src=&quot;https://devs.school/wp-content/uploads/2025/07/The-prompt-box-for-users-to-describe-the-video-they-want-to-create.png&quot; srcset=&quot;https://devs.school/wp-content/uploads/2025/07/The-prompt-box-for-users-to-describe-the-video-they-want-to-create.png 372w, https://devs.school/wp-content/uploads/2025/07/The-prompt-box-for-users-to-describe-the-video-they-want-to-create-294x300.png 294w, https://devs.school/wp-content/uploads/2025/07/The-prompt-box-for-users-to-describe-the-video-they-want-to-create-70x70.png 70w, https://devs.school/wp-content/uploads/2025/07/The-prompt-box-for-users-to-describe-the-video-they-want-to-create-16x16.png 16w, https://devs.school/wp-content/uploads/2025/07/The-prompt-box-for-users-to-describe-the-video-they-want-to-create-40x40.png 40w, https://devs.school/wp-content/uploads/2025/07/The-prompt-box-for-users-to-describe-the-video-they-want-to-create-60x60.png 60w, https://devs.school/wp-content/uploads/2025/07/The-prompt-box-for-users-to-describe-the-video-they-want-to-create-18x18.png 18w, https://devs.school/wp-content/uploads/2025/07/The-prompt-box-for-users-to-describe-the-video-they-want-to-create-20x20.png 20w&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;															&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-9fc8e3c elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-6f3898b&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-c9d2c62 elementor-widget elementor-widget-text-editor&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
							&lt;div&gt;
&lt;div&gt;Something that is very common is for users to enter simple prompts that do not describe well what the video generator should produce. To address this issue, I added a checkbox that allows the user to decide whether they want to enhance the prompt using AI, which will invoke the Chat service to improve the entered prompt:&lt;/div&gt;
&lt;/div&gt;						&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-0632a76 elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-a0d62b6&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-b4e80d9 elementor-widget elementor-widget-image&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
															&lt;img width=&quot;345&quot; height=&quot;114&quot; class=&quot;attachment-large size-large&quot; alt=&quot;Checkbox to enable AI-powered prompt enhancement&quot; src=&quot;https://devs.school/wp-content/uploads/2025/07/Checkbox-to-enable-AI-powered-prompt-enhancement.gif&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;															&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-56b300b elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-609642f&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-dde3f4e elementor-widget elementor-widget-text-editor&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
							&lt;div&gt;
&lt;div&gt;Furthermore, it is on this same page where the user can configure the output video, as SORA allows different configuration options for creating videos in horizontal or vertical formats, different resolutions, and even durations of the generated videos:&lt;/div&gt;
&lt;/div&gt;						&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-8872629 elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-5aa0531&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-acaa746 elementor-widget elementor-widget-image&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
															&lt;img width=&quot;376&quot; height=&quot;462&quot; class=&quot;attachment-large size-large&quot; alt=&quot;Settings for the video output generated by SORA&quot; src=&quot;https://devs.school/wp-content/uploads/2025/07/Settings-for-the-video-output-generated-by-SORA.png&quot; srcset=&quot;https://devs.school/wp-content/uploads/2025/07/Settings-for-the-video-output-generated-by-SORA.png 376w, https://devs.school/wp-content/uploads/2025/07/Settings-for-the-video-output-generated-by-SORA-244x300.png 244w&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;															&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-8635858 elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-d5abd18&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-f0e15ef elementor-widget elementor-widget-text-editor&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
							&lt;div&gt;
&lt;div&gt;The code for this page is a bit more complex:&lt;/div&gt;
&lt;/div&gt;						&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-920645c elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-4933af2&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-2f09891 elementor-widget elementor-widget-code-highlight&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
					&lt;div class=&quot;prismjs-default copy-to-clipboard&quot;&gt;
			&lt;pre class=&quot;highlight-height language-xml line-numbers&quot;&gt;
				&lt;code class=&quot;language-xml&quot;&gt;
					&lt;span class=&quot;legacy-code-literal&quot;&gt;&amp;lt;ScrollView&amp;gt;
    &amp;lt;VerticalStackLayout
        Padding=&quot;30,0&quot;
        Spacing=&quot;25&quot;
        VerticalOptions=&quot;Center&quot;&amp;gt;

        &amp;lt;!--  Title  --&amp;gt;
        &amp;lt;Label
            FontAttributes=&quot;Bold&quot;
            FontSize=&quot;24&quot;
            HorizontalOptions=&quot;Center&quot;
            Text=&quot;Share Your Viral Video Idea&quot;
            TextColor=&quot;{AppThemeBinding Light={StaticResource Primary},
                                        Dark={StaticResource White}}&quot; /&amp;gt;

        &amp;lt;!--  Subtitle  --&amp;gt;
        &amp;lt;Label
            FontSize=&quot;16&quot;
            HorizontalOptions=&quot;Center&quot;
            Text=&quot;Describe your creative idea for a viral video&quot;
            TextColor=&quot;{AppThemeBinding Light={StaticResource Gray600},
                                        Dark={StaticResource Gray300}}&quot; /&amp;gt;

        &amp;lt;!--  Text Input Area  --&amp;gt;
        &amp;lt;Border
            Padding=&quot;10&quot;
            BackgroundColor=&quot;{AppThemeBinding Light={StaticResource White},
                                              Dark={StaticResource Gray950}}&quot;
            Stroke=&quot;{AppThemeBinding Light={StaticResource Gray200},
                                     Dark={StaticResource Gray500}}&quot;
            StrokeShape=&quot;RoundRectangle 8&quot;
            StrokeThickness=&quot;1&quot;&amp;gt;

            &amp;lt;Editor
                BackgroundColor=&quot;Transparent&quot;
                FontSize=&quot;16&quot;
                HeightRequest=&quot;200&quot;
                Placeholder=&quot;Tell us about your viral video idea... What makes it special? What's the concept, story, or hook that will capture viewers' attention?&quot;
                PlaceholderColor=&quot;{AppThemeBinding Light={StaticResource Gray400},
                                                   Dark={StaticResource Gray500}}&quot;
                Text=&quot;{Binding VideoIdea}&quot;
                TextColor=&quot;{AppThemeBinding Light={StaticResource Black},
                                            Dark={StaticResource White}}&quot; /&amp;gt;

        &amp;lt;/Border&amp;gt;

        &amp;lt;!--  Character count label  --&amp;gt;
        &amp;lt;Label
            FontSize=&quot;12&quot;
            HorizontalOptions=&quot;End&quot;
            Text=&quot;{Binding CharacterCountText}&quot;
            TextColor=&quot;{AppThemeBinding Light={StaticResource Gray500},
                                        Dark={StaticResource Gray400}}&quot; /&amp;gt;

        &amp;lt;!--  AI Enhancement Option  --&amp;gt;
        &amp;lt;Border
            Margin=&quot;0,10,0,0&quot;
            Padding=&quot;15&quot;
            BackgroundColor=&quot;{AppThemeBinding Light={StaticResource Gray100},
                                              Dark={StaticResource Gray900}}&quot;
            Stroke=&quot;{AppThemeBinding Light={StaticResource Gray200},
                                     Dark={StaticResource Gray500}}&quot;
            StrokeShape=&quot;RoundRectangle 12&quot;
            StrokeThickness=&quot;1&quot;&amp;gt;

            &amp;lt;Grid ColumnDefinitions=&quot;Auto,*,Auto&quot; ColumnSpacing=&quot;12&quot;&amp;gt;

                &amp;lt;!--  AI Enhancement Icon  --&amp;gt;
                &amp;lt;Border
                    Grid.Column=&quot;0&quot;
                    BackgroundColor=&quot;{AppThemeBinding Light={StaticResource Primary},
                                                      Dark={StaticResource Primary}}&quot;
                    HeightRequest=&quot;32&quot;
                    HorizontalOptions=&quot;Center&quot;
                    StrokeShape=&quot;RoundRectangle 8&quot;
                    VerticalOptions=&quot;Center&quot;
                    WidthRequest=&quot;32&quot;&amp;gt;

                    &amp;lt;Label
                        FontSize=&quot;16&quot;
                        HorizontalOptions=&quot;Center&quot;
                        Text=&quot;✨&quot;
                        TextColor=&quot;White&quot;
                        VerticalOptions=&quot;Center&quot; /&amp;gt;
                &amp;lt;/Border&amp;gt;

                &amp;lt;!--  Enhancement Description  --&amp;gt;
                &amp;lt;StackLayout
                    Grid.Column=&quot;1&quot;
                    Spacing=&quot;2&quot;
                    VerticalOptions=&quot;Center&quot;&amp;gt;
                    &amp;lt;Label
                        FontAttributes=&quot;Bold&quot;
                        FontSize=&quot;16&quot;
                        Text=&quot;AI Prompt Enhancement&quot;
                        TextColor=&quot;{AppThemeBinding Light={StaticResource Black},
                                                    Dark={StaticResource White}}&quot; /&amp;gt;

                    &amp;lt;Label
                        FontSize=&quot;13&quot;
                        Text=&quot;Let AI optimize your idea for better viral potential&quot;
                        TextColor=&quot;{AppThemeBinding Light={StaticResource Gray600},
                                                    Dark={StaticResource Gray400}}&quot; /&amp;gt;
                &amp;lt;/StackLayout&amp;gt;

                &amp;lt;!--  Enhancement Toggle  --&amp;gt;
                &amp;lt;Border
                    Grid.Column=&quot;2&quot;
                    BackgroundColor=&quot;{Binding EnhancementToggleBorderColor}&quot;
                    HeightRequest=&quot;30&quot;
                    StrokeShape=&quot;RoundRectangle 20&quot;
                    VerticalOptions=&quot;Center&quot;
                    WidthRequest=&quot;50&quot;&amp;gt;

                    &amp;lt;Border.GestureRecognizers&amp;gt;
                        &amp;lt;TapGestureRecognizer Command=&quot;{Binding ToggleEnhancementCommand}&quot; /&amp;gt;
                    &amp;lt;/Border.GestureRecognizers&amp;gt;

                    &amp;lt;Grid&amp;gt;
                        &amp;lt;!--  Toggle Circle  --&amp;gt;
                        &amp;lt;Border
                            Margin=&quot;2,0&quot;
                            BackgroundColor=&quot;White&quot;
                            HeightRequest=&quot;26&quot;
                            HorizontalOptions=&quot;Start&quot;
                            StrokeShape=&quot;RoundRectangle 14&quot;
                            TranslationX=&quot;{Binding EnhancementToggleTranslationX}&quot;
                            VerticalOptions=&quot;Center&quot;
                            WidthRequest=&quot;26&quot;&amp;gt;

                            &amp;lt;Label
                                FontSize=&quot;12&quot;
                                HorizontalOptions=&quot;Center&quot;
                                Opacity=&quot;{Binding EnhancementToggleOpacity}&quot;
                                Text=&quot;{Binding EnhancementToggleIcon}&quot;
                                VerticalOptions=&quot;Center&quot; /&amp;gt;
                        &amp;lt;/Border&amp;gt;
                    &amp;lt;/Grid&amp;gt;
                &amp;lt;/Border&amp;gt;

            &amp;lt;/Grid&amp;gt;
        &amp;lt;/Border&amp;gt;

        &amp;lt;!--  Video Configuration Section  --&amp;gt;
        &amp;lt;Border
            Margin=&quot;0,20,0,0&quot;
            Padding=&quot;20&quot;
            BackgroundColor=&quot;{AppThemeBinding Light={StaticResource Gray100},
                                              Dark={StaticResource Gray900}}&quot;
            Stroke=&quot;{AppThemeBinding Light={StaticResource Gray200},
                                     Dark={StaticResource Gray500}}&quot;
            StrokeShape=&quot;RoundRectangle 12&quot;
            StrokeThickness=&quot;1&quot;&amp;gt;

            &amp;lt;StackLayout Spacing=&quot;20&quot;&amp;gt;

                &amp;lt;!--  Configuration Header  --&amp;gt;
                &amp;lt;StackLayout Orientation=&quot;Horizontal&quot; Spacing=&quot;10&quot;&amp;gt;
                    &amp;lt;Border
                        BackgroundColor=&quot;{AppThemeBinding Light={StaticResource Primary},
                                                          Dark={StaticResource Primary}}&quot;
                        HeightRequest=&quot;28&quot;
                        StrokeShape=&quot;RoundRectangle 6&quot;
                        VerticalOptions=&quot;Center&quot;
                        WidthRequest=&quot;28&quot;&amp;gt;
                        &amp;lt;Label
                            FontSize=&quot;14&quot;
                            HorizontalOptions=&quot;Center&quot;
                            Text=&quot;🎬&quot;
                            TextColor=&quot;White&quot;
                            VerticalOptions=&quot;Center&quot; /&amp;gt;
                    &amp;lt;/Border&amp;gt;

                    &amp;lt;Label
                        FontAttributes=&quot;Bold&quot;
                        FontSize=&quot;18&quot;
                        Text=&quot;Video Configuration&quot;
                        TextColor=&quot;{AppThemeBinding Light={StaticResource Black},
                                                    Dark={StaticResource White}}&quot;
                        VerticalOptions=&quot;Center&quot; /&amp;gt;
                &amp;lt;/StackLayout&amp;gt;

                &amp;lt;!--  Resolution Selection  --&amp;gt;
                &amp;lt;StackLayout&amp;gt;
                    &amp;lt;Label
                        FontAttributes=&quot;Bold&quot;
                        FontSize=&quot;14&quot;
                        Text=&quot;Resolution&quot;
                        TextColor=&quot;{AppThemeBinding Light={StaticResource Black},
                                                    Dark={StaticResource White}}&quot; /&amp;gt;
                    &amp;lt;Label
                        FontSize=&quot;12&quot;
                        Text=&quot;Select video quality level - higher resolution provides better quality but takes longer to generate&quot;
                        TextColor=&quot;{AppThemeBinding Light={StaticResource Gray600},
                                                    Dark={StaticResource Gray400}}&quot; /&amp;gt;

                    &amp;lt;Border
                        Margin=&quot;0,8,0,0&quot;
                        BackgroundColor=&quot;{AppThemeBinding Light={StaticResource White},
                                                          Dark={StaticResource Gray950}}&quot;
                        Stroke=&quot;{AppThemeBinding Light={StaticResource Gray300},
                                                 Dark={StaticResource Gray600}}&quot;
                        StrokeShape=&quot;RoundRectangle 8&quot;
                        StrokeThickness=&quot;1&quot;&amp;gt;
                        &amp;lt;Picker
                            Title=&quot;Select Resolution&quot;
                            BackgroundColor=&quot;Transparent&quot;
                            FontSize=&quot;16&quot;
                            ItemsSource=&quot;{Binding ResolutionOptions}&quot;
                            SelectedItem=&quot;{Binding SelectedResolution}&quot;
                            TextColor=&quot;{AppThemeBinding Light={StaticResource Black},
                                                        Dark={StaticResource White}}&quot; /&amp;gt;
                    &amp;lt;/Border&amp;gt;
                &amp;lt;/StackLayout&amp;gt;

                &amp;lt;!--  Duration Selection  --&amp;gt;
                &amp;lt;StackLayout&amp;gt;
                    &amp;lt;Label
                        FontAttributes=&quot;Bold&quot;
                        FontSize=&quot;14&quot;
                        Text=&quot;Duration (seconds)&quot;
                        TextColor=&quot;{AppThemeBinding Light={StaticResource Black},
                                                    Dark={StaticResource White}}&quot; /&amp;gt;
                    &amp;lt;Label
                        FontSize=&quot;12&quot;
                        Text=&quot;Longer videos take more time to generate&quot;
                        TextColor=&quot;{AppThemeBinding Light={StaticResource Gray600},
                                                    Dark={StaticResource Gray400}}&quot; /&amp;gt;

                    &amp;lt;Border
                        Margin=&quot;0,8,0,0&quot;
                        BackgroundColor=&quot;{AppThemeBinding Light={StaticResource White},
                                                          Dark={StaticResource Gray950}}&quot;
                        Stroke=&quot;{AppThemeBinding Light={StaticResource Gray300},
                                                 Dark={StaticResource Gray600}}&quot;
                        StrokeShape=&quot;RoundRectangle 8&quot;
                        StrokeThickness=&quot;1&quot;&amp;gt;
                        &amp;lt;Picker
                            Title=&quot;Select Duration&quot;
                            BackgroundColor=&quot;Transparent&quot;
                            FontSize=&quot;16&quot;
                            ItemsSource=&quot;{Binding DurationOptions}&quot;
                            SelectedItem=&quot;{Binding SelectedDuration}&quot;
                            TextColor=&quot;{AppThemeBinding Light={StaticResource Black},
                                                        Dark={StaticResource White}}&quot; /&amp;gt;
                    &amp;lt;/Border&amp;gt;
                &amp;lt;/StackLayout&amp;gt;

                &amp;lt;!--  Orientation Selection  --&amp;gt;
                &amp;lt;StackLayout&amp;gt;
                    &amp;lt;Label
                        FontAttributes=&quot;Bold&quot;
                        FontSize=&quot;14&quot;
                        Text=&quot;Orientation&quot;
                        TextColor=&quot;{AppThemeBinding Light={StaticResource Black},
                                                    Dark={StaticResource White}}&quot; /&amp;gt;
                    &amp;lt;Label
                        FontSize=&quot;12&quot;
                        Text=&quot;Choose aspect ratio: Horizontal (16:9), Vertical (9:16), or Square (1:1)&quot;
                        TextColor=&quot;{AppThemeBinding Light={StaticResource Gray600},
                                                    Dark={StaticResource Gray400}}&quot; /&amp;gt;

                    &amp;lt;Border
                        Margin=&quot;0,8,0,0&quot;
                        BackgroundColor=&quot;{AppThemeBinding Light={StaticResource White},
                                                          Dark={StaticResource Gray950}}&quot;
                        Stroke=&quot;{AppThemeBinding Light={StaticResource Gray300},
                                                 Dark={StaticResource Gray600}}&quot;
                        StrokeShape=&quot;RoundRectangle 8&quot;
                        StrokeThickness=&quot;1&quot;&amp;gt;
                        &amp;lt;Picker
                            Title=&quot;Select Orientation&quot;
                            BackgroundColor=&quot;Transparent&quot;
                            FontSize=&quot;16&quot;
                            ItemsSource=&quot;{Binding OrientationOptions}&quot;
                            SelectedItem=&quot;{Binding SelectedOrientation}&quot;
                            TextColor=&quot;{AppThemeBinding Light={StaticResource Black},
                                                        Dark={StaticResource White}}&quot; /&amp;gt;
                    &amp;lt;/Border&amp;gt;
                &amp;lt;/StackLayout&amp;gt;

            &amp;lt;/StackLayout&amp;gt;
        &amp;lt;/Border&amp;gt;

        &amp;lt;!--  Generate Button  --&amp;gt;
        &amp;lt;Button
            Margin=&quot;0,20,0,0&quot;
            BackgroundColor=&quot;{StaticResource Primary}&quot;
            Command=&quot;{Binding GenerateViralStoryCommand}&quot;
            CornerRadius=&quot;25&quot;
            FontAttributes=&quot;Bold&quot;
            FontSize=&quot;18&quot;
            HeightRequest=&quot;50&quot;
            HorizontalOptions=&quot;Fill&quot;
            IsEnabled=&quot;{Binding CanGenerateStory}&quot;
            Text=&quot;{Binding GenerateButtonText}&quot;
            TextColor=&quot;White&quot; /&amp;gt;

        &amp;lt;!--  Enhanced Loading Indicator  --&amp;gt;
        &amp;lt;StackLayout
            Margin=&quot;0,20,0,0&quot;
            HorizontalOptions=&quot;Center&quot;
            IsVisible=&quot;{Binding IsGenerating}&quot;
            Spacing=&quot;20&quot;
            VerticalOptions=&quot;Center&quot;&amp;gt;

            &amp;lt;ActivityIndicator
                HeightRequest=&quot;50&quot;
                HorizontalOptions=&quot;Center&quot;
                IsRunning=&quot;{Binding IsGenerating}&quot;
                WidthRequest=&quot;50&quot;
                Color=&quot;{StaticResource Primary}&quot; /&amp;gt;

            &amp;lt;StackLayout Spacing=&quot;10&quot;&amp;gt;
                &amp;lt;Label
                    FontAttributes=&quot;Bold&quot;
                    FontSize=&quot;18&quot;
                    HorizontalOptions=&quot;Center&quot;
                    HorizontalTextAlignment=&quot;Center&quot;
                    Text=&quot;🧠 Processing your idea...&quot;
                    TextColor=&quot;{AppThemeBinding Light={StaticResource Primary},
                                                Dark={StaticResource Primary}}&quot; /&amp;gt;

                &amp;lt;Label
                    FontSize=&quot;14&quot;
                    HorizontalOptions=&quot;Center&quot;
                    HorizontalTextAlignment=&quot;Center&quot;
                    LineBreakMode=&quot;WordWrap&quot;
                    Text=&quot;We’re enhancing your idea with AI and generating optimized prompts to create an amazing viral video.&quot;
                    TextColor=&quot;{AppThemeBinding Light={StaticResource Gray600},
                                                Dark={StaticResource Gray400}}&quot; /&amp;gt;

                &amp;lt;Label
                    FontAttributes=&quot;Italic&quot;
                    FontSize=&quot;12&quot;
                    HorizontalOptions=&quot;Center&quot;
                    HorizontalTextAlignment=&quot;Center&quot;
                    Text=&quot;⏱️ This process may take a few moments&quot;
                    TextColor=&quot;{AppThemeBinding Light={StaticResource Gray500},
                                                Dark={StaticResource Gray500}}&quot; /&amp;gt;
            &amp;lt;/StackLayout&amp;gt;

        &amp;lt;/StackLayout&amp;gt;


    &amp;lt;/VerticalStackLayout&amp;gt;
&amp;lt;/ScrollView&amp;gt;&lt;/span&gt;
				&lt;/code&gt;
			&lt;/pre&gt;
		&lt;/div&gt;
				&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-c5cb763 elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-021fe13&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-2f9ae22 elementor-widget elementor-widget-text-editor&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
							&lt;div&gt;
&lt;div&gt;On the other hand, the ViewModel called &lt;strong&gt;AddVideoIdeaViewModel&lt;/strong&gt; looks as follows:&lt;/div&gt;
&lt;/div&gt;						&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-7b9178e elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-932c457&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-4dd3d7f elementor-widget elementor-widget-code-highlight&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
					&lt;div class=&quot;prismjs-default copy-to-clipboard&quot;&gt;
			&lt;pre class=&quot;highlight-height language-csharp line-numbers&quot;&gt;
				&lt;code class=&quot;language-csharp&quot;&gt;
					&lt;span class=&quot;legacy-code-literal&quot;&gt;public partial class AddVideoIdeaViewModel : ObservableObject
{
    private readonly IChatService _chatService;

    [ObservableProperty]
    [NotifyPropertyChangedFor(nameof(CanGenerateStory))]
    private string videoIdea = string.Empty;

    [ObservableProperty]
    private string characterCountText = &quot;0 characters&quot;;

    [ObservableProperty]
    private bool isEnhancementEnabled = false;

    [ObservableProperty]
    private string generateButtonText = &quot;Generate Viral Story&quot;;

    [ObservableProperty]
    private string enhancementToggleIcon = &quot;🤖&quot;;

    [ObservableProperty]
    private double enhancementToggleOpacity = 0.5;

    [ObservableProperty]
    private double enhancementToggleTranslationX = 0.0;

    [ObservableProperty]
    private Color enhancementToggleBorderColor = Colors.Gray;

    [ObservableProperty]
    [NotifyPropertyChangedFor(nameof(CanGenerateStory))]
    private bool isGenerating = false;

    // Video Configuration Properties
    [ObservableProperty]
    private string selectedResolution = &quot;720&quot;;

    [ObservableProperty]
    private string selectedDuration = &quot;10&quot;;

    [ObservableProperty]
    private string selectedOrientation = &quot;Horizontal&quot;;

    // Available options for pickers
    public List&amp;lt;string&amp;gt; ResolutionOptions { get; } = [&quot;480&quot;, &quot;720&quot;, &quot;1080&quot;];
    public List&amp;lt;string&amp;gt; DurationOptions { get; } = [&quot;5&quot;, &quot;10&quot;, &quot;15&quot;, &quot;20&quot;];
    public List&amp;lt;string&amp;gt; OrientationOptions { get; } = [&quot;Horizontal&quot;, &quot;Vertical&quot;, &quot;Square&quot;];

    // Reference to the page for displaying alerts
    private Page? _page;

    public AddVideoIdeaViewModel(IChatService chatService)
    {
        _chatService = chatService;
        CheckChatServiceConfiguration();
    }

    public void SetPage(Page page)
    {
        _page = page;
    }

    /// &amp;lt;summary&amp;gt;
    /// Checks if chat service is configured and updates UI accordingly
    /// &amp;lt;/summary&amp;gt;
    private async void CheckChatServiceConfiguration()
    {
        try
        {
            var isConfigured = await _chatService.IsConfiguredAsync();
            if (!isConfigured)
            {
                // Update UI to indicate that enhancement requires configuration
                EnhancementToggleIcon = &quot;⚙️&quot;;
            }
        }
        catch
        {
            // If checking fails, assume not configured
            EnhancementToggleIcon = &quot;⚙️&quot;;
        }
    }

    /// &amp;lt;summary&amp;gt;
    /// Updates character count when video idea text changes
    /// &amp;lt;/summary&amp;gt;
    partial void OnVideoIdeaChanged(string value)
    {
        var characterCount = string.IsNullOrEmpty(value) ? 0 : value.Length;
        CharacterCountText = $&quot;{characterCount} characters&quot;;
    }

    /// &amp;lt;summary&amp;gt;
    /// Updates UI elements when enhancement toggle state changes
    /// &amp;lt;/summary&amp;gt;
    partial void OnIsEnhancementEnabledChanged(bool value)
    {
        UpdateGenerateButtonText();
        UpdateToggleAppearance();
    }

    /// &amp;lt;summary&amp;gt;
    /// Command to toggle AI enhancement feature
    /// &amp;lt;/summary&amp;gt;
    [RelayCommand]
    private async Task ToggleEnhancement()
    {
        IsEnhancementEnabled = !IsEnhancementEnabled;
        await AnimateToggle();
    }

    /// &amp;lt;summary&amp;gt;
    /// Command to generate viral story from user's idea
    /// &amp;lt;/summary&amp;gt;
    [RelayCommand]
    private async Task GenerateViralStory()
    {
        if (string.IsNullOrWhiteSpace(VideoIdea))
        {
            if (_page != null)
            {
                await _page.DisplayAlert(&quot;Empty Idea&quot;, &quot;Please enter your video idea before generating a viral story.&quot;, &quot;OK&quot;);
            }
            return;
        }

        IsGenerating = true;

        try
        {
            string finalVideoIdea = VideoIdea;

            // Check if enhancement is enabled and service is configured
            if (IsEnhancementEnabled)
            {
                var isConfigured = await _chatService.IsConfiguredAsync();
                if (!isConfigured)
                {
                    if (_page != null)
                    {
                        var result = await _page.DisplayAlert(
                            &quot;Service Not Configured&quot;, 
                            &quot;AI enhancement requires Azure LLM configuration. Would you like to go to Settings to configure it?&quot;, 
                            &quot;Go to Settings&quot;, 
                            &quot;Continue without Enhancement&quot;);
                        
                        if (result)
                        {
                            await Shell.Current.GoToAsync(&quot;//Settings&quot;);
                            return;
                        }
                        else
                        {
                            // Continue without enhancement
                            IsEnhancementEnabled = false;
                            await AnimateToggle();
                        }
                    }
                }
                else
                {
                    // Enhance the idea using Azure LLM
                    try
                    {
                        finalVideoIdea = await _chatService.EnhancePromptAsync(VideoIdea);
                        
                        // No DisplayAlert - keep loading while processing
                        Debug.WriteLine($&quot;[AddVideoIdea] Idea enhanced successfully: {finalVideoIdea}&quot;);
                    }
                    catch (Exception ex)
                    {
                        Debug.WriteLine($&quot;[AddVideoIdea] Enhancement failed: {ex.Message}&quot;);
                        if (_page != null)
                        {
                            await _page.DisplayAlert(&quot;Enhancement Failed&quot;, 
                                $&quot;Failed to enhance the idea: {ex.Message}\n\nContinuing with original idea.&quot;, 
                                &quot;OK&quot;);
                        }
                    }
                }
            }

            // TODO: Store the final video idea and enhancement status for the VideoPromptsPage
            // Pass the data through navigation parameters including video configuration
            var (width, height) = GetVideoDimensions();
            var duration = int.Parse(SelectedDuration);
            
            var navigationParameters = new Dictionary&amp;lt;string, object&amp;gt;
            {
                [&quot;VideoIdea&quot;] = VideoIdea,
                [&quot;EnhancedIdea&quot;] = finalVideoIdea ?? string.Empty,
                [&quot;WasEnhanced&quot;] = (finalVideoIdea != VideoIdea &amp;amp;&amp;amp; !string.IsNullOrEmpty(finalVideoIdea)).ToString(),
                [&quot;VideoWidth&quot;] = width.ToString(),
                [&quot;VideoHeight&quot;] = height.ToString(),
                [&quot;VideoDuration&quot;] = duration.ToString(),
                [&quot;VideoOrientation&quot;] = SelectedOrientation
            };

            // Navigate to VideoPromptsPage after processing
            await Shell.Current.GoToAsync(&quot;//VideoPrompts&quot;, navigationParameters);
        }
        finally
        {
            IsGenerating = false;
        }
    }

    /// &amp;lt;summary&amp;gt;
    /// Updates the generate button text based on enhancement state
    /// &amp;lt;/summary&amp;gt;
    private void UpdateGenerateButtonText()
    {
        GenerateButtonText = IsEnhancementEnabled 
            ? &quot;✨ Enhance &amp;amp; Generate&quot; 
            : &quot;Generate Viral Story&quot;;
    }

    /// &amp;lt;summary&amp;gt;
    /// Updates toggle visual appearance based on current state
    /// &amp;lt;/summary&amp;gt;
    private void UpdateToggleAppearance()
    {
        if (IsEnhancementEnabled)
        {
            EnhancementToggleIcon = &quot;✨&quot;;
            EnhancementToggleOpacity = 1.0;
            EnhancementToggleTranslationX = 20.0;
            EnhancementToggleBorderColor = Color.FromRgb(0x00, 0xFF, 0x33); // Green
        }
        else
        {
            EnhancementToggleIcon = &quot;🤖&quot;;
            EnhancementToggleOpacity = 0.5;
            EnhancementToggleTranslationX = 0.0;
            EnhancementToggleBorderColor = Colors.Gray;
        }
    }

    /// &amp;lt;summary&amp;gt;
    /// Animates the enhancement toggle switch
    /// &amp;lt;/summary&amp;gt;
    private async Task AnimateToggle()
    {
        var animation = new Animation();
        var targetTranslation = IsEnhancementEnabled ? 20.0 : 0.0;
        var startTranslation = IsEnhancementEnabled ? 0.0 : 20.0;

        // Translation animation
        animation.Add(0, 1, new Animation(v =&amp;gt; 
        {
            EnhancementToggleTranslationX = v;
        }, startTranslation, targetTranslation));

        // Color animation
        animation.Add(0, 1, new Animation(v =&amp;gt; 
        {
            if (IsEnhancementEnabled)
            {
                var color = Color.FromRgba(
                    (int)(0x66 + (0x00 - 0x66) * v), // Red component
                    (int)(0x66 + (0xFF - 0x66) * v), // Green component  
                    (int)(0x66 + (0x33 - 0x66) * v), // Blue component
                    255);
                EnhancementToggleBorderColor = color;
            }
            else
            {
                var grayValue = (int)(0x66 + (0xCC - 0x66) * v);
                EnhancementToggleBorderColor = Color.FromRgb(grayValue, grayValue, grayValue);
            }
        }, 0, 1));

        var completionSource = new TaskCompletionSource&amp;lt;bool&amp;gt;();

        if (_page != null)
        {
            animation.Commit(_page, &quot;ToggleAnimation&quot;, 16, 250, 
                Easing.CubicOut, (v, c) =&amp;gt; completionSource.SetResult(true));
        }
        else
        {
            completionSource.SetResult(true);
        }

        await completionSource.Task;
    }

    /// &amp;lt;summary&amp;gt;
    /// Validates if the current idea is ready for generation
    /// &amp;lt;/summary&amp;gt;
    public bool CanGenerateStory =&amp;gt; !string.IsNullOrWhiteSpace(VideoIdea) &amp;amp;&amp;amp; !IsGenerating;

    /// &amp;lt;summary&amp;gt;
    /// Gets video dimensions based on selected resolution and orientation
    /// Using SORA-supported resolution combinations
    /// &amp;lt;/summary&amp;gt;
    /// &amp;lt;returns&amp;gt;Tuple with width and height values&amp;lt;/returns&amp;gt;
    private (int width, int height) GetVideoDimensions()
    {
        // SORA supported resolutions: (480, 480), (854, 480), (720, 720), (1280, 720), (1080, 1080), (1920, 1080)
        return SelectedOrientation switch
        {
            &quot;Horizontal&quot; =&amp;gt; SelectedResolution switch
            {
                &quot;480&quot; =&amp;gt; (854, 480),    // Horizontal 480p
                &quot;720&quot; =&amp;gt; (1280, 720),   // Horizontal 720p (HD)
                &quot;1080&quot; =&amp;gt; (1920, 1080), // Horizontal 1080p (Full HD)
                _ =&amp;gt; (1280, 720)        // Default to 720p horizontal
            },
            &quot;Vertical&quot; =&amp;gt; SelectedResolution switch
            {
                &quot;480&quot; =&amp;gt; (480, 854),    // Vertical 480p
                &quot;720&quot; =&amp;gt; (720, 1280),   // Vertical 720p
                &quot;1080&quot; =&amp;gt; (1080, 1920), // Vertical 1080p
                _ =&amp;gt; (720, 1280)        // Default to 720p vertical
            },
            &quot;Square&quot; =&amp;gt; SelectedResolution switch
            {
                &quot;480&quot; =&amp;gt; (480, 480),    // Square 480p
                &quot;720&quot; =&amp;gt; (720, 720),    // Square 720p
                &quot;1080&quot; =&amp;gt; (1080, 1080), // Square 1080p
                _ =&amp;gt; (720, 720)         // Default to 720p square
            },
            _ =&amp;gt; (1280, 720)            // Default to horizontal 720p
        };
    }
}&lt;/span&gt;
				&lt;/code&gt;
			&lt;/pre&gt;
		&lt;/div&gt;
				&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-df2b98b elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-5dcd959&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-5d22202 elementor-widget elementor-widget-text-editor&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
							&lt;div&gt;
&lt;div&gt;Now, let's talk about the page that allows modifying the enhanced prompt for video generation.&lt;/div&gt;
&lt;/div&gt;						&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-e057ac9 elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-b878131&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-8d80c61 elementor-widget elementor-widget-heading&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
			&lt;h2 class=&quot;elementor-heading-title elementor-size-default&quot; id=&quot;the-final-prompt-settings-page&quot;&gt;The Final Prompt Settings Page&lt;/h2&gt;		&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-0272c21 elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-0ef04cb&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-0f8f60a elementor-widget elementor-widget-text-editor&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
							&lt;div&gt;
&lt;div&gt;Whether the user selected the option to enhance the video or not, they will be redirected to the &lt;strong&gt;VideoPromptsPage.xaml&lt;/strong&gt;. This page contains a series of mini prompts that will be added to the final prompt to create an amazing video. These mini prompts can be modified if desired and are essentially a set of prompts that define certain characteristics for creating viral videos.&lt;/div&gt;
&lt;br&gt;
&lt;div&gt;Similarly, this page is responsible for generating the video, so transitioning from this to the next page may take a little while due to the enormous processing required to generate a video.&lt;/div&gt;
&lt;br&gt;
&lt;div&gt;The page looks as follows:&lt;/div&gt;
&lt;/div&gt;						&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-0c8b1a1 elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-fb2f4e3&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-69f0f8d elementor-widget elementor-widget-image&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
															&lt;img width=&quot;375&quot; height=&quot;835&quot; class=&quot;attachment-large size-large&quot; alt=&quot;Final Prompt Settings Page&quot; src=&quot;https://devs.school/wp-content/uploads/2025/07/Final-Prompt-Settings-Page.gif&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;															&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-c38bdaf elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-b742e90&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-162b221 elementor-widget elementor-widget-text-editor&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
							&lt;div&gt;
&lt;div&gt;The XAML code for this page is relatively simple, and it can be modified to add other features that we may need:&lt;/div&gt;
&lt;/div&gt;						&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-cd544fa elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-2aaf53e&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-783be83 elementor-widget elementor-widget-code-highlight&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
					&lt;div class=&quot;prismjs-default copy-to-clipboard&quot;&gt;
			&lt;pre class=&quot;highlight-height language-xml line-numbers&quot;&gt;
				&lt;code class=&quot;language-xml&quot;&gt;
					&lt;span class=&quot;legacy-code-literal&quot;&gt;&amp;lt;!--  Grid to allow overlay  --&amp;gt;
&amp;lt;Grid&amp;gt;
    &amp;lt;!--  Main Content  --&amp;gt;
    &amp;lt;ScrollView&amp;gt;
        &amp;lt;StackLayout Padding=&quot;20&quot; Spacing=&quot;15&quot;&amp;gt;

            &amp;lt;!--  Header Section  --&amp;gt;
            &amp;lt;Border BackgroundColor=&quot;{AppThemeBinding Light={StaticResource Primary}, Dark={StaticResource PrimaryDark}}&quot; StrokeThickness=&quot;0&quot;&amp;gt;
                &amp;lt;Border.StrokeShape&amp;gt;
                    &amp;lt;RoundRectangle CornerRadius=&quot;12&quot; /&amp;gt;
                &amp;lt;/Border.StrokeShape&amp;gt;
                &amp;lt;StackLayout Padding=&quot;20&quot; Spacing=&quot;10&quot;&amp;gt;
                    &amp;lt;Label
                        FontAttributes=&quot;Bold&quot;
                        FontSize=&quot;24&quot;
                        Text=&quot;Generated Prompts&quot;
                        TextColor=&quot;White&quot; /&amp;gt;
                    &amp;lt;Label
                        FontSize=&quot;16&quot;
                        Opacity=&quot;0.9&quot;
                        Text=&quot;{Binding VideoIdea}&quot;
                        TextColor=&quot;White&quot; /&amp;gt;
                &amp;lt;/StackLayout&amp;gt;
            &amp;lt;/Border&amp;gt;

            &amp;lt;!--  Statistics  --&amp;gt;
            &amp;lt;Grid ColumnDefinitions=&quot;*,*&quot; ColumnSpacing=&quot;10&quot;&amp;gt;
                &amp;lt;Border
                    Grid.Column=&quot;0&quot;
                    BackgroundColor=&quot;{AppThemeBinding Light=#F0F0F0,
                                                        Dark=#2A2A2A}&quot;
                    StrokeThickness=&quot;0&quot;&amp;gt;
                    &amp;lt;Border.StrokeShape&amp;gt;
                        &amp;lt;RoundRectangle CornerRadius=&quot;8&quot; /&amp;gt;
                    &amp;lt;/Border.StrokeShape&amp;gt;
                    &amp;lt;StackLayout Padding=&quot;15&quot; Spacing=&quot;5&quot;&amp;gt;
                        &amp;lt;Label
                            FontAttributes=&quot;Bold&quot;
                            FontSize=&quot;24&quot;
                            HorizontalOptions=&quot;Center&quot;
                            Text=&quot;{Binding TotalPrompts}&quot; /&amp;gt;
                        &amp;lt;Label
                            FontSize=&quot;12&quot;
                            HorizontalOptions=&quot;Center&quot;
                            Opacity=&quot;0.7&quot;
                            Text=&quot;Total Prompts&quot; /&amp;gt;
                    &amp;lt;/StackLayout&amp;gt;
                &amp;lt;/Border&amp;gt;

                &amp;lt;Border
                    Grid.Column=&quot;1&quot;
                    BackgroundColor=&quot;{AppThemeBinding Light=#F0F0F0,
                                                        Dark=#2A2A2A}&quot;
                    StrokeThickness=&quot;0&quot;&amp;gt;
                    &amp;lt;Border.StrokeShape&amp;gt;
                        &amp;lt;RoundRectangle CornerRadius=&quot;8&quot; /&amp;gt;
                    &amp;lt;/Border.StrokeShape&amp;gt;
                    &amp;lt;StackLayout Padding=&quot;15&quot; Spacing=&quot;5&quot;&amp;gt;
                        &amp;lt;Label
                            FontAttributes=&quot;Bold&quot;
                            FontSize=&quot;24&quot;
                            HorizontalOptions=&quot;Center&quot;
                            Text=&quot;{Binding EditedPrompts}&quot;
                            TextColor=&quot;{AppThemeBinding Light={StaticResource Primary},
                                                        Dark={StaticResource PrimaryDark}}&quot; /&amp;gt;
                        &amp;lt;Label
                            FontSize=&quot;12&quot;
                            HorizontalOptions=&quot;Center&quot;
                            Opacity=&quot;0.7&quot;
                            Text=&quot;Edited&quot; /&amp;gt;
                    &amp;lt;/StackLayout&amp;gt;
                &amp;lt;/Border&amp;gt;
            &amp;lt;/Grid&amp;gt;

            &amp;lt;!--  Prompts List  --&amp;gt;
            &amp;lt;CollectionView ItemsSource=&quot;{Binding Prompts}&quot; SelectionMode=&quot;None&quot;&amp;gt;
                &amp;lt;CollectionView.ItemTemplate&amp;gt;
                    &amp;lt;DataTemplate x:DataType=&quot;viewmodels:VideoPrompt&quot;&amp;gt;
                        &amp;lt;Border
                            Margin=&quot;0,5&quot;
                            BackgroundColor=&quot;{AppThemeBinding Light=White,
                                                                Dark=#1A1A1A}&quot;
                            Stroke=&quot;{AppThemeBinding Light=#E0E0E0,
                                                        Dark=#404040}&quot;
                            StrokeThickness=&quot;1&quot;&amp;gt;
                            &amp;lt;Border.StrokeShape&amp;gt;
                                &amp;lt;RoundRectangle CornerRadius=&quot;12&quot; /&amp;gt;
                            &amp;lt;/Border.StrokeShape&amp;gt;
                            &amp;lt;StackLayout Padding=&quot;15&quot; Spacing=&quot;10&quot;&amp;gt;

                                &amp;lt;!--  Header with title and edited indicator  --&amp;gt;
                                &amp;lt;Grid ColumnDefinitions=&quot;*,Auto&quot;&amp;gt;
                                    &amp;lt;Label
                                        Grid.Column=&quot;0&quot;
                                        FontAttributes=&quot;Bold&quot;
                                        FontSize=&quot;18&quot;
                                        Text=&quot;{Binding Title}&quot; /&amp;gt;
                                    &amp;lt;Label
                                        Grid.Column=&quot;1&quot;
                                        FontSize=&quot;12&quot;
                                        IsVisible=&quot;{Binding IsEdited}&quot;
                                        Text=&quot;✏️ Edited&quot;
                                        TextColor=&quot;{AppThemeBinding Light={StaticResource Primary},
                                                                    Dark={StaticResource PrimaryDark}}&quot; /&amp;gt;
                                &amp;lt;/Grid&amp;gt;

                                &amp;lt;!--  Content  --&amp;gt;
                                &amp;lt;Label
                                    FontSize=&quot;16&quot;
                                    LineBreakMode=&quot;WordWrap&quot;
                                    Text=&quot;{Binding Content}&quot; /&amp;gt;

                                &amp;lt;!--  Action Buttons  --&amp;gt;
                                &amp;lt;Grid
                                    Margin=&quot;0,10,0,0&quot;
                                    ColumnDefinitions=&quot;*,*,*&quot;
                                    ColumnSpacing=&quot;10&quot;&amp;gt;
                                    &amp;lt;Button
                                        Grid.Column=&quot;0&quot;
                                        BackgroundColor=&quot;{AppThemeBinding Light={StaticResource Primary},
                                                                            Dark={StaticResource PrimaryDark}}&quot;
                                        Command=&quot;{Binding Source={RelativeSource AncestorType={x:Type viewmodels:VideoPromptsViewModel}}, Path=EditPromptCommand}&quot;
                                        CommandParameter=&quot;{Binding .}&quot;
                                        FontSize=&quot;14&quot;
                                        Text=&quot;Edit&quot;
                                        TextColor=&quot;White&quot; /&amp;gt;

                                    &amp;lt;Button
                                        Grid.Column=&quot;1&quot;
                                        BackgroundColor=&quot;#FF9500&quot;
                                        Command=&quot;{Binding Source={RelativeSource AncestorType={x:Type viewmodels:VideoPromptsViewModel}}, Path=RegeneratePromptCommand}&quot;
                                        CommandParameter=&quot;{Binding .}&quot;
                                        FontSize=&quot;14&quot;
                                        Text=&quot;🔄 Regenerate&quot;
                                        TextColor=&quot;White&quot; /&amp;gt;

                                    &amp;lt;Button
                                        Grid.Column=&quot;2&quot;
                                        BackgroundColor=&quot;#FF3B30&quot;
                                        Command=&quot;{Binding Source={RelativeSource AncestorType={x:Type viewmodels:VideoPromptsViewModel}}, Path=DeletePromptCommand}&quot;
                                        CommandParameter=&quot;{Binding .}&quot;
                                        FontSize=&quot;14&quot;
                                        Text=&quot;🗑️&quot;
                                        TextColor=&quot;White&quot; /&amp;gt;
                                &amp;lt;/Grid&amp;gt;
                            &amp;lt;/StackLayout&amp;gt;
                        &amp;lt;/Border&amp;gt;
                    &amp;lt;/DataTemplate&amp;gt;
                &amp;lt;/CollectionView.ItemTemplate&amp;gt;
            &amp;lt;/CollectionView&amp;gt;

            &amp;lt;!--  Generate Video Button  --&amp;gt;
            &amp;lt;Button
                Margin=&quot;0,20,0,0&quot;
                BackgroundColor=&quot;{AppThemeBinding Light={StaticResource Success},
                                                    Dark={StaticResource Success}}&quot;
                Command=&quot;{Binding GenerateVideoCommand}&quot;
                FontAttributes=&quot;Bold&quot;
                FontSize=&quot;18&quot;
                HeightRequest=&quot;50&quot;
                Text=&quot;🎬 Generate Video&quot;
                TextColor=&quot;White&quot; /&amp;gt;

        &amp;lt;/StackLayout&amp;gt;
    &amp;lt;/ScrollView&amp;gt;

    &amp;lt;!--  FULLSCREEN BLOCKING OVERLAY  --&amp;gt;
    &amp;lt;ContentView
        BackgroundColor=&quot;#80000000&quot;
        InputTransparent=&quot;False&quot;
        IsVisible=&quot;{Binding IsLoading}&quot;&amp;gt;

        &amp;lt;!--  Centered Loading Content  --&amp;gt;
        &amp;lt;StackLayout
            HorizontalOptions=&quot;Center&quot;
            Spacing=&quot;30&quot;
            VerticalOptions=&quot;Center&quot;&amp;gt;

            &amp;lt;!--  Loading Animation  --&amp;gt;
            &amp;lt;ActivityIndicator
                HeightRequest=&quot;80&quot;
                IsRunning=&quot;{Binding IsLoading}&quot;
                WidthRequest=&quot;80&quot;
                Color=&quot;White&quot; /&amp;gt;

            &amp;lt;!--  Loading Card  --&amp;gt;
            &amp;lt;Border
                Padding=&quot;30&quot;
                BackgroundColor=&quot;White&quot;
                HorizontalOptions=&quot;Center&quot;
                StrokeThickness=&quot;0&quot;&amp;gt;
                &amp;lt;Border.StrokeShape&amp;gt;
                    &amp;lt;RoundRectangle CornerRadius=&quot;15&quot; /&amp;gt;
                &amp;lt;/Border.StrokeShape&amp;gt;

                &amp;lt;StackLayout
                    HorizontalOptions=&quot;Center&quot;
                    Spacing=&quot;20&quot;
                    WidthRequest=&quot;300&quot;&amp;gt;

                    &amp;lt;!--  Main Message  --&amp;gt;
                    &amp;lt;Label
                        FontAttributes=&quot;Bold&quot;
                        FontSize=&quot;20&quot;
                        HorizontalOptions=&quot;Center&quot;
                        HorizontalTextAlignment=&quot;Center&quot;
                        Text=&quot;🎬 Generating Video with AI&quot;
                        TextColor=&quot;{StaticResource Primary}&quot; /&amp;gt;

                    &amp;lt;!--  Progress Message  --&amp;gt;
                    &amp;lt;Label
                        FontSize=&quot;16&quot;
                        HorizontalOptions=&quot;Center&quot;
                        HorizontalTextAlignment=&quot;Center&quot;
                        LineBreakMode=&quot;WordWrap&quot;
                        Text=&quot;Your viral video is being created using SORA AI. This process may take several minutes due to the complexity of video generation.&quot;
                        TextColor=&quot;{StaticResource Gray600}&quot; /&amp;gt;

                    &amp;lt;!--  Status Message  --&amp;gt;
                    &amp;lt;Label
                        FontAttributes=&quot;Italic&quot;
                        FontSize=&quot;14&quot;
                        HorizontalOptions=&quot;Center&quot;
                        HorizontalTextAlignment=&quot;Center&quot;
                        Text=&quot;🔄 Processing...&quot;
                        TextColor=&quot;{StaticResource Primary}&quot; /&amp;gt;

                    &amp;lt;!--  Warning Message  --&amp;gt;
                    &amp;lt;Label
                        FontAttributes=&quot;Bold&quot;
                        FontSize=&quot;12&quot;
                        HorizontalOptions=&quot;Center&quot;
                        HorizontalTextAlignment=&quot;Center&quot;
                        Text=&quot;⚠️ Do not close the app during this process&quot;
                        TextColor=&quot;#FF9500&quot; /&amp;gt;

                &amp;lt;/StackLayout&amp;gt;

            &amp;lt;/Border&amp;gt;
        &amp;lt;/StackLayout&amp;gt;
    &amp;lt;/ContentView&amp;gt;

&amp;lt;/Grid&amp;gt;&lt;/span&gt;
				&lt;/code&gt;
			&lt;/pre&gt;
		&lt;/div&gt;
				&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-7db7df9 elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-1923a2b&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-88e6630 elementor-widget elementor-widget-text-editor&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
							&lt;div&gt;
&lt;div&gt;The ViewModel of this page, called &lt;strong&gt;VideoPromptsViewModel&lt;/strong&gt;, looks as follows:&lt;/div&gt;
&lt;/div&gt;						&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-1c81016 elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-1049f97&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-39b4802 elementor-widget elementor-widget-code-highlight&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
					&lt;div class=&quot;prismjs-default copy-to-clipboard&quot;&gt;
			&lt;pre class=&quot;highlight-height language-csharp line-numbers&quot;&gt;
				&lt;code class=&quot;language-csharp&quot;&gt;
					&lt;span class=&quot;legacy-code-literal&quot;&gt;public partial class VideoPromptsViewModel : ObservableObject, IQueryAttributable
{
    private readonly IChatService _chatService;
    private readonly ISoraService _soraService;

    [ObservableProperty]
    private ObservableCollection&amp;lt;VideoPrompt&amp;gt; prompts = new();

    [ObservableProperty]
    private int totalPrompts = 0;

    [ObservableProperty]
    private int editedPrompts = 0;

    [ObservableProperty]
    private string videoIdea = string.Empty;

    [ObservableProperty]
    private bool isLoading = false;

    // Store original and enhanced ideas
    private string _originalIdea = string.Empty;
    private string _enhancedIdea = string.Empty;
    private bool _wasEnhanced = false;

    // Video configuration properties
    private int _videoWidth = 1280;      // Default horizontal 720p
    private int _videoHeight = 720;
    private int _videoDuration = 10;     // Default 10 seconds
    private string _videoOrientation = &quot;Horizontal&quot;;

    public VideoPromptsViewModel(IChatService chatService, ISoraService soraService)
    {
        _chatService = chatService;
        _soraService = soraService;
        // Don't load sample data by default anymore
    }

    // IQueryAttributable implementation
    public void ApplyQueryAttributes(IDictionary&amp;lt;string, object&amp;gt; query)
    {
        if (query.ContainsKey(&quot;VideoIdea&quot;))
        {
            _originalIdea = query[&quot;VideoIdea&quot;].ToString() ?? &quot;&quot;;
        }

        if (query.ContainsKey(&quot;EnhancedIdea&quot;))
        {
            _enhancedIdea = query[&quot;EnhancedIdea&quot;].ToString() ?? &quot;&quot;;
            _wasEnhanced = !string.IsNullOrEmpty(_enhancedIdea);
        }

        if (query.ContainsKey(&quot;WasEnhanced&quot;))
        {
            _wasEnhanced = bool.Parse(query[&quot;WasEnhanced&quot;].ToString() ?? &quot;false&quot;);
        }

        // Get video configuration parameters
        if (query.ContainsKey(&quot;VideoWidth&quot;))
        {
            int.TryParse(query[&quot;VideoWidth&quot;].ToString(), out _videoWidth);
        }

        if (query.ContainsKey(&quot;VideoHeight&quot;))
        {
            int.TryParse(query[&quot;VideoHeight&quot;].ToString(), out _videoHeight);
        }

        if (query.ContainsKey(&quot;VideoDuration&quot;))
        {
            int.TryParse(query[&quot;VideoDuration&quot;].ToString(), out _videoDuration);
        }

        if (query.ContainsKey(&quot;VideoOrientation&quot;))
        {
            _videoOrientation = query[&quot;VideoOrientation&quot;].ToString() ?? &quot;Horizontal&quot;;
        }

        // Set the display idea (enhanced if available, otherwise original)
        VideoIdea = _wasEnhanced &amp;amp;&amp;amp; !string.IsNullOrEmpty(_enhancedIdea) ? _enhancedIdea : _originalIdea;

        // Generate prompts based on the video idea
        _ = GeneratePromptsFromAI();
    }

    private async Task GeneratePromptsFromAI()
    {
        if (string.IsNullOrWhiteSpace(VideoIdea))
        {
            LoadSampleData(); // Fallback to sample data
            return;
        }

        IsLoading = true;
        Prompts.Clear();

        try
        {
            var isConfigured = await _chatService.IsConfiguredAsync();
            if (!isConfigured)
            {
                LoadSampleData(); // Fallback to sample data
                return;
            }

            // Generate prompts using AI
            var generatedPrompts = await _chatService.GenerateVideoPromptsAsync(VideoIdea, _wasEnhanced);
            
            int promptId = 1;
            foreach (var prompt in generatedPrompts)
            {
                Prompts.Add(new VideoPrompt
                {
                    Id = promptId++,
                    Title = prompt.Title,
                    Content = prompt.Content,
                    IsEdited = false
                });
            }

            UpdateStatistics();
        }
        catch (Exception)
        {
            // If AI generation fails, fall back to sample data
            LoadSampleData();
        }
        finally
        {
            IsLoading = false;
        }
    }

    private void LoadSampleData()
    {
        VideoIdea = &quot;Dancing cat compilation with trending music&quot;;
        
        Prompts.Add(new VideoPrompt
        {
            Id = 1,
            Title = &quot;Opening Hook&quot;,
            Content = &quot;Start with the most energetic cat dance move synchronized to the beat drop&quot;,
            IsEdited = false
        });

        Prompts.Add(new VideoPrompt
        {
            Id = 2,
            Title = &quot;Main Content&quot;,
            Content = &quot;Sequence of 5-7 different cats dancing to trending audio, each for 3-4 seconds&quot;,
            IsEdited = false
        });

        Prompts.Add(new VideoPrompt
        {
            Id = 3,
            Title = &quot;Engagement Boost&quot;,
            Content = &quot;Add text overlay: 'Which cat has the best moves? 👇 Comment below!'&quot;,
            IsEdited = false
        });

        Prompts.Add(new VideoPrompt
        {
            Id = 4,
            Title = &quot;Call to Action&quot;,
            Content = &quot;End with 'Follow for more dancing pets!' with heart and dancing emojis&quot;,
            IsEdited = false
        });

        UpdateStatistics();
    }

    [RelayCommand]
    private async Task EditPrompt(VideoPrompt prompt)
    {
        try
        {
            var page = GetCurrentPage();
            if (page == null) return;

            var result = await page.DisplayPromptAsync(
                &quot;Edit Prompt&quot;, 
                $&quot;Edit the {prompt.Title}:&quot;, 
                &quot;Save&quot;, 
                &quot;Cancel&quot;, 
                placeholder: prompt.Content, 
                initialValue: prompt.Content);

            if (!string.IsNullOrEmpty(result) &amp;amp;&amp;amp; result != prompt.Content)
            {
                if (!prompt.IsEdited)
                {
                    prompt.IsEdited = true;
                    EditedPrompts++;
                }
                prompt.Content = result;
            }
        }
        catch
        {
            // Handle any navigation errors silently
        }
    }

    [RelayCommand]
    private void DeletePrompt(VideoPrompt prompt)
    {
        if (prompt.IsEdited)
        {
            EditedPrompts--;
        }
        Prompts.Remove(prompt);
        UpdateStatistics();
    }

    [RelayCommand]
    private async Task RegeneratePrompt(VideoPrompt prompt)
    {
        // Simulate regeneration
        await Task.Delay(1000);
        
        var regeneratedContent = prompt.Title switch
        {
            &quot;Opening Hook&quot; =&amp;gt; &quot;Begin with an unexpected cat appearing from behind furniture, dancing immediately&quot;,
            &quot;Main Content&quot; =&amp;gt; &quot;Create a montage of cats from different breeds, each showcasing unique dance styles&quot;,
            &quot;Engagement Boost&quot; =&amp;gt; &quot;Add interactive text: 'Tap ❤️ if your cat can dance too!'&quot;,
            &quot;Call to Action&quot; =&amp;gt; &quot;Conclude with 'Tag a friend who loves dancing cats!' with music note emojis&quot;,
            _ =&amp;gt; &quot;Regenerated prompt content&quot;
        };

        if (!prompt.IsEdited)
        {
            prompt.IsEdited = true;
            EditedPrompts++;
        }
        prompt.Content = regeneratedContent;
    }

    [RelayCommand]
    private async Task GenerateVideo()
    {
        try
        {
            Debug.WriteLine(&quot;[VideoPrompts] GenerateVideo started&quot;);
            var page = GetCurrentPage();
            
            // Check if SORA service is configured
            var isConfigured = await _soraService.IsConfiguredAsync();
            Debug.WriteLine($&quot;[VideoPrompts] SORA configured: {isConfigured}&quot;);
            
            if (!isConfigured)
            {
                Debug.WriteLine(&quot;[VideoPrompts] SORA not configured, showing alert&quot;);
                if (page != null)
                {
                    await page.DisplayAlert(&quot;Configuration Required&quot;, 
                        &quot;Please configure your SORA credentials in the settings page.&quot;, 
                        &quot;OK&quot;);
                }
                return;
            }

            // Activate loading UI (blocks all interaction)
            IsLoading = true;
            Debug.WriteLine(&quot;[VideoPrompts] Loading UI activated - blocking all interaction&quot;);

            // Generate the combined prompt from all prompts
            var combinedPrompt = string.Join(&quot;. &quot;, Prompts.Select(p =&amp;gt; p.Content));
            if (string.IsNullOrWhiteSpace(combinedPrompt))
            {
                combinedPrompt = VideoIdea; // Fallback to original idea
            }

            Debug.WriteLine($&quot;[VideoPrompts] Combined prompt: {combinedPrompt}&quot;);
            Debug.WriteLine($&quot;[VideoPrompts] Video configuration: {_videoWidth}x{_videoHeight}, {_videoDuration}s, {_videoOrientation}&quot;);
            Debug.WriteLine(&quot;[VideoPrompts] Starting SORA video generation...&quot;);

            // Generate video using SORA service with custom configuration
            var videoFilePath = await _soraService.GenerateVideoAsync(combinedPrompt, _videoWidth, _videoHeight, _videoDuration);
            
            Debug.WriteLine($&quot;[VideoPrompts] ✅ Video generated successfully: {videoFilePath}&quot;);
            Debug.WriteLine($&quot;[VideoPrompts] File exists: {File.Exists(videoFilePath)}&quot;);
            Debug.WriteLine($&quot;[VideoPrompts] File size: {new FileInfo(videoFilePath).Length / 1024 / 1024:F2} MB&quot;);

            // Prepare navigation parameters
            var navigationParams = new Dictionary&amp;lt;string, object&amp;gt;
            {
                [&quot;VideoTitle&quot;] = VideoIdea,
                [&quot;VideoSource&quot;] = videoFilePath,
                [&quot;OriginalPrompt&quot;] = _originalIdea,
                [&quot;EnhancedPrompt&quot;] = _wasEnhanced ? _enhancedIdea : &quot;&quot;,
                [&quot;EnglishContent&quot;] = combinedPrompt,
                [&quot;HasEnhancedPrompt&quot;] = _wasEnhanced.ToString()
            };

            Debug.WriteLine(&quot;[VideoPrompts] Navigation parameters:&quot;);
            foreach (var kvp in navigationParams)
            {
                Debug.WriteLine($&quot;[VideoPrompts]   {kvp.Key}: {kvp.Value}&quot;);
            }

            // Navigate to video display page with real video
            Debug.WriteLine(&quot;[VideoPrompts] Navigating to VideoDisplay page...&quot;);
            await Shell.Current.GoToAsync(&quot;VideoDisplay&quot;, navigationParams);

            // Show success message
            if (page != null)
            {
                Debug.WriteLine(&quot;[VideoPrompts] Showing success message&quot;);
                await page.DisplayAlert(&quot;Video Generated!&quot;, 
                    $&quot;Your viral video has been created successfully.\n\nFile: {Path.GetFileName(videoFilePath)}&quot;, 
                    &quot;Watch Video&quot;);
            }
            
            Debug.WriteLine(&quot;[VideoPrompts] GenerateVideo completed successfully&quot;);
        }
        catch (InvalidOperationException ex)
        {
            Debug.WriteLine($&quot;[VideoPrompts] Configuration error: {ex.Message}&quot;);
            var page = GetCurrentPage();
            if (page != null)
            {
                await page.DisplayAlert(&quot;Configuration Error&quot;, ex.Message, &quot;OK&quot;);
            }
        }
        catch (TimeoutException)
        {
            Debug.WriteLine(&quot;[VideoPrompts] Timeout error&quot;);
            var page = GetCurrentPage();
            if (page != null)
            {
                await page.DisplayAlert(&quot;Timeout&quot;, 
                    &quot;Video generation took too long. Please try again.&quot;, 
                    &quot;OK&quot;);
            }
        }
        catch (HttpRequestException ex)
        {
            Debug.WriteLine($&quot;[VideoPrompts] HTTP error: {ex.Message}&quot;);
            var page = GetCurrentPage();
            if (page != null)
            {
                await page.DisplayAlert(&quot;Connection Error&quot;, 
                    $&quot;Failed to connect to the SORA service: {ex.Message}&quot;, 
                    &quot;OK&quot;);
            }
        }
        catch (Exception ex)
        {
            Debug.WriteLine($&quot;[VideoPrompts] Unexpected error: {ex.Message}&quot;);
            Debug.WriteLine($&quot;[VideoPrompts] Exception type: {ex.GetType().Name}&quot;);
            Debug.WriteLine($&quot;[VideoPrompts] Stack trace: {ex.StackTrace}&quot;);
            var page = GetCurrentPage();
            if (page != null)
            {
                await page.DisplayAlert(&quot;Error&quot;, $&quot;An error occurred while generating the video: {ex.Message}&quot;, &quot;OK&quot;);
            }
        }
        finally
        {
            // Always deactivate loading UI regardless of success or failure
            IsLoading = false;
            Debug.WriteLine(&quot;[VideoPrompts] Loading UI deactivated - interaction restored&quot;);
        }
    }


    private Page? GetCurrentPage()
    {
        try
        {
            return Application.Current?.Windows?.FirstOrDefault()?.Page;
        }
        catch
        {
            return null;
        }
    }

    private void UpdateStatistics()
    {
        TotalPrompts = Prompts.Count;
        EditedPrompts = Prompts.Count(p =&amp;gt; p.IsEdited);
    }
}

public partial class VideoPrompt : ObservableObject
{
    [ObservableProperty]
    private int id;

    [ObservableProperty]
    private string title = string.Empty;

    [ObservableProperty]
    private string content = string.Empty;

    [ObservableProperty]
    private bool isEdited;
}&lt;/span&gt;
				&lt;/code&gt;
			&lt;/pre&gt;
		&lt;/div&gt;
				&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-5295765 elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-c0f4f7a&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-f44d007 elementor-widget elementor-widget-heading&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
			&lt;h2 class=&quot;elementor-heading-title elementor-size-default&quot; id=&quot;page-with-the-result-of-the-final-video-generation&quot;&gt;Page with the Result of the Final Video Generation&lt;/h2&gt;		&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-3c184af elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-966b179&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-03fd78f elementor-widget elementor-widget-text-editor&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
							&lt;div&gt;
&lt;div&gt;The last page of the application is the one that displays the generated video called `VideoDisplayPage.xaml`. This page utilizes the sleek and enhanced &lt;a href=&quot;https://learn.microsoft.com/en-us/dotnet/communitytoolkit/maui/views/mediaelement?tabs=android&quot;&gt;MediaElement&lt;/a&gt;, which is a super cross-platform control that allows for very simple multimedia element display developed by the .NET community. Similarly, within this page, I have left some elements as placeholders, which would allow for video regeneration, sharing the video on social media, or downloading the video, that you can adapt according to your needs.&lt;/div&gt;
&lt;/div&gt;						&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-7a20dc0 elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-0d2ee5e&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-90e5e74 elementor-widget elementor-widget-image&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
															&lt;img width=&quot;376&quot; height=&quot;762&quot; class=&quot;attachment-large size-large&quot; alt=&quot;The video viewer page for videos generated by the SORA model&quot; src=&quot;https://devs.school/wp-content/uploads/2025/07/The-video-viewer-page-for-videos-generated-by-the-SORA-model.png&quot; srcset=&quot;https://devs.school/wp-content/uploads/2025/07/The-video-viewer-page-for-videos-generated-by-the-SORA-model.png 376w, https://devs.school/wp-content/uploads/2025/07/The-video-viewer-page-for-videos-generated-by-the-SORA-model-148x300.png 148w&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;															&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-78f8b96 elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-c8c79d2&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-150640f elementor-widget elementor-widget-text-editor&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
							&lt;div&gt;
&lt;div&gt;The code for this page is as follows:&lt;/div&gt;
&lt;/div&gt;						&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-87ace28 elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-141ea9c&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-aa84f2a elementor-widget elementor-widget-code-highlight&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
					&lt;div class=&quot;prismjs-default copy-to-clipboard&quot;&gt;
			&lt;pre class=&quot;highlight-height language-xml line-numbers&quot;&gt;
				&lt;code class=&quot;language-xml&quot;&gt;
					&lt;span class=&quot;legacy-code-literal&quot;&gt;&amp;lt;ScrollView&amp;gt;
    &amp;lt;VerticalStackLayout Padding=&quot;20&quot; Spacing=&quot;15&quot;&amp;gt;

        &amp;lt;!--  Loading Indicator  --&amp;gt;
        &amp;lt;VerticalStackLayout
            Padding=&quot;30&quot;
            HorizontalOptions=&quot;Center&quot;
            IsVisible=&quot;{Binding IsLoading}&quot;
            Spacing=&quot;20&quot;
            VerticalOptions=&quot;Center&quot;&amp;gt;

            &amp;lt;ActivityIndicator
                HeightRequest=&quot;50&quot;
                HorizontalOptions=&quot;Center&quot;
                IsRunning=&quot;{Binding IsLoading}&quot;
                WidthRequest=&quot;50&quot;
                Color=&quot;{StaticResource Primary}&quot; /&amp;gt;

            &amp;lt;Label
                FontAttributes=&quot;Bold&quot;
                FontSize=&quot;18&quot;
                HorizontalOptions=&quot;Center&quot;
                Text=&quot;Loading your generated video...&quot;
                TextColor=&quot;{AppThemeBinding Light={StaticResource Primary},
                                            Dark={StaticResource Primary}}&quot; /&amp;gt;

            &amp;lt;Label
                FontSize=&quot;14&quot;
                HorizontalOptions=&quot;Center&quot;
                Text=&quot;Please wait while we prepare your video for playback&quot;
                TextColor=&quot;{AppThemeBinding Light={StaticResource Gray600},
                                            Dark={StaticResource Gray400}}&quot; /&amp;gt;

        &amp;lt;/VerticalStackLayout&amp;gt;

        &amp;lt;!--  Main Content (hidden while loading)  --&amp;gt;
        &amp;lt;VerticalStackLayout IsVisible=&quot;{Binding IsLoading, Converter={StaticResource InvertedBoolConverter}}&quot; Spacing=&quot;15&quot;&amp;gt;

            &amp;lt;!--  Video Title  --&amp;gt;
            &amp;lt;Label
                FontAttributes=&quot;Bold&quot;
                FontSize=&quot;18&quot;
                HorizontalOptions=&quot;Center&quot;
                Text=&quot;{Binding VideoTitle}&quot;
                TextColor=&quot;White&quot; /&amp;gt;

            &amp;lt;!--  MediaElement for video playback  --&amp;gt;
            &amp;lt;Border
                Padding=&quot;5&quot;
                BackgroundColor=&quot;Black&quot;
                Stroke=&quot;Gray&quot;
                StrokeThickness=&quot;2&quot;&amp;gt;
                &amp;lt;Border.StrokeShape&amp;gt;
                    &amp;lt;RoundRectangle CornerRadius=&quot;10&quot; /&amp;gt;
                &amp;lt;/Border.StrokeShape&amp;gt;

                &amp;lt;toolkit:MediaElement
                    x:Name=&quot;VideoPlayer&quot;
                    Aspect=&quot;AspectFit&quot;
                    BackgroundColor=&quot;Black&quot;
                    HeightRequest=&quot;300&quot;
                    ShouldAutoPlay=&quot;False&quot;
                    ShouldLoopPlayback=&quot;False&quot;
                    ShouldShowPlaybackControls=&quot;True&quot;
                    Source=&quot;{Binding VideoSource}&quot; /&amp;gt;
            &amp;lt;/Border&amp;gt;

            &amp;lt;!--  Video Controls  --&amp;gt;
            &amp;lt;HorizontalStackLayout HorizontalOptions=&quot;Center&quot; Spacing=&quot;20&quot;&amp;gt;
                &amp;lt;Button
                    BackgroundColor=&quot;#1E90FF&quot;
                    Command=&quot;{Binding PlayCommand}&quot;
                    Text=&quot;Play&quot;
                    TextColor=&quot;White&quot;
                    WidthRequest=&quot;80&quot; /&amp;gt;
                &amp;lt;Button
                    BackgroundColor=&quot;#FF4500&quot;
                    Command=&quot;{Binding PauseCommand}&quot;
                    Text=&quot;Pause&quot;
                    TextColor=&quot;White&quot;
                    WidthRequest=&quot;80&quot; /&amp;gt;
                &amp;lt;Button
                    BackgroundColor=&quot;#DC143C&quot;
                    Command=&quot;{Binding StopCommand}&quot;
                    Text=&quot;Stop&quot;
                    TextColor=&quot;White&quot;
                    WidthRequest=&quot;80&quot; /&amp;gt;
            &amp;lt;/HorizontalStackLayout&amp;gt;

            &amp;lt;!--  Video Information  --&amp;gt;
            &amp;lt;Border
                Padding=&quot;15&quot;
                BackgroundColor=&quot;#2C2C2C&quot;
                Stroke=&quot;Gray&quot;
                StrokeShape=&quot;RoundRectangle 10&quot;&amp;gt;
                &amp;lt;VerticalStackLayout Spacing=&quot;10&quot;&amp;gt;
                    &amp;lt;Label
                        FontAttributes=&quot;Bold&quot;
                        FontSize=&quot;16&quot;
                        Text=&quot;Video Information&quot;
                        TextColor=&quot;White&quot; /&amp;gt;

                    &amp;lt;Label
                        FontSize=&quot;14&quot;
                        LineBreakMode=&quot;WordWrap&quot;
                        Text=&quot;{Binding VideoDescription}&quot;
                        TextColor=&quot;LightGray&quot; /&amp;gt;

                    &amp;lt;Label
                        FontSize=&quot;12&quot;
                        Text=&quot;{Binding VideoDuration, StringFormat='Duration: {0}'}&quot;
                        TextColor=&quot;LightGray&quot; /&amp;gt;

                    &amp;lt;Label
                        FontSize=&quot;12&quot;
                        Text=&quot;{Binding VideoStatus, StringFormat='Status: {0}'}&quot;
                        TextColor=&quot;LightGray&quot; /&amp;gt;
                &amp;lt;/VerticalStackLayout&amp;gt;
            &amp;lt;/Border&amp;gt;

            &amp;lt;!--  Original Prompt Section  --&amp;gt;
            &amp;lt;Border
                Padding=&quot;15&quot;
                BackgroundColor=&quot;#2C2C2C&quot;
                Stroke=&quot;Gray&quot;
                StrokeShape=&quot;RoundRectangle 10&quot;&amp;gt;
                &amp;lt;VerticalStackLayout Spacing=&quot;10&quot;&amp;gt;
                    &amp;lt;Label
                        FontAttributes=&quot;Bold&quot;
                        FontSize=&quot;16&quot;
                        Text=&quot;Original Prompt&quot;
                        TextColor=&quot;White&quot; /&amp;gt;

                    &amp;lt;Label
                        FontSize=&quot;14&quot;
                        LineBreakMode=&quot;WordWrap&quot;
                        Text=&quot;{Binding OriginalPrompt}&quot;
                        TextColor=&quot;LightGray&quot; /&amp;gt;
                &amp;lt;/VerticalStackLayout&amp;gt;
            &amp;lt;/Border&amp;gt;

            &amp;lt;!--  Enhanced Prompt Section (if available)  --&amp;gt;
            &amp;lt;Border
                Padding=&quot;15&quot;
                BackgroundColor=&quot;#2C2C2C&quot;
                IsVisible=&quot;{Binding HasEnhancedPrompt}&quot;
                Stroke=&quot;Gray&quot;
                StrokeShape=&quot;RoundRectangle 10&quot;&amp;gt;
                &amp;lt;VerticalStackLayout Spacing=&quot;10&quot;&amp;gt;
                    &amp;lt;Label
                        FontAttributes=&quot;Bold&quot;
                        FontSize=&quot;16&quot;
                        Text=&quot;AI Enhanced Prompt&quot;
                        TextColor=&quot;White&quot; /&amp;gt;

                    &amp;lt;Label
                        FontSize=&quot;14&quot;
                        LineBreakMode=&quot;WordWrap&quot;
                        Text=&quot;{Binding EnhancedPrompt}&quot;
                        TextColor=&quot;LightGray&quot; /&amp;gt;
                &amp;lt;/VerticalStackLayout&amp;gt;
            &amp;lt;/Border&amp;gt;

            &amp;lt;!--  English Content Section  --&amp;gt;
            &amp;lt;Border
                Padding=&quot;15&quot;
                BackgroundColor=&quot;#2C2C2C&quot;
                Stroke=&quot;Gray&quot;
                StrokeShape=&quot;RoundRectangle 10&quot;&amp;gt;
                &amp;lt;VerticalStackLayout Spacing=&quot;10&quot;&amp;gt;
                    &amp;lt;Label
                        FontAttributes=&quot;Bold&quot;
                        FontSize=&quot;16&quot;
                        Text=&quot;English Content&quot;
                        TextColor=&quot;White&quot; /&amp;gt;

                    &amp;lt;Label
                        FontSize=&quot;14&quot;
                        LineBreakMode=&quot;WordWrap&quot;
                        Text=&quot;{Binding EnglishContent}&quot;
                        TextColor=&quot;LightGray&quot; /&amp;gt;
                &amp;lt;/VerticalStackLayout&amp;gt;
            &amp;lt;/Border&amp;gt;

            &amp;lt;!--  Action Buttons  --&amp;gt;
            &amp;lt;HorizontalStackLayout HorizontalOptions=&quot;Center&quot; Spacing=&quot;15&quot;&amp;gt;
                &amp;lt;Button
                    BackgroundColor=&quot;#32CD32&quot;
                    Command=&quot;{Binding ShareVideoCommand}&quot;
                    Text=&quot;Share Video&quot;
                    TextColor=&quot;White&quot;
                    WidthRequest=&quot;120&quot; /&amp;gt;
                &amp;lt;Button
                    BackgroundColor=&quot;#4169E1&quot;
                    Command=&quot;{Binding DownloadCommand}&quot;
                    Text=&quot;Download&quot;
                    TextColor=&quot;White&quot;
                    WidthRequest=&quot;120&quot; /&amp;gt;
                &amp;lt;Button
                    BackgroundColor=&quot;#696969&quot;
                    Command=&quot;{Binding BackCommand}&quot;
                    Text=&quot;Back&quot;
                    TextColor=&quot;White&quot;
                    WidthRequest=&quot;120&quot; /&amp;gt;
            &amp;lt;/HorizontalStackLayout&amp;gt;

        &amp;lt;/VerticalStackLayout&amp;gt;
        &amp;lt;!--  Closing main content StackLayout  --&amp;gt;

    &amp;lt;/VerticalStackLayout&amp;gt;
&amp;lt;/ScrollView&amp;gt;&lt;/span&gt;
				&lt;/code&gt;
			&lt;/pre&gt;
		&lt;/div&gt;
				&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-bf4ecec elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-ed93e4e&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-b84afb8 elementor-widget elementor-widget-text-editor&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
							&lt;div&gt;
&lt;div&gt;The code for the ViewModel is as follows:&lt;/div&gt;
&lt;/div&gt;						&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-942adcb elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-64ca1f3&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-b7b32e6 elementor-widget elementor-widget-code-highlight&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
					&lt;div class=&quot;prismjs-default copy-to-clipboard&quot;&gt;
			&lt;pre class=&quot;highlight-height language-csharp line-numbers&quot;&gt;
				&lt;code class=&quot;language-csharp&quot;&gt;
					&lt;span class=&quot;legacy-code-literal&quot;&gt;public partial class VideoDisplayViewModel : ObservableObject, IQueryAttributable
{
    private MediaElement? _mediaElement;

    [ObservableProperty]
    private string videoTitle = &quot;Generated Viral Video&quot;;

    [ObservableProperty]
    private string videoSource = &quot;&quot;;

    [ObservableProperty]
    private string videoDescription = &quot;AI-generated viral video content&quot;;

    [ObservableProperty]
    private string videoDuration = &quot;Loading...&quot;;

    [ObservableProperty]
    private string videoStatus = &quot;Ready&quot;;

    [ObservableProperty]
    private string originalPrompt = &quot;&quot;;

    [ObservableProperty]
    private string enhancedPrompt = &quot;&quot;;

    [ObservableProperty]
    private string englishContent = &quot;&quot;;

    [ObservableProperty]
    private bool hasEnhancedPrompt = false;

    [ObservableProperty]
    private bool isLoading = true;

    public VideoDisplayViewModel()
    {
        // Sample data for demonstration
        VideoTitle = &quot;AI Generated Viral Video&quot;;
        VideoDescription = &quot;This video was generated using AI based on your creative prompt and enhanced with advanced algorithms.&quot;;
        OriginalPrompt = &quot;A cat playing with a ball of yarn&quot;;
        EnhancedPrompt = &quot;A playful orange tabby cat with bright green eyes gracefully pouncing and rolling around with a large, fluffy ball of rainbow-colored yarn in a cozy, sunlit living room with wooden floors and comfortable furniture.&quot;;
        EnglishContent = &quot;Watch as this adorable cat brings joy and entertainment through its playful interaction with colorful yarn. Perfect for social media sharing and guaranteed to make viewers smile!&quot;;
        HasEnhancedPrompt = !string.IsNullOrEmpty(EnhancedPrompt);
        
        // For demo purposes, you can use a sample video URL or local file
        // VideoSource = &quot;https://sample-videos.com/zip/10/mp4/SampleVideo_1280x720_1mb.mp4&quot;;
    }

    public void SetMediaElement(MediaElement mediaElement)
    {
        _mediaElement = mediaElement;
        
        // Subscribe to MediaElement events
        if (_mediaElement != null)
        {
            _mediaElement.MediaOpened += OnMediaOpened;
            _mediaElement.MediaEnded += OnMediaEnded;
            _mediaElement.MediaFailed += OnMediaFailed;
        }
    }

    private void OnMediaOpened(object? sender, EventArgs e)
    {
        if (_mediaElement != null)
        {
            VideoDuration = _mediaElement.Duration.ToString(@&quot;mm\:ss&quot;);
            VideoStatus = &quot;Ready to play&quot;;
            IsLoading = false; // Stop loading when media is ready
        }
    }

    private void OnMediaEnded(object? sender, EventArgs e)
    {
        VideoStatus = &quot;Playback completed&quot;;
    }

    private void OnMediaFailed(object? sender, EventArgs e)
    {
        VideoStatus = &quot;Error loading video&quot;;
        IsLoading = false; // Stop loading on error
    }

    [RelayCommand]
    private void Play()
    {
        try
        {
            _mediaElement?.Play();
            VideoStatus = &quot;Playing&quot;;
        }
        catch (Exception ex)
        {
            Debug.WriteLine($&quot;Error playing video: {ex.Message}&quot;);
            VideoStatus = &quot;Error playing video&quot;;
        }
    }

    [RelayCommand]
    private void Pause()
    {
        try
        {
            _mediaElement?.Pause();
            VideoStatus = &quot;Paused&quot;;
        }
        catch (Exception ex)
        {
            Debug.WriteLine($&quot;Error pausing video: {ex.Message}&quot;);
        }
    }

    [RelayCommand]
    private void Stop()
    {
        try
        {
            _mediaElement?.Stop();
            VideoStatus = &quot;Stopped&quot;;
        }
        catch (Exception ex)
        {
            Debug.WriteLine($&quot;Error stopping video: {ex.Message}&quot;);
        }
    }

    [RelayCommand]
    private async Task ShareVideo()
    {
        try
        {
            if (!string.IsNullOrEmpty(VideoSource))
            {
                await Shell.Current.DisplayAlert(&quot;Share Video&quot;, $&quot;Sharing: {VideoTitle}\n\nCheck out this AI-generated viral video!&quot;, &quot;OK&quot;);
            }
            else
            {
                await Shell.Current.DisplayAlert(&quot;Info&quot;, &quot;No video available to share&quot;, &quot;OK&quot;);
            }
        }
        catch (Exception ex)
        {
            Debug.WriteLine($&quot;Error sharing video: {ex.Message}&quot;);
            await Shell.Current.DisplayAlert(&quot;Error&quot;, &quot;Unable to share video&quot;, &quot;OK&quot;);
        }
    }

    [RelayCommand]
    private async Task Download()
    {
        try
        {
            // In a real app, this would download the video file
            await Shell.Current.DisplayAlert(&quot;Info&quot;, &quot;Download functionality will be implemented with actual video generation service&quot;, &quot;OK&quot;);
        }
        catch (Exception ex)
        {
            Debug.WriteLine($&quot;Error downloading video: {ex.Message}&quot;);
            await Shell.Current.DisplayAlert(&quot;Error&quot;, &quot;Unable to download video&quot;, &quot;OK&quot;);
        }
    }

    [RelayCommand]
    private async Task Back()
    {
        try
        {
            // Stop video before navigating back
            _mediaElement?.Stop();
            await Shell.Current.GoToAsync(&quot;..&quot;);
        }
        catch (Exception ex)
        {
            Debug.WriteLine($&quot;Error navigating back: {ex.Message}&quot;);
        }
    }

    // Method to set video data from external source
    public void SetVideoData(string title, string source, string originalPrompt, string enhancedPrompt = &quot;&quot;, string englishContent = &quot;&quot;)
    {
        VideoTitle = title;
        VideoSource = source;
        OriginalPrompt = originalPrompt;
        EnhancedPrompt = enhancedPrompt;
        EnglishContent = englishContent;
        HasEnhancedPrompt = !string.IsNullOrEmpty(enhancedPrompt);
    }

    // IQueryAttributable implementation
    public void ApplyQueryAttributes(IDictionary&amp;lt;string, object&amp;gt; query)
    {
        Debug.WriteLine(&quot;[VideoDisplay] ApplyQueryAttributes called&quot;);
        Debug.WriteLine($&quot;[VideoDisplay] Received {query.Count} parameters:&quot;);
        
        // Start loading when receiving new video parameters
        IsLoading = true;
        
        foreach (var kvp in query)
        {
            Debug.WriteLine($&quot;[VideoDisplay]   {kvp.Key}: {kvp.Value}&quot;);
        }

        if (query.ContainsKey(&quot;VideoTitle&quot;))
        {
            VideoTitle = query[&quot;VideoTitle&quot;].ToString() ?? &quot;&quot;;
            Debug.WriteLine($&quot;[VideoDisplay] Set VideoTitle: {VideoTitle}&quot;);
        }

        if (query.ContainsKey(&quot;VideoSource&quot;))
        {
            var videoPath = query[&quot;VideoSource&quot;].ToString() ?? &quot;&quot;;
            Debug.WriteLine($&quot;[VideoDisplay] Received VideoSource: {videoPath}&quot;);
            
            // Validate that the file exists
            if (File.Exists(videoPath))
            {
                VideoSource = videoPath;
                Debug.WriteLine($&quot;[VideoDisplay] ✅ Video file exists, set VideoSource: {VideoSource}&quot;);
            }
            else
            {
                Debug.WriteLine($&quot;[VideoDisplay] ❌ Video file not found: {videoPath}&quot;);
                // Fallback to sample video for demo
                VideoSource = &quot;https://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4&quot;;
                Debug.WriteLine($&quot;[VideoDisplay] Using fallback video: {VideoSource}&quot;);
            }
        }
        else
        {
            Debug.WriteLine(&quot;[VideoDisplay] No VideoSource parameter received, using fallback&quot;);
            VideoSource = &quot;https://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4&quot;;
        }

        if (query.ContainsKey(&quot;OriginalPrompt&quot;))
        {
            OriginalPrompt = query[&quot;OriginalPrompt&quot;].ToString() ?? &quot;&quot;;
            Debug.WriteLine($&quot;[VideoDisplay] Set OriginalPrompt: {OriginalPrompt}&quot;);
        }

        if (query.ContainsKey(&quot;EnhancedPrompt&quot;))
        {
            EnhancedPrompt = query[&quot;EnhancedPrompt&quot;].ToString() ?? &quot;&quot;;
            HasEnhancedPrompt = !string.IsNullOrEmpty(EnhancedPrompt);
            Debug.WriteLine($&quot;[VideoDisplay] Set EnhancedPrompt: {EnhancedPrompt}&quot;);
            Debug.WriteLine($&quot;[VideoDisplay] HasEnhancedPrompt: {HasEnhancedPrompt}&quot;);
        }

        if (query.ContainsKey(&quot;HasEnhancedPrompt&quot;))
        {
            if (bool.TryParse(query[&quot;HasEnhancedPrompt&quot;].ToString(), out bool hasEnhanced))
            {
                HasEnhancedPrompt = hasEnhanced;
                Debug.WriteLine($&quot;[VideoDisplay] Set HasEnhancedPrompt from parameter: {HasEnhancedPrompt}&quot;);
            }
        }

        if (query.ContainsKey(&quot;EnglishContent&quot;))
        {
            EnglishContent = query[&quot;EnglishContent&quot;].ToString() ?? &quot;&quot;;
            Debug.WriteLine($&quot;[VideoDisplay] Set EnglishContent: {EnglishContent}&quot;);
        }

        VideoDescription = $&quot;AI-generated viral video: {VideoTitle}&quot;;
        Debug.WriteLine($&quot;[VideoDisplay] Set VideoDescription: {VideoDescription}&quot;);
        Debug.WriteLine(&quot;[VideoDisplay] ApplyQueryAttributes completed&quot;);
    }
}&lt;/span&gt;
				&lt;/code&gt;
			&lt;/pre&gt;
		&lt;/div&gt;
				&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-3bbcde6 elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-56b6e9c&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-056667d elementor-widget elementor-widget-text-editor&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
							&lt;div&gt;
&lt;div&gt;With the above, we complete the application's code.&lt;/div&gt;
&lt;/div&gt;						&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-b7607af elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-1a72533&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-98c4efd elementor-widget elementor-widget-heading&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
			&lt;h2 class=&quot;elementor-heading-title elementor-size-default&quot; id=&quot;complete-application-flow&quot;&gt;Complete Application Flow&lt;/h2&gt;		&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-3c03844 elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-43f668a&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-36f2e83 elementor-widget elementor-widget-text-editor&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
							&lt;div&gt;
&lt;div&gt;As a final step, I share an image showing the entire process from the prompt input to the generation of the final video:&lt;/div&gt;
&lt;/div&gt;						&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-83e9eaa elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-bdf01e4&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-cb1d8fe uael-aspect-ratio-16_9 uael-youtube-subscribe-no elementor-widget elementor-widget-uael-video&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
							&lt;div class=&quot;uael-video__outer-wrap uael-video-type-youtube&quot;&gt;
						&lt;div class=&quot;uael-video-inner-wrap&quot;&gt;
				&lt;figure class=&quot;migration-video&quot;&gt;&lt;iframe src=&quot;https://www.youtube-nocookie.com/embed/hNmlEZQ7zPw&quot; title=&quot;YouTube video&quot; loading=&quot;lazy&quot; allowfullscreen=&quot;&quot; referrerpolicy=&quot;strict-origin-when-cross-origin&quot; sandbox=&quot;allow-scripts allow-same-origin allow-presentation&quot; allow=&quot;accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture; fullscreen&quot;&gt;&lt;/iframe&gt;&lt;/figure&gt;
											&lt;/div&gt;
		&lt;/div&gt;
					&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-4c94073 elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-45faf9e&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-5d0a2d1 elementor-widget elementor-widget-text-editor&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
							&lt;div&gt;
&lt;div&gt;You can find the full repository on GitHub: &lt;a href=&quot;https://github.com/hprez21/ViralVideosDemo&quot;&gt;ViralVideosDemo Repo&lt;/a&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;I hope you found the article enjoyable.&lt;/div&gt;
&lt;br&gt;
&lt;div&gt;Best regards!&lt;/div&gt;
&lt;/div&gt;						&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
							&lt;/div&gt;
		</content:encoded></item><item><title>How to Apply Different Item Templates in One CollectionView with .NET MAUI</title><link>https://devs.school/net-maui-data-template-selector/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=net-maui-data-template-selector</link><guid isPermaLink="false">https://devs.school/?p=8950</guid><pubDate>Wed, 24 Jul 2024 05:00:00 GMT</pubDate><description>Learn to apply multiple Data Templates for a versatile and engaging mobile UI.</description><content:encoded>		&lt;div class=&quot;elementor elementor-8950&quot;&gt;
									&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-8a4942c elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-8db5bd4&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-dd87430 elementor-widget elementor-widget-docy_quote&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
			        &lt;section class=&quot;about-journalism&quot;&gt;
            &lt;div class=&quot;container&quot;&gt;
                &lt;div class=&quot;row&quot;&gt;
                    &lt;div class=&quot;col-lg-7 md-order-two&quot;&gt;
                        &lt;div class=&quot;journalism-content-wrapper&quot;&gt;
                                                            &lt;div class=&quot;quote wow&quot;&gt;
                                    &lt;img alt=&quot;quote icon left&quot; src=&quot;https://devs.school/wp-content/plugins/docy-core/widgets/images/quote-top.png&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;
                                &lt;/div&gt;
                                                                                        &lt;h2 class=&quot;journalism-title wow&quot; id=&quot;net-maui-ui-july-2024&quot;&gt;
                                    .NET MAUI UI July - 2024                                &lt;/h2&gt;
                                                                                        &lt;p class=&quot;description wow&quot;&gt;
                                    This post is part of the .NET MAUI UI July - 2024 calendar, organized by Matt Goldman. I invite you to explore the other posts in the calendar and enjoy them. You might find something that changes your perspective for your upcoming projects.                                &lt;/p&gt;
                            
                            &lt;div class=&quot;journalism-info wow&quot;&gt;
                                                                                            &lt;/div&gt;
                                                            &lt;div class=&quot;quote dmt-4 wow&quot;&gt;
                                    &lt;img alt=&quot;quote&quot; src=&quot;https://devs.school/wp-content/plugins/docy-core/widgets/images/quote-bottom.png&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;
                                &lt;/div&gt;
                                                    &lt;/div&gt;
                        
                    &lt;/div&gt;
                    

                                    &lt;/div&gt;
                
            &lt;/div&gt;
            

                            &lt;div class=&quot;light-header&quot;&gt;
                    &lt;h2 class=&quot;title-light wow fadeInDown&quot; id=&quot;net-maui&quot;&gt;
                        .NET MAUI                    &lt;/h2&gt;
                &lt;/div&gt;
                    &lt;/section&gt;
        		&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-c6aced9 elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-5218c9c&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-537887c elementor-widget elementor-widget-text-editor&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
							&lt;p&gt; &lt;/p&gt;&lt;p&gt;When working with mobile applications in general, it is essential to know how to create lists and define the appearance of their items. However, have you ever wondered how to create multiple designs for the list items?&lt;/p&gt;&lt;p&gt;This is the topic we will cover today. Let's get started!&lt;/p&gt;						&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-a61ad6b elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-d388e7e&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-83ddf37 elementor-widget elementor-widget-heading&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
			&lt;h2 class=&quot;elementor-heading-title elementor-size-default&quot; id=&quot;creating-a-demonstrative-generic-list&quot;&gt;Creating a Demonstrative Generic List&lt;/h2&gt;		&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-0f83c3e elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-9af16f8&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-85c8d57 elementor-widget elementor-widget-text-editor&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
							&lt;p&gt;Let's start with something simple, that is, creating a list like the ones we already know, with the purpose of having a starting point. In our example, we will create a product list composed of products with a regular price and products on sale.&lt;/p&gt;&lt;p&gt;To do this, I will define a Product Model:&lt;/p&gt;						&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-f9de8dc elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-cc6f314&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-fd2da63 elementor-widget elementor-widget-code-highlight&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
					&lt;div class=&quot;prismjs-okaidia copy-to-clipboard&quot;&gt;
			&lt;pre class=&quot;highlight-height language-csharp line-numbers&quot;&gt;
				&lt;code class=&quot;language-csharp&quot;&gt;
					&lt;span class=&quot;legacy-code-literal&quot;&gt;     public class Product
     {
          public int Id { get; set; }
          public string Name { get; set; }
          public decimal Price { get; set; }
          public string Image { get; set; }
          public int Stock { get; set; }
          public bool HasOffer { get; set; }
          public decimal OfferPrice { get; set; }
     }&lt;/span&gt;
				&lt;/code&gt;
			&lt;/pre&gt;
		&lt;/div&gt;
				&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-520b82e elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-ab226e3&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-f33cf3f elementor-widget elementor-widget-text-editor&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
							&lt;p&gt;I will also create a ViewModel called &lt;b&gt;ProductsViewModel.cs&lt;/b&gt;, where I will create a set of fictitious data, which looks something like this (I have removed most of the definition to optimize space):&lt;/p&gt;						&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-381d655 elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-f550064&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-eccf1bf elementor-widget elementor-widget-code-highlight&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
					&lt;div class=&quot;prismjs-okaidia copy-to-clipboard&quot;&gt;
			&lt;pre class=&quot;highlight-height language-csharp line-numbers&quot;&gt;
				&lt;code class=&quot;language-csharp&quot;&gt;
					&lt;span class=&quot;legacy-code-literal&quot;&gt;    public class ProductsViewModel
    {
        public ObservableCollection&amp;lt;Product&amp;gt; Products { get; set; } =
             new ObservableCollection&amp;lt;Product&amp;gt;();
        public ProductsViewModel()
        {
            Products = new ObservableCollection&amp;lt;Product&amp;gt;(LoadItems());
        }
        private List&amp;lt;Product&amp;gt; LoadItems()
        {
            return new List&amp;lt;Product&amp;gt;
               {
                    new Product
                     {
                         Name = &quot;Yogurt&quot;,
                         Price = 60.0m,
                         Image = &quot;yogurt.png&quot;,
                         HasOffer = false,
                         Stock = 28
                     },
                     ...
               };
        }
    }&lt;/span&gt;
				&lt;/code&gt;
			&lt;/pre&gt;
		&lt;/div&gt;
				&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-4e8ab7f elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-fe3a63e&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-fdb1c64 elementor-widget elementor-widget-text-editor&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
							&lt;p&gt;Finally, on the default page &lt;b&gt;MainPage.xaml&lt;/b&gt;, I will define a CollectionView binding it to the Products property defined in the previous code:&lt;/p&gt;						&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-fe2afe8 elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-410b4d8&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-fa04712 elementor-widget elementor-widget-code-highlight&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
					&lt;div class=&quot;prismjs-okaidia copy-to-clipboard&quot;&gt;
			&lt;pre class=&quot;highlight-height language-xml line-numbers&quot;&gt;
				&lt;code class=&quot;language-xml&quot;&gt;
					&lt;span class=&quot;legacy-code-literal&quot;&gt;&amp;lt;CollectionView ItemsSource=&quot;{Binding Products}&quot;&amp;gt;
    &amp;lt;CollectionView.ItemsLayout&amp;gt;
        &amp;lt;LinearItemsLayout ItemSpacing=&quot;10&quot; Orientation=&quot;Vertical&quot; /&amp;gt;
    &amp;lt;/CollectionView.ItemsLayout&amp;gt;
    &amp;lt;CollectionView.ItemTemplate&amp;gt;
        &amp;lt;DataTemplate&amp;gt;
            &amp;lt;Grid
                Margin=&quot;15,10,15,0&quot;
                ColumnDefinitions=&quot;.1*,.2*,.7*&quot;
                RowDefinitions=&quot;*,*&quot;&amp;gt;
                &amp;lt;Frame
                    Grid.RowSpan=&quot;2&quot;
                    Grid.Column=&quot;1&quot;
                    Grid.ColumnSpan=&quot;2&quot;
                    BorderColor=&quot;White&quot;&amp;gt;
                    &amp;lt;Frame.Background&amp;gt;
                        &amp;lt;LinearGradientBrush EndPoint=&quot;1,0&quot;&amp;gt;
                            &amp;lt;GradientStop Offset=&quot;0&quot; Color=&quot;#F8F9FA&quot; /&amp;gt;
                            &amp;lt;GradientStop Offset=&quot;1&quot; Color=&quot;#DEE2E6&quot; /&amp;gt;
                        &amp;lt;/LinearGradientBrush&amp;gt;
                    &amp;lt;/Frame.Background&amp;gt;
                &amp;lt;/Frame&amp;gt;
                &amp;lt;Image
                    Grid.RowSpan=&quot;2&quot;
                    Grid.ColumnSpan=&quot;2&quot;
                    HeightRequest=&quot;100&quot;
                    Source=&quot;{Binding Image}&quot; /&amp;gt;
                &amp;lt;Label
                    Grid.Column=&quot;2&quot;
                    FontSize=&quot;Large&quot;
                    Text=&quot;{Binding Name}&quot;
                    VerticalOptions=&quot;Center&quot; /&amp;gt;
                &amp;lt;Label
                    Grid.Row=&quot;1&quot;
                    Grid.Column=&quot;2&quot;
                    FontSize=&quot;Large&quot;
                    Text=&quot;{Binding Price, StringFormat='{0:C}'}&quot;
                    VerticalOptions=&quot;Center&quot; /&amp;gt;
            &amp;lt;/Grid&amp;gt;
        &amp;lt;/DataTemplate&amp;gt;
    &amp;lt;/CollectionView.ItemTemplate&amp;gt;
&amp;lt;/CollectionView&amp;gt;&lt;/span&gt;
				&lt;/code&gt;
			&lt;/pre&gt;
		&lt;/div&gt;
				&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-21dddf9 elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-ee765db&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-5923ec8 elementor-widget elementor-widget-text-editor&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
							&lt;p&gt;All of the above produces a list like the one you can see below:&lt;/p&gt;						&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-36fd963 elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-d9a8082&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-60fd8cf elementor-widget elementor-widget-image&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
															&lt;img width=&quot;452&quot; height=&quot;979&quot; class=&quot;attachment-large size-large&quot; alt=&quot;CollectionView in .NET MAUI&quot; src=&quot;https://devs.school/wp-content/uploads/2024/07/qemu-system-x86_64_HZg6K5FpdA.png&quot; srcset=&quot;https://devs.school/wp-content/uploads/2024/07/qemu-system-x86_64_HZg6K5FpdA.png 452w, https://devs.school/wp-content/uploads/2024/07/qemu-system-x86_64_HZg6K5FpdA-139x300.png 139w&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;															&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-456a746 elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-5d6b50f&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-b821e61 elementor-widget elementor-widget-text-editor&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
							&lt;p&gt;Up to this point, surely nothing you haven't seen before. Now, let's move on to the fun part by seeing how to create a different design for the products on sale.&lt;/p&gt;						&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-469b55f elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-667532a&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-72f5912 elementor-widget elementor-widget-heading&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
			&lt;h2 class=&quot;elementor-heading-title elementor-size-default&quot; id=&quot;creating-a-different-design-for-products-on-sale&quot;&gt;Creating a Different Design for Products on Sale&lt;/h2&gt;		&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-b5e7571 elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-ec63da2&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-1586e52 elementor-widget elementor-widget-text-editor&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
							&lt;p&gt;Once we have our example compiling and running, the next step is to determine the design we will use for the items on sale. In my case, I have chosen to create a design that stands out from the regular design, so it does not go unnoticed by the user:&lt;/p&gt;						&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-1fc30b9 elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-eb1cc2c&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-a324135 elementor-widget elementor-widget-code-highlight&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
					&lt;div class=&quot;prismjs-okaidia copy-to-clipboard&quot;&gt;
			&lt;pre class=&quot;highlight-height language-xml line-numbers&quot;&gt;
				&lt;code class=&quot;language-xml&quot;&gt;
					&lt;span class=&quot;legacy-code-literal&quot;&gt;                &amp;lt;Grid
                    Margin=&quot;15,10,15,0&quot;
                    ColumnDefinitions=&quot;.3*,.7*&quot;
                    HeightRequest=&quot;200&quot;
                    RowDefinitions=&quot;*,*&quot;&amp;gt;
                    &amp;lt;Frame
                        Grid.RowSpan=&quot;2&quot;
                        Grid.ColumnSpan=&quot;2&quot;
                        BorderColor=&quot;White&quot;&amp;gt;
                        &amp;lt;Frame.Background&amp;gt;
                            &amp;lt;LinearGradientBrush EndPoint=&quot;1,0&quot;&amp;gt;
                                &amp;lt;GradientStop Offset=&quot;0&quot; Color=&quot;#FFBF47&quot; /&amp;gt;
                                &amp;lt;GradientStop Offset=&quot;1&quot; Color=&quot;#EEB54C&quot; /&amp;gt;
                            &amp;lt;/LinearGradientBrush&amp;gt;
                        &amp;lt;/Frame.Background&amp;gt;
                    &amp;lt;/Frame&amp;gt;
                    &amp;lt;Image
                        Grid.RowSpan=&quot;2&quot;
                        HeightRequest=&quot;100&quot;
                        Source=&quot;{Binding Image}&quot; /&amp;gt;
                    &amp;lt;Label
                        Grid.Column=&quot;2&quot;
                        FontAttributes=&quot;Bold&quot;
                        FontSize=&quot;Title&quot;
                        Text=&quot;{Binding Name, StringFormat='OFFER: {0}'}&quot;
                        TextColor=&quot;White&quot;
                        VerticalOptions=&quot;End&quot; /&amp;gt;
                    &amp;lt;Label
                        Grid.Row=&quot;1&quot;
                        Grid.Column=&quot;2&quot;
                        FontAttributes=&quot;Bold&quot;
                        FontSize=&quot;Title&quot;
                        Text=&quot;{Binding Price, StringFormat='{0:C}'}&quot;
                        TextColor=&quot;White&quot;
                        VerticalOptions=&quot;Start&quot;&amp;gt;
                        &amp;lt;Label.FormattedText&amp;gt;
                            &amp;lt;FormattedString&amp;gt;
                                &amp;lt;Span Text=&quot;{Binding OfferPrice, StringFormat='{0:C}'}&quot; /&amp;gt;
                                &amp;lt;Span
                                    Text=&quot;{Binding Price, StringFormat='{0:C}'}&quot;
                                    TextColor=&quot;DarkRed&quot;
                                    TextDecorations=&quot;Strikethrough&quot; /&amp;gt;
                            &amp;lt;/FormattedString&amp;gt;
                        &amp;lt;/Label.FormattedText&amp;gt;
                    &amp;lt;/Label&amp;gt;
                &amp;lt;/Grid&amp;gt;&lt;/span&gt;
				&lt;/code&gt;
			&lt;/pre&gt;
		&lt;/div&gt;
				&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-4d5593c elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-f624b0a&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-43be35f elementor-widget elementor-widget-text-editor&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
							&lt;p&gt;Changing the design of the products in the previous list, we will have the following result:&lt;/p&gt;						&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-72d568d elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-f2f74b6&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-26d0538 elementor-widget elementor-widget-image&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
															&lt;img width=&quot;452&quot; height=&quot;979&quot; class=&quot;attachment-large size-large&quot; alt=&quot;A product in offer Template in a CollectionView&quot; src=&quot;https://devs.school/wp-content/uploads/2024/07/qemu-system-x86_64_sVjUQk9feF.png&quot; srcset=&quot;https://devs.school/wp-content/uploads/2024/07/qemu-system-x86_64_sVjUQk9feF.png 452w, https://devs.school/wp-content/uploads/2024/07/qemu-system-x86_64_sVjUQk9feF-139x300.png 139w&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;															&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-76f7e8d elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-e36f29f&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-e25c5c8 elementor-widget elementor-widget-text-editor&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
							&lt;p&gt;Without a doubt, this design is much more eye-catching. Now the question is, how can we use both designs in the list? We will see that next.&lt;/p&gt;						&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-9b6abbe elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-7c1035d&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-bb3d4b6 elementor-widget elementor-widget-heading&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
			&lt;h2 class=&quot;elementor-heading-title elementor-size-default&quot; id=&quot;creating-a-datatemplateselector&quot;&gt;Creating a DataTemplateSelector&lt;/h2&gt;		&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-98272fa elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-5ea7523&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-ae1b54c elementor-widget elementor-widget-text-editor&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
							&lt;p&gt;To determine which design to apply to each item at runtime, we will use a DataTemplateSelector. This is a very simple class that we need to inherit from to determine the resource to use, and it looks like this:&lt;/p&gt;						&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-b22ee0d elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-a3a5cb5&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-11d426a elementor-widget elementor-widget-code-highlight&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
					&lt;div class=&quot;prismjs-okaidia copy-to-clipboard&quot;&gt;
			&lt;pre class=&quot;highlight-height language-csharp line-numbers&quot;&gt;
				&lt;code class=&quot;language-csharp&quot;&gt;
					&lt;span class=&quot;legacy-code-literal&quot;&gt;    public class ProductTemplateSelector : DataTemplateSelector
    {
        protected override DataTemplate OnSelectTemplate(object item, BindableObject container)
        {
            throw new NotImplementedException();
        }
    }&lt;/span&gt;
				&lt;/code&gt;
			&lt;/pre&gt;
		&lt;/div&gt;
				&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-00c863c elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-8183c7a&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-b7221ad elementor-widget elementor-widget-text-editor&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
							&lt;p&gt;You can see that by inheriting from DataTemplateSelector, we are required to implement the OnSelectTemplate method, which contains two arguments that allow us to carry out the design selection:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;item: Allows us to get each of the items to apply a design.&lt;/li&gt;&lt;li&gt;container: Is the control that contains the list of items.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;The great advantage of this approach is that we can use any comparison we want to determine the design to use. We could use an object property, a comparison, a filter, etc.&lt;/p&gt;&lt;p&gt;In my case, I will retrieve the product to which the item is being bound, and then I will use the &lt;b&gt;HasOffer &lt;/b&gt;property defined in the model to determine whether the product is on sale or not:&lt;/p&gt;						&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-7e345d9 elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-63b031e&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-6a90da2 elementor-widget elementor-widget-code-highlight&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
					&lt;div class=&quot;prismjs-okaidia copy-to-clipboard&quot;&gt;
			&lt;pre class=&quot;highlight-height language-csharp line-numbers&quot;&gt;
				&lt;code class=&quot;language-csharp&quot;&gt;
					&lt;span class=&quot;legacy-code-literal&quot;&gt;    public class ProductTemplateSelector : DataTemplateSelector
    {
        protected override DataTemplate OnSelectTemplate(object item, BindableObject container)
        {
            var product =
                 item as Product;
            if (!product.HasOffer)
            {
               //Product has offer
            }
            else
            {
               //Product has no offer
            }
            return new DataTemplate();
        }
    }&lt;/span&gt;
				&lt;/code&gt;
			&lt;/pre&gt;
		&lt;/div&gt;
				&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-8f34303 elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-c61698f&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-e83f564 elementor-widget elementor-widget-text-editor&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
							&lt;p&gt;The final step is to determine which design to apply to the items based on the condition. There are several ways to do this, but it all depends on where you place the item designs.&lt;/p&gt;&lt;p&gt;You should do this by defining a DataTemplate for each design you want to apply, as well as an x:Key. In my case, I will do it in the resources of the CollectionView:&lt;/p&gt;						&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-92fface elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-0496137&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-2271325 elementor-widget elementor-widget-code-highlight&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
					&lt;div class=&quot;prismjs-okaidia copy-to-clipboard&quot;&gt;
			&lt;pre class=&quot;highlight-height language-xml line-numbers&quot;&gt;
				&lt;code class=&quot;language-xml&quot;&gt;
					&lt;span class=&quot;legacy-code-literal&quot;&gt;&amp;lt;CollectionView ItemsSource=&quot;{Binding Products}&quot;&amp;gt;
    &amp;lt;CollectionView.Resources&amp;gt;
        &amp;lt;DataTemplate x:Key=&quot;ProductStyle&quot;&amp;gt;
            &amp;lt;Grid
                Margin=&quot;15,10,15,0&quot;
                ColumnDefinitions=&quot;.1*,.2*,.7*&quot;
                RowDefinitions=&quot;*,*&quot;&amp;gt;
                &amp;lt;Frame
                    Grid.RowSpan=&quot;2&quot;
                    Grid.Column=&quot;1&quot;
                    Grid.ColumnSpan=&quot;2&quot;
                    BorderColor=&quot;White&quot;&amp;gt;
                    &amp;lt;Frame.Background&amp;gt;
                        &amp;lt;LinearGradientBrush EndPoint=&quot;1,0&quot;&amp;gt;
                            &amp;lt;GradientStop Offset=&quot;0&quot; Color=&quot;#F8F9FA&quot; /&amp;gt;
                            &amp;lt;GradientStop Offset=&quot;1&quot; Color=&quot;#DEE2E6&quot; /&amp;gt;
                        &amp;lt;/LinearGradientBrush&amp;gt;
                    &amp;lt;/Frame.Background&amp;gt;
                &amp;lt;/Frame&amp;gt;
                &amp;lt;Image
                    Grid.RowSpan=&quot;2&quot;
                    Grid.ColumnSpan=&quot;2&quot;
                    HeightRequest=&quot;100&quot;
                    Source=&quot;{Binding Image}&quot; /&amp;gt;
                &amp;lt;Label
                    Grid.Column=&quot;2&quot;
                    FontSize=&quot;Large&quot;
                    Text=&quot;{Binding Name}&quot;
                    VerticalOptions=&quot;Center&quot; /&amp;gt;
                &amp;lt;Label
                    Grid.Row=&quot;1&quot;
                    Grid.Column=&quot;2&quot;
                    FontSize=&quot;Large&quot;
                    Text=&quot;{Binding Price, StringFormat='{0:C}'}&quot;
                    VerticalOptions=&quot;Center&quot; /&amp;gt;
            &amp;lt;/Grid&amp;gt;
        &amp;lt;/DataTemplate&amp;gt;
        &amp;lt;DataTemplate x:Key=&quot;OfferStyle&quot;&amp;gt;
            &amp;lt;Grid
                Margin=&quot;15,10,15,0&quot;
                ColumnDefinitions=&quot;.3*,.7*&quot;
                HeightRequest=&quot;200&quot;
                RowDefinitions=&quot;*,*&quot;&amp;gt;
                &amp;lt;Frame
                    Grid.RowSpan=&quot;2&quot;
                    Grid.ColumnSpan=&quot;2&quot;
                    BorderColor=&quot;White&quot;&amp;gt;
                    &amp;lt;Frame.Background&amp;gt;
                        &amp;lt;LinearGradientBrush EndPoint=&quot;1,0&quot;&amp;gt;
                            &amp;lt;GradientStop Offset=&quot;0&quot; Color=&quot;#FFBF47&quot; /&amp;gt;
                            &amp;lt;GradientStop Offset=&quot;1&quot; Color=&quot;#EEB54C&quot; /&amp;gt;
                        &amp;lt;/LinearGradientBrush&amp;gt;
                    &amp;lt;/Frame.Background&amp;gt;
                &amp;lt;/Frame&amp;gt;
                &amp;lt;Image
                    Grid.RowSpan=&quot;2&quot;
                    HeightRequest=&quot;100&quot;
                    Source=&quot;{Binding Image}&quot; /&amp;gt;
                &amp;lt;Label
                    Grid.Column=&quot;2&quot;
                    FontAttributes=&quot;Bold&quot;
                    FontSize=&quot;Title&quot;
                    Text=&quot;{Binding Name, StringFormat='OFFER: {0}'}&quot;
                    TextColor=&quot;White&quot;
                    VerticalOptions=&quot;End&quot; /&amp;gt;
                &amp;lt;Label
                    Grid.Row=&quot;1&quot;
                    Grid.Column=&quot;2&quot;
                    FontAttributes=&quot;Bold&quot;
                    FontSize=&quot;Title&quot;
                    Text=&quot;{Binding Price, StringFormat='{0:C}'}&quot;
                    TextColor=&quot;White&quot;
                    VerticalOptions=&quot;Start&quot;&amp;gt;
                    &amp;lt;Label.FormattedText&amp;gt;
                        &amp;lt;FormattedString&amp;gt;
                            &amp;lt;Span Text=&quot;{Binding OfferPrice, StringFormat='{0:C}'}&quot; /&amp;gt;
                            &amp;lt;Span
                                Text=&quot;{Binding Price, StringFormat='{0:C}'}&quot;
                                TextColor=&quot;DarkRed&quot;
                                TextDecorations=&quot;Strikethrough&quot; /&amp;gt;
                        &amp;lt;/FormattedString&amp;gt;
                    &amp;lt;/Label.FormattedText&amp;gt;
                &amp;lt;/Label&amp;gt;
            &amp;lt;/Grid&amp;gt;
        &amp;lt;/DataTemplate&amp;gt;
    &amp;lt;/CollectionView.Resources&amp;gt;
    &amp;lt;CollectionView.ItemsLayout&amp;gt;
        &amp;lt;LinearItemsLayout ItemSpacing=&quot;10&quot; Orientation=&quot;Vertical&quot; /&amp;gt;
    &amp;lt;/CollectionView.ItemsLayout&amp;gt;
&amp;lt;/CollectionView&amp;gt;&lt;/span&gt;
				&lt;/code&gt;
			&lt;/pre&gt;
		&lt;/div&gt;
				&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-1ef7acc elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-06123c0&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-620bdff elementor-widget elementor-widget-text-editor&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
							&lt;p&gt;As we have already defined several DataTemplates, we can retrieve them and assign them to the CollectionView item according to our needs, as shown in the following example:&lt;/p&gt;						&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-2f0510e elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-91d84a7&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-9927d71 elementor-widget elementor-widget-code-highlight&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
					&lt;div class=&quot;prismjs-okaidia copy-to-clipboard&quot;&gt;
			&lt;pre class=&quot;highlight-height language-csharp line-numbers&quot;&gt;
				&lt;code class=&quot;language-csharp&quot;&gt;
					&lt;span class=&quot;legacy-code-literal&quot;&gt;    public class ProductTemplateSelector : DataTemplateSelector
    {
        protected override DataTemplate OnSelectTemplate(object item, BindableObject container)
        {
            var product =
                 item as Product;
            var collectionView = container as CollectionView;
            if (!product.HasOffer)
            {
               return (DataTemplate)collectionView.Resources[&quot;ProductStyle&quot;];
            }
            else
            {
                return (DataTemplate)collectionView.Resources[&quot;OfferStyle&quot;];
            }
            return new DataTemplate();
        }
    }&lt;/span&gt;
				&lt;/code&gt;
			&lt;/pre&gt;
		&lt;/div&gt;
				&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-5ccd5fa elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-8700046&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-fd7fc6e elementor-widget elementor-widget-text-editor&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
							&lt;p&gt;Finally, you need to specify in the CollectionView control that you will use the created selector, as follows:&lt;/p&gt;						&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-fa95bdc elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-13a3f20&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-6037e22 elementor-widget elementor-widget-code-highlight&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
					&lt;div class=&quot;prismjs-okaidia copy-to-clipboard&quot;&gt;
			&lt;pre class=&quot;highlight-height language-javascript line-numbers&quot;&gt;
				&lt;code class=&quot;language-javascript&quot;&gt;
					&lt;span class=&quot;legacy-code-literal&quot;&gt;&amp;lt;ContentPage
    xmlns:selectors=&quot;clr-namespace:DataTemplateSelectorDemo.Selectors&quot;
    ...&amp;gt;
    
    &amp;lt;ContentPage.Resources&amp;gt;
        &amp;lt;ResourceDictionary&amp;gt;
            &amp;lt;selectors:ProductTemplateSelector x:Key=&quot;ProductTemplateSelector&quot; /&amp;gt;
        &amp;lt;/ResourceDictionary&amp;gt;
    &amp;lt;/ContentPage.Resources&amp;gt;
    
    &amp;lt;CollectionView ItemTemplate=&quot;{StaticResource ProductTemplateSelector}&quot; ItemsSource=&quot;{Binding Products}&quot;&amp;gt;
        ...
    &amp;lt;/CollectionView&amp;gt;
&amp;lt;/ContentPage&amp;gt;    &lt;/span&gt;
				&lt;/code&gt;
			&lt;/pre&gt;
		&lt;/div&gt;
				&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-4dd531b elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-c04cfd6&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-582a8b6 elementor-widget elementor-widget-text-editor&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
							&lt;p&gt;With these changes, you will be ready to run the application, which looks like this:&lt;/p&gt;						&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-4d3c296 elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-2c65f64&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-af33208 elementor-widget elementor-widget-image&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
															&lt;img width=&quot;452&quot; height=&quot;979&quot; class=&quot;attachment-large size-large&quot; alt=&quot;.NET MAUI CollectionView with multiple Data Templates&quot; src=&quot;https://devs.school/wp-content/uploads/2024/07/qemu-system-x86_64_JvrinVeWAz.png&quot; srcset=&quot;https://devs.school/wp-content/uploads/2024/07/qemu-system-x86_64_JvrinVeWAz.png 452w, https://devs.school/wp-content/uploads/2024/07/qemu-system-x86_64_JvrinVeWAz-139x300.png 139w&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;															&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-d85355e elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-d2ea415&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-39a90f3 elementor-widget elementor-widget-text-editor&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
							&lt;p&gt;I hope you find this post useful, and remember that I have a course on .NET MAUI where I explain this topic and many more step by step. See you in the next post!&lt;/p&gt;						&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-6d71b32 elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-f2a40c1&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-f3e02e0 elementor-widget elementor-widget-template&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
					&lt;div class=&quot;elementor-template&quot;&gt;
					&lt;div class=&quot;elementor elementor-8656&quot;&gt;
									&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-888c14b elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-551f2ca&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-ec2cc06 elementor-widget elementor-widget-template&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
					&lt;div class=&quot;elementor-template&quot;&gt;
					&lt;div class=&quot;elementor elementor-8632&quot;&gt;
									&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-ad17090 ha-particle-yes elementor-section-boxed elementor-section-height-default elementor-section-height-default ha-particle-adv-no&quot;&gt;
							&lt;div class=&quot;elementor-background-overlay&quot;&gt;&lt;/div&gt;
							&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-33 elementor-top-column elementor-element elementor-element-291b567&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-8750ea5 elementor-widget elementor-widget-image&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
															&lt;img width=&quot;150&quot; height=&quot;150&quot; class=&quot;attachment-thumbnail size-thumbnail&quot; alt=&quot;maui-bot&quot; src=&quot;https://devs.school/wp-content/uploads/2022/09/my-dotnet-bot-mod-1-150x150.png&quot; srcset=&quot;https://devs.school/wp-content/uploads/2022/09/my-dotnet-bot-mod-1-150x150.png 150w, https://devs.school/wp-content/uploads/2022/09/my-dotnet-bot-mod-1-300x300.png 300w, https://devs.school/wp-content/uploads/2022/09/my-dotnet-bot-mod-1-1024x1024.png 1024w, https://devs.school/wp-content/uploads/2022/09/my-dotnet-bot-mod-1-768x768.png 768w, https://devs.school/wp-content/uploads/2022/09/my-dotnet-bot-mod-1-70x70.png 70w, https://devs.school/wp-content/uploads/2022/09/my-dotnet-bot-mod-1-16x16.png 16w, https://devs.school/wp-content/uploads/2022/09/my-dotnet-bot-mod-1-40x40.png 40w, https://devs.school/wp-content/uploads/2022/09/my-dotnet-bot-mod-1-1536x1536.png 1536w, https://devs.school/wp-content/uploads/2022/09/my-dotnet-bot-mod-1-60x60.png 60w, https://devs.school/wp-content/uploads/2022/09/my-dotnet-bot-mod-1-18x18.png 18w, https://devs.school/wp-content/uploads/2022/09/my-dotnet-bot-mod-1-20x20.png 20w, https://devs.school/wp-content/uploads/2022/09/my-dotnet-bot-mod-1.png 2000w&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;															&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
				&lt;div class=&quot;elementor-column elementor-col-66 elementor-top-column elementor-element elementor-element-0080d0e&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-89569a9 elementor-widget elementor-widget-heading&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
			&lt;h2 class=&quot;elementor-heading-title elementor-size-default&quot; id=&quot;learn-net-maui-creating-projects&quot;&gt;Learn .NET MAUI creating projects&lt;/h2&gt;		&lt;/div&gt;
				&lt;/div&gt;
				&lt;div class=&quot;elementor-element elementor-element-204f713 elementor-widget elementor-widget-text-editor&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
							&lt;p&gt;Learn how to create cross-platform applications, thanks to the power of .NET MAUI and a series of real projects.&lt;/p&gt;						&lt;/div&gt;
				&lt;/div&gt;
				&lt;div class=&quot;elementor-element elementor-element-5395b64 elementor-align-left elementor-widget elementor-widget-button&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
					&lt;div class=&quot;elementor-button-wrapper&quot;&gt;
			&lt;a href=&quot;https://courses.devs.school/courses/net-maui&quot; class=&quot;elementor-button-link elementor-button elementor-size-md&quot;&gt;
						&lt;span class=&quot;elementor-button-content-wrapper&quot;&gt;
						&lt;span class=&quot;elementor-button-text&quot;&gt;TAKE THE COURSE&lt;/span&gt;
		&lt;/span&gt;
					&lt;/a&gt;
		&lt;/div&gt;
				&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-30ef59a elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-a162dbf&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap&quot;&gt;
									&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
							&lt;/div&gt;
				&lt;/div&gt;
				&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
							&lt;/div&gt;
				&lt;/div&gt;
				&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
							&lt;/div&gt;
		</content:encoded></item><item><title>.NET MAUI Advent Calendar English 2023</title><link>https://devs.school/net-maui-advent-calendar-23/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=net-maui-advent-calendar-23</link><guid isPermaLink="false">https://devs.school/?p=8900</guid><pubDate>Sun, 19 Nov 2023 03:05:16 GMT</pubDate><description>✅ Advent calendars are a fantastic initiative promoted by the tech community, in which, during December, experts share their knowledge through contributions</description><content:encoded>		&lt;div class=&quot;elementor elementor-8900&quot;&gt;
									&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-4e63baa elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-dcc0657&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-f338236 elementor-widget elementor-widget-text-editor&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
							Advent calendars are a fantastic initiative promoted by the tech community, in which, during December, experts share their knowledge through contributions of a specific technology in different formats:
&lt;ul&gt;
 	&lt;li&gt;blog posts&lt;/li&gt;
 	&lt;li&gt;videos&lt;/li&gt;
 	&lt;li&gt;webinars&lt;/li&gt;
 	&lt;li&gt;etc.&lt;/li&gt;
&lt;/ul&gt;
This year we (Microsoft MVPs &lt;a href=&quot;https://mvp.microsoft.com/en-us/PublicProfile/5004148&quot;&gt;Héctor Pérez&lt;/a&gt;, &lt;a href=&quot;https://mvp.microsoft.com/en-US/MVP/profile/33e06bb6-ccb0-ec11-983f-000d3a1017e3&quot;&gt;Pablo Piovano&lt;/a&gt; and &lt;a href=&quot;https://mvp.microsoft.com/en-us/PublicProfile/5002392&quot;&gt;Luis Beltrán&lt;/a&gt; proudly present another edition of the &lt;strong&gt;.NET MAUI Advent Calendar 2023 in English&lt;/strong&gt; (take a look at last year's contributions &lt;a href=&quot;https://dev.to/icebeam7/net-maui-advent-calendar-48d0&quot;&gt;here&lt;/a&gt;)

We know that communities are full of talented people. Let's promote this idea with the sole purpose of creating a collaborative space in which we all benefit, from expert, professionals to students, avid seekers of knowledge.

Are you in? Would you like to share your knowledge with the community? If you are interested in participating in this initiative, just follow these simple steps:

Before December:
&lt;ol&gt;
 	&lt;li&gt;Reserve a slot by replying to our tweet with the hashtag #AzureAdvent, or by leaving a comment on this post.&lt;/li&gt;
 	&lt;li&gt;When reserving a slot, choose an available date from the calendar (see below). We might open new dates if there is a high response from the community 🙂&lt;/li&gt;
 	&lt;li&gt;Important: Please send us the title of your contribution during the last week of November at the latest.&lt;/li&gt;
&lt;/ol&gt;
In December, on the chosen date:
&lt;ol&gt;
 	&lt;li&gt;Publish your contribution. If you use a platform like WordPress / YouTube, you can schedule it in advance so that it is published on the desired date / time. We will share your contribution on social networks (Twitter and our Facebook communities).&lt;/li&gt;
 	&lt;li&gt;In your contribution, add a link to this page, so that visitors can see the complete set of contributions and learn more about the calendar initiative.&lt;/li&gt;
 	&lt;li&gt;Share the link to us to update the table with your contribution.&lt;/li&gt;
&lt;/ol&gt;
You can also share your contribution using the hashtags #azure and #AzureAdvent.

These are the contributions to the Azure Advent Calendar 2023 in English:						&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-aa789a1 elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-63ece40&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap&quot;&gt;
									&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-6711535 elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-ca83c48&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-9a1ef13 elementor-widget elementor-widget-text-editor&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
							&lt;p&gt;If you need inspiration for your contribution, here are some ideas:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;UI/UX challenges in .NET MAUI&lt;/li&gt;&lt;li&gt;Useful Nuget packages for development with .NET MAUI&lt;/li&gt;&lt;li&gt;.NET MAUI developer tips&lt;/li&gt;&lt;li&gt;What's new in .NET MAUI?&lt;/li&gt;&lt;li&gt;Less-known but amazing features in .NET MAUI&lt;/li&gt;&lt;li&gt;Integration of .NET MAUI with other platforms&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;All contributions related to .NET MAUI are welcome, even if you have been developing with this technology for a short time, for sure you have some tips or experience to share.&lt;/p&gt;&lt;p&gt;In case you don't have any platform where to publish your content, there are several free alternatives such as wordpress.com, GitHub pages, dev.to, medium and many more.&lt;/p&gt;&lt;p&gt;Thanks in advance to those who wish to contribute to this initiative. We hope that you enjoy and learn a lot!&lt;/p&gt;&lt;p&gt;One more thing…&lt;/p&gt;&lt;p&gt;Check the Advent Calendars of other technologies which include amazing community contributions too:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://dev.to/icebeam7/azure-advent-calendar-english-2023-3g0l&quot;&gt;Azure in English&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://dev.to/icebeam7/calendario-de-adviento-azure-espanol-2023-a83&quot;&gt;Azure in Spanish&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://devs.school/net-maui-advent-calendar-23/&quot;&gt;.NET MAUI in Spanish&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://dev.to/ppiova/advent-artificial-intelligence-2881&quot;&gt;Artificial Intelligence in English&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://dev.to/ppiova/adviento-inteligencia-artificial-48aj&quot;&gt;Artificial Intelligence in Spanish&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://dev.to/rostanker/advent-power-platform-fm7&quot;&gt;Power Platform in English&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://dev.to/rostanker/adviento-power-platform-5450&quot;&gt;Power Platform in Spanish&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;						&lt;/div&gt;
				&lt;/div&gt;
				&lt;div class=&quot;elementor-element elementor-element-6a2b9c3 uael-header-sticky-no uael-border-yes elementor-widget elementor-widget-uael-table&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
			&lt;div class=&quot;uael-table-wrapper&quot;&gt;
		&lt;table id=&quot;uael-table-id-6a2b9c3&quot; class=&quot;uael-text-break uael-column-rules uael-table&quot;&gt;
				&lt;thead&gt;
										&lt;tr class=&quot;uael-table-row&quot;&gt;
													&lt;th class=&quot;sort-this elementor-repeater-item-e5c1e58 uael-table-col uael-table-head-cell-text&quot; scope=&quot;col&quot;&gt;
							&lt;span class=&quot;sort-style&quot;&gt;
							&lt;span class=&quot;uael-table__text&quot;&gt;
																																		&lt;span class=&quot;uael-table__text-inner&quot;&gt;Date&lt;/span&gt;

																																	&lt;/span&gt;
														&lt;/span&gt;
						&lt;/th&gt;
												&lt;th class=&quot;sort-this elementor-repeater-item-ca623ec uael-table-col uael-table-head-cell-text&quot; scope=&quot;col&quot;&gt;
							&lt;span class=&quot;sort-style&quot;&gt;
							&lt;span class=&quot;uael-table__text&quot;&gt;
																																		&lt;span class=&quot;uael-table__text-inner&quot;&gt;Requested By&lt;/span&gt;

																																	&lt;/span&gt;
														&lt;/span&gt;
						&lt;/th&gt;
												&lt;th class=&quot;sort-this elementor-repeater-item-7d7246a uael-table-col uael-table-head-cell-text&quot; scope=&quot;col&quot;&gt;
							&lt;span class=&quot;sort-style&quot;&gt;
							&lt;span class=&quot;uael-table__text&quot;&gt;
																																		&lt;span class=&quot;uael-table__text-inner&quot;&gt;Topic&lt;/span&gt;

																																	&lt;/span&gt;
														&lt;/span&gt;
						&lt;/th&gt;
								&lt;/tr&gt;&lt;/thead&gt;
				&lt;tbody&gt;
			
										&lt;tr class=&quot;uael-table-row&quot;&gt;
																	&lt;td class=&quot;uael-table-col uael-table-body-cell-text elementor-repeater-item-922c184&quot;&gt;
															&lt;span class=&quot;uael-table__text&quot;&gt;
																																					&lt;span class=&quot;uael-table__text-inner&quot;&gt;Dec 1&lt;/span&gt;
																																				&lt;/span&gt;
													&lt;/td&gt;
													&lt;td class=&quot;uael-table-col uael-table-body-cell-text elementor-repeater-item-96f3419&quot;&gt;
															&lt;span class=&quot;uael-table__text&quot;&gt;
																																					&lt;span class=&quot;uael-table__text-inner&quot;&gt;Luis Beltrán&lt;/span&gt;
																																				&lt;/span&gt;
													&lt;/td&gt;
													&lt;td class=&quot;uael-table-col uael-table-body-cell-text elementor-repeater-item-3193a46&quot;&gt;
														&lt;a href=&quot;https://dev.to/icebeam7/storing-local-data-in-a-net-maui-blazor-hybrid-app-using-indexeddb-part-1-3hn2&quot;&gt;
															&lt;span class=&quot;uael-table__text&quot;&gt;
																																					&lt;span class=&quot;uael-table__text-inner&quot;&gt;Storing local data in a .NET MAUI Blazor Hybrid App using IndexedDB - Part 1&lt;/span&gt;
																																				&lt;/span&gt;
														&lt;/a&gt;
													&lt;/td&gt;
														&lt;/tr&gt;&lt;tr class=&quot;uael-table-row&quot;&gt;
																		&lt;td class=&quot;uael-table-col uael-table-body-cell-text elementor-repeater-item-1e17bdf&quot;&gt;
															&lt;span class=&quot;uael-table__text&quot;&gt;
																																					&lt;span class=&quot;uael-table__text-inner&quot;&gt;Dec 4&lt;/span&gt;
																																				&lt;/span&gt;
													&lt;/td&gt;
													&lt;td class=&quot;uael-table-col uael-table-body-cell-text elementor-repeater-item-1137abb&quot;&gt;
															&lt;span class=&quot;uael-table__text&quot;&gt;
																																					&lt;span class=&quot;uael-table__text-inner&quot;&gt;Héctor Pérez&lt;/span&gt;
																																				&lt;/span&gt;
													&lt;/td&gt;
													&lt;td class=&quot;uael-table-col uael-table-body-cell-text elementor-repeater-item-ee0bc9c&quot;&gt;
														&lt;a href=&quot;https://youtu.be/h2-1dhFzjI8&quot;&gt;
															&lt;span class=&quot;uael-table__text&quot;&gt;
																																					&lt;span class=&quot;uael-table__text-inner&quot;&gt;.NET MAUI + Azure: Magic in Children's Stories&lt;/span&gt;
																																				&lt;/span&gt;
														&lt;/a&gt;
													&lt;/td&gt;
														&lt;/tr&gt;&lt;tr class=&quot;uael-table-row&quot;&gt;
																		&lt;td class=&quot;uael-table-col uael-table-body-cell-text elementor-repeater-item-d21abeb&quot;&gt;
															&lt;span class=&quot;uael-table__text&quot;&gt;
																																					&lt;span class=&quot;uael-table__text-inner&quot;&gt;Dec 5&lt;/span&gt;
																																				&lt;/span&gt;
													&lt;/td&gt;
													&lt;td class=&quot;uael-table-col uael-table-body-cell-text elementor-repeater-item-7b19728&quot;&gt;
															&lt;span class=&quot;uael-table__text&quot;&gt;
																																					&lt;span class=&quot;uael-table__text-inner&quot;&gt;Enis Necipoglu
&lt;/span&gt;
																																				&lt;/span&gt;
													&lt;/td&gt;
													&lt;td class=&quot;uael-table-col uael-table-body-cell-text elementor-repeater-item-4069216&quot;&gt;
														&lt;a href=&quot;https://www.youtube.com/watch?v=OUPiPGqotMc&quot;&gt;
															&lt;span class=&quot;uael-table__text&quot;&gt;
																																					&lt;span class=&quot;uael-table__text-inner&quot;&gt;MAUI TreeView Implementation with UraniumUI
&lt;/span&gt;
																																				&lt;/span&gt;
														&lt;/a&gt;
													&lt;/td&gt;
														&lt;/tr&gt;&lt;tr class=&quot;uael-table-row&quot;&gt;
																		&lt;td class=&quot;uael-table-col uael-table-body-cell-text elementor-repeater-item-50fca89&quot;&gt;
															&lt;span class=&quot;uael-table__text&quot;&gt;
																																					&lt;span class=&quot;uael-table__text-inner&quot;&gt;Dec 6&lt;/span&gt;
																																				&lt;/span&gt;
													&lt;/td&gt;
													&lt;td class=&quot;uael-table-col uael-table-body-cell-text elementor-repeater-item-5492a08&quot;&gt;
															&lt;span class=&quot;uael-table__text&quot;&gt;
																																					&lt;span class=&quot;uael-table__text-inner&quot;&gt;Maddy Montaquila&lt;/span&gt;
																																				&lt;/span&gt;
													&lt;/td&gt;
													&lt;td class=&quot;uael-table-col uael-table-body-cell-text elementor-repeater-item-3893237&quot;&gt;
														&lt;a href=&quot;https://www.youtube.com/watch?v=hdZgsRBIoes&quot;&gt;
															&lt;span class=&quot;uael-table__text&quot;&gt;
																																					&lt;span class=&quot;uael-table__text-inner&quot;&gt;Customizing your labels with FormattedText | .NET MAUI Minutes&lt;/span&gt;
																																				&lt;/span&gt;
														&lt;/a&gt;
													&lt;/td&gt;
														&lt;/tr&gt;&lt;tr class=&quot;uael-table-row&quot;&gt;
																		&lt;td class=&quot;uael-table-col uael-table-body-cell-text elementor-repeater-item-7d91208&quot;&gt;
															&lt;span class=&quot;uael-table__text&quot;&gt;
																																					&lt;span class=&quot;uael-table__text-inner&quot;&gt;Dec 7&lt;/span&gt;
																																				&lt;/span&gt;
													&lt;/td&gt;
													&lt;td class=&quot;uael-table-col uael-table-body-cell-text elementor-repeater-item-271ba32&quot;&gt;
															&lt;span class=&quot;uael-table__text&quot;&gt;
																																					&lt;span class=&quot;uael-table__text-inner&quot;&gt;&lt;/span&gt;
																																				&lt;/span&gt;
													&lt;/td&gt;
													&lt;td class=&quot;uael-table-col uael-table-body-cell-text elementor-repeater-item-1c39a42&quot;&gt;
															&lt;span class=&quot;uael-table__text&quot;&gt;
																																					&lt;span class=&quot;uael-table__text-inner&quot;&gt;&lt;/span&gt;
																																				&lt;/span&gt;
													&lt;/td&gt;
														&lt;/tr&gt;&lt;tr class=&quot;uael-table-row&quot;&gt;
																		&lt;td class=&quot;uael-table-col uael-table-body-cell-text elementor-repeater-item-c6ebcba&quot;&gt;
															&lt;span class=&quot;uael-table__text&quot;&gt;
																																					&lt;span class=&quot;uael-table__text-inner&quot;&gt;Dec 8&lt;/span&gt;
																																				&lt;/span&gt;
													&lt;/td&gt;
													&lt;td class=&quot;uael-table-col uael-table-body-cell-text elementor-repeater-item-fe55d1a&quot;&gt;
															&lt;span class=&quot;uael-table__text&quot;&gt;
																																					&lt;span class=&quot;uael-table__text-inner&quot;&gt;&lt;/span&gt;
																																				&lt;/span&gt;
													&lt;/td&gt;
													&lt;td class=&quot;uael-table-col uael-table-body-cell-text elementor-repeater-item-96fdaa9&quot;&gt;
															&lt;span class=&quot;uael-table__text&quot;&gt;
																																					&lt;span class=&quot;uael-table__text-inner&quot;&gt;&lt;/span&gt;
																																				&lt;/span&gt;
													&lt;/td&gt;
														&lt;/tr&gt;&lt;tr class=&quot;uael-table-row&quot;&gt;
																		&lt;td class=&quot;uael-table-col uael-table-body-cell-text elementor-repeater-item-89448ff&quot;&gt;
															&lt;span class=&quot;uael-table__text&quot;&gt;
																																					&lt;span class=&quot;uael-table__text-inner&quot;&gt;Dec 11&lt;/span&gt;
																																				&lt;/span&gt;
													&lt;/td&gt;
													&lt;td class=&quot;uael-table-col uael-table-body-cell-text elementor-repeater-item-4c38884&quot;&gt;
															&lt;span class=&quot;uael-table__text&quot;&gt;
																																					&lt;span class=&quot;uael-table__text-inner&quot;&gt;&lt;/span&gt;
																																				&lt;/span&gt;
													&lt;/td&gt;
													&lt;td class=&quot;uael-table-col uael-table-body-cell-text elementor-repeater-item-510c1f2&quot;&gt;
															&lt;span class=&quot;uael-table__text&quot;&gt;
																																					&lt;span class=&quot;uael-table__text-inner&quot;&gt;&lt;/span&gt;
																																				&lt;/span&gt;
													&lt;/td&gt;
														&lt;/tr&gt;&lt;tr class=&quot;uael-table-row&quot;&gt;
																		&lt;td class=&quot;uael-table-col uael-table-body-cell-text elementor-repeater-item-853d774&quot;&gt;
															&lt;span class=&quot;uael-table__text&quot;&gt;
																																					&lt;span class=&quot;uael-table__text-inner&quot;&gt;Dec 12&lt;/span&gt;
																																				&lt;/span&gt;
													&lt;/td&gt;
													&lt;td class=&quot;uael-table-col uael-table-body-cell-text elementor-repeater-item-33a21f8&quot;&gt;
															&lt;span class=&quot;uael-table__text&quot;&gt;
																																					&lt;span class=&quot;uael-table__text-inner&quot;&gt;&lt;/span&gt;
																																				&lt;/span&gt;
													&lt;/td&gt;
													&lt;td class=&quot;uael-table-col uael-table-body-cell-text elementor-repeater-item-0b913b7&quot;&gt;
															&lt;span class=&quot;uael-table__text&quot;&gt;
																																					&lt;span class=&quot;uael-table__text-inner&quot;&gt;&lt;/span&gt;
																																				&lt;/span&gt;
													&lt;/td&gt;
														&lt;/tr&gt;&lt;tr class=&quot;uael-table-row&quot;&gt;
																		&lt;td class=&quot;uael-table-col uael-table-body-cell-text elementor-repeater-item-54e9300&quot;&gt;
															&lt;span class=&quot;uael-table__text&quot;&gt;
																																					&lt;span class=&quot;uael-table__text-inner&quot;&gt;Dec 13&lt;/span&gt;
																																				&lt;/span&gt;
													&lt;/td&gt;
													&lt;td class=&quot;uael-table-col uael-table-body-cell-text elementor-repeater-item-1152f43&quot;&gt;
															&lt;span class=&quot;uael-table__text&quot;&gt;
																																					&lt;span class=&quot;uael-table__text-inner&quot;&gt;&lt;/span&gt;
																																				&lt;/span&gt;
													&lt;/td&gt;
													&lt;td class=&quot;uael-table-col uael-table-body-cell-text elementor-repeater-item-dca90ac&quot;&gt;
															&lt;span class=&quot;uael-table__text&quot;&gt;
																																					&lt;span class=&quot;uael-table__text-inner&quot;&gt;&lt;/span&gt;
																																				&lt;/span&gt;
													&lt;/td&gt;
														&lt;/tr&gt;&lt;tr class=&quot;uael-table-row&quot;&gt;
																		&lt;td class=&quot;uael-table-col uael-table-body-cell-text elementor-repeater-item-d4a8650&quot;&gt;
															&lt;span class=&quot;uael-table__text&quot;&gt;
																																					&lt;span class=&quot;uael-table__text-inner&quot;&gt;Dec 14&lt;/span&gt;
																																				&lt;/span&gt;
													&lt;/td&gt;
													&lt;td class=&quot;uael-table-col uael-table-body-cell-text elementor-repeater-item-6b9f60c&quot;&gt;
															&lt;span class=&quot;uael-table__text&quot;&gt;
																																					&lt;span class=&quot;uael-table__text-inner&quot;&gt;&lt;/span&gt;
																																				&lt;/span&gt;
													&lt;/td&gt;
													&lt;td class=&quot;uael-table-col uael-table-body-cell-text elementor-repeater-item-ced5198&quot;&gt;
															&lt;span class=&quot;uael-table__text&quot;&gt;
																																					&lt;span class=&quot;uael-table__text-inner&quot;&gt;&lt;/span&gt;
																																				&lt;/span&gt;
													&lt;/td&gt;
														&lt;/tr&gt;&lt;tr class=&quot;uael-table-row&quot;&gt;
																		&lt;td class=&quot;uael-table-col uael-table-body-cell-text elementor-repeater-item-84301dd&quot;&gt;
															&lt;span class=&quot;uael-table__text&quot;&gt;
																																					&lt;span class=&quot;uael-table__text-inner&quot;&gt;Dec 15&lt;/span&gt;
																																				&lt;/span&gt;
													&lt;/td&gt;
													&lt;td class=&quot;uael-table-col uael-table-body-cell-text elementor-repeater-item-8b29297&quot;&gt;
															&lt;span class=&quot;uael-table__text&quot;&gt;
																																					&lt;span class=&quot;uael-table__text-inner&quot;&gt;&lt;/span&gt;
																																				&lt;/span&gt;
													&lt;/td&gt;
													&lt;td class=&quot;uael-table-col uael-table-body-cell-text elementor-repeater-item-8fa4e39&quot;&gt;
															&lt;span class=&quot;uael-table__text&quot;&gt;
																																					&lt;span class=&quot;uael-table__text-inner&quot;&gt;&lt;/span&gt;
																																				&lt;/span&gt;
													&lt;/td&gt;
														&lt;/tr&gt;&lt;tr class=&quot;uael-table-row&quot;&gt;
																		&lt;td class=&quot;uael-table-col uael-table-body-cell-text elementor-repeater-item-88ee951&quot;&gt;
															&lt;span class=&quot;uael-table__text&quot;&gt;
																																					&lt;span class=&quot;uael-table__text-inner&quot;&gt;Dec 18&lt;/span&gt;
																																				&lt;/span&gt;
													&lt;/td&gt;
													&lt;td class=&quot;uael-table-col uael-table-body-cell-text elementor-repeater-item-98330fb&quot;&gt;
															&lt;span class=&quot;uael-table__text&quot;&gt;
																																					&lt;span class=&quot;uael-table__text-inner&quot;&gt;&lt;/span&gt;
																																				&lt;/span&gt;
													&lt;/td&gt;
													&lt;td class=&quot;uael-table-col uael-table-body-cell-text elementor-repeater-item-a5ce7f6&quot;&gt;
															&lt;span class=&quot;uael-table__text&quot;&gt;
																																					&lt;span class=&quot;uael-table__text-inner&quot;&gt;&lt;/span&gt;
																																				&lt;/span&gt;
													&lt;/td&gt;
														&lt;/tr&gt;&lt;tr class=&quot;uael-table-row&quot;&gt;
																		&lt;td class=&quot;uael-table-col uael-table-body-cell-text elementor-repeater-item-ee169e7&quot;&gt;
															&lt;span class=&quot;uael-table__text&quot;&gt;
																																					&lt;span class=&quot;uael-table__text-inner&quot;&gt;Dec 19&lt;/span&gt;
																																				&lt;/span&gt;
													&lt;/td&gt;
													&lt;td class=&quot;uael-table-col uael-table-body-cell-text elementor-repeater-item-753ec7d&quot;&gt;
															&lt;span class=&quot;uael-table__text&quot;&gt;
																																					&lt;span class=&quot;uael-table__text-inner&quot;&gt;&lt;/span&gt;
																																				&lt;/span&gt;
													&lt;/td&gt;
													&lt;td class=&quot;uael-table-col uael-table-body-cell-text elementor-repeater-item-c908061&quot;&gt;
															&lt;span class=&quot;uael-table__text&quot;&gt;
																																					&lt;span class=&quot;uael-table__text-inner&quot;&gt;&lt;/span&gt;
																																				&lt;/span&gt;
													&lt;/td&gt;
														&lt;/tr&gt;&lt;tr class=&quot;uael-table-row&quot;&gt;
																		&lt;td class=&quot;uael-table-col uael-table-body-cell-text elementor-repeater-item-266a9b3&quot;&gt;
															&lt;span class=&quot;uael-table__text&quot;&gt;
																																					&lt;span class=&quot;uael-table__text-inner&quot;&gt;Dec 20&lt;/span&gt;
																																				&lt;/span&gt;
													&lt;/td&gt;
													&lt;td class=&quot;uael-table-col uael-table-body-cell-text elementor-repeater-item-e17d524&quot;&gt;
															&lt;span class=&quot;uael-table__text&quot;&gt;
																																					&lt;span class=&quot;uael-table__text-inner&quot;&gt;&lt;/span&gt;
																																				&lt;/span&gt;
													&lt;/td&gt;
													&lt;td class=&quot;uael-table-col uael-table-body-cell-text elementor-repeater-item-5d0c9b8&quot;&gt;
															&lt;span class=&quot;uael-table__text&quot;&gt;
																																					&lt;span class=&quot;uael-table__text-inner&quot;&gt;&lt;/span&gt;
																																				&lt;/span&gt;
													&lt;/td&gt;
														&lt;/tr&gt;&lt;tr class=&quot;uael-table-row&quot;&gt;
																		&lt;td class=&quot;uael-table-col uael-table-body-cell-text elementor-repeater-item-3b8f1e9&quot;&gt;
															&lt;span class=&quot;uael-table__text&quot;&gt;
																																					&lt;span class=&quot;uael-table__text-inner&quot;&gt;Dec 21&lt;/span&gt;
																																				&lt;/span&gt;
													&lt;/td&gt;
													&lt;td class=&quot;uael-table-col uael-table-body-cell-text elementor-repeater-item-faf9b8f&quot;&gt;
															&lt;span class=&quot;uael-table__text&quot;&gt;
																																					&lt;span class=&quot;uael-table__text-inner&quot;&gt;&lt;/span&gt;
																																				&lt;/span&gt;
													&lt;/td&gt;
													&lt;td class=&quot;uael-table-col uael-table-body-cell-text elementor-repeater-item-f94dbe8&quot;&gt;
															&lt;span class=&quot;uael-table__text&quot;&gt;
																																					&lt;span class=&quot;uael-table__text-inner&quot;&gt;&lt;/span&gt;
																																				&lt;/span&gt;
													&lt;/td&gt;
														&lt;/tr&gt;&lt;tr class=&quot;uael-table-row&quot;&gt;
																		&lt;td class=&quot;uael-table-col uael-table-body-cell-text elementor-repeater-item-9747129&quot;&gt;
															&lt;span class=&quot;uael-table__text&quot;&gt;
																																					&lt;span class=&quot;uael-table__text-inner&quot;&gt;Dec 22&lt;/span&gt;
																																				&lt;/span&gt;
													&lt;/td&gt;
													&lt;td class=&quot;uael-table-col uael-table-body-cell-text elementor-repeater-item-2c6027b&quot;&gt;
															&lt;span class=&quot;uael-table__text&quot;&gt;
																																					&lt;span class=&quot;uael-table__text-inner&quot;&gt;&lt;/span&gt;
																																				&lt;/span&gt;
													&lt;/td&gt;
													&lt;td class=&quot;uael-table-col uael-table-body-cell-text elementor-repeater-item-ce30ae1&quot;&gt;
															&lt;span class=&quot;uael-table__text&quot;&gt;
																																					&lt;span class=&quot;uael-table__text-inner&quot;&gt;&lt;/span&gt;
																																				&lt;/span&gt;
													&lt;/td&gt;
														&lt;/tr&gt;&lt;tr class=&quot;uael-table-row&quot;&gt;
																		&lt;td class=&quot;uael-table-col uael-table-body-cell-text elementor-repeater-item-70f894a&quot;&gt;
															&lt;span class=&quot;uael-table__text&quot;&gt;
																																					&lt;span class=&quot;uael-table__text-inner&quot;&gt;Dec 25&lt;/span&gt;
																																				&lt;/span&gt;
													&lt;/td&gt;
													&lt;td class=&quot;uael-table-col uael-table-body-cell-text elementor-repeater-item-b52fac3&quot;&gt;
															&lt;span class=&quot;uael-table__text&quot;&gt;
																																					&lt;span class=&quot;uael-table__text-inner&quot;&gt;&lt;/span&gt;
																																				&lt;/span&gt;
													&lt;/td&gt;
													&lt;td class=&quot;uael-table-col uael-table-body-cell-text elementor-repeater-item-f88cb77&quot;&gt;
															&lt;span class=&quot;uael-table__text&quot;&gt;
																																					&lt;span class=&quot;uael-table__text-inner&quot;&gt;&lt;/span&gt;
																																				&lt;/span&gt;
													&lt;/td&gt;
														&lt;/tr&gt;&lt;tr class=&quot;uael-table-row&quot;&gt;
																		&lt;td class=&quot;uael-table-col uael-table-body-cell-text elementor-repeater-item-39f68ff&quot;&gt;
															&lt;span class=&quot;uael-table__text&quot;&gt;
																																					&lt;span class=&quot;uael-table__text-inner&quot;&gt;Dec 26&lt;/span&gt;
																																				&lt;/span&gt;
													&lt;/td&gt;
													&lt;td class=&quot;uael-table-col uael-table-body-cell-text elementor-repeater-item-bd45cef&quot;&gt;
															&lt;span class=&quot;uael-table__text&quot;&gt;
																																					&lt;span class=&quot;uael-table__text-inner&quot;&gt;&lt;/span&gt;
																																				&lt;/span&gt;
													&lt;/td&gt;
													&lt;td class=&quot;uael-table-col uael-table-body-cell-text elementor-repeater-item-76514c7&quot;&gt;
															&lt;span class=&quot;uael-table__text&quot;&gt;
																																					&lt;span class=&quot;uael-table__text-inner&quot;&gt;&lt;/span&gt;
																																				&lt;/span&gt;
													&lt;/td&gt;
														&lt;/tr&gt;&lt;tr class=&quot;uael-table-row&quot;&gt;
																		&lt;td class=&quot;uael-table-col uael-table-body-cell-text elementor-repeater-item-e7948da&quot;&gt;
															&lt;span class=&quot;uael-table__text&quot;&gt;
																																					&lt;span class=&quot;uael-table__text-inner&quot;&gt;Dec 27&lt;/span&gt;
																																				&lt;/span&gt;
													&lt;/td&gt;
													&lt;td class=&quot;uael-table-col uael-table-body-cell-text elementor-repeater-item-a8f7c3c&quot;&gt;
															&lt;span class=&quot;uael-table__text&quot;&gt;
																																					&lt;span class=&quot;uael-table__text-inner&quot;&gt;&lt;/span&gt;
																																				&lt;/span&gt;
													&lt;/td&gt;
													&lt;td class=&quot;uael-table-col uael-table-body-cell-text elementor-repeater-item-7d86fa9&quot;&gt;
															&lt;span class=&quot;uael-table__text&quot;&gt;
																																					&lt;span class=&quot;uael-table__text-inner&quot;&gt;&lt;/span&gt;
																																				&lt;/span&gt;
													&lt;/td&gt;
														&lt;/tr&gt;&lt;tr class=&quot;uael-table-row&quot;&gt;
																		&lt;td class=&quot;uael-table-col uael-table-body-cell-text elementor-repeater-item-71039c9&quot;&gt;
															&lt;span class=&quot;uael-table__text&quot;&gt;
																																					&lt;span class=&quot;uael-table__text-inner&quot;&gt;Dec 28&lt;/span&gt;
																																				&lt;/span&gt;
													&lt;/td&gt;
													&lt;td class=&quot;uael-table-col uael-table-body-cell-text elementor-repeater-item-19e3b64&quot;&gt;
															&lt;span class=&quot;uael-table__text&quot;&gt;
																																					&lt;span class=&quot;uael-table__text-inner&quot;&gt;&lt;/span&gt;
																																				&lt;/span&gt;
													&lt;/td&gt;
													&lt;td class=&quot;uael-table-col uael-table-body-cell-text elementor-repeater-item-9603a25&quot;&gt;
															&lt;span class=&quot;uael-table__text&quot;&gt;
																																					&lt;span class=&quot;uael-table__text-inner&quot;&gt;&lt;/span&gt;
																																				&lt;/span&gt;
													&lt;/td&gt;
														&lt;/tr&gt;&lt;tr class=&quot;uael-table-row&quot;&gt;
																		&lt;td class=&quot;uael-table-col uael-table-body-cell-text elementor-repeater-item-e32fd79&quot;&gt;
															&lt;span class=&quot;uael-table__text&quot;&gt;
																																					&lt;span class=&quot;uael-table__text-inner&quot;&gt;Dec 29&lt;/span&gt;
																																				&lt;/span&gt;
													&lt;/td&gt;
													&lt;td class=&quot;uael-table-col uael-table-body-cell-text elementor-repeater-item-b298bbb&quot;&gt;
															&lt;span class=&quot;uael-table__text&quot;&gt;
																																					&lt;span class=&quot;uael-table__text-inner&quot;&gt;&lt;/span&gt;
																																				&lt;/span&gt;
													&lt;/td&gt;
													&lt;td class=&quot;uael-table-col uael-table-body-cell-text elementor-repeater-item-5e21524&quot;&gt;
															&lt;span class=&quot;uael-table__text&quot;&gt;
																																					&lt;span class=&quot;uael-table__text-inner&quot;&gt;&lt;/span&gt;
																																				&lt;/span&gt;
													&lt;/td&gt;
									&lt;/tr&gt;&lt;/tbody&gt;
	&lt;/table&gt;
		&lt;/div&gt;
		&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
							&lt;/div&gt;
		</content:encoded></item><item><title>How to build a story generator application for children with .NET MAUI and Microsoft Azure</title><link>https://devs.school/story-generator/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=story-generator</link><guid isPermaLink="false">https://devs.school/?p=8865</guid><pubDate>Sat, 11 Nov 2023 15:46:10 GMT</pubDate><description>✅ In this post, I will show you in more detail how I created the story generator application for children, as well as additional resources and source code.</description><content:encoded>		&lt;div class=&quot;elementor elementor-8865&quot;&gt;
									&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-327eba6 elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-2d99971&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-e1c7183 elementor-widget elementor-widget-text-editor&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
							&lt;p&gt;In this post, I will show you in more detail how I created the story generator application for children, as well as additional resources and source code. Let's get started!&lt;/p&gt;						&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-c4d2253 elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-a411a56&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-42f4223 uael-aspect-ratio-16_9 uael-youtube-subscribe-no elementor-widget elementor-widget-uael-video&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
							&lt;div class=&quot;uael-video__outer-wrap uael-video-type-youtube uael-video-play-lightbox&quot;&gt;
						&lt;div class=&quot;uael-video-inner-wrap&quot;&gt;
				&lt;figure class=&quot;migration-video&quot;&gt;&lt;iframe src=&quot;https://www.youtube-nocookie.com/embed/2cksH4FBizo&quot; title=&quot;YouTube video&quot; loading=&quot;lazy&quot; allowfullscreen=&quot;&quot; referrerpolicy=&quot;strict-origin-when-cross-origin&quot; sandbox=&quot;allow-scripts allow-same-origin allow-presentation&quot; allow=&quot;accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture; fullscreen&quot;&gt;&lt;/iframe&gt;&lt;/figure&gt;
											&lt;/div&gt;
		&lt;/div&gt;
					&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-f0f0af8 elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-e0cbd35&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-f2020d8 elementor-widget elementor-widget-heading&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
			&lt;h2 class=&quot;elementor-heading-title elementor-size-default&quot; id=&quot;first-step-of-the-application&quot;&gt;First step of the application&lt;/h2&gt;		&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-6243de6 elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-13dfec5&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-4aa4334 elementor-widget elementor-widget-text-editor&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
							&lt;p&gt;In the .NET CONF video, I showed that the application was created in 5 different steps. The first step was to create the parallax effect. I found this idea very interesting to be applied in an application for children. Searching if someone had done something similar in Xamarin / .NET MAUI, I was able to find an example from ValonK:&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/ValonK/Xamarin.Forms.Parallax&quot;&gt;https://github.com/ValonK/Xamarin.Forms.Parallax&lt;/a&gt;&lt;/p&gt;&lt;p&gt;In my case, after searching the internet, I ended up using the Accelerometer and creating some additional methods to delimit how much the images can move within their space, as well as to indicate the speed of movement:&lt;/p&gt;						&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-389122c elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-eda0c59&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-4f714c1 elementor-widget elementor-widget-code-highlight&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
					&lt;div class=&quot;prismjs-okaidia copy-to-clipboard&quot;&gt;
			&lt;pre class=&quot;highlight-height language-csharp line-numbers&quot;&gt;
				&lt;code class=&quot;language-csharp&quot;&gt;
					&lt;span class=&quot;legacy-code-literal&quot;&gt;    private double LimitTranslation(double translation, double imageSize, double containerSize)
    {
        double maxTranslation = imageSize - containerSize;
        if (maxTranslation &amp;lt; 0)
            return 0;
        return Math.Max(-maxTranslation, Math.Min(translation, maxTranslation));
    }
    
    public async Task TranslateImage(Image image, double xTranslationFactor, double yTranslationFactor, uint length, double maxWidth, double maxHeight)
    {
        double xTranslation = LimitTranslation(xTranslationFactor, image.Width, maxWidth);
        double yTranslation = LimitTranslation(yTranslationFactor, image.Height, maxHeight);
        await image.TranslateTo(xTranslation, yTranslation, length);
    }&lt;/span&gt;
				&lt;/code&gt;
			&lt;/pre&gt;
		&lt;/div&gt;
				&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-ecc6172 elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-8fdf2cd&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-dbe1d57 elementor-widget elementor-widget-heading&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
			&lt;h2 class=&quot;elementor-heading-title elementor-size-default&quot; id=&quot;second-step-of-the-application&quot;&gt;Second step of the application&lt;/h2&gt;		&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-7dbcf2c elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-5a44ffa&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-612d751 elementor-widget elementor-widget-text-editor&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
							&lt;p&gt;The second step for the creation of the application, was to create a class that allowed to add gradients to a button, but that could have an animated effect. I have to admit that this step was a bit complicated, since I have not found until today, any similar reference for .NET MAUI (using a custom animation).&lt;/p&gt;&lt;p&gt;I started creating some simple animations, until I came to the perfect animation, at least for me, that allows you to add as many gradients as you want and iterate through them in the time you specify. This allows you to control how fast the transitions between gradients happen.&lt;/p&gt;&lt;p&gt;The great advantage of having created an extension class that receives a VisualElement, is that it can be applied to any control that inherits from this type, i.e., it can be layouts, controls, etc. This is an example of an animation as the background of a ContentPage:&lt;/p&gt;						&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-a8ec068 elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-4295ab5&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-ea68e47 elementor-widget elementor-widget-image&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
															&lt;img width=&quot;909&quot; height=&quot;549&quot; class=&quot;attachment-large size-large&quot; alt=&quot;.NET MAUI dynamic gradient&quot; src=&quot;https://devs.school/wp-content/uploads/2023/11/GradientTests1_Zwwlk5mIjm-2.gif&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;															&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-e7b1a21 elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-a73e5dd&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-8be8619 elementor-widget elementor-widget-heading&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
			&lt;h2 class=&quot;elementor-heading-title elementor-size-default&quot; id=&quot;third-step-of-the-application&quot;&gt;Third step of the application&lt;/h2&gt;		&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-bdc4d35 elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-6fac2c9&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-d86ad3a elementor-widget elementor-widget-text-editor&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
							&lt;p&gt;The third part, consists of adding an animation that lets the user know that his story is being generated. Since I wanted to have a fully customized page, I decided to use &lt;a href=&quot;https://github.com/LuckyDucko/Mopups&quot;&gt;Mopups&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;For this step, I have to thank &lt;a href=&quot;https://lottiefiles.com/animations/story-icon-HfBSNoVBbD&quot;&gt;Ahmad Halawani&lt;/a&gt;, for creating the beautiful animation you can see below:&lt;/p&gt;&lt;p&gt; &lt;/p&gt;						&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-9ce7be7 elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-273556d&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-ee14b97 elementor-widget elementor-widget-image&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
															&lt;img width=&quot;150&quot; height=&quot;150&quot; class=&quot;attachment-large size-large&quot; alt=&quot;&quot; src=&quot;https://devs.school/wp-content/uploads/2023/11/Animation-1698866607921.gif&quot; srcset=&quot;https://devs.school/wp-content/uploads/2023/11/Animation-1698866607921.gif 150w, https://devs.school/wp-content/uploads/2023/11/Animation-1698866607921-70x70.gif 70w, https://devs.school/wp-content/uploads/2023/11/Animation-1698866607921-16x16.gif 16w, https://devs.school/wp-content/uploads/2023/11/Animation-1698866607921-40x40.gif 40w, https://devs.school/wp-content/uploads/2023/11/Animation-1698866607921-60x60.gif 60w, https://devs.school/wp-content/uploads/2023/11/Animation-1698866607921-18x18.gif 18w, https://devs.school/wp-content/uploads/2023/11/Animation-1698866607921-20x20.gif 20w&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;															&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-1513463 elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-f321ccf&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-74e3998 elementor-widget elementor-widget-text-editor&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
							&lt;p&gt;If you want a quick reference on how to use the package, Gerald Versluis has a very good video on the subject: &lt;/p&gt;						&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-f6a22e5 elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-7e203ad&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-ffdc92c uael-aspect-ratio-16_9 uael-youtube-subscribe-no elementor-widget elementor-widget-uael-video&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
							&lt;div class=&quot;uael-video__outer-wrap uael-video-type-youtube uael-video-play-lightbox&quot;&gt;
						&lt;div class=&quot;uael-video-inner-wrap&quot;&gt;
				&lt;figure class=&quot;migration-video&quot;&gt;&lt;iframe src=&quot;https://www.youtube-nocookie.com/embed/OGWhgASmSto&quot; title=&quot;YouTube video&quot; loading=&quot;lazy&quot; allowfullscreen=&quot;&quot; referrerpolicy=&quot;strict-origin-when-cross-origin&quot; sandbox=&quot;allow-scripts allow-same-origin allow-presentation&quot; allow=&quot;accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture; fullscreen&quot;&gt;&lt;/iframe&gt;&lt;/figure&gt;
											&lt;/div&gt;
		&lt;/div&gt;
					&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-6be82f0 elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-b251050&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-c0985fd elementor-widget elementor-widget-text-editor&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
							&lt;p&gt;Similarly, I added an animation to the Label control to have an effect where the opacity decreases and increases, to give feedback to the user that their story is being created:&lt;/p&gt;						&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-c6f5eb2 elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-e0164db&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-3ea71f8 elementor-widget elementor-widget-code-highlight&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
					&lt;div class=&quot;prismjs-okaidia copy-to-clipboard&quot;&gt;
			&lt;pre class=&quot;highlight-height language-javascript line-numbers&quot;&gt;
				&lt;code class=&quot;language-javascript&quot;&gt;
					&lt;span class=&quot;legacy-code-literal&quot;&gt;    void StartAnimation()
    {
        var isFadingIn = false;
        Action&amp;lt;double&amp;gt; callback = input =&amp;gt; lblMessage.Opacity = input;

        void UpdateState(double value)
        {
            isFadingIn = !isFadingIn;
            var newOpacity = isFadingIn ? 1.0 : 0.5;
            var length = TimeSpan.FromSeconds(1);  //Duration of the animation

            //Start the animation
            lblMessage.Animate(&quot;Fade&quot;, callback, lblMessage.Opacity, newOpacity, length: (uint)length.TotalMilliseconds, finished: (v, c) =&amp;gt; UpdateState(newOpacity));
        }

        UpdateState(lblMessage.Opacity);
    }&lt;/span&gt;
				&lt;/code&gt;
			&lt;/pre&gt;
		&lt;/div&gt;
				&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-8d4bbe3 elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-5381eb3&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-3a19065 elementor-widget elementor-widget-heading&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
			&lt;h2 class=&quot;elementor-heading-title elementor-size-default&quot; id=&quot;fourth-step-of-the-application&quot;&gt;Fourth step of the application&lt;/h2&gt;		&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-cd155d5 elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-3a339aa&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-8997e09 elementor-widget elementor-widget-text-editor&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
							&lt;p&gt;The fourth part was to create the player page of the story, which is composed of an image at the top, a custom control that displays the current page of the story, the text of the story and the player controls.&lt;br&gt;The image of the current page is an Image control, which has an associated animation that is executed every time the image changes, through the following code:&lt;/p&gt;						&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-5f731ad elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-5d4d605&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-34dacfd elementor-widget elementor-widget-code-highlight&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
					&lt;div class=&quot;prismjs-okaidia copy-to-clipboard&quot;&gt;
			&lt;pre class=&quot;highlight-height language-javascript line-numbers&quot;&gt;
				&lt;code class=&quot;language-javascript&quot;&gt;
					&lt;span class=&quot;legacy-code-literal&quot;&gt;public StoryView(StoryViewModel storyViewModel)
{
	InitializeComponent();
	BindingContext = storyViewModel;
    image.PropertyChanged += Image_PropertyChanged;
}

private void Image_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
{
    if (e.PropertyName == nameof(Image.Source))
    {
        image.Scale = 1;
        ScaleImage();
    }
}

private void ScaleImage()
{
    var startingScale = image.Scale;
    var endScale = startingScale * 2;
    var length = 60000;

    image.Animate(
        name: &quot;ScaleAnimation&quot;,
        callback: scale =&amp;gt; image.Scale = scale,
        start: startingScale,
        end: endScale,
        length: (uint)length,
        easing: Easing.Linear
    );
}&lt;/span&gt;
				&lt;/code&gt;
			&lt;/pre&gt;
		&lt;/div&gt;
				&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-cf2922d elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-9ee4841&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-db23f57 elementor-widget elementor-widget-text-editor&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
							&lt;p&gt;For the custom control that displays the current page, I used SkiaSharp. &lt;a href=&quot;https://blog.ewers-peters.de/how-to-write-a-custom-control-for-net-maui-using-skiasharp&quot;&gt;Julian Ewers-Peters&lt;/a&gt; has an excellent tutorial on this topic.&lt;br&gt;&lt;br&gt;For the custom control outside the button, which displays the current second of playback, I used a custom control from &lt;a href=&quot;https://javiersuarezruiz.wordpress.com/2018/08/20/xamarin-forms-challenge-pulsemusic/&quot;&gt;Javier Suarez&lt;/a&gt;.&lt;br&gt;&lt;br&gt;Finally, to control the audio playback, I used the &lt;a href=&quot;https://github.com/Baseflow/XamarinMediaManager&quot;&gt;Plugin.MediaManager&lt;/a&gt; package, which fortunately is now compatible with .NET MAUI. I really like this package because it allows to load the stream from a url, and manipulate it to stop it, pause it, etc. In addition, it contains a number of events such as the one that allows to detect when the audio changes to a different second.&lt;/p&gt;						&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-4cdef6c elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-d2eda95&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-b1bb970 elementor-widget elementor-widget-heading&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
			&lt;h2 class=&quot;elementor-heading-title elementor-size-default&quot; id=&quot;fifth-step-of-the-application&quot;&gt;Fifth step of the application&lt;/h2&gt;		&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-9b71f65 elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-610cbb8&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-2172ae6 elementor-widget elementor-widget-text-editor&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
							&lt;p&gt;The fifth and final step is the creation of the ASP.NET Core Web API to take care of all the information generation, and thus avoid placing API Keys in the application directly. For this step I used &lt;a href=&quot;https://github.com/microsoft/semantic-kernel&quot;&gt;Semantic Kernel&lt;/a&gt;, which as I explained in the lecture, is a very versatile SDK that allows you to use both OpenAI and Azure OpenAI service, for the generation of text and images. You can find a lot of information on this topic directly in the project repository, and for the case of image generation, &lt;a href=&quot;https://github.com/microsoft/semantic-kernel/blob/main/dotnet/samples/KernelSyntaxExamples/Example18_DallE.cs&quot;&gt;here&lt;/a&gt; is a concrete example of how to generate images.&lt;/p&gt;&lt;p&gt;For the Text-to-Speech service, I have used the &lt;a href=&quot;https://learn.microsoft.com/en-us/azure/ai-services/speech-service/get-started-text-to-speech?tabs=windows%2Cterminal&amp;amp;pivots=programming-language-csharp&quot;&gt;Microsoft.CognitiveServices.Speech&lt;/a&gt; package for the generation of the streams, and the &lt;a href=&quot;https://learn.microsoft.com/en-us/azure/storage/blobs/storage-blob-upload&quot;&gt;Azure.Storage.Blobs&lt;/a&gt; package for the file upload.&lt;/p&gt;&lt;p&gt;This project has been a lot of fun and with its complexities, but I was happy to prepare a unique demo for this event. I thank the whole team behind the organization for considering me to give the talk and for organizing such a great event.&lt;/p&gt;						&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-70381ef elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-39fb9d6&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-4476589 elementor-widget elementor-widget-template&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
					&lt;div class=&quot;elementor-template&quot;&gt;
					&lt;div class=&quot;elementor elementor-8656&quot;&gt;
									&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-888c14b elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-551f2ca&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-ec2cc06 elementor-widget elementor-widget-template&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
					&lt;div class=&quot;elementor-template&quot;&gt;
					&lt;div class=&quot;elementor elementor-8632&quot;&gt;
									&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-ad17090 ha-particle-yes elementor-section-boxed elementor-section-height-default elementor-section-height-default ha-particle-adv-no&quot;&gt;
							&lt;div class=&quot;elementor-background-overlay&quot;&gt;&lt;/div&gt;
							&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-33 elementor-top-column elementor-element elementor-element-291b567&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-8750ea5 elementor-widget elementor-widget-image&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
															&lt;img width=&quot;150&quot; height=&quot;150&quot; class=&quot;attachment-thumbnail size-thumbnail&quot; alt=&quot;maui-bot&quot; src=&quot;https://devs.school/wp-content/uploads/2022/09/my-dotnet-bot-mod-1-150x150.png&quot; srcset=&quot;https://devs.school/wp-content/uploads/2022/09/my-dotnet-bot-mod-1-150x150.png 150w, https://devs.school/wp-content/uploads/2022/09/my-dotnet-bot-mod-1-300x300.png 300w, https://devs.school/wp-content/uploads/2022/09/my-dotnet-bot-mod-1-1024x1024.png 1024w, https://devs.school/wp-content/uploads/2022/09/my-dotnet-bot-mod-1-768x768.png 768w, https://devs.school/wp-content/uploads/2022/09/my-dotnet-bot-mod-1-70x70.png 70w, https://devs.school/wp-content/uploads/2022/09/my-dotnet-bot-mod-1-16x16.png 16w, https://devs.school/wp-content/uploads/2022/09/my-dotnet-bot-mod-1-40x40.png 40w, https://devs.school/wp-content/uploads/2022/09/my-dotnet-bot-mod-1-1536x1536.png 1536w, https://devs.school/wp-content/uploads/2022/09/my-dotnet-bot-mod-1-60x60.png 60w, https://devs.school/wp-content/uploads/2022/09/my-dotnet-bot-mod-1-18x18.png 18w, https://devs.school/wp-content/uploads/2022/09/my-dotnet-bot-mod-1-20x20.png 20w, https://devs.school/wp-content/uploads/2022/09/my-dotnet-bot-mod-1.png 2000w&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;															&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
				&lt;div class=&quot;elementor-column elementor-col-66 elementor-top-column elementor-element elementor-element-0080d0e&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-89569a9 elementor-widget elementor-widget-heading&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
			&lt;h2 class=&quot;elementor-heading-title elementor-size-default&quot; id=&quot;learn-net-maui-creating-projects&quot;&gt;Learn .NET MAUI creating projects&lt;/h2&gt;		&lt;/div&gt;
				&lt;/div&gt;
				&lt;div class=&quot;elementor-element elementor-element-204f713 elementor-widget elementor-widget-text-editor&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
							&lt;p&gt;Learn how to create cross-platform applications, thanks to the power of .NET MAUI and a series of real projects.&lt;/p&gt;						&lt;/div&gt;
				&lt;/div&gt;
				&lt;div class=&quot;elementor-element elementor-element-5395b64 elementor-align-left elementor-widget elementor-widget-button&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
					&lt;div class=&quot;elementor-button-wrapper&quot;&gt;
			&lt;a href=&quot;https://courses.devs.school/courses/net-maui&quot; class=&quot;elementor-button-link elementor-button elementor-size-md&quot;&gt;
						&lt;span class=&quot;elementor-button-content-wrapper&quot;&gt;
						&lt;span class=&quot;elementor-button-text&quot;&gt;TAKE THE COURSE&lt;/span&gt;
		&lt;/span&gt;
					&lt;/a&gt;
		&lt;/div&gt;
				&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-30ef59a elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-a162dbf&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap&quot;&gt;
									&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
							&lt;/div&gt;
				&lt;/div&gt;
				&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
							&lt;/div&gt;
				&lt;/div&gt;
				&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
							&lt;/div&gt;
		</content:encoded></item><item><title>How to use gradients in .NET MAUI</title><link>https://devs.school/how-to-use-gradients-in-net-maui/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=how-to-use-gradients-in-net-maui</link><guid isPermaLink="false">https://devs.school/?p=8853</guid><pubDate>Mon, 03 Apr 2023 19:23:06 GMT</pubDate><description>✅ Gradients are a very simple way to add a better visual experience to your cross-platform applications. That's why, in this post, I'm going to show you how</description><content:encoded>		&lt;div class=&quot;elementor elementor-8853&quot;&gt;
									&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-9d53586 elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-8d2fc6e&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-4cfdf77 elementor-widget elementor-widget-text-editor&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
							&lt;p&gt;Gradients are a very simple way to add a better visual experience to your cross-platform applications. That's why, in this post, I'm going to show you how to work with linear and circular gradients in .NET MAUI.&lt;/p&gt;						&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-720be76 elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-4f13450&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-443b4ae elementor-widget elementor-widget-heading&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
			&lt;h2 class=&quot;elementor-heading-title elementor-size-default&quot; id=&quot;understanding-the-concept-of-gradients&quot;&gt;Understanding the concept of gradients
&lt;/h2&gt;		&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-477fec9 elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-d819e4e&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-1fc9f66 elementor-widget elementor-widget-text-editor&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
							&lt;p&gt;Before starting with the application of gradients in .NET MAUI, we must understand how they work, for this, I will use the &lt;a href=&quot;https://cssgradient.io/&quot;&gt;CSS gradient tool&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;In this site we can see a visualization of a linear gradient when opening the page.&lt;/p&gt;						&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-287a2d3 elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-7c9fb62&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-bc00342 elementor-widget elementor-widget-image&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
															&lt;img width=&quot;1024&quot; height=&quot;576&quot; class=&quot;attachment-large size-large&quot; alt=&quot;Gradients in .NET MAUI&quot; src=&quot;https://devs.school/wp-content/uploads/2023/04/vlc_Mvz4hSrvYV-1024x576.png&quot; srcset=&quot;https://devs.school/wp-content/uploads/2023/04/vlc_Mvz4hSrvYV-1024x576.png 1024w, https://devs.school/wp-content/uploads/2023/04/vlc_Mvz4hSrvYV-300x169.png 300w, https://devs.school/wp-content/uploads/2023/04/vlc_Mvz4hSrvYV-768x432.png 768w, https://devs.school/wp-content/uploads/2023/04/vlc_Mvz4hSrvYV-270x152.png 270w, https://devs.school/wp-content/uploads/2023/04/vlc_Mvz4hSrvYV-1536x864.png 1536w, https://devs.school/wp-content/uploads/2023/04/vlc_Mvz4hSrvYV.png 1920w&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;															&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-489fb6c elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-f54415c&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-593302d elementor-widget elementor-widget-text-editor&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
							&lt;p&gt;This means that the gradient extends linearly from one end with one color to the other end with another color. In total, 3 colors are being set as part of the gradient in the example.&lt;/p&gt;&lt;p&gt;You can also see a couple of additional options on the site:&lt;/p&gt;						&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-0689a96 elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-fd0c010&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-726b677 elementor-widget elementor-widget-image&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
															&lt;img width=&quot;508&quot; height=&quot;101&quot; class=&quot;attachment-large size-large&quot; alt=&quot;.NET MAUI gradients&quot; src=&quot;https://devs.school/wp-content/uploads/2023/04/msedge_Q0sX99auxc.png&quot; srcset=&quot;https://devs.school/wp-content/uploads/2023/04/msedge_Q0sX99auxc.png 508w, https://devs.school/wp-content/uploads/2023/04/msedge_Q0sX99auxc-300x60.png 300w&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;															&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-6a969e5 elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-158dd6e&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-ff3d61d elementor-widget elementor-widget-text-editor&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
							&lt;p&gt;The first option allows us to indicate whether we want a linear or radial gradient, which basically refers to a gradient based on circles from the inside out. Similarly, we can set the gradient angle in the case of linear gradients. These concepts are important, since they will help us to know how to define gradients in .NET MAUI.&lt;br&gt;&lt;br&gt;Finally, the 3 colors that have been set, which can be increased or decreased according to our needs, and which can also be changed color, are called &lt;strong&gt;Gradient Stops&lt;/strong&gt;, since they define to what extent one of the colors will affect the gradient. In summary, and for your consideration, we can define the following:&lt;br&gt;&lt;br&gt;&lt;strong&gt;Gradient Type&lt;/strong&gt;: How the gradient will look, whether linearly or radially.&lt;br&gt;&lt;strong&gt;Gradient Angle&lt;/strong&gt;: Towards which direction the gradient will point.&lt;br&gt;&lt;strong&gt;Gradient Stops&lt;/strong&gt;: The colors in the gradient, and their position in the gradient.&lt;/p&gt;						&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-4ad2498 elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-3b0982e&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-0f7f431 elementor-widget elementor-widget-heading&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
			&lt;h2 class=&quot;elementor-heading-title elementor-size-default&quot; id=&quot;creating-linear-gradients-in-net-maui&quot;&gt;Creating Linear Gradients in .NET MAUI&lt;/h2&gt;		&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-a389aaf elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-ca14b6e&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-9098eb3 elementor-widget elementor-widget-text-editor&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
							&lt;p&gt;To add gradients to a .NET MAUI application, we must first specify the Background property of a View element from the XAML code. For example, we could define this property of a Grid as follows, although it is also possible to do the same with other elements, for example, inside a Frame:&lt;/p&gt;						&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-64edfa2 elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-96832c3&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-ef4bea1 elementor-widget elementor-widget-code-highlight&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
					&lt;div class=&quot;prismjs-okaidia copy-to-clipboard&quot;&gt;
			&lt;pre class=&quot;highlight-height language-markup line-numbers&quot;&gt;
				&lt;code class=&quot;language-markup&quot;&gt;
					&lt;span class=&quot;legacy-code-literal&quot;&gt;&amp;lt;Grid BackgroundColor=&quot;Navy&quot;&amp;gt;
    &amp;lt;Grid.Background&amp;gt;
    &amp;lt;/Grid.Background&amp;gt;
&amp;lt;/Grid&amp;gt; &lt;/span&gt;
				&lt;/code&gt;
			&lt;/pre&gt;
		&lt;/div&gt;
				&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-8144f7a elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-cdb19e3&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-b23b890 elementor-widget elementor-widget-text-editor&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
							&lt;p&gt;Once the property is used, let's start specifying a linear gradient. For it, we have to define an element of the type &lt;strong&gt;LinearGradientBrush&lt;/strong&gt;, with a &lt;strong&gt;StartPoint&lt;/strong&gt; equal to 0,0, and an &lt;strong&gt;EndPoint&lt;/strong&gt; equal to 0,0 also:&lt;/p&gt;						&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-b1cde23 elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-3df2825&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-3977914 elementor-widget elementor-widget-code-highlight&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
					&lt;div class=&quot;prismjs-okaidia copy-to-clipboard&quot;&gt;
			&lt;pre class=&quot;highlight-height language-markup line-numbers&quot;&gt;
				&lt;code class=&quot;language-markup&quot;&gt;
					&lt;span class=&quot;legacy-code-literal&quot;&gt;&amp;lt;Grid BackgroundColor=&quot;Navy&quot;&amp;gt;
    &amp;lt;Grid.Background&amp;gt;
        &amp;lt;LinearGradientBrush StartPoint=&quot;0,0&quot; EndPoint=&quot;0,0&quot;&amp;gt;
        &amp;lt;/LinearGradientBrush&amp;gt;
    &amp;lt;/Grid.Background&amp;gt;
&amp;lt;/Grid&amp;gt; &lt;/span&gt;
				&lt;/code&gt;
			&lt;/pre&gt;
		&lt;/div&gt;
				&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-78fa27a elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-ce1b82f&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-e800247 elementor-widget elementor-widget-text-editor&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
							&lt;p&gt;Surely by now, you are wondering what the &lt;strong&gt;StartPoint&lt;/strong&gt; and &lt;strong&gt;EndPoint&lt;/strong&gt; properties are for.&lt;/p&gt;&lt;p&gt;These are properties that allow you to specify the orientation of the linear gradient, and I'll explain it better with this image:&lt;/p&gt;						&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-17df241 elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-fa89934&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-d4fab8a elementor-widget elementor-widget-image&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
															&lt;img width=&quot;265&quot; height=&quot;161&quot; class=&quot;attachment-large size-large&quot; alt=&quot;Linear Gradient .NET MAUI&quot; src=&quot;https://devs.school/wp-content/uploads/2023/04/vlc_PvShjs3rwJ.png&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;															&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-bafb729 elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-f91ab2a&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-6a0be3d elementor-widget elementor-widget-text-editor&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
							&lt;p&gt;In the image are represented different points that we can set for a gradient, indicating the direction from and to where we want the gradient to go. If we wanted the gradient to start in the upper left corner, and end in the lower right corner, we would have to specify this in the LinearGradientBrush.&lt;br&gt;&lt;br&gt;If we wanted the gradient to go from top to bottom, we could specify StartPoint 0,0 and EndPoint 0,1, and so on.&lt;/p&gt;						&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-f06cb1b elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-0c08b21&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-31cca1a elementor-widget elementor-widget-code-highlight&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
					&lt;div class=&quot;prismjs-okaidia copy-to-clipboard&quot;&gt;
			&lt;pre class=&quot;highlight-height language-markup line-numbers&quot;&gt;
				&lt;code class=&quot;language-markup&quot;&gt;
					&lt;span class=&quot;legacy-code-literal&quot;&gt;&amp;lt;Grid BackgroundColor=&quot;Navy&quot;&amp;gt;
    &amp;lt;Grid.Background&amp;gt;
        &amp;lt;LinearGradientBrush StartPoint=&quot;0,0&quot; EndPoint=&quot;1,0&quot;&amp;gt;
        &amp;lt;/LinearGradientBrush&amp;gt;
    &amp;lt;/Grid.Background&amp;gt;
&amp;lt;/Grid&amp;gt; &lt;/span&gt;
				&lt;/code&gt;
			&lt;/pre&gt;
		&lt;/div&gt;
				&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-f774b0c elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-d5c4321&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-1833128 elementor-widget elementor-widget-text-editor&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
							&lt;p&gt;With this we have already specified the type of gradient to use and the orientation. The third step is to specify the colors of the gradient. For it, we must use the &lt;strong&gt;GradientStopCollection&lt;/strong&gt; property and inside, define the amount of &lt;strong&gt;GrandientStops&lt;/strong&gt; that we need, as follows:&lt;/p&gt;						&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-0c644ad elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-d1da1f3&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-cff17f6 elementor-widget elementor-widget-code-highlight&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
					&lt;div class=&quot;prismjs-okaidia copy-to-clipboard&quot;&gt;
			&lt;pre class=&quot;highlight-height language-markup line-numbers&quot;&gt;
				&lt;code class=&quot;language-markup&quot;&gt;
					&lt;span class=&quot;legacy-code-literal&quot;&gt;&amp;lt;Grid BackgroundColor=&quot;Navy&quot;&amp;gt;
    &amp;lt;Grid.Background&amp;gt;
        &amp;lt;LinearGradientBrush StartPoint=&quot;0,0&quot; EndPoint=&quot;1,0&quot;&amp;gt;
            &amp;lt;GradientStopCollection&amp;gt;
                &amp;lt;GradientStop Offset=&quot;0&quot; Color=&quot;DarkBlue&quot;&amp;gt;
                &amp;lt;GradientStop Offset=&quot;1&quot; Color=&quot;LightBlue&quot;&amp;gt;
            &amp;lt;/GradientStopCollection&amp;gt;
        &amp;lt;/LinearGradientBrush&amp;gt;
    &amp;lt;/Grid.Background&amp;gt;
&amp;lt;/Grid&amp;gt; &lt;/span&gt;
				&lt;/code&gt;
			&lt;/pre&gt;
		&lt;/div&gt;
				&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-2a917b6 elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-9e2b240&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-1231b51 elementor-widget elementor-widget-text-editor&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
							&lt;p&gt;Each GradientStop defines an Offset and a color. The Offset refers to the location of the GradientStop within the gradient, and can have a value between 0 and 1, while the color defines the color of the gradient section. The above code would result in the following:&lt;/p&gt;&lt;p&gt; &lt;/p&gt;						&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-3d904d2 elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-4da1e5f&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-720f478 elementor-widget elementor-widget-image&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
															&lt;img width=&quot;1024&quot; height=&quot;554&quot; class=&quot;attachment-large size-large&quot; alt=&quot;LinearGradientBrush .NET MAUI&quot; src=&quot;https://devs.school/wp-content/uploads/2023/04/vlc_m3L1oYCati-1024x554.png&quot; srcset=&quot;https://devs.school/wp-content/uploads/2023/04/vlc_m3L1oYCati-1024x554.png 1024w, https://devs.school/wp-content/uploads/2023/04/vlc_m3L1oYCati-300x162.png 300w, https://devs.school/wp-content/uploads/2023/04/vlc_m3L1oYCati-768x415.png 768w, https://devs.school/wp-content/uploads/2023/04/vlc_m3L1oYCati-370x200.png 370w, https://devs.school/wp-content/uploads/2023/04/vlc_m3L1oYCati.png 1237w&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;															&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-c26f463 elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-22006d7&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-33bc768 elementor-widget elementor-widget-heading&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
			&lt;h2 class=&quot;elementor-heading-title elementor-size-default&quot; id=&quot;creating-radial-gradients-in-net-maui&quot;&gt;Creating Radial Gradients in .NET MAUI&lt;/h2&gt;		&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-1b7798a elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-d96c562&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-5dfd575 elementor-widget elementor-widget-text-editor&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
							&lt;p&gt;In the case of defining radial gradients, it is sufficient to change the gradient type to RadialGradientBrush.&lt;/p&gt;&lt;p&gt;Unlike the linear gradient, the &lt;strong&gt;StartPoint&lt;/strong&gt; and &lt;strong&gt;EndPoint&lt;/strong&gt; properties are not defined, but the &lt;strong&gt;Center&lt;/strong&gt; property is defined, which sets the central position of the gradient:&lt;/p&gt;						&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-4d9441f elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-b12daa9&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-f5b5d51 elementor-widget elementor-widget-code-highlight&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
					&lt;div class=&quot;prismjs-okaidia copy-to-clipboard&quot;&gt;
			&lt;pre class=&quot;highlight-height language-markup line-numbers&quot;&gt;
				&lt;code class=&quot;language-markup&quot;&gt;
					&lt;span class=&quot;legacy-code-literal&quot;&gt;&amp;lt;Grid BackgroundColor=&quot;Navy&quot;&amp;gt;
    &amp;lt;Grid.Background&amp;gt;
        &amp;lt;RadialGradientBrush Center=&quot;0.5,0.5&quot;&amp;gt;
            &amp;lt;GradientStopCollection&amp;gt;
                &amp;lt;GradientStop Offset=&quot;0&quot; Color=&quot;DarkBlue&quot;&amp;gt;
                &amp;lt;GradientStop Offset=&quot;1&quot; Color=&quot;LightBlue&quot;&amp;gt;
            &amp;lt;/GradientStopCollection&amp;gt;
        &amp;lt;/RadialGradientBrush&amp;gt;
    &amp;lt;/Grid.Background&amp;gt;
&amp;lt;/Grid&amp;gt; &lt;/span&gt;
				&lt;/code&gt;
			&lt;/pre&gt;
		&lt;/div&gt;
				&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-c231d65 elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-683d91e&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-300eb18 elementor-widget elementor-widget-text-editor&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
							&lt;p&gt;Running the application, with the addition of a pink color, results in the following screen:&lt;/p&gt;						&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-2e51ec2 elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-8dd8615&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-80ed4b3 elementor-widget elementor-widget-image&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
															&lt;img width=&quot;1024&quot; height=&quot;556&quot; class=&quot;attachment-large size-large&quot; alt=&quot;Radial gradient .NET MAUI&quot; src=&quot;https://devs.school/wp-content/uploads/2023/04/vlc_jfNa82UGGg-1024x556.png&quot; srcset=&quot;https://devs.school/wp-content/uploads/2023/04/vlc_jfNa82UGGg-1024x556.png 1024w, https://devs.school/wp-content/uploads/2023/04/vlc_jfNa82UGGg-300x163.png 300w, https://devs.school/wp-content/uploads/2023/04/vlc_jfNa82UGGg-768x417.png 768w, https://devs.school/wp-content/uploads/2023/04/vlc_jfNa82UGGg-370x200.png 370w, https://devs.school/wp-content/uploads/2023/04/vlc_jfNa82UGGg.png 1238w&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;															&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-c736ed5 elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-c2b1e54&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-cfc7411 elementor-widget elementor-widget-text-editor&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
							&lt;p&gt;Finally, the screenshots you've seen throughout this post are part of a practical application of my .NET MAUI course, in which you take a random phrase and apply an automatically generated multi-color gradient to it, and in which you can learn much more about .NET MAUI.&lt;/p&gt;						&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-678fd60 elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-8c20d5a&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-4f4189d elementor-widget elementor-widget-template&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
					&lt;div class=&quot;elementor-template&quot;&gt;
					&lt;div class=&quot;elementor elementor-8656&quot;&gt;
									&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-888c14b elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-551f2ca&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-ec2cc06 elementor-widget elementor-widget-template&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
					&lt;div class=&quot;elementor-template&quot;&gt;
					&lt;div class=&quot;elementor elementor-8632&quot;&gt;
									&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-ad17090 ha-particle-yes elementor-section-boxed elementor-section-height-default elementor-section-height-default ha-particle-adv-no&quot;&gt;
							&lt;div class=&quot;elementor-background-overlay&quot;&gt;&lt;/div&gt;
							&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-33 elementor-top-column elementor-element elementor-element-291b567&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-8750ea5 elementor-widget elementor-widget-image&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
															&lt;img width=&quot;150&quot; height=&quot;150&quot; class=&quot;attachment-thumbnail size-thumbnail&quot; alt=&quot;maui-bot&quot; src=&quot;https://devs.school/wp-content/uploads/2022/09/my-dotnet-bot-mod-1-150x150.png&quot; srcset=&quot;https://devs.school/wp-content/uploads/2022/09/my-dotnet-bot-mod-1-150x150.png 150w, https://devs.school/wp-content/uploads/2022/09/my-dotnet-bot-mod-1-300x300.png 300w, https://devs.school/wp-content/uploads/2022/09/my-dotnet-bot-mod-1-1024x1024.png 1024w, https://devs.school/wp-content/uploads/2022/09/my-dotnet-bot-mod-1-768x768.png 768w, https://devs.school/wp-content/uploads/2022/09/my-dotnet-bot-mod-1-70x70.png 70w, https://devs.school/wp-content/uploads/2022/09/my-dotnet-bot-mod-1-16x16.png 16w, https://devs.school/wp-content/uploads/2022/09/my-dotnet-bot-mod-1-40x40.png 40w, https://devs.school/wp-content/uploads/2022/09/my-dotnet-bot-mod-1-1536x1536.png 1536w, https://devs.school/wp-content/uploads/2022/09/my-dotnet-bot-mod-1-60x60.png 60w, https://devs.school/wp-content/uploads/2022/09/my-dotnet-bot-mod-1-18x18.png 18w, https://devs.school/wp-content/uploads/2022/09/my-dotnet-bot-mod-1-20x20.png 20w, https://devs.school/wp-content/uploads/2022/09/my-dotnet-bot-mod-1.png 2000w&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;															&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
				&lt;div class=&quot;elementor-column elementor-col-66 elementor-top-column elementor-element elementor-element-0080d0e&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-89569a9 elementor-widget elementor-widget-heading&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
			&lt;h2 class=&quot;elementor-heading-title elementor-size-default&quot; id=&quot;learn-net-maui-creating-projects&quot;&gt;Learn .NET MAUI creating projects&lt;/h2&gt;		&lt;/div&gt;
				&lt;/div&gt;
				&lt;div class=&quot;elementor-element elementor-element-204f713 elementor-widget elementor-widget-text-editor&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
							&lt;p&gt;Learn how to create cross-platform applications, thanks to the power of .NET MAUI and a series of real projects.&lt;/p&gt;						&lt;/div&gt;
				&lt;/div&gt;
				&lt;div class=&quot;elementor-element elementor-element-5395b64 elementor-align-left elementor-widget elementor-widget-button&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
					&lt;div class=&quot;elementor-button-wrapper&quot;&gt;
			&lt;a href=&quot;https://courses.devs.school/courses/net-maui&quot; class=&quot;elementor-button-link elementor-button elementor-size-md&quot;&gt;
						&lt;span class=&quot;elementor-button-content-wrapper&quot;&gt;
						&lt;span class=&quot;elementor-button-text&quot;&gt;TAKE THE COURSE&lt;/span&gt;
		&lt;/span&gt;
					&lt;/a&gt;
		&lt;/div&gt;
				&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-30ef59a elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-a162dbf&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap&quot;&gt;
									&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
							&lt;/div&gt;
				&lt;/div&gt;
				&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
							&lt;/div&gt;
				&lt;/div&gt;
				&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
							&lt;/div&gt;
		</content:encoded></item><item><title>How to detect a language of a string in C# .NET?</title><link>https://devs.school/how-to-detect-a-language-of-a-string-in-c-net/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=how-to-detect-a-language-of-a-string-in-c-net</link><guid isPermaLink="false">https://devs.school/?p=8837</guid><pubDate>Mon, 27 Mar 2023 15:38:45 GMT</pubDate><description>✅ Welcome, this time, I want to share with you the solution to a problem I had a few days ago, how to know what language a text string belongs to?</description><content:encoded>		&lt;div class=&quot;elementor elementor-8837&quot;&gt;
									&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-732eab9 elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-7be73320&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-10004d4e elementor-widget elementor-widget-text-editor&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
							&lt;p&gt;Welcome, this time, I want to share with you the solution to a problem I had a few days ago, how to know what language a text string belongs to?&lt;/p&gt;
&lt;p&gt;Throughout my research, I found several possible solutions, unfortunately some did not meet 100% of what I needed, for example, failed to detect certain specific languages, or had a particular cost.&lt;/p&gt;
&lt;p&gt;In the end, I found a solution that I found extraordinary and it is free. To show it to you, I have created a new Console project in Visual Studio, which I called “DetectingLanguagesDemo”.&lt;/p&gt;
&lt;p&gt;I'm going to install a nuget package, which by the way, I fortunately found by browsing through the dozens of results in the package search, and it's called “LanguageDetection.NETStandard”, by Pēteris Ņikiforovs.&lt;/p&gt;						&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-d02b41e elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-7509b27&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-02d4a29 elementor-widget elementor-widget-code-highlight&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
					&lt;div class=&quot;prismjs-okaidia copy-to-clipboard&quot;&gt;
			&lt;pre class=&quot;highlight-height language-bash line-numbers&quot;&gt;
				&lt;code class=&quot;language-bash&quot;&gt;
					&lt;span class=&quot;legacy-code-literal&quot;&gt;NuGet\Install-Package LanguageDetection.NETStandard&lt;/span&gt;
				&lt;/code&gt;
			&lt;/pre&gt;
		&lt;/div&gt;
				&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-720d81a elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-8496cec&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-395c82d elementor-widget elementor-widget-text-editor&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
							&lt;p&gt;Once the plugin has been installed, we simply have to create a new instance of the “LanguageDetector” class, to which we must indicate which languages we want to load through the “AddLanguages” method, which receives an array with the languages we want to detect, such as English:&lt;/p&gt;						&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-5420d4c elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-f2064e7&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-67bae14 elementor-widget elementor-widget-code-highlight&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
					&lt;div class=&quot;prismjs-okaidia copy-to-clipboard&quot;&gt;
			&lt;pre class=&quot;highlight-height language-csharp line-numbers&quot;&gt;
				&lt;code class=&quot;language-csharp&quot;&gt;
					&lt;span class=&quot;legacy-code-literal&quot;&gt;using LanguageDetection;

var detector = new LanguageDetector();

detector.AddLanguages(new[] { &quot;en&quot; });&lt;/span&gt;
				&lt;/code&gt;
			&lt;/pre&gt;
		&lt;/div&gt;
				&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-dd1d164 elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-1c39d26&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-8938374 elementor-widget elementor-widget-text-editor&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
							&lt;p&gt;or we can use the AddAllLanguages method, which will be able to detect 53 languages.&lt;/p&gt;						&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-c1139fc elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-bcaeccd&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-570d583 elementor-widget elementor-widget-code-highlight&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
					&lt;div class=&quot;prismjs-okaidia copy-to-clipboard&quot;&gt;
			&lt;pre class=&quot;highlight-height language-csharp line-numbers&quot;&gt;
				&lt;code class=&quot;language-csharp&quot;&gt;
					&lt;span class=&quot;legacy-code-literal&quot;&gt;detector.AddAllLanguages();&lt;/span&gt;
				&lt;/code&gt;
			&lt;/pre&gt;
		&lt;/div&gt;
				&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-d79e3cc elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-0906a5a&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-b0c8e53 elementor-widget elementor-widget-text-editor&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
							&lt;p&gt;Finally, it is enough to execute the Detect method, passing the text string, in this case “This library is perfect for what I need”, which will return the language of the string. I will create a Console.WriteLine to see the result, and run the application.&lt;/p&gt;						&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-fd9bb1c elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-04cde47&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-235483a elementor-widget elementor-widget-code-highlight&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
					&lt;div class=&quot;prismjs-okaidia copy-to-clipboard&quot;&gt;
			&lt;pre class=&quot;highlight-height language-csharp line-numbers&quot;&gt;
				&lt;code class=&quot;language-csharp&quot;&gt;
					&lt;span class=&quot;legacy-code-literal&quot;&gt;string text = &quot;This library is perfect for what I need&quot;;

detector.Detect(text);&lt;/span&gt;
				&lt;/code&gt;
			&lt;/pre&gt;
		&lt;/div&gt;
				&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-c096e35 elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-5444ae6&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-1d81d2f elementor-widget elementor-widget-image&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
															&lt;img width=&quot;719&quot; height=&quot;556&quot; class=&quot;attachment-large size-large&quot; alt=&quot;Detect language from string in .NET&quot; src=&quot;https://devs.school/wp-content/uploads/2023/03/vlc_DyHBzcKiO3.png&quot; srcset=&quot;https://devs.school/wp-content/uploads/2023/03/vlc_DyHBzcKiO3.png 719w, https://devs.school/wp-content/uploads/2023/03/vlc_DyHBzcKiO3-300x232.png 300w&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;															&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-d45c494 elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-b316246&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-ce7ff8b elementor-widget elementor-widget-text-editor&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
							&lt;p&gt;You can see that the result of the execution returns the code eng, which refers to the English language. I am going to change the string to the same string in Spanish: “&lt;strong&gt;Esta biblioteca es perfecta para lo que necesito&lt;/strong&gt;“, and run the program again.&lt;/p&gt;
&lt;p&gt;The result is the &lt;strong&gt;spa&lt;/strong&gt; code, which corresponds to the Spanish language. I am going to make a last test with the same string, but this time translated into French: “Cette bibliothèque répond parfaitement à mes besoins”.&lt;/p&gt;
&lt;p&gt;Once again, we get the code fra, corresponding to the French language.&lt;/p&gt;
&lt;p&gt;If you are wondering why the result returns 3 characters, it is because the &lt;strong&gt;ISO 639.3&lt;/strong&gt; standard is used. To make things easier for you, I share with you the link to this &lt;a href=&quot;https://www.loc.gov/standards/iso639-2/php/English_list.php&quot;&gt;website&lt;/a&gt;, which contains the name of the languages, as well as the corresponding ISO code.&lt;/p&gt;
&lt;p&gt;Finally, I also share with you the list inside the &lt;a href=&quot;https://github.com/TechnikEmpire/language-detection/tree/master/LanguageDetection/Profiles&quot;&gt;repository&lt;/a&gt; with the ISO codes of the languages supported by the nuget package.&lt;/p&gt;
&lt;p&gt;I hope you find this information useful.&lt;/p&gt;						&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-df65c2b elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-89e7eda&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-f06da54 uael-aspect-ratio-16_9 uael-youtube-subscribe-no elementor-widget elementor-widget-uael-video&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
							&lt;div class=&quot;uael-video__outer-wrap uael-video-type-youtube&quot;&gt;
						&lt;div class=&quot;uael-video-inner-wrap&quot;&gt;
				&lt;figure class=&quot;migration-video&quot;&gt;&lt;iframe src=&quot;https://www.youtube-nocookie.com/embed/5QD9GcLYwDw&quot; title=&quot;YouTube video&quot; loading=&quot;lazy&quot; allowfullscreen=&quot;&quot; referrerpolicy=&quot;strict-origin-when-cross-origin&quot; sandbox=&quot;allow-scripts allow-same-origin allow-presentation&quot; allow=&quot;accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture; fullscreen&quot;&gt;&lt;/iframe&gt;&lt;/figure&gt;
											&lt;/div&gt;
		&lt;/div&gt;
					&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
							&lt;/div&gt;
		</content:encoded></item><item><title>How was the MAUIDelivery application created?</title><link>https://devs.school/how-was-the-mauidelivery-application-created/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=how-was-the-mauidelivery-application-created</link><guid isPermaLink="false">https://devs.school/?p=8426</guid><pubDate>Tue, 30 Aug 2022 21:26:59 GMT</pubDate><description>✅ Hi Devs!</description><content:encoded>		&lt;div class=&quot;elementor elementor-8426&quot;&gt;
									&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-289490c elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-f19a111&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-55d0a28 elementor-widget elementor-widget-text-editor&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
							&lt;p&gt;Hi Devs!&lt;/p&gt;&lt;p&gt;Nice to have you around.&lt;/p&gt;&lt;p&gt;Nice to have you around! I'm launching a new personal project in the English language, where I plan to publish a lot of content related to software development.&lt;/p&gt;&lt;p&gt;And what better way to launch the site, than sharing my contribution to the &lt;a href=&quot;https://devblogs.microsoft.com/dotnet/announcing-dotnet-maui-beautiful-ui-challenge/&quot;&gt;.NET MAUI Beautiful UI Challenge&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;The purpose of this post, is to explain you a little bit how the MAUIDelivery application is composed.&lt;/p&gt;&lt;p&gt;I want to clarify, that the application uses preloaded information at the beginning of each window, so you shouldn't be surprised if you select an element of a collection and it shows you another one in the next window.&lt;/p&gt;&lt;p&gt;Also, being a UI challenge, there are some uncompleted functionalities, such as the map functionality. Additionally, being a weekend project, there are many things to be polished, such as the addition of resource dictionaries for the reuse of styles, or the implementation of the mvvm pattern, which can remain as a personal challenge to be done.&lt;/p&gt;&lt;p&gt;Finally, I want to give special thanks to my friend Galo Galvez, who was a key piece in the realization of the project through their feedback.&lt;/p&gt;&lt;p&gt;Still, I think it's a pretty good looking application. Without further ado, let's get started!&lt;/p&gt;						&lt;/div&gt;
				&lt;/div&gt;
				&lt;nav class=&quot;migration-article-toc&quot; aria-label=&quot;Table of contents&quot;&gt;&lt;details open=&quot;&quot;&gt;&lt;summary&gt;Table of contents&lt;/summary&gt;&lt;ol&gt;&lt;li&gt;&lt;a href=&quot;#Home_Page&quot;&gt;Home Page&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;#Create_Account_Page&quot;&gt;Create Account Page&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;#Stores_Page&quot;&gt;Stores Page&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;#The_scrollable_element_for_choosing_a_direction&quot;&gt;The scrollable element for choosing a direction&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;#The_screen_for_adding_a_new_address&quot;&gt;The screen for adding a new address&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;#Store_Page&quot;&gt;Store Page&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;#Menu_Page&quot;&gt;Menu Page&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;#Products_page&quot;&gt;Products page&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;#Payment_page&quot;&gt;Payment page&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;#Where_can_I_learn_more_about_NET_MAUI&quot;&gt;Where can I learn more about .NET MAUI?&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/details&gt;&lt;/nav&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-a9b62c6 elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-a291af7&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-f244175 elementor-widget elementor-widget-heading&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
			&lt;h2 class=&quot;elementor-heading-title elementor-size-default&quot; id=&quot;Home_Page&quot;&gt;Home Page&lt;/h2&gt;		&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-0bf85f2 elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-de431b4&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-b2cf7b3 elementor-widget elementor-widget-text-editor&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
							&lt;p&gt;This is the Home Page of the application, in other words, the Login page.&lt;/p&gt;						&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-adbedf0 elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-a718604&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;figure class=&quot;migration-image-annotations&quot;&gt;&lt;img width=&quot;512&quot; height=&quot;1024&quot; class=&quot;attachment-large size-large&quot; alt=&quot;MAUIDelivery HomeScreen&quot; src=&quot;https://devs.school/wp-content/uploads/2022/08/screenshot-2022-08-30_12.47.53.202-512x1024.png&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;&lt;details class=&quot;image-annotation&quot;&gt;&lt;summary&gt;Annotation 1&lt;/summary&gt;&lt;div id=&quot;uael-tooltip-content-b588392-1083859&quot;&gt;&lt;p&gt;Logo created for the application&lt;/p&gt;								
															&lt;/div&gt;&lt;/details&gt;&lt;details class=&quot;image-annotation&quot;&gt;&lt;summary&gt;Annotation 2&lt;/summary&gt;&lt;div id=&quot;uael-tooltip-content-b588392-12f7830&quot;&gt;&lt;p&gt;Lottie animation running thanks to SKLottieView control&lt;/p&gt;								
															&lt;/div&gt;&lt;/details&gt;&lt;details class=&quot;image-annotation&quot;&gt;&lt;summary&gt;Annotation 3&lt;/summary&gt;&lt;div id=&quot;uael-tooltip-content-b588392-914eac8&quot;&gt;&lt;p&gt;Use of the frame control to achieve rounded corners (although there are many options to achieve the same effect).&lt;/p&gt;								
															&lt;/div&gt;&lt;/details&gt;&lt;details class=&quot;image-annotation&quot;&gt;&lt;summary&gt;Annotation 4&lt;/summary&gt;&lt;div id=&quot;uael-tooltip-content-b588392-5f9ae2c&quot;&gt;&lt;p&gt;Use of fonts for a customized visual appearance&lt;/p&gt;								
															&lt;/div&gt;&lt;/details&gt;&lt;details class=&quot;image-annotation&quot;&gt;&lt;summary&gt;Annotation 5&lt;/summary&gt;&lt;div id=&quot;uael-tooltip-content-b588392-b6ff8de&quot;&gt;&lt;p&gt;Using FontAwesome as an icon library&lt;/p&gt;								
															&lt;/div&gt;&lt;/details&gt;&lt;/figure&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-db6ab03 elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-397adb2&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-a8725af elementor-widget elementor-widget-text-editor&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
							&lt;p&gt;The page makes use of rounded edges in various sections, to give an interesting appearance. In the case of the white section, a frame was used, although there are many ways to achieve the same effect, either through a BoxView or a RoundRectangle. In the case of the image, it is achieved through the following code:&lt;/p&gt;						&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-016a2e8 elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-27eb592&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-40aaa22 elementor-widget elementor-widget-code-highlight&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
					&lt;div class=&quot;prismjs-okaidia copy-to-clipboard&quot;&gt;
			&lt;pre class=&quot;highlight-height language-xml line-numbers&quot;&gt;
				&lt;code class=&quot;language-xml&quot;&gt;
					&lt;span class=&quot;legacy-code-literal&quot;&gt;&amp;lt;Frame
                Grid.Row=&quot;1&quot;
                Margin=&quot;0,-30,0,0&quot;
                CornerRadius=&quot;25&quot;&amp;gt;&lt;/span&gt;
				&lt;/code&gt;
			&lt;/pre&gt;
		&lt;/div&gt;
				&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-6a730f8 elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-a3755fd&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-ec880c0 elementor-widget elementor-widget-text-editor&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
							&lt;p&gt;As part of the application, extensive use is also made of icons, so the FontAwesome font is used, which includes a large collection of icons.&lt;br&gt;An example of this is the use of icons to show the user that an email and password are required. Each icon is located inside a frame element, as follows:&lt;/p&gt;						&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-0759e93 elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-c2cc0bc&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-98568b8 elementor-widget elementor-widget-code-highlight&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
					&lt;div class=&quot;prismjs-okaidia copy-to-clipboard&quot;&gt;
			&lt;pre class=&quot;highlight-height language-xml line-numbers&quot;&gt;
				&lt;code class=&quot;language-xml&quot;&gt;
					&lt;span class=&quot;legacy-code-literal&quot;&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;
&amp;lt;Frame Padding=&quot;0&quot; BackgroundColor=&quot;#EDEBF6&quot; CornerRadius=&quot;10&quot; HeightRequest=&quot;60&quot; HorizontalOptions=&quot;Center&quot; VerticalOptions=&quot;Center&quot; WidthRequest=&quot;60&quot;&amp;gt;
   &amp;lt;Image HorizontalOptions=&quot;Center&quot;&amp;gt;
      &amp;lt;Image.Source&amp;gt;
         &amp;lt;FontImageSource FontFamily=&quot;AwesomeSolid&quot; Glyph=&quot;&amp;amp;#xf084;&quot; Color=&quot;#4F3F9B&quot; /&amp;gt;
      &amp;lt;/Image.Source&amp;gt;
   &amp;lt;/Image&amp;gt;
&amp;lt;/Frame&amp;gt;&lt;/span&gt;
				&lt;/code&gt;
			&lt;/pre&gt;
		&lt;/div&gt;
				&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-eec81a4 elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-49e0649&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-b7dd553 elementor-widget elementor-widget-heading&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
			&lt;h2 class=&quot;elementor-heading-title elementor-size-default&quot; id=&quot;Create_Account_Page&quot;&gt;Create Account Page&lt;/h2&gt;		&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-39d6117 elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-acea806&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-0d4e5c3 elementor-widget elementor-widget-text-editor&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
							&lt;p&gt;This is the page for the user to register a new account.&lt;/p&gt;						&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-e99232a elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-98801fd&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-2eebb33 elementor-widget elementor-widget-image&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
															&lt;img width=&quot;512&quot; height=&quot;1024&quot; class=&quot;attachment-large size-large&quot; alt=&quot;Create your Account Page&quot; src=&quot;https://devs.school/wp-content/uploads/2022/08/screenshot-2022-08-30_13.33.06.553-512x1024.png&quot; srcset=&quot;https://devs.school/wp-content/uploads/2022/08/screenshot-2022-08-30_13.33.06.553-512x1024.png 512w, https://devs.school/wp-content/uploads/2022/08/screenshot-2022-08-30_13.33.06.553-150x300.png 150w, https://devs.school/wp-content/uploads/2022/08/screenshot-2022-08-30_13.33.06.553-768x1536.png 768w, https://devs.school/wp-content/uploads/2022/08/screenshot-2022-08-30_13.33.06.553-1024x2048.png 1024w, https://devs.school/wp-content/uploads/2022/08/screenshot-2022-08-30_13.33.06.553.png 1080w&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;															&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-2e9dced elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-44cc41a&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-5c92f28 elementor-widget elementor-widget-text-editor&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
							&lt;p&gt;The page contains a format very similar to the Login page, except that you are prompted for a name to register.&lt;/p&gt;						&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-106a398 elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-6d4391a&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-2e7bb9b elementor-widget elementor-widget-heading&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
			&lt;h2 class=&quot;elementor-heading-title elementor-size-default&quot; id=&quot;Stores_Page&quot;&gt;Stores Page&lt;/h2&gt;		&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-b321e3b elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-127fd0f&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-88d8fbf elementor-widget elementor-widget-text-editor&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
							&lt;p&gt;This is the page that shows the list of businesses from which you can place an order.&lt;/p&gt;						&lt;/div&gt;
				&lt;/div&gt;
				&lt;figure class=&quot;migration-image-annotations&quot;&gt;&lt;img width=&quot;512&quot; height=&quot;1024&quot; class=&quot;attachment-large size-large&quot; alt=&quot;Stores List Page&quot; src=&quot;https://devs.school/wp-content/uploads/2022/08/screenshot-2022-08-30_13.34.38.761-512x1024.png&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;&lt;details class=&quot;image-annotation&quot;&gt;&lt;summary&gt;Annotation 1&lt;/summary&gt;&lt;div id=&quot;uael-tooltip-content-3886575-8d21983&quot;&gt;&lt;p&gt;If you click on the arrow, the menu for selecting or adding addresses is displayed.&lt;/p&gt;								
															&lt;/div&gt;&lt;/details&gt;&lt;details class=&quot;image-annotation&quot;&gt;&lt;summary&gt;Annotation 2&lt;/summary&gt;&lt;div id=&quot;uael-tooltip-content-3886575-be87132&quot;&gt;&lt;p&gt;Search box made from a combination of an image and an input control.&lt;/p&gt;								
															&lt;/div&gt;&lt;/details&gt;&lt;details class=&quot;image-annotation&quot;&gt;&lt;summary&gt;Annotation 3&lt;/summary&gt;&lt;div id=&quot;uael-tooltip-content-3886575-f74914c&quot;&gt;&lt;p&gt;Use of a border with a gradient applied on an Image control.&lt;/p&gt;								
															&lt;/div&gt;&lt;/details&gt;&lt;details class=&quot;image-annotation&quot;&gt;&lt;summary&gt;Annotation 4&lt;/summary&gt;&lt;div id=&quot;uael-tooltip-content-3886575-e6688b2&quot;&gt;&lt;p&gt;Using shadows to create a card effect&lt;/p&gt;								
															&lt;/div&gt;&lt;/details&gt;&lt;details class=&quot;image-annotation&quot;&gt;&lt;summary&gt;Annotation 5&lt;/summary&gt;&lt;div id=&quot;uael-tooltip-content-3886575-373657f&quot;&gt;&lt;p&gt;Use roundrectangle to create an outline only on the bottom of the cards.&lt;/p&gt;								
															&lt;/div&gt;&lt;/details&gt;&lt;/figure&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-9f0fd8f elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-b69ba92&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-32f1f1a elementor-widget elementor-widget-text-editor&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
							&lt;p&gt;The page to view list of Stores, consists of several interesting elements. First, at the top, I added an icon to select or add delivery addresses, which we will discuss later.&lt;br&gt;Also, I created a search box from an icon and an Entry control, as follows:&lt;/p&gt;						&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-f1b96e4 elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-6c0e4c2&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-5f114ec elementor-widget elementor-widget-code-highlight&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
					&lt;div class=&quot;prismjs-okaidia copy-to-clipboard&quot;&gt;
			&lt;pre class=&quot;highlight-height language-markup line-numbers&quot;&gt;
				&lt;code class=&quot;language-markup&quot;&gt;
					&lt;span class=&quot;legacy-code-literal&quot;&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;
&amp;lt;Frame Padding=&quot;0&quot; BackgroundColor=&quot;#4F3F9B&quot;&amp;gt;
   &amp;lt;Grid&amp;gt;
      &amp;lt;Grid.ColumnDefinitions&amp;gt;
         &amp;lt;ColumnDefinition Width=&quot;.2*&quot; /&amp;gt;
         &amp;lt;ColumnDefinition Width=&quot;.9*&quot; /&amp;gt;
      &amp;lt;/Grid.ColumnDefinitions&amp;gt;
      &amp;lt;Image HorizontalOptions=&quot;Center&quot; VerticalOptions=&quot;Center&quot; WidthRequest=&quot;20&quot;&amp;gt;
         &amp;lt;Image.Source&amp;gt;
            &amp;lt;FontImageSource FontFamily=&quot;AwesomeSolid&quot; Glyph=&quot;&quot; /&amp;gt;
         &amp;lt;/Image.Source&amp;gt;
      &amp;lt;/Image&amp;gt;
      &amp;lt;Entry Grid.Column=&quot;1&quot; FontFamily=&quot;bold&quot; Placeholder=&quot;Search a restaurant or dish&quot; PlaceholderColor=&quot;#9D9D9D&quot; TextColor=&quot;White&quot; /&amp;gt;
   &amp;lt;/Grid&amp;gt;
&amp;lt;/Frame&amp;gt;&lt;/span&gt;
				&lt;/code&gt;
			&lt;/pre&gt;
		&lt;/div&gt;
				&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-7da72de elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-fe51120&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-a0113ca elementor-widget elementor-widget-text-editor&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
							&lt;p&gt;I have used a Frame control to give a card-like appearance to each element of the CollectionView, and I have given each of them a shadow, which gives a very attractive appearance.&lt;/p&gt;						&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-1b4c457 elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-329af95&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-f4c47e8 elementor-widget elementor-widget-code-highlight&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
					&lt;div class=&quot;prismjs-okaidia copy-to-clipboard&quot;&gt;
			&lt;pre class=&quot;highlight-height language-markup line-numbers&quot;&gt;
				&lt;code class=&quot;language-markup&quot;&gt;
					&lt;span class=&quot;legacy-code-literal&quot;&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;
&amp;lt;BoxView Grid.RowSpan=&quot;2&quot; CornerRadius=&quot;10&quot; Color=&quot;White&quot;&amp;gt;
   &amp;lt;BoxView.Shadow&amp;gt;
      &amp;lt;Shadow Brush=&quot;#CFD0D4&quot; Opacity=&quot;0.8&quot; Offset=&quot;10,10&quot; /&amp;gt;
   &amp;lt;/BoxView.Shadow&amp;gt;
&amp;lt;/BoxView&amp;gt;&lt;/span&gt;
				&lt;/code&gt;
			&lt;/pre&gt;
		&lt;/div&gt;
				&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-15447a8 elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-3c0bfda&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-ed9c45a elementor-widget elementor-widget-text-editor&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
							&lt;p&gt;Inside the card, as an element to highlight, is the logo of each business, which is rounded and with a gradient border, which has been achieved thanks to a Border control as follows:&lt;/p&gt;						&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-2e587a7 elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-e7ee928&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-d8cf1db elementor-widget elementor-widget-code-highlight&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
					&lt;div class=&quot;prismjs-okaidia copy-to-clipboard&quot;&gt;
			&lt;pre class=&quot;highlight-height language-markup line-numbers&quot;&gt;
				&lt;code class=&quot;language-markup&quot;&gt;
					&lt;span class=&quot;legacy-code-literal&quot;&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;
&amp;lt;Border HeightRequest=&quot;70&quot; HorizontalOptions=&quot;Center&quot; StrokeShape=&quot;Ellipse&quot; StrokeThickness=&quot;4&quot;&amp;gt;
   &amp;lt;Border.Stroke&amp;gt;
      &amp;lt;LinearGradientBrush EndPoint=&quot;0,1&quot;&amp;gt;
         &amp;lt;GradientStop Offset=&quot;0.0&quot; Color=&quot;#FEFEEF&quot; /&amp;gt;
         &amp;lt;GradientStop Offset=&quot;0.25&quot; Color=&quot;#EBD570&quot; /&amp;gt;
         &amp;lt;GradientStop Offset=&quot;0.5&quot; Color=&quot;#FF94C3&quot; /&amp;gt;
         &amp;lt;GradientStop Offset=&quot;0.75&quot; Color=&quot;#A573E4&quot; /&amp;gt;
         &amp;lt;GradientStop Offset=&quot;1.0&quot; Color=&quot;#A9E2EE&quot; /&amp;gt;
      &amp;lt;/LinearGradientBrush&amp;gt;
   &amp;lt;/Border.Stroke&amp;gt;
   &amp;lt;Image HorizontalOptions=&quot;Center&quot; Source=&quot;{Binding Logo}&quot; /&amp;gt;
&amp;lt;/Border&amp;gt;&lt;/span&gt;
				&lt;/code&gt;
			&lt;/pre&gt;
		&lt;/div&gt;
				&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-bf7997d elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-00212c9&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-6cddbf4 elementor-widget elementor-widget-heading&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
			&lt;h2 class=&quot;elementor-heading-title elementor-size-default&quot; id=&quot;The_scrollable_element_for_choosing_a_direction&quot;&gt;The scrollable element for choosing a direction&lt;/h2&gt;		&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-15f44bf elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-46db97b&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-cccf752 elementor-widget elementor-widget-text-editor&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
							&lt;p&gt;As mentioned before, if we tap on the arrow next to the address, a control will be displayed from below that will show previously registered addresses, as well as the option to select a new address.&lt;/p&gt;						&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-32b274b elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-e7f80d3&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-f1d1e33 elementor-widget elementor-widget-image&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
															&lt;img width=&quot;512&quot; height=&quot;1024&quot; class=&quot;attachment-large size-large&quot; alt=&quot;Scrollable menu to choose an address&quot; src=&quot;https://devs.school/wp-content/uploads/2022/08/screenshot-2022-08-30_13.34.52.211-512x1024.png&quot; srcset=&quot;https://devs.school/wp-content/uploads/2022/08/screenshot-2022-08-30_13.34.52.211-512x1024.png 512w, https://devs.school/wp-content/uploads/2022/08/screenshot-2022-08-30_13.34.52.211-150x300.png 150w, https://devs.school/wp-content/uploads/2022/08/screenshot-2022-08-30_13.34.52.211-768x1536.png 768w, https://devs.school/wp-content/uploads/2022/08/screenshot-2022-08-30_13.34.52.211-1024x2048.png 1024w, https://devs.school/wp-content/uploads/2022/08/screenshot-2022-08-30_13.34.52.211.png 1080w&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;															&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-da22601 elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-6072def&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-4968639 elementor-widget elementor-widget-text-editor&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
							&lt;p&gt;The address list is a Frame control containing a Grid to be able to size the address section and the buttons. For the scrolling effect to work, the frame must be named:&lt;/p&gt;						&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-1accd5b elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-9672791&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-3f605ef elementor-widget elementor-widget-code-highlight&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
					&lt;div class=&quot;prismjs-okaidia copy-to-clipboard&quot;&gt;
			&lt;pre class=&quot;highlight-height language-markup line-numbers&quot;&gt;
				&lt;code class=&quot;language-markup&quot;&gt;
					&lt;span class=&quot;legacy-code-literal&quot;&gt;&amp;lt;Frame
    x:Name=&quot;addressesList&quot;
    Grid.RowSpan=&quot;2&quot;
    BackgroundColor=&quot;#F7F7F7&quot;
    CornerRadius=&quot;25&quot;&amp;gt;&lt;/span&gt;
				&lt;/code&gt;
			&lt;/pre&gt;
		&lt;/div&gt;
				&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-feae784 elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-a8ae3ed&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-e0baafc elementor-widget elementor-widget-text-editor&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
							&lt;p&gt;Next, I have created a field in the code behind to store the height of the window, with the purpose that we know up to what position the Frame must be shown, this we can know it in the method OnSizeAllocated. In this method, we are also going to set the TranslationY property to 0 initially, to hide the Frame:&lt;/p&gt;						&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-1b6b973 elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-62a1a8d&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-5a65fc8 elementor-widget elementor-widget-code-highlight&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
					&lt;div class=&quot;prismjs-okaidia copy-to-clipboard&quot;&gt;
			&lt;pre class=&quot;highlight-height language-csharp line-numbers&quot;&gt;
				&lt;code class=&quot;language-csharp&quot;&gt;
					&lt;span class=&quot;legacy-code-literal&quot;&gt;private double height = 0;

protected override void OnSizeAllocated(double width, double height)
{
    base.OnSizeAllocated(width, height);
    addressesList.TranslationY = height;
    this.width = width;
    this.height = height;
}&lt;/span&gt;
				&lt;/code&gt;
			&lt;/pre&gt;
		&lt;/div&gt;
				&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-afe1f11 elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-f046bf1&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-5e04a76 elementor-widget elementor-widget-text-editor&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
							&lt;p&gt;With this we have done, it is possible to show and hide the Frame in a simple way, by clicking on a specific element of the screen:&lt;/p&gt;						&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-501aa0d elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-20e1406&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-e40bd74 elementor-widget elementor-widget-code-highlight&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
					&lt;div class=&quot;prismjs-okaidia copy-to-clipboard&quot;&gt;
			&lt;pre class=&quot;highlight-height language-csharp line-numbers&quot;&gt;
				&lt;code class=&quot;language-csharp&quot;&gt;
					&lt;span class=&quot;legacy-code-literal&quot;&gt;     private void SelectAddress_Clicked(object sender, EventArgs e)
     {
          addressesList.TranslateTo(0, height, 500, Easing.SinIn);
     }

     private void TapGestureRecognizer_Tapped(object sender, EventArgs e)
     {
          addressesList.TranslateTo(0, 0, 500, Easing.SinOut);
     }&lt;/span&gt;
				&lt;/code&gt;
			&lt;/pre&gt;
		&lt;/div&gt;
				&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-09f680a elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-49fe991&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-f4e0fee elementor-widget elementor-widget-heading&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
			&lt;h2 class=&quot;elementor-heading-title elementor-size-default&quot; id=&quot;The_screen_for_adding_a_new_address&quot;&gt;The screen for adding a new address&lt;/h2&gt;		&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-dd9acba elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-1a2e328&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-0f0657e elementor-widget elementor-widget-text-editor&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
							&lt;p&gt;This is the screen intended to allow the user to add a new delivery address.&lt;/p&gt;						&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-d8b666e elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-d18e159&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-a705d5a elementor-widget elementor-widget-image&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
															&lt;img width=&quot;512&quot; height=&quot;1024&quot; class=&quot;attachment-large size-large&quot; alt=&quot;Add a new address Page&quot; src=&quot;https://devs.school/wp-content/uploads/2022/08/screenshot-2022-08-30_13.37.59.947-512x1024.png&quot; srcset=&quot;https://devs.school/wp-content/uploads/2022/08/screenshot-2022-08-30_13.37.59.947-512x1024.png 512w, https://devs.school/wp-content/uploads/2022/08/screenshot-2022-08-30_13.37.59.947-150x300.png 150w, https://devs.school/wp-content/uploads/2022/08/screenshot-2022-08-30_13.37.59.947-768x1536.png 768w, https://devs.school/wp-content/uploads/2022/08/screenshot-2022-08-30_13.37.59.947-1024x2048.png 1024w, https://devs.school/wp-content/uploads/2022/08/screenshot-2022-08-30_13.37.59.947.png 1080w&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;															&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-fff7659 elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-fbdde26&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-d76f0cc elementor-widget elementor-widget-text-editor&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
							&lt;p&gt;This is a very simple screen, which should allow the user to select a location from the map, and then display the street as part of the data entered. It should also allow the user to add references to the location.&lt;/p&gt;&lt;p&gt;Actually, the application does not make use of maps, and only shows an image as a placeholder.&lt;/p&gt;						&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-850c25b elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-60304cb&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-25e9a38 elementor-widget elementor-widget-heading&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
			&lt;h2 class=&quot;elementor-heading-title elementor-size-default&quot; id=&quot;Store_Page&quot;&gt;Store Page&lt;/h2&gt;		&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-f4f4a72 elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-f235286&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-7e0a169 elementor-widget elementor-widget-text-editor&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
							&lt;p&gt;This is a store page, which displays relevant information such as the rating and the categories that can be found in the store.&lt;/p&gt;						&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-396f259 elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-b37b68c&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-7b498ab elementor-widget elementor-widget-image&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
															&lt;img width=&quot;512&quot; height=&quot;1024&quot; class=&quot;attachment-large size-large&quot; alt=&quot;&quot; src=&quot;https://devs.school/wp-content/uploads/2022/08/screenshot-2022-08-30_13.36.47.53-512x1024.png&quot; srcset=&quot;https://devs.school/wp-content/uploads/2022/08/screenshot-2022-08-30_13.36.47.53-512x1024.png 512w, https://devs.school/wp-content/uploads/2022/08/screenshot-2022-08-30_13.36.47.53-150x300.png 150w, https://devs.school/wp-content/uploads/2022/08/screenshot-2022-08-30_13.36.47.53-768x1536.png 768w, https://devs.school/wp-content/uploads/2022/08/screenshot-2022-08-30_13.36.47.53-1024x2048.png 1024w, https://devs.school/wp-content/uploads/2022/08/screenshot-2022-08-30_13.36.47.53.png 1080w&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;															&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-107f49b elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-44b48bb&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-42b1ba1 elementor-widget elementor-widget-text-editor&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
							&lt;p&gt;On this page, I used a CollectionView to display the store categories. The opacity is achieved by using a Grid over the category images, as follows:&lt;/p&gt;						&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-8f6995d elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-687b707&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-b3f355e elementor-widget elementor-widget-code-highlight&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
					&lt;div class=&quot;prismjs-okaidia copy-to-clipboard&quot;&gt;
			&lt;pre class=&quot;highlight-height language-markup line-numbers&quot;&gt;
				&lt;code class=&quot;language-markup&quot;&gt;
					&lt;span class=&quot;legacy-code-literal&quot;&gt;&amp;lt;Grid&amp;gt;
	&amp;lt;Image Aspect=&quot;AspectFill&quot; Source=&quot;{Binding Image}&quot; /&amp;gt;
	&amp;lt;Grid BackgroundColor=&quot;Black&quot; Opacity=&quot;.5&quot; /&amp;gt;
&amp;lt;/Grid&amp;gt;&lt;/span&gt;
				&lt;/code&gt;
			&lt;/pre&gt;
		&lt;/div&gt;
				&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-a122a7f elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-49d8397&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-a468b04 elementor-widget elementor-widget-heading&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
			&lt;h2 class=&quot;elementor-heading-title elementor-size-default&quot; id=&quot;Menu_Page&quot;&gt;Menu Page&lt;/h2&gt;		&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-8c39280 elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-7c4d572&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-2caec99 elementor-widget elementor-widget-text-editor&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
							&lt;p&gt;After you have selected a category, the page is displayed to show the products in the store.&lt;/p&gt;						&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-615e7c4 elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-192932d&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-0740d0e elementor-widget elementor-widget-image&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
															&lt;img width=&quot;512&quot; height=&quot;1024&quot; class=&quot;attachment-large size-large&quot; alt=&quot;Menu Page&quot; src=&quot;https://devs.school/wp-content/uploads/2022/08/screenshot-2022-08-30_13.36.58.531-512x1024.png&quot; srcset=&quot;https://devs.school/wp-content/uploads/2022/08/screenshot-2022-08-30_13.36.58.531-512x1024.png 512w, https://devs.school/wp-content/uploads/2022/08/screenshot-2022-08-30_13.36.58.531-150x300.png 150w, https://devs.school/wp-content/uploads/2022/08/screenshot-2022-08-30_13.36.58.531-768x1536.png 768w, https://devs.school/wp-content/uploads/2022/08/screenshot-2022-08-30_13.36.58.531-1024x2048.png 1024w, https://devs.school/wp-content/uploads/2022/08/screenshot-2022-08-30_13.36.58.531.png 1080w&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;															&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-0383b0b elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-8747644&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-130f3d4 elementor-widget elementor-widget-text-editor&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
							&lt;p&gt;At the top, we have a CollectionView, whose purpose is to allow us to move between categories quickly.&lt;/p&gt;&lt;p&gt;The idea is to pre-select the item that has been selected on the previous page, and to filter the products by category, as it is not currently implemented.&lt;/p&gt;&lt;p&gt;On this page, again the elements are displayed in the form of a card with a shadow, being a Grid the one in charge of dividing the sections for each element of the card.&lt;br&gt;We can also notice at the bottom, an orange box that shows the order information such as the items in the cart and the estimated total. If we click on this element, we can go to the payment processing page.&lt;/p&gt;						&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-db35a87 elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-42cf057&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-f2fe97e elementor-widget elementor-widget-heading&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
			&lt;h2 class=&quot;elementor-heading-title elementor-size-default&quot; id=&quot;Products_page&quot;&gt;Products page&lt;/h2&gt;		&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-613a4eb elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-607dfbb&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-f6d3dc1 elementor-widget elementor-widget-text-editor&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
							&lt;p&gt;This is the product page, i.e. where the ingredients of a product can be configured, as well as the Extras and supplements that can be added.&lt;/p&gt;						&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-7c5b847 elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-9d2751e&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-e799ee0 elementor-widget elementor-widget-image&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
															&lt;img width=&quot;512&quot; height=&quot;1024&quot; class=&quot;attachment-large size-large&quot; alt=&quot;Product Page&quot; src=&quot;https://devs.school/wp-content/uploads/2022/08/screenshot-2022-08-30_13.37.12.749-512x1024.png&quot; srcset=&quot;https://devs.school/wp-content/uploads/2022/08/screenshot-2022-08-30_13.37.12.749-512x1024.png 512w, https://devs.school/wp-content/uploads/2022/08/screenshot-2022-08-30_13.37.12.749-150x300.png 150w, https://devs.school/wp-content/uploads/2022/08/screenshot-2022-08-30_13.37.12.749-768x1536.png 768w, https://devs.school/wp-content/uploads/2022/08/screenshot-2022-08-30_13.37.12.749-1024x2048.png 1024w, https://devs.school/wp-content/uploads/2022/08/screenshot-2022-08-30_13.37.12.749.png 1080w&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;															&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-2ed8311 elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-ddcec56&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-4be274f elementor-widget elementor-widget-text-editor&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
							&lt;p&gt;The great advantage of this page is that it has implemented the option to add as many add-ons as necessary according to a product. This is done thanks to the established class hierarchy.&lt;/p&gt;						&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-b1c8dc3 elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-1bf3787&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-f4fe7da elementor-widget elementor-widget-code-highlight&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
					&lt;div class=&quot;prismjs-okaidia copy-to-clipboard&quot;&gt;
			&lt;pre class=&quot;highlight-height language-csharp line-numbers&quot;&gt;
				&lt;code class=&quot;language-csharp&quot;&gt;
					&lt;span class=&quot;legacy-code-literal&quot;&gt;Extras = new List&amp;lt;Extra&amp;gt;
{
     new Extra
     {
          options = new List&amp;lt;Option&amp;gt;
          {                         
               new Option
               {
                    name = &quot;Extras&quot;,
                    suboptions = new List&amp;lt;Suboption&amp;gt;
                    {
                         new Suboption
                         {
                              Name = &quot;French fries&quot;,
                              Rule = EnumRule.Min0_Max1
                         }
                    }
               }
          }
     }
};&lt;/span&gt;
				&lt;/code&gt;
			&lt;/pre&gt;
		&lt;/div&gt;
				&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-69c350a elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-b95fa67&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-ea61ca7 elementor-widget elementor-widget-text-editor&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
							&lt;p&gt; &lt;/p&gt;&lt;p&gt;In the same way, each section is shown, because the CollectionView has been enabled to show groupings, which is filled thanks to the following code:&lt;/p&gt;						&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-8e416f5 elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-5fd4585&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-89a29ce elementor-widget elementor-widget-code-highlight&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
					&lt;div class=&quot;prismjs-okaidia copy-to-clipboard&quot;&gt;
			&lt;pre class=&quot;highlight-height language-csharp line-numbers&quot;&gt;
				&lt;code class=&quot;language-csharp&quot;&gt;
					&lt;span class=&quot;legacy-code-literal&quot;&gt;var grouped =  from o in AllOptions
               group o by o.GroupName
               into groups
               select new OptionsGroup(groups.Key, groups.ToList());

Options = new List&amp;lt;OptionsGroup&amp;gt;(grouped);&lt;/span&gt;
				&lt;/code&gt;
			&lt;/pre&gt;
		&lt;/div&gt;
				&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-05f41ed elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-99db0b5&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-425011c elementor-widget elementor-widget-text-editor&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
							&lt;p&gt;Finally, the previous code shows the assignment to a property called Rule, which basically indicates the number of elements that can be selected as a complement. This assignment, serves to be able to apply a DataTemplate to each element of the CollectionView, with the purpose of showing a CheckBox or a RadioButton according to the established rule:&lt;/p&gt;						&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-4038d4e elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-ffaee3f&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-1f0ea91 elementor-widget elementor-widget-code-highlight&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
					&lt;div class=&quot;prismjs-okaidia copy-to-clipboard&quot;&gt;
			&lt;pre class=&quot;highlight-height language-csharp line-numbers&quot;&gt;
				&lt;code class=&quot;language-csharp&quot;&gt;
					&lt;span class=&quot;legacy-code-literal&quot;&gt;protected override DataTemplate OnSelectTemplate(object item, BindableObject container)
{
     var collection = container as CollectionView;

     if (container != null)
     {
          var product = item as BaseOptionsItem;
     if (product.Rule == EnumRule.None)
     {
          return (DataTemplate)collection.Resources[&quot;checkOption&quot;];
     }
     else if (product.Rule == EnumRule.Min0_Max1)
     {
          return (DataTemplate)collection.Resources[&quot;checkOption&quot;];
     }
     else if (product.Rule == EnumRule.Min1_Max1)
     {
          return (DataTemplate)collection.Resources[&quot;radioOption&quot;];
     }
     else if (product.Rule == EnumRule.Max)
     {
          return (DataTemplate)collection.Resources[&quot;radioOption&quot;];
     }
     }
     return null;
}&lt;/span&gt;
				&lt;/code&gt;
			&lt;/pre&gt;
		&lt;/div&gt;
				&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-d0d9f51 elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-bb64234&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-27fef14 elementor-widget elementor-widget-text-editor&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
							&lt;p&gt;At the end of the product configuration, the product must be added to the shopping cart and allow the user to continue shopping, so a PopAsync is made to the previous page by pressing the &lt;strong&gt;ADD&lt;/strong&gt; button.&lt;/p&gt;						&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-a98c56f elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-aa4bef4&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-65cb772 elementor-widget elementor-widget-heading&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
			&lt;h2 class=&quot;elementor-heading-title elementor-size-default&quot; id=&quot;Payment_page&quot;&gt;Payment page&lt;/h2&gt;		&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-7b47e07 elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-39d9dd2&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-6672e68 elementor-widget elementor-widget-text-editor&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
							&lt;p&gt;This is the payment page. In it, the idea is to be able to add new cards, as well as other payment methods (which is not implemented).&lt;/p&gt;						&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-b21e247 elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-d40fcb4&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-8dcfa2d elementor-widget elementor-widget-image&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
															&lt;img width=&quot;512&quot; height=&quot;1024&quot; class=&quot;attachment-large size-large&quot; alt=&quot;Checkout Page&quot; src=&quot;https://devs.school/wp-content/uploads/2022/08/screenshot-2022-08-30_13.37.41.096-512x1024.png&quot; srcset=&quot;https://devs.school/wp-content/uploads/2022/08/screenshot-2022-08-30_13.37.41.096-512x1024.png 512w, https://devs.school/wp-content/uploads/2022/08/screenshot-2022-08-30_13.37.41.096-150x300.png 150w, https://devs.school/wp-content/uploads/2022/08/screenshot-2022-08-30_13.37.41.096-768x1536.png 768w, https://devs.school/wp-content/uploads/2022/08/screenshot-2022-08-30_13.37.41.096-1024x2048.png 1024w, https://devs.school/wp-content/uploads/2022/08/screenshot-2022-08-30_13.37.41.096.png 1080w&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;															&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-f25763f elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-453f780&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-34ef7b4 elementor-widget elementor-widget-text-editor&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
							&lt;p&gt;For this page, I reused the same layout of the addresses, as well as a frame with borders to show a nice visual appearance. The button with the &lt;strong&gt;+&lt;/strong&gt; sign should be able to add a new card, however, this functionality is not implemented.&lt;/p&gt;&lt;p&gt;Clicking on the Pay Now button should initiate the payment processing. Currently only a Lottie animation is displayed showing that the transaction was successful:&lt;/p&gt;						&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-c2d163c elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-7449a8e&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-09c0ac7 elementor-widget elementor-widget-image&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
															&lt;img width=&quot;512&quot; height=&quot;1024&quot; class=&quot;attachment-large size-large&quot; alt=&quot;.NET MAUI Lottie Animation&quot; src=&quot;https://devs.school/wp-content/uploads/2022/08/screenshot-2022-08-30_13.37.44.329-512x1024.png&quot; srcset=&quot;https://devs.school/wp-content/uploads/2022/08/screenshot-2022-08-30_13.37.44.329-512x1024.png 512w, https://devs.school/wp-content/uploads/2022/08/screenshot-2022-08-30_13.37.44.329-150x300.png 150w, https://devs.school/wp-content/uploads/2022/08/screenshot-2022-08-30_13.37.44.329-768x1536.png 768w, https://devs.school/wp-content/uploads/2022/08/screenshot-2022-08-30_13.37.44.329-1024x2048.png 1024w, https://devs.school/wp-content/uploads/2022/08/screenshot-2022-08-30_13.37.44.329.png 1080w&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;															&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-cce7659 elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-f0c0b16&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-4aac423 elementor-widget elementor-widget-text-editor&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
							&lt;p&gt;With this we finish the analysis of the MAUIDelivery application. If you liked it, and want to see more content like this, feel free to leave me a comment.&lt;/p&gt;						&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-ef0ca63 elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-93c4f13&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-c04f34d elementor-widget elementor-widget-heading&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
			&lt;h2 class=&quot;elementor-heading-title elementor-size-default&quot; id=&quot;Where_can_I_learn_more_about_NET_MAUI&quot;&gt;Where can I learn more about .NET MAUI?&lt;/h2&gt;		&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-e230935 elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-1323586&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-a5da570 elementor-widget elementor-widget-text-editor&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
							&lt;p&gt;To end this publication, I would like to tell you that I have created a .NET MAUI course, in which I deal with topics from basic to advanced, and I update it regularly. If you are interested, you can see the &lt;a href=&quot;https://courses.devs.school/courses/net-maui&quot;&gt;MAUI course&lt;/a&gt; syllabus.&lt;/p&gt;						&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
				&lt;section class=&quot;elementor-section elementor-top-section elementor-element elementor-element-8da5fd3 elementor-section-boxed elementor-section-height-default elementor-section-height-default&quot;&gt;
						&lt;div class=&quot;elementor-container elementor-column-gap-default&quot;&gt;
					&lt;div class=&quot;elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-64a59b9&quot;&gt;
			&lt;div class=&quot;elementor-widget-wrap elementor-element-populated&quot;&gt;
								&lt;div class=&quot;elementor-element elementor-element-e8210fd elementor-widget elementor-widget-image&quot;&gt;
				&lt;div class=&quot;elementor-widget-container&quot;&gt;
																&lt;a href=&quot;https://courses.devs.school/courses/net-maui&quot;&gt;
							&lt;img width=&quot;1024&quot; height=&quot;661&quot; class=&quot;attachment-large size-large&quot; alt=&quot;.NET MAUI Course&quot; src=&quot;https://devs.school/wp-content/uploads/2022/08/msedge_BpAhdwWS2m-1024x661.png&quot; srcset=&quot;https://devs.school/wp-content/uploads/2022/08/msedge_BpAhdwWS2m-1024x661.png 1024w, https://devs.school/wp-content/uploads/2022/08/msedge_BpAhdwWS2m-300x194.png 300w, https://devs.school/wp-content/uploads/2022/08/msedge_BpAhdwWS2m-768x496.png 768w, https://devs.school/wp-content/uploads/2022/08/msedge_BpAhdwWS2m-60x40.png 60w, https://devs.school/wp-content/uploads/2022/08/msedge_BpAhdwWS2m.png 1169w&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;								&lt;/a&gt;
															&lt;/div&gt;
				&lt;/div&gt;
					&lt;/div&gt;
		&lt;/div&gt;
							&lt;/div&gt;
		&lt;/section&gt;
							&lt;/div&gt;
		</content:encoded></item></channel></rss>