<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Mohammad Hossein Rastegarinia</title>
    <description>The latest articles on DEV Community by Mohammad Hossein Rastegarinia (@mhrastegari).</description>
    <link>https://dev.to/mhrastegari</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F915294%2F51eafd1a-263a-44d7-8552-161d7f331280.jpg</url>
      <title>DEV Community: Mohammad Hossein Rastegarinia</title>
      <link>https://dev.to/mhrastegari</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/mhrastegari"/>
    <language>en</language>
    <item>
      <title>Develop .NET MAUI Apps Using VS Code Without Traditional IDEs</title>
      <dc:creator>Mohammad Hossein Rastegarinia</dc:creator>
      <pubDate>Fri, 18 Oct 2024 19:44:20 +0000</pubDate>
      <link>https://dev.to/mhrastegari/develop-net-maui-apps-using-vs-code-without-traditional-ides-2l51</link>
      <guid>https://dev.to/mhrastegari/develop-net-maui-apps-using-vs-code-without-traditional-ides-2l51</guid>
      <description>&lt;p&gt;.NET MAUI (Multi-platform App UI) is a powerful cross-platform framework by Microsoft, often used with full-featured IDEs. However, you can now build and debug .NET MAUI apps using &lt;strong&gt;VS Code&lt;/strong&gt; alone! This guide provides a step-by-step approach to setting up your environment and developing .NET MAUI apps without relying on traditional IDEs.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 1: Install Required Tools
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Download and Install .NET SDK&lt;/strong&gt;&lt;br&gt;
Get the latest &lt;strong&gt;.NET SDK&lt;/strong&gt; (version 8 or 9rc) from the &lt;a href="https://dotnet.microsoft.com/en-us/download" rel="noopener noreferrer"&gt;.NET website&lt;/a&gt;.  &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Install Visual Studio Code&lt;/strong&gt;&lt;br&gt;
Download and install &lt;strong&gt;VS Code&lt;/strong&gt; from &lt;a href="https://code.visualstudio.com/" rel="noopener noreferrer"&gt;here&lt;/a&gt;.   &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Install the .NET MAUI Extension for VS Code&lt;/strong&gt;&lt;br&gt;
Install the &lt;strong&gt;.NET MAUI extension&lt;/strong&gt; from the VS Code marketplace. This extension also installs the &lt;strong&gt;C# Dev Kit&lt;/strong&gt; and &lt;strong&gt;C# extensions&lt;/strong&gt; for debugging and building .NET projects.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Step 2: Install .NET MAUI Templates and Workloads
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Open a new terminal and write these to install Microsoft's .NET MAUI project templates
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dotnet new &lt;span class="nb"&gt;install &lt;/span&gt;Microsoft.Maui.Templates 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Write the following command to create a new .NET MAUI project:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dotnet new maui &lt;span class="nt"&gt;-n&lt;/span&gt; MyMauiApp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Run the following command to install the required workloads:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dotnet workload &lt;span class="nb"&gt;install &lt;/span&gt;maui
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This ensures that your system is ready to build and run MAUI projects.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 3: Setup Android Development
&lt;/h2&gt;

&lt;p&gt;Setting up Android development without full-featured IDEs can be tricky. Below are the steps to configure Android tools manually.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Install Microsoft OpenJDK 17&lt;/strong&gt;&lt;br&gt;
Download the latest version of &lt;strong&gt;Microsoft OpenJDK 17&lt;/strong&gt; &lt;a href="https://learn.microsoft.com/en-us/java/openjdk/download#openjdk-17" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Install Android Dependencies&lt;/strong&gt;&lt;br&gt;
Use the following command to install the Android SDK and related dependencies:&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dotnet build &lt;span class="nt"&gt;-t&lt;/span&gt;:InstallAndroidDependencies &lt;span class="nt"&gt;-f&lt;/span&gt;:net8.0-android &lt;span class="nt"&gt;-p&lt;/span&gt;:AndroidSdkDirectory&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"C:&lt;/span&gt;&lt;span class="se"&gt;\P&lt;/span&gt;&lt;span class="s2"&gt;rogram Files (x86)&lt;/span&gt;&lt;span class="se"&gt;\A&lt;/span&gt;&lt;span class="s2"&gt;ndroid&lt;/span&gt;&lt;span class="se"&gt;\a&lt;/span&gt;&lt;span class="s2"&gt;ndroid-sdk"&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt;:JavaSdkDirectory&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"C:&lt;/span&gt;&lt;span class="se"&gt;\P&lt;/span&gt;&lt;span class="s2"&gt;rogram Files&lt;/span&gt;&lt;span class="se"&gt;\M&lt;/span&gt;&lt;span class="s2"&gt;icrosoft&lt;/span&gt;&lt;span class="se"&gt;\j&lt;/span&gt;&lt;span class="s2"&gt;dk-17.0.16.8-hotspot&lt;/span&gt;&lt;span class="se"&gt;\b&lt;/span&gt;&lt;span class="s2"&gt;in"&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt;:AcceptAndroidSDKLicenses&lt;span class="o"&gt;=&lt;/span&gt;True
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Configure the required environment variables:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;setx ANDROID_HOME &lt;span class="s2"&gt;"C:&lt;/span&gt;&lt;span class="se"&gt;\P&lt;/span&gt;&lt;span class="s2"&gt;rogram Files (x86)&lt;/span&gt;&lt;span class="se"&gt;\A&lt;/span&gt;&lt;span class="s2"&gt;ndroid&lt;/span&gt;&lt;span class="se"&gt;\a&lt;/span&gt;&lt;span class="s2"&gt;ndroid-sdk"&lt;/span&gt;
setx JAVA_HOME &lt;span class="s2"&gt;"C:&lt;/span&gt;&lt;span class="se"&gt;\P&lt;/span&gt;&lt;span class="s2"&gt;rogram Files&lt;/span&gt;&lt;span class="se"&gt;\M&lt;/span&gt;&lt;span class="s2"&gt;icrosoft&lt;/span&gt;&lt;span class="se"&gt;\j&lt;/span&gt;&lt;span class="s2"&gt;dk-17.0.16.8-hotspot&lt;/span&gt;&lt;span class="se"&gt;\b&lt;/span&gt;&lt;span class="s2"&gt;in"&lt;/span&gt;
setx PATH &lt;span class="s2"&gt;"%PATH%;%ANDROID_HOME%&lt;/span&gt;&lt;span class="se"&gt;\t&lt;/span&gt;&lt;span class="s2"&gt;ools;%ANDROID_HOME%&lt;/span&gt;&lt;span class="se"&gt;\p&lt;/span&gt;&lt;span class="s2"&gt;latform-tools;%JAVA_HOME%&lt;/span&gt;&lt;span class="se"&gt;\b&lt;/span&gt;&lt;span class="s2"&gt;in"&lt;/span&gt;
setx PATH &lt;span class="s2"&gt;"%PATH%;C:&lt;/span&gt;&lt;span class="se"&gt;\P&lt;/span&gt;&lt;span class="s2"&gt;rogram Files (x86)&lt;/span&gt;&lt;span class="se"&gt;\A&lt;/span&gt;&lt;span class="s2"&gt;ndroid&lt;/span&gt;&lt;span class="se"&gt;\a&lt;/span&gt;&lt;span class="s2"&gt;ndroid-sdk&lt;/span&gt;&lt;span class="se"&gt;\c&lt;/span&gt;&lt;span class="s2"&gt;mdline-tools&lt;/span&gt;&lt;span class="se"&gt;\1&lt;/span&gt;&lt;span class="s2"&gt;1.0&lt;/span&gt;&lt;span class="se"&gt;\b&lt;/span&gt;&lt;span class="s2"&gt;in"&lt;/span&gt;
setx PATH &lt;span class="s2"&gt;"%PATH%;C:&lt;/span&gt;&lt;span class="se"&gt;\P&lt;/span&gt;&lt;span class="s2"&gt;rogram Files (x86)&lt;/span&gt;&lt;span class="se"&gt;\A&lt;/span&gt;&lt;span class="s2"&gt;ndroid&lt;/span&gt;&lt;span class="se"&gt;\a&lt;/span&gt;&lt;span class="s2"&gt;ndroid-sdk&lt;/span&gt;&lt;span class="se"&gt;\p&lt;/span&gt;&lt;span class="s2"&gt;latform-tools"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Step 4: Install and Configure the Android Emulator
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Check which system images are available:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;sdkmanager &lt;span class="nt"&gt;--list&lt;/span&gt; | findstr /i system-images
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Install a System Image
For example install the Google Play system image for Android API 34:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;sdkmanager &lt;span class="s2"&gt;"system-images;android-34;google_apis_playstore;x86_64"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Install the Android Emulator:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;sdkmanager &lt;span class="nt"&gt;--install&lt;/span&gt; &lt;span class="s2"&gt;"emulator"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Add the emulator to your system PATH:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;setx PATH &lt;span class="s2"&gt;"%PATH%;C:&lt;/span&gt;&lt;span class="se"&gt;\P&lt;/span&gt;&lt;span class="s2"&gt;rogram Files (x86)&lt;/span&gt;&lt;span class="se"&gt;\A&lt;/span&gt;&lt;span class="s2"&gt;ndroid&lt;/span&gt;&lt;span class="se"&gt;\a&lt;/span&gt;&lt;span class="s2"&gt;ndroid-sdk&lt;/span&gt;&lt;span class="se"&gt;\e&lt;/span&gt;&lt;span class="s2"&gt;mulator"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Create an Android virtual device, for example Pixel 6 Pro:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;avdmanager create avd &lt;span class="nt"&gt;-n&lt;/span&gt; Pixel_6_Pro_API_34_Play &lt;span class="nt"&gt;-k&lt;/span&gt; &lt;span class="s2"&gt;"system-images;android-34;google_apis_playstore;x86_64"&lt;/span&gt; &lt;span class="nt"&gt;--device&lt;/span&gt; &lt;span class="s2"&gt;"pixel_6_pro"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Launch the Emulator:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;emulator &lt;span class="nt"&gt;-avd&lt;/span&gt; Pixel_6_Pro_API_34_Play
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Step 5: Delete an Emulator (Optional)
&lt;/h2&gt;

&lt;p&gt;If you no longer need a virtual device, delete it with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;avdmanager delete avd &lt;span class="nt"&gt;-n&lt;/span&gt; Pixel_6_Pro_API_34_Play
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  A Note on iOS/macOS and Windows Development
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;iOS/macOS:&lt;br&gt;
Developing for iOS/macOS requires macOS, as Apple’s tooling, such as Xcode and simulators, is only available on macOS. Once configured, you can deploy and debug your MAUI app to iOS devices or simulators directly from VS Code by setting up remote build hosts.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Windows (WinUI):&lt;br&gt;
For Windows apps, ensure that you have the required Windows SDKs installed. Building and running MAUI apps on Windows is straightforward since the necessary tools are included with the .NET SDK.&lt;br&gt;
For insuring about WindowsAppSDK install you can run this command:&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dotnet add package Microsoft.WindowsAppSDK &lt;span class="nt"&gt;--version&lt;/span&gt; 1.5.2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Using &lt;strong&gt;VS Code&lt;/strong&gt; to develop .NET MAUI apps offers a lightweight alternative to traditional IDEs. While configuring Android development can be tricky, following the steps outlined in this guide will set you up for success.&lt;/p&gt;

&lt;p&gt;With your environment properly configured, you can build cross-platform apps targeting &lt;strong&gt;Android&lt;/strong&gt;, &lt;strong&gt;iOS/macOS&lt;/strong&gt;, and &lt;strong&gt;Windows&lt;/strong&gt; all from the comfort of VS Code!&lt;/p&gt;

&lt;p&gt;Happy coding! 🚀&lt;/p&gt;

</description>
      <category>dotnet</category>
      <category>maui</category>
      <category>vscode</category>
      <category>android</category>
    </item>
    <item>
      <title>Optimizing startup UX in .NET MAUI Blazor with a simple preloading 🚀</title>
      <dc:creator>Mohammad Hossein Rastegarinia</dc:creator>
      <pubDate>Sat, 25 Nov 2023 17:56:47 +0000</pubDate>
      <link>https://dev.to/mhrastegari/optimizing-startup-ux-in-net-maui-blazor-with-a-simple-preloading-11l4</link>
      <guid>https://dev.to/mhrastegari/optimizing-startup-ux-in-net-maui-blazor-with-a-simple-preloading-11l4</guid>
      <description>&lt;p&gt;Developing a &lt;code&gt;.NET MAUI Blazor&lt;/code&gt; app involves optimizing various aspects for an enhanced user experience, and preloading is one of the key elements in this endeavor. Unlike preloading in websites, where you might preload carefully, focusing on specific assets in your main page can significantly improve performance without overwhelming the process.&lt;/p&gt;

&lt;p&gt;In this context, leveraging the &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt; tag in the &lt;code&gt;index.html&lt;/code&gt; file allows for strategic preloading of essential resources, like images and fonts, which directly impact the initial visual and typographic aspects of the app. For instance:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;head&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;link&lt;/span&gt; &lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;"preload"&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"images/my-logo.svg"&lt;/span&gt; &lt;span class="na"&gt;as=&lt;/span&gt;&lt;span class="s"&gt;"image"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;link&lt;/span&gt; &lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;"preload"&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"fonts/my-font.ttf"&lt;/span&gt; &lt;span class="na"&gt;as=&lt;/span&gt;&lt;span class="s"&gt;"font"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This approach ensures that crucial visual elements, such as logos or key images, and necessary fonts, load swiftly when users access the main page, contributing to a smoother and more engaging user experience.&lt;/p&gt;

&lt;p&gt;However, it's crucial to strike a balance between what's preloaded and what's dynamically loaded during runtime. Overloading the preload might bloat the initial loading time, defeating the purpose of optimization. Therefore, identifying and prioritizing critical assets that significantly impact the initial user interaction is key.&lt;/p&gt;

&lt;p&gt;By implementing selective preloading strategies within the &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt; tag, you can optimize resource loading, offering users a faster and more seamless experience without compromising on app functionality or speed.&lt;/p&gt;

</description>
      <category>dotnet</category>
      <category>blazor</category>
      <category>webdev</category>
      <category>mobile</category>
    </item>
    <item>
      <title>Why is Blazor Hybrid's file input crashing on iOS?!</title>
      <dc:creator>Mohammad Hossein Rastegarinia</dc:creator>
      <pubDate>Mon, 28 Aug 2023 13:59:31 +0000</pubDate>
      <link>https://dev.to/mhrastegari/why-is-blazor-hybrids-file-uploader-crashing-on-ios-oea</link>
      <guid>https://dev.to/mhrastegari/why-is-blazor-hybrids-file-uploader-crashing-on-ios-oea</guid>
      <description>&lt;p&gt;On &lt;code&gt;Android&lt;/code&gt; and &lt;code&gt;WinUI&lt;/code&gt; input tag with type of &lt;code&gt;file&lt;/code&gt; is working fine when trying to capture &lt;code&gt;image/video&lt;/code&gt; with the camera, but on &lt;code&gt;iOS&lt;/code&gt; doing weird stuff like crashing on a real device or showing a black screen when you want to upload an image or video from the camera! so no worries we're here to fix them all.&lt;/p&gt;

&lt;h2&gt;
  
  
  Crashing on opening camera
&lt;/h2&gt;

&lt;p&gt;Why it's happening only on the &lt;code&gt;Hybrid&lt;/code&gt; app?&lt;br&gt;
Because unlike &lt;code&gt;PWA&lt;/code&gt; or &lt;code&gt;SPA&lt;/code&gt;, it's basically an actual app accessing all the native stuff + Web UI and the crashing is because you need to give it the right permissions just like a native app!&lt;br&gt;
So go to &lt;code&gt;YOURPROJECTNAME\Platforms\iOS\Info.plist&lt;/code&gt; and add these lines:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;key&amp;gt;&lt;/span&gt;NSCameraUsageDescription&lt;span class="nt"&gt;&amp;lt;/key&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;This app uses camera for...&lt;span class="nt"&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;key&amp;gt;&lt;/span&gt;NSMicrophoneUsageDescription&lt;span class="nt"&gt;&amp;lt;/key&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;This app uses microphone to record videos for...&lt;span class="nt"&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Camera view is black!
&lt;/h2&gt;

&lt;p&gt;I don't know if this is on &lt;code&gt;BlazorWebView&lt;/code&gt; or not but when you open the camera from an &lt;code&gt;input&lt;/code&gt; tag it shows a black screen! so I read &lt;code&gt;WKWebView&lt;/code&gt;'s docs and found the &lt;code&gt;AllowsInlineMediaPlayback&lt;/code&gt; property and we have to enable it in our &lt;code&gt;BlazorWebView&lt;/code&gt;!&lt;br&gt;
In your &lt;code&gt;MainPage.xaml.cs&lt;/code&gt; add these lines:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;BlazorWebViewHandler&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;BlazorWebViewMapper&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AppendToMapping&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"CustomBlazorWebViewMapper"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;handler&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;view&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="cp"&gt;#if IOS
&lt;/span&gt;    &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;configs&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;handler&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;PlatformView&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Configuration&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;configs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AllowsInlineMediaPlayback&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="cp"&gt;#endif
&lt;/span&gt;&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;So that was all you needed to fix the &lt;code&gt;input&lt;/code&gt; tag on a Blazor Hybrid iOS app! &lt;br&gt;
Luckily we've covered these in &lt;a href="https://bitplatform.dev/templates/overview" rel="noopener noreferrer"&gt;BitPlatform templates&lt;/a&gt; and more!&lt;/p&gt;

&lt;p&gt;Happy coding ;D&lt;/p&gt;

</description>
      <category>blazor</category>
      <category>dotnet</category>
      <category>mobile</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Animate your .NET MAUI Windows app</title>
      <dc:creator>Mohammad Hossein Rastegarinia</dc:creator>
      <pubDate>Fri, 26 May 2023 10:44:17 +0000</pubDate>
      <link>https://dev.to/mhrastegari/animate-your-net-maui-windows-app-27h0</link>
      <guid>https://dev.to/mhrastegari/animate-your-net-maui-windows-app-27h0</guid>
      <description>&lt;p&gt;If you're new to Windows development with .NET MAUI, you may not be familiar with some of the native tricks available. However, developers experienced in &lt;code&gt;UWP&lt;/code&gt; and &lt;code&gt;WinUI&lt;/code&gt; have knowledge of these tricks! Currently, .NET MAUI uses &lt;code&gt;WinUI&lt;/code&gt; for Windows development, and there are a lot of impressive animations in WinUI that we can incorporate into our .NET MAUI apps. Let's explore some of them.&lt;/p&gt;

&lt;h2&gt;
  
  
  Animate moving elements
&lt;/h2&gt;

&lt;p&gt;One of the animations available is the &lt;code&gt;RepositionThemeTransition&lt;/code&gt;, which works when an element moves, such as when you resize your window or when certain events occur in your C# code. You can also utilize Triggers and VisualStates in XAML to trigger this animation. I'm absolutely enamored by this animation, It's truly remarkable. You just need to have a responsive design to witness its magic.&lt;br&gt;
To animate any layout by targeting a &lt;code&gt;Panel&lt;/code&gt;, you can use the following XAML code snippet:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;    &lt;span class="nt"&gt;&amp;lt;maui:MauiWinUIApplication.Resources&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;Style&lt;/span&gt; &lt;span class="na"&gt;TargetType=&lt;/span&gt;&lt;span class="s"&gt;"Panel"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;Setter&lt;/span&gt; &lt;span class="na"&gt;Property=&lt;/span&gt;&lt;span class="s"&gt;"ChildrenTransitions"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;Setter.Value&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;TransitionCollection&amp;gt;&lt;/span&gt;
                        &lt;span class="nt"&gt;&amp;lt;RepositionThemeTransition&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;/TransitionCollection&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;/Setter.Value&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;/Setter&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/Style&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/maui:MauiWinUIApplication.Resources&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can also animate individual elements like &lt;code&gt;Button&lt;/code&gt; by specifying the target type accordingly.&lt;/p&gt;

&lt;h2&gt;
  
  
  Changing Page Navigation Animation
&lt;/h2&gt;

&lt;p&gt;If you wish to modify the default page animation in .NET MAUI for Windows, which is the &lt;code&gt;SlideNavigationTransition&lt;/code&gt;, here's the code you need:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;    &lt;span class="nt"&gt;&amp;lt;maui:MauiWinUIApplication.Resources&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;Style&lt;/span&gt; &lt;span class="na"&gt;TargetType=&lt;/span&gt;&lt;span class="s"&gt;"Page"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;Setter&lt;/span&gt; &lt;span class="na"&gt;Property=&lt;/span&gt;&lt;span class="s"&gt;"Transitions"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;Setter.Value&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;TransitionCollection&amp;gt;&lt;/span&gt;
                        &lt;span class="nt"&gt;&amp;lt;EdgeUIThemeTransition&lt;/span&gt; &lt;span class="na"&gt;Edge=&lt;/span&gt;&lt;span class="s"&gt;"Bottom"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
                    &lt;span class="nt"&gt;&amp;lt;/TransitionCollection&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;/Setter.Value&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;/Setter&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/Style&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/maui:MauiWinUIApplication.Resources&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;That's all there is to it! Just remember to include these code snippets in the &lt;code&gt;Platforms/Windows/App.xaml&lt;/code&gt; file of your project. Additionally, I've created a sample repository where you can access the code &lt;a href="https://github.com/mhrastegari/MAUIWinUIAnimations" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;br&gt;
Also you can learn more about Windows animations from &lt;a href="https://learn.microsoft.com/en-us/windows/apps/design/motion/xaml-animation" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I hope you find these animations useful and enjoy enhancing your .NET MAUI Windows app with delightful visual effects!&lt;/p&gt;

</description>
      <category>dotnet</category>
      <category>winui</category>
      <category>windows</category>
      <category>dotnetmaui</category>
    </item>
    <item>
      <title>Entering into the Multiverse of Blazor with Bit Platform templates</title>
      <dc:creator>Mohammad Hossein Rastegarinia</dc:creator>
      <pubDate>Sun, 26 Mar 2023 17:00:35 +0000</pubDate>
      <link>https://dev.to/mhrastegari/entering-into-the-multiverse-of-blazor-with-bit-platform-templates-4ln4</link>
      <guid>https://dev.to/mhrastegari/entering-into-the-multiverse-of-blazor-with-bit-platform-templates-4ln4</guid>
      <description>&lt;p&gt;Looking for a solution to create both Web and App projects in a single shared codebase? Look no further than &lt;a href="https://bitplatform.dev/" rel="noopener noreferrer"&gt;Bit Platform&lt;/a&gt;'s templates!&lt;/p&gt;

&lt;p&gt;Bit Platform's &lt;a href="https://bitplatform.dev/templates" rel="noopener noreferrer"&gt;Boilerplate&lt;/a&gt; is a comprehensive solution that utilizes ASP.NET Core, Identity, Web API, and EF Core for the server-side, and Blazor for the client-side. With this powerful combination, you can build a wide variety of applications from a single codebase, including:&lt;/p&gt;

&lt;h3&gt;
  
  
  Blazor Modes
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Blazor Server: Ideal for fast development and debugging&lt;/li&gt;
&lt;li&gt;Blazor WebAssembly: Perfect for SPA and PWA (for production)&lt;/li&gt;
&lt;li&gt;Blazor Hybrid: Provides Android, iOS, Mac Catalyst, Tizen, and WinUI apps with full access to platform native features using .NET MAUI!&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Features
&lt;/h3&gt;

&lt;p&gt;With pre-configured options for Android, iOS, macOS, Windows, and Linux apps, as well as PWA (for offline-capable web apps) and SPA with/without pre-rendering, Bit Platform's templates offer unparalleled flexibility and startup speed. These templates also utilize Bit Blazor UI components, which are fast, lightweight (less than 200KB), and perfect for building even complex applications like e-commerce sites.&lt;/p&gt;

&lt;h3&gt;
  
  
  Demos
&lt;/h3&gt;

&lt;p&gt;Bit Platform has already developed and published several websites and apps using these templates, including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://components.bitplatform.dev/" rel="noopener noreferrer"&gt;Bit Components web site&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://install.appcenter.ms/orgs/bitfoundation/apps/bitcomponents/distribution_groups/testers" rel="noopener noreferrer"&gt;Bit Components mobile app&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://bitplatform.dev/" rel="noopener noreferrer"&gt;Bit Platform web site&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://todo.bitplatform.dev/" rel="noopener noreferrer"&gt;Todo web app&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://play.google.com/store/apps/details?id=com.bitplatform.Todo.Template" rel="noopener noreferrer"&gt;Todo mobile app&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://adminpanel.bitplatform.dev/" rel="noopener noreferrer"&gt;Admin panel multilingual web app&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://play.google.com/store/apps/details?id=com.bitplatform.AdminPanel.Template" rel="noopener noreferrer"&gt;Admin panel multilingual mobile app&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Support
&lt;/h3&gt;

&lt;p&gt;In addition to offering a convenient and streamlined development process, Bit Platform's Boilerplate also comes with excellent documentation and support. Their team of experts is always ready to answer questions and provide guidance, making it easy for developers of all levels to use their platform effectively.&lt;/p&gt;




&lt;p&gt;Don't let the complexity of building web and app projects separately hold you back. Try Bit Platform's templates and start building your next project today!&lt;/p&gt;

&lt;p&gt;You can also find more information about Bit Platform's Boilerplate at &lt;a href="https://bitplatform.dev/templates" rel="noopener noreferrer"&gt;https://bitplatform.dev/templates&lt;/a&gt; and components at &lt;a href="https://blazorui.bitplatform.dev/" rel="noopener noreferrer"&gt;https://blazorui.bitplatform.dev/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Happy coding ;D&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>dotnet</category>
      <category>csharp</category>
      <category>blazor</category>
    </item>
    <item>
      <title>.NET MAUI Blazor - Best practices for Desktop UI</title>
      <dc:creator>Mohammad Hossein Rastegarinia</dc:creator>
      <pubDate>Sat, 18 Feb 2023 17:49:13 +0000</pubDate>
      <link>https://dev.to/mhrastegari/net-maui-blazor-best-practices-for-desktop-ui-4peo</link>
      <guid>https://dev.to/mhrastegari/net-maui-blazor-best-practices-for-desktop-ui-4peo</guid>
      <description>&lt;p&gt;.NET MAUI Blazor is an open-source framework that lets you create cross-platform apps with web UI components and C# code. It uses BlazorWebView to render Razor components on mobile and desktop. So, like the &lt;a href="https://dev.to/mhrastegari/net-maui-blazor-best-practices-for-mobile-ui-4def"&gt;last article&lt;/a&gt; which mostly was for mobile, this time I’m going to show you some handy tips for Desktop UI.&lt;/p&gt;

&lt;h2&gt;
  
  
  Disable refresh with the &lt;code&gt;F5&lt;/code&gt; key and zoom with the mouse wheel
&lt;/h2&gt;

&lt;p&gt;In your &lt;code&gt;MainPage.xaml&lt;/code&gt; use the &lt;code&gt;Loaded&lt;/code&gt; event of the &lt;code&gt;ContentPage&lt;/code&gt; tag to override &lt;code&gt;BlazorWebView&lt;/code&gt;’s default settings like the code down below:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;   &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;MainPage&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nf"&gt;InitializeComponent&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="n"&gt;Loaded&lt;/span&gt; &lt;span class="p"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;ContentPage_Loaded&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;ContentPage_Loaded&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;object&lt;/span&gt; &lt;span class="n"&gt;sender&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;EventArgs&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="cp"&gt;#if WINDOWS &amp;amp;&amp;amp; RELEASE
&lt;/span&gt;        &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;webView2&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;blazorWebView&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Handler&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;PlatformView&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;Microsoft&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;UI&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Xaml&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Controls&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WebView2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;webView2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;EnsureCoreWebView2Async&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

        &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;settings&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;webView2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CoreWebView2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Settings&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;settings&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;IsZoomControlEnabled&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;settings&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AreBrowserAcceleratorKeysEnabled&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="cp"&gt;#endif
&lt;/span&gt;    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Disable context menu
&lt;/h2&gt;

&lt;p&gt;By default &lt;code&gt;Windows&lt;/code&gt; context menu is disabled but &lt;code&gt;macOS&lt;/code&gt; is not, so we need to disable it with a little bit of JavaScript in your &lt;code&gt;index.html&lt;/code&gt; file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;contextmenu&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;preventDefault&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Change Windows Titlebar colors
&lt;/h2&gt;

&lt;p&gt;In the &lt;code&gt;Platforms/Windows/App.xaml&lt;/code&gt; add these lines and change the colors to whatever you want.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;maui:MauiWinUIApplication&lt;/span&gt;
    &lt;span class="na"&gt;x:Class=&lt;/span&gt;&lt;span class="s"&gt;"YouProject.Client.App.Platforms.Windows.App"&lt;/span&gt;
    &lt;span class="na"&gt;xmlns=&lt;/span&gt;&lt;span class="s"&gt;"http://schemas.microsoft.com/winfx/2006/xaml/presentation"&lt;/span&gt;
    &lt;span class="na"&gt;xmlns:x=&lt;/span&gt;&lt;span class="s"&gt;"http://schemas.microsoft.com/winfx/2006/xaml"&lt;/span&gt;
    &lt;span class="na"&gt;xmlns:maui=&lt;/span&gt;&lt;span class="s"&gt;"using:Microsoft.Maui"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;maui:MauiWinUIApplication.Resources&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;ResourceDictionary&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;SolidColorBrush&lt;/span&gt; &lt;span class="na"&gt;x:Key=&lt;/span&gt;&lt;span class="s"&gt;"WindowCaptionForeground"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;#512bdf&lt;span class="nt"&gt;&amp;lt;/SolidColorBrush&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;SolidColorBrush&lt;/span&gt; &lt;span class="na"&gt;x:Key=&lt;/span&gt;&lt;span class="s"&gt;"WindowCaptionBackground"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;#ffffff&lt;span class="nt"&gt;&amp;lt;/SolidColorBrush&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;SolidColorBrush&lt;/span&gt; &lt;span class="na"&gt;x:Key=&lt;/span&gt;&lt;span class="s"&gt;"WindowCaptionForegroundDisabled"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;#512bdf&lt;span class="nt"&gt;&amp;lt;/SolidColorBrush&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;SolidColorBrush&lt;/span&gt; &lt;span class="na"&gt;x:Key=&lt;/span&gt;&lt;span class="s"&gt;"WindowCaptionBackgroundDisabled"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;#ffffff&lt;span class="nt"&gt;&amp;lt;/SolidColorBrush&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/ResourceDictionary&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/maui:MauiWinUIApplication.Resources&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/maui:MauiWinUIApplication&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Learn more from &lt;a href="https://learn.microsoft.com/en-us/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.window.settitlebar?view=windows-app-sdk-1.1#colors" rel="noopener noreferrer"&gt;Microsoft documentation&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Common HTML/CSS tricks
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. Disable dragging images and selecting texts&lt;/strong&gt;&lt;br&gt;
Well, I guess we all agree that not every image should be draggable also not every text should be selected so all you need to add these:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight scss"&gt;&lt;code&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="nd"&gt;:not&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nt"&gt;input&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;user-select&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;none&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="na"&gt;-webkit-user-drag&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;none&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="na"&gt;-webkit-user-select&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;none&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;2. Have some tooltips&lt;/strong&gt;&lt;br&gt;
Remember tooltips in developing desktop apps? You can do it with the &lt;code&gt;title&lt;/code&gt; attribute on any &lt;code&gt;HTML&lt;/code&gt; element.&lt;br&gt;
For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"close-button"&lt;/span&gt; &lt;span class="na"&gt;title=&lt;/span&gt;&lt;span class="s"&gt;"Close"&lt;/span&gt; &lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="na"&gt;onclick=&lt;/span&gt;&lt;span class="s"&gt;"Close()"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;3.  Change mouse cursor&lt;/strong&gt;&lt;br&gt;
For different elements and components the mouse cursor can be changed, here is an example of using the &lt;code&gt;cursor&lt;/code&gt; property to change the cursor to a pointer when hovering over a &lt;code&gt;div&lt;/code&gt; tag with the class of &lt;code&gt;item&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight scss"&gt;&lt;code&gt;&lt;span class="nc"&gt;.item&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;cursor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;pointer&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;4. Add some active and hover effects&lt;/strong&gt;&lt;br&gt;
By default in some of the Native controls there are some hover and active(click) effects that change the color, So we can do it on the web like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight scss"&gt;&lt;code&gt;  &lt;span class="nc"&gt;.item&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
       &lt;span class="nl"&gt;background-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;white&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nc"&gt;.item&lt;/span&gt;&lt;span class="nd"&gt;:active&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
       &lt;span class="nl"&gt;background-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;whitesmoke&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nc"&gt;.item&lt;/span&gt;&lt;span class="nd"&gt;:hover&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
       &lt;span class="nl"&gt;background-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;lightgray&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Get window size
&lt;/h2&gt;

&lt;p&gt;Sometimes you need to have the window size to do some calculations in your C# code so you can do it with JavaScript like this:&lt;/p&gt;

&lt;p&gt;In your Razor component add these lines of code&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;partial&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;YourComponent&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ComponentBase&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;WindowWidth&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;_resizeEventListenerId&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Empty&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="n"&gt;DotNetObjectReference&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;YourComponent&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;?&lt;/span&gt; &lt;span class="n"&gt;_dotnetObjectReference&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Inject&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="n"&gt;IJSRuntime&lt;/span&gt; &lt;span class="n"&gt;JSRuntime&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt;&lt;span class="p"&gt;!;&lt;/span&gt;

    &lt;span class="k"&gt;protected&lt;/span&gt; &lt;span class="k"&gt;override&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="n"&gt;Task&lt;/span&gt; &lt;span class="nf"&gt;OnInitializedAsync&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;_dotnetObjectReference&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;DotNetObjectReference&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="k"&gt;base&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;OnInitializedAsync&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;protected&lt;/span&gt; &lt;span class="k"&gt;override&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="n"&gt;Task&lt;/span&gt; &lt;span class="nf"&gt;OnAfterRenderAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;firstRender&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;firstRender&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;JSRuntime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;InvokeVoidAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"UpdateWindowWidth"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;_dotnetObjectReference&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;InitWindowWidthListener&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="k"&gt;base&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;OnAfterRenderAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;firstRender&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;JSInvokable&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;UpdateWindowWidth&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;windowWidth&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;WindowWidth&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;windowWidth&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="nf"&gt;StateHasChanged&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="n"&gt;Task&lt;/span&gt; &lt;span class="nf"&gt;InitWindowWidthListener&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;_resizeEventListenerId&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Guid&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;NewGuid&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;ToString&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;JSRuntime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;InvokeVoidAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"AddWindowWidthListener"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;_dotnetObjectReference&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;_resizeEventListenerId&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And put these in a JavaScript file and add it in your &lt;code&gt;index.html&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;windowEventListeners&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{};&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;AddWindowWidthListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;objReference&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;eventListener&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;UpdateWindowWidth&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;objReference&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;resize&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;eventListener&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;windowEventListeners&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;eventListener&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;RemoveWindowWidthListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;removeEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;resize&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;windowEventListeners&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
    &lt;span class="k"&gt;delete&lt;/span&gt; &lt;span class="nx"&gt;windowEventListeners&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;UpdateWindowWidth&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;objReference&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;objReference&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;invokeMethodAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;UpdateWindowWidth&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;innerWidth&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;Well, I guess it would be better to have both Mobile and Desktop best practices in one project, So I updated the sample repo containing all of the code that we discussed. You can have it &lt;a href="https://github.com/mhrastegari/MauiBlazorUIBestPractices" rel="noopener noreferrer"&gt;from here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Happy coding ;D&lt;/p&gt;

</description>
      <category>dotnet</category>
      <category>desktop</category>
      <category>webdev</category>
      <category>css</category>
    </item>
    <item>
      <title>.NET MAUI Blazor - Best practices for mobile UI</title>
      <dc:creator>Mohammad Hossein Rastegarinia</dc:creator>
      <pubDate>Fri, 27 Jan 2023 20:15:33 +0000</pubDate>
      <link>https://dev.to/mhrastegari/net-maui-blazor-best-practices-for-mobile-ui-4def</link>
      <guid>https://dev.to/mhrastegari/net-maui-blazor-best-practices-for-mobile-ui-4def</guid>
      <description>&lt;p&gt;Both Blazor and .NET MAUI are great and Powerful frameworks. Using .NET MAUI, you can build fully native cross-platform apps and build web apps completely in C# with Blazor.&lt;br&gt;
But when you combine them with the MAUI Blazor template, you need to know that it should feel like a mobile app, not a web page! So, in this article, I will show you some tips and tricks.&lt;/p&gt;
&lt;h2&gt;
  
  
  Disable selecting content and texts
&lt;/h2&gt;

&lt;p&gt;There is no need to select all texts and contents in your app! So, you can disable it in your CSS with these properties:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight scss"&gt;&lt;code&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="nd"&gt;:not&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nt"&gt;input&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;user-select&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;none&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="na"&gt;-webkit-user-select&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;none&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Remove the default tapping effect
&lt;/h2&gt;

&lt;p&gt;Mostly in mobile devices, when you tap on clickable elements like &lt;code&gt;a&lt;/code&gt; tag, it shows some effects. In my experience, Android was showing an ugly blue color and in iOS was a gray one. So, give it your own beautiful effect using &lt;code&gt;active&lt;/code&gt; selector in CSS and remove the default one with this CSS property:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight scss"&gt;&lt;code&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;-webkit-tap-highlight-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;transparent&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Handling Safe areas
&lt;/h2&gt;

&lt;p&gt;Don’t worry it’s not Blazor or MAUI’s fault that your content is in the Status bar or Home bar. You can fix it in CSS like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight scss"&gt;&lt;code&gt;&lt;span class="k"&gt;@supports&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nt"&gt;-webkit-touch-callout&lt;/span&gt;&lt;span class="nd"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;none&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nt"&gt;body&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nl"&gt;padding-top&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;env&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;safe-area-inset-top&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nl"&gt;padding-right&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;env&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;safe-area-inset-right&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nl"&gt;padding-bottom&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;env&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;safe-area-inset-bottom&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nl"&gt;padding-left&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;env&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;safe-area-inset-left&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Changing Android default colors
&lt;/h2&gt;

&lt;p&gt;For those who are not familiar with native stuff, you can change the accent color and status bar color of your Android app from &lt;code&gt;YOURPROJECTNAME\Platforms\Android\Resources\values\colors.xml&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;resources&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;color&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"colorPrimary"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;#512BD4&lt;span class="nt"&gt;&amp;lt;/color&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;color&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"colorPrimaryDark"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;#2B0B98&lt;span class="nt"&gt;&amp;lt;/color&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;color&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"colorAccent"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;#2B0B98&lt;span class="nt"&gt;&amp;lt;/color&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/resources&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Annoying startup background
&lt;/h2&gt;

&lt;p&gt;When you run your app, you see a “Loading…” text with a white background so let’s fix that!&lt;br&gt;
For “Loading…” text you need to remove it from a &lt;code&gt;div&lt;/code&gt; tag with &lt;code&gt;app&lt;/code&gt; id in your &lt;code&gt;index.html&lt;/code&gt;, then access the BlazorWebView’s handler in your &lt;code&gt;MainPage.xaml.cs&lt;/code&gt; and change the default background color of the platforms that you need like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;BlazorWebViewHandler&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;BlazorWebViewMapper&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AppendToMapping&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"CustomBlazorWebViewMapper"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;handler&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;view&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="cp"&gt;#if WINDOWS
&lt;/span&gt;            &lt;span class="c1"&gt;//Workaround for WinUI splash screen&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;AppInfo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Current&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;RequestedTheme&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="n"&gt;AppTheme&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Dark&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;handler&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;PlatformView&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DefaultBackgroundColor&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Microsoft&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;UI&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Colors&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Black&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="cp"&gt;#endif
&lt;/span&gt;
&lt;span class="cp"&gt;#if IOS || MACCATALYST
&lt;/span&gt;            &lt;span class="n"&gt;handler&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;PlatformView&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;BackgroundColor&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;UIKit&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;UIColor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Clear&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="n"&gt;handler&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;PlatformView&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Opaque&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="cp"&gt;#endif
&lt;/span&gt;
&lt;span class="cp"&gt;#if ANDROID
&lt;/span&gt;            &lt;span class="n"&gt;handler&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;PlatformView&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;SetBackgroundColor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Android&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Graphics&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Color&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Transparent&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="cp"&gt;#endif
&lt;/span&gt;        &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Annoying scroll animation
&lt;/h2&gt;

&lt;p&gt;Sometimes you don’t want your app's body (mostly iOS) to have animation when the scroll hits the bottom or top of the page, so you can disable it in the &lt;code&gt;BlazorWebView&lt;/code&gt; handler we talked about like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;BlazorWebViewHandler&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;BlazorWebViewMapper&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AppendToMapping&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"CustomBlazorWebViewMapper"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;handler&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;view&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="cp"&gt;#if IOS || MACCATALYST
&lt;/span&gt;            &lt;span class="n"&gt;handler&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;PlatformView&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ScrollView&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Bounces&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="cp"&gt;#endif
&lt;/span&gt;
&lt;span class="cp"&gt;#if ANDROID
&lt;/span&gt;            &lt;span class="n"&gt;handler&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;PlatformView&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;OverScrollMode&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Android&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Views&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;OverScrollMode&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Never&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="cp"&gt;#endif
&lt;/span&gt;        &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;By the way, I already made a sample repo containing all of the code we discussed. You can have it &lt;a href="https://github.com/mhrastegari/MauiBlazorUIBestPractices" rel="noopener noreferrer"&gt;from here&lt;/a&gt;. &lt;br&gt;
Also you can read about the second part of this article which is about Desktop UI &lt;a href="https://dev.to/mhrastegari/net-maui-blazor-best-practices-for-desktop-ui-4peo"&gt;from here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Happy coding ;D&lt;/p&gt;

</description>
      <category>dotnet</category>
      <category>mobile</category>
      <category>webdev</category>
      <category>css</category>
    </item>
  </channel>
</rss>
