{"id":872,"date":"2020-09-29T09:07:54","date_gmt":"2020-09-29T16:07:54","guid":{"rendered":"https:\/\/devblogs.microsoft.com\/surface-duo\/?p=872"},"modified":"2020-10-05T11:08:42","modified_gmt":"2020-10-05T18:08:42","slug":"get-started-uno-platform","status":"publish","type":"post","link":"https:\/\/devblogs.microsoft.com\/surface-duo\/get-started-uno-platform\/","title":{"rendered":"Build pixel-perfect Microsoft Surface Duo apps with Uno Platform"},"content":{"rendered":"<p>Hello Microsoft Surface Duo developers!<\/p>\n<p>Today\u2019s post was contributed by Nventive, the publishers of the Uno Platform.<\/p>\n<p>In previous blog posts, the Surface Duo team demonstrated how you can build dual-screen apps using Java and Kotlin, Xamarin and C#, Flutter, React Native, Web, and games with Unity. Today\u2019s blog post shows how UWP and WinUI developers can target the Surface Duo using <a href=\"http:\/\/www.platform.uno\">Uno Platform<\/a>.<\/p>\n<p><img decoding=\"async\" width=\"1000\" height=\"668\" class=\"wp-image-873\" src=\"https:\/\/devblogs.microsoft.com\/surface-duo\/wp-content\/uploads\/sites\/53\/2020\/09\/word-image-3.gif\" alt=\"Car animation on Android on the Surface Duo Emulator with Uno Platform\" \/>\n<em>Figure 1: Car animation on Android on the Surface Duo Emulator with Uno Platform<\/em><\/p>\n<p>For those new to Uno Platform, it allows for creation of pixel-perfect, single-source C# and XAML apps which run natively on Windows, iOS, Android, macOS, Linux, and Web via WebAssembly. Uno Platform is Open Source (Apache 2.0) and\u00a0<a href=\"https:\/\/github.com\/unoplatform\/uno\">available on GitHub<\/a>.<\/p>\n<p><strong>In this blog post you will learn how to: <\/strong><\/p>\n<ol>\n<li>Use Uno Platform for your next Surface Duo application<\/li>\n<li>Test your application using the Surface Duo emulator<\/li>\n<li>Utilize Surface Duo\u2019s unique Hinge<\/li>\n<li>Find code samples and resources for further Surface Duo development with Uno Platform<\/li>\n<\/ol>\n<p><strong>Architecture of Uno Platform and Surface Duo Solution <\/strong><\/p>\n<p>The Uno Platform philosophy is to replicate the WinUI and Windows APIs everywhere. Uno Platform support for the Surface Duo device is <a href=\"https:\/\/platform.uno\/blog\/surface-duo-winui-twopaneview-implementation-via-uno-platform\/\">based on WinUI TwoPaneView control<\/a>, which is a Windows 10 specific control providing the ability to layout content in two panes. It also handles your content well on dual-screen devices. It behaves like a dual <a href=\"https:\/\/docs.microsoft.com\/uwp\/api\/Windows.UI.Xaml.Controls.ContentControl?view=winrt-19041#remarks\">ContentControl<\/a> based on a set of parameters such as Pane length, tall and wide configuration modes and pane priorities to display content based on the available window space. It can be useful when dealing with orientation changes, in windowed modes, or snap\/split screen scenarios.<\/p>\n<h2><strong>Getting started with Surface Duo and Uno Platform\n<\/strong><\/h2>\n<p>For this exercise, we are building a sample from scratch, so let\u2019s start from the beginning and follow the steps below to get started:<\/p>\n<ol>\n<li><a href=\"https:\/\/docs.microsoft.com\/dual-screen\/android\/get-duo-sdk?tabs=windows\">Download the Surface Duo SDK<\/a>.<\/li>\n<li><a href=\"https:\/\/www.microsoft.com\/download\/details.aspx?id=100847\">Install the latest emulator<\/a>.<\/li>\n<li>Run through the Uno Platform <a href=\"https:\/\/platform.uno\/docs\/articles\/getting-started-tutorial-1.html\">Getting Started tutorial<\/a>. This will ensure you have the correct environment set up and that you have the latest release of Uno Platform.<\/li>\n<li>Reference the <a href=\"https:\/\/www.nuget.org\/packages\/Uno.UI.DualScreen\">Uno.UI.DualScreen<\/a> NuGet package in the Android project:\n<ol type=\"a\">\n<li>Right click on the Solution and select <strong>Manage NuGet Packages for Solution<\/strong> from the context menu or on the top main menu in Visual Studio go to <strong>Tools<\/strong> &gt; <strong>Nuget Package Manage<\/strong>r.<\/li>\n<li>Make sure to select <strong>nuget.org<\/strong> or <strong>NuGet official package source<\/strong> as the package source.<\/li>\n<li>Click on the <strong>Browse<\/strong> tab and search for <strong>Uno.UI.DualScreen<\/strong>.<\/li>\n<li>Install the latest stable version available for your <b>Droid.csproj<\/b>.<img decoding=\"async\" width=\"500\" height=\"442\" class=\"wp-image-874\" src=\"https:\/\/devblogs.microsoft.com\/surface-duo\/wp-content\/uploads\/sites\/53\/2020\/09\/word-image-9.png\" alt=\"Manage NuGet packages\" srcset=\"https:\/\/devblogs.microsoft.com\/surface-duo\/wp-content\/uploads\/sites\/53\/2020\/09\/word-image-9.png 500w, https:\/\/devblogs.microsoft.com\/surface-duo\/wp-content\/uploads\/sites\/53\/2020\/09\/word-image-9-300x265.png 300w\" sizes=\"(max-width: 500px) 100vw, 500px\" \/><\/li>\n<\/ol>\n<\/li>\n<li>Launch the Surface Duo Emulator for Visual Studio from the Start menu.<img decoding=\"async\" width=\"428\" height=\"690\" class=\"wp-image-875\" src=\"https:\/\/devblogs.microsoft.com\/surface-duo\/wp-content\/uploads\/sites\/53\/2020\/09\/word-image-10.png\" alt=\"Start menu showing Surface Duo emulator option\" srcset=\"https:\/\/devblogs.microsoft.com\/surface-duo\/wp-content\/uploads\/sites\/53\/2020\/09\/word-image-10.png 428w, https:\/\/devblogs.microsoft.com\/surface-duo\/wp-content\/uploads\/sites\/53\/2020\/09\/word-image-10-186x300.png 186w\" sizes=\"(max-width: 428px) 100vw, 428px\" \/><\/li>\n<\/ol>\n<p>Once you have completed the above steps, you will be able to modify the content of your <b>MainPage.xaml<\/b>:<\/p>\n<pre>&lt;Page x:Class=\"DualScreenSample.MainPage\"\r\n    xmlns=\"http:\/\/schemas.microsoft.com\/winfx\/2006\/xaml\/presentation\"\r\n    xmlns:x=\"http:\/\/schemas.microsoft.com\/winfx\/2006\/xaml\"\r\n    xmlns:local=\"using:DualScreenSample\"\r\n    xmlns:d=\"http:\/\/schemas.microsoft.com\/expression\/blend\/2008\"\r\n    xmlns:mc=\"http:\/\/schemas.openxmlformats.org\/markup-compatibility\/2006\"\r\n    xmlns:muxc=\"using:Microsoft.UI.Xaml.Controls\"\r\n    mc:Ignorable=\"d\"&gt;\r\n \r\n  &lt;Grid&gt;\r\n    &lt;muxc:TwoPaneView Pane1Length=\"*\"\r\n              Pane2Length=\"*\"\r\n              PanePriority=\"Pane1\"\r\n              WideModeConfiguration=\"LeftRight\"\r\n              TallModeConfiguration=\"SinglePane\"&gt;\r\n      &lt;muxc:TwoPaneView.Resources&gt;\r\n        &lt;Style TargetType=\"TextBlock\"&gt;\r\n          &lt;Setter Property=\"FontSize\"\r\n              Value=\"24\" \/&gt;\r\n        &lt;\/Style&gt;\r\n      &lt;\/muxc:TwoPaneView.Resources&gt;\r\n      &lt;muxc:TwoPaneView.Pane1&gt;\r\n        &lt;Grid Background=\"#FF159BFF\"&gt;\r\n          &lt;StackPanel VerticalAlignment=\"Center\"\r\n                HorizontalAlignment=\"Center\"&gt;\r\n            &lt;TextBlock Text=\"Pane 1\" \/&gt;\r\n            &lt;TextBlock Text=\"Priority pane for TallModeConfiguration\" \/&gt;\r\n            &lt;TextBlock Text=\"Left pane for WideModeConfiguration\" \/&gt;\r\n          &lt;\/StackPanel&gt;\r\n        &lt;\/Grid&gt;\r\n      &lt;\/muxc:TwoPaneView.Pane1&gt;\r\n \r\n      &lt;muxc:TwoPaneView.Pane2&gt;\r\n        &lt;Grid Background=\"#FF67E5AD\"&gt;\r\n          &lt;StackPanel VerticalAlignment=\"Center\"\r\n                HorizontalAlignment=\"Center\"&gt;\r\n            &lt;TextBlock Text=\"Pane 2\" \/&gt;\r\n            &lt;TextBlock Text=\"Not the priority pane for TallModeConfiguration\" \/&gt;\r\n            &lt;TextBlock Text=\"Right pane for WideModeConfiguration\" \/&gt;\r\n          &lt;\/StackPanel&gt;\r\n        &lt;\/Grid&gt;\r\n      &lt;\/muxc:TwoPaneView.Pane2&gt;\r\n    &lt;\/muxc:TwoPaneView&gt;\r\n  &lt;\/Grid&gt;\r\n&lt;\/Page&gt;<\/pre>\n<p>Select Android as the start-up project in Visual Studio, then run your sample on the Surface Duo Emulator.<\/p>\n<p><img decoding=\"async\" width=\"603\" height=\"55\" class=\"wp-image-876\" src=\"https:\/\/devblogs.microsoft.com\/surface-duo\/wp-content\/uploads\/sites\/53\/2020\/09\/word-image-11.png\" alt=\"Start menu showing Surface Duo emulator for Visual Studio\" srcset=\"https:\/\/devblogs.microsoft.com\/surface-duo\/wp-content\/uploads\/sites\/53\/2020\/09\/word-image-11.png 603w, https:\/\/devblogs.microsoft.com\/surface-duo\/wp-content\/uploads\/sites\/53\/2020\/09\/word-image-11-300x27.png 300w\" sizes=\"(max-width: 603px) 100vw, 603px\" \/><\/p>\n<p><img decoding=\"async\" width=\"1266\" height=\"852\" class=\"wp-image-877\" src=\"https:\/\/devblogs.microsoft.com\/surface-duo\/wp-content\/uploads\/sites\/53\/2020\/09\/word-image-12.png\" srcset=\"https:\/\/devblogs.microsoft.com\/surface-duo\/wp-content\/uploads\/sites\/53\/2020\/09\/word-image-12.png 1266w, https:\/\/devblogs.microsoft.com\/surface-duo\/wp-content\/uploads\/sites\/53\/2020\/09\/word-image-12-300x202.png 300w, https:\/\/devblogs.microsoft.com\/surface-duo\/wp-content\/uploads\/sites\/53\/2020\/09\/word-image-12-1024x689.png 1024w, https:\/\/devblogs.microsoft.com\/surface-duo\/wp-content\/uploads\/sites\/53\/2020\/09\/word-image-12-768x517.png 768w\" sizes=\"(max-width: 1266px) 100vw, 1266px\" \/><\/p>\n<p><em>Figure 2: DualScreen sample running on Android on the Surface Duo Emulator<\/em><\/p>\n<p>As you can see in this code snippet, you need to set a Star <a href=\"https:\/\/docs.microsoft.com\/uwp\/api\/windows.ui.xaml.gridlength?view=winrt-19041\">GridLength<\/a> (<code>Pane1Length=\"*\"<\/code> \/ <code>Pane2Length=\"*\"<\/code>) for the two pane to correctly take 50% for each side screens of the Surface Duo with the <a href=\"https:\/\/docs.microsoft.com\/windows\/uwp\/design\/controls-and-patterns\/two-pane-view\">TwoPaneView<\/a>.<\/p>\n<p>The <a href=\"https:\/\/docs.microsoft.com\/uwp\/api\/windows.ui.xaml.controls.twopaneview.panepriority?view=winrt-19041\">PanePriority<\/a> sets which pane will be displayed when <a href=\"https:\/\/docs.microsoft.com\/uwp\/api\/microsoft.ui.xaml.controls.twopaneviewtallmodeconfiguration?view=winui-2.4\">SinglePane<\/a> mode is set (for <a href=\"https:\/\/docs.microsoft.com\/uwp\/api\/microsoft.ui.xaml.controls.twopaneview.tallmodeconfiguration?view=winui-2.4\">TallModeConfiguration<\/a> in this example).\nFor <a href=\"https:\/\/docs.microsoft.com\/uwp\/api\/microsoft.ui.xaml.controls.twopaneview.widemodeconfiguration?view=winui-2.4\">WideModeConfiguration<\/a>, the <a href=\"https:\/\/docs.microsoft.com\/uwp\/api\/microsoft.ui.xaml.controls.twopaneviewwidemodeconfiguration?view=winui-2.4\">LeftRight<\/a> is used for <a href=\"https:\/\/docs.microsoft.com\/uwp\/api\/windows.ui.xaml.controls.twopaneviewpriority?view=winrt-19041\">Pane1<\/a> to have priority and be shown on the left. The Pane2 is shown on the right.<\/p>\n<p>The complete sample is available on <a href=\"https:\/\/github.com\/unoplatform\/Uno.Samples\/tree\/master\/UI\/DualScreenSample\">GitHub<\/a>.<\/p>\n<p>If you also want to test your sample on UWP \/ WinUI:<\/p>\n<ol>\n<li>Make sure to reference the <a href=\"https:\/\/www.nuget.org\/packages\/Microsoft.UI.Xaml\/\">Microsoft.UI.Xaml<\/a> NuGet package in the UWP project.<\/li>\n<li>Don&#8217;t forget also to set XamlControlsResources as your Application resources in App.xaml:\n<pre>&lt;Application&gt;\r\n  &lt;Application.Resources&gt;\r\n    &lt;XamlControlsResources xmlns=\"using:Microsoft.UI.Xaml.Controls\" \/&gt;\r\n  &lt;\/Application.Resources&gt;\r\n&lt;\/Application&gt;<\/pre>\n<\/li>\n<li>\u00a0And finally, as Microsoft.UI.Xaml nuget package requires TargetPlatformVersion of at least 10.0.18362.0, make sure to update the SDK version in the UWP properties.<\/li>\n<\/ol>\n<h2>What is and how to use the hinge angle<\/h2>\n<p>Now let\u2019s do something more fun! I was really inspired by Justin Liu\u2019s Surface Duo <a href=\"https:\/\/twitter.com\/justinxinliu\/status\/1281123335410049027\">demo app<\/a> which used Flutter. I wanted to see if I would be able to do the same with Uno Platform, so I re-created this <a href=\"https:\/\/twitter.com\/UnoPlatform\/status\/1294080531550867463\">car animation sample<\/a> .<\/p>\n<p>I was very happy to be able to reproduce the demo easily for the Surface Duo. Best of all, it was also running on other platforms Uno Platform supports without requiring any platform-specific code.<\/p>\n<p><img decoding=\"async\" width=\"800\" height=\"450\" class=\"wp-image-878\" src=\"https:\/\/devblogs.microsoft.com\/surface-duo\/wp-content\/uploads\/sites\/53\/2020\/09\/word-image-4.gif\" alt=\"ToyCar sample running on Windows, WebAssembly, iOS and Android on the Surface Duo Emulator\" \/><\/p>\n<p><em>Figure 3: ToyCar sample running on Windows, WebAssembly, iOS and Android on the Surface Duo Emulator<\/em><\/p>\n<p>But what if instead of moving the car with a mouse or a finger, we could move the car depending on the hinge angle value?<\/p>\n<p>The hinge is unique for dual-screen devices and learning how to work with it based on the angle of two screens, is essential for creating unique user experiences on Surface devices. In a <a href=\"https:\/\/devblogs.microsoft.com\/surface-duo\/surface-duo-testing-tips-tricks\/\">previous blog post<\/a>, Cesar mentioned how to adjust the hinge angle in the Surface Duo emulator. Today, I\u2019m going to show you how to take advantage of this feature using my car animation sample.<\/p>\n<p>But first, a quick overview of how I implemented this cool concept. I have a toy car image on the left pane and a sketch car image on the right pane. The technique here is to have a transparent rectangle (same size as the car images) on top of the TwoPaneView control. This way it is possible to use the pointers <a href=\"https:\/\/docs.microsoft.com\/uwp\/api\/windows.ui.xaml.uielement.manipulationdelta?view=winrt-19041\">ManipulationDelta event<\/a> to move and to keep both cars at the same position. This gives the illusion of a car transformation.<\/p>\n<p><img decoding=\"async\" width=\"387\" height=\"208\" class=\"wp-image-879\" src=\"https:\/\/devblogs.microsoft.com\/surface-duo\/wp-content\/uploads\/sites\/53\/2020\/09\/word-image-13.png\" alt=\"Car transformation close-up on Android on the Surface Duo Emulator\" srcset=\"https:\/\/devblogs.microsoft.com\/surface-duo\/wp-content\/uploads\/sites\/53\/2020\/09\/word-image-13.png 387w, https:\/\/devblogs.microsoft.com\/surface-duo\/wp-content\/uploads\/sites\/53\/2020\/09\/word-image-13-300x161.png 300w\" sizes=\"(max-width: 387px) 100vw, 387px\" \/><\/p>\n<p><em>Figure 4: Car transformation close-up on Android on the Surface Duo Emulator<\/em><\/p>\n<p>Now let\u2019s try to move and animate the cars with the hinge angle.<\/p>\n<p>On UWP \/ WinUI, we can use the <a href=\"https:\/\/docs.microsoft.com\/uwp\/api\/windows.devices.sensors.hingeanglesensor?view=winrt-19041\">Windows.Devices.Sensors.HingeAngleSensor API<\/a> to be notified when the hinge\u2019s angle changes. The <a href=\"https:\/\/docs.microsoft.com\/uwp\/api\/windows.devices.sensors.hingeanglereading.angleindegrees?view=winrt-19041\">HingeAngleReading.AngleInDegrees property<\/a> gives us the hinge\u2019s current angle in degrees.<\/p>\n<p>With Uno Platform, you don\u2019t need to worry that the Surface Duo runs Android and the fact that the <a href=\"https:\/\/docs.microsoft.com\/dual-screen\/android\/api-reference\/hinge-sensor?tabs=csharp\">API<\/a> for the hinge sensor is different. Your UWP \/ WinUI implementation will just work on Android with no platform-specific code required!<\/p>\n<p>In the code-behind I can simply have:<\/p>\n<pre>public async Task InitializeAsync()\r\n{\r\n  \/\/Asynchronously retrieves the default hinge angle sensor.\r\n  hinge = await HingeAngleSensor.GetDefaultAsync();\r\n  \r\n  if (hinge != null)\r\n  {\r\n    SensorStatus.Content = \"HingeAngleSensor created\";\r\n    \r\n    \/\/Listener for the HingeAngleSensor ReadingChanged event.\r\n    hinge.ReadingChanged += HingeAngleSensor_ReadingChanged;\r\n  }\r\n  else\r\n  {\r\n    SensorStatus.Content = \"HingeAngleSensor not available on this device\";\r\n    AngleValue.Content = \"Angle value: Not available\";\r\n  }\r\n}\r\nprivate async void HingeAngleSensor_ReadingChanged(HingeAngleSensor sender, HingeAngleSensorReadingChangedEventArgs args)\r\n{\r\n  await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =&gt;\r\n  {\r\n    var angleValue = args.Reading.AngleInDegrees;\r\n    \r\n    AngleValue.Content = \"Angle value: \" + angleValue.ToString();\r\n    \r\n    \/\/ When the dual-screen device is half-opened\r\n    if (angleValue == 180)\r\n    {\r\n      \/\/ Move the car along the x-axis in the middle of the screen.\r\n      dragTranslation.X = (MainRoot.ActualWidth \/ 2);\r\n    }\r\n    \/\/ When the dual-screen device is fully opened, meaning that both screens are facing aware from each other.\r\n    else if (angleValue == 360)\r\n    {\r\n      \/\/ Move the car along the x-axis on the right side of the screen.\r\n      dragTranslation.X = MainRoot.ActualWidth * rightSideThresholdRatio;\r\n    }\r\n  });\r\n}<\/pre>\n<p>I used <a href=\"https:\/\/docs.microsoft.com\/uwp\/api\/windows.devices.sensors.hingeanglesensor.getdefaultasync?view=winrt-19041\">HingeAngleSensor.GetDefaultAsync<\/a> to asynchronously retrieve the default hinge angle. If the hinge is available, I subscribe to the <a href=\"https:\/\/docs.microsoft.com\/uwp\/api\/windows.devices.sensors.hingeanglesensor.readingchanged?view=winrt-19041\">HingeAngleSensor ReadingChanged event<\/a>.<\/p>\n<p>If the angle is equal to 180 degrees (meaning the device is half opened), the car is moved to the middle of the device.<\/p>\n<p>If the angle is equal to 360 degrees (meaning that both screens are facing away from each other and the device is fully opened), the car is moved to the right side of the device. The car animation and background scene animation will start at the same time.<\/p>\n<p><img decoding=\"async\" width=\"1000\" height=\"470\" class=\"wp-image-880\" src=\"https:\/\/devblogs.microsoft.com\/surface-duo\/wp-content\/uploads\/sites\/53\/2020\/09\/word-image-5.gif\" alt=\"Car animation while changing the hinge angle on Android on the Surface Duo Emulator\" \/><\/p>\n<p><em>Figure 5: Car animation while changing the hinge angle on Android on the Surface Duo Emulator<\/em><\/p>\n<p>The complete sample is available on <a href=\"https:\/\/github.com\/unoplatform\/Uno.Samples\/tree\/master\/UI\/ToyCar\">GitHub<\/a>.<\/p>\n<p><strong>Additional code sample from OSS real-world implementation<\/strong><\/p>\n<p>Uno Platform community member\u00a0<a href=\"https:\/\/twitter.com\/ibebbs\">Ian Bebbington<\/a>\u00a0has put together an app called <em>COduo<\/em> to help users in the UK understand the environmental impact of their energy usage. The app is available on <a href=\"https:\/\/play.google.com\/store\/apps\/details?id=solutions.onecog.coduo\">Google Play<\/a> and <a href=\"https:\/\/www.microsoft.com\/p\/coduo\/9php2cf3z997\">Windows<\/a>. The complete solution is available on <a href=\"https:\/\/github.com\/ibebbs\/CODuo\">GitHub<\/a>.<\/p>\n<p><img decoding=\"async\" width=\"1100\" height=\"856\" class=\"wp-image-881\" src=\"https:\/\/devblogs.microsoft.com\/surface-duo\/wp-content\/uploads\/sites\/53\/2020\/09\/word-image-14.png\" alt=\"COduo on Android on Surface Duo Emulator with Uno Platform\" srcset=\"https:\/\/devblogs.microsoft.com\/surface-duo\/wp-content\/uploads\/sites\/53\/2020\/09\/word-image-14.png 1100w, https:\/\/devblogs.microsoft.com\/surface-duo\/wp-content\/uploads\/sites\/53\/2020\/09\/word-image-14-300x233.png 300w, https:\/\/devblogs.microsoft.com\/surface-duo\/wp-content\/uploads\/sites\/53\/2020\/09\/word-image-14-1024x797.png 1024w, https:\/\/devblogs.microsoft.com\/surface-duo\/wp-content\/uploads\/sites\/53\/2020\/09\/word-image-14-768x598.png 768w\" sizes=\"(max-width: 1100px) 100vw, 1100px\" \/><\/p>\n<p><em>Figure 6: COduo on Android on Surface Duo Emulator with Uno Platform<\/em><\/p>\n<h2>Additional resources and feedback<\/h2>\n<p>If you already have a UWP\/ WinUI application, try porting your current C# code base on multiple platforms, including Surface Duo, with Uno Platform. Or just for fun, start a new multi-platform project targeting Surface Duo. I\u2019m sure you will find our platform valuable.<\/p>\n<p>You will be able to use the UWP\/WinUI tooling from Windows in <a href=\"https:\/\/visualstudio.microsoft.com\/\">Visual Studio<\/a>, such as <a href=\"https:\/\/docs.microsoft.com\/visualstudio\/xaml-tools\/xaml-hot-reload?view=vs-2019\">XAML Hot Reload<\/a> and <a href=\"https:\/\/docs.microsoft.com\/visualstudio\/debugger\/how-to-use-edit-and-continue-csharp?view=vs-2019\">C# Edit and Continue<\/a>, build your application as much as possible on Windows, then validate that your application runs on every platform supported by Uno Platform, including Android, on Surface Duo. You can develop Uno Platform applications on Visual Studio and Windows like I did above, but also use <a href=\"https:\/\/platform.uno\/docs\/articles\/get-started-vsmac.html\">Visual Studio for Mac<\/a> or <a href=\"https:\/\/platform.uno\/docs\/articles\/get-started-vscode.html\">Visual Studio Code<\/a>.<\/p>\n<p>If you have questions, feature requests, or issues about using Uno Platform, you can find our engineering team on <a href=\"https:\/\/discord.com\/invite\/eBHZSKG\">Discord &#8211; Channel #uno-platform<\/a>. You can also find us on <a href=\"https:\/\/twitter.com\/UnoPlatform\/status\/1294080531550867463\">Twitter<\/a>.<\/p>\n<p>Finally, reach out to the Surface Duo team using their <a href=\"https:\/\/techcommunity.microsoft.com\/t5\/surface-duo-sdk\/bd-p\/SurfaceDuoSDK\">feedback forum<\/a> or on <a href=\"https:\/\/twitter.com\/surfaceduodev\">Twitter<\/a> or <a href=\"https:\/\/github.com\/Microsoft\/surface-duo-sdk\">GitHub<\/a> with your feedback regarding your experience with the Surface Duo.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Hello Microsoft Surface Duo developers! Today\u2019s post was contributed by Nventive, the publishers of the Uno Platform. In previous blog posts, the Surface Duo team demonstrated how you can build dual-screen apps using Java and Kotlin, Xamarin and C#, Flutter, React Native, Web, and games with Unity. Today\u2019s blog post shows how UWP and WinUI [&hellip;]<\/p>\n","protected":false},"author":40869,"featured_media":879,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[1],"tags":[31,695,696,697],"class_list":["post-872","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-surface-duo-sdk","tag-dual-screen-development","tag-uno-platform","tag-uwp","tag-winui"],"acf":[],"blog_post_summary":"<p>Hello Microsoft Surface Duo developers! Today\u2019s post was contributed by Nventive, the publishers of the Uno Platform. In previous blog posts, the Surface Duo team demonstrated how you can build dual-screen apps using Java and Kotlin, Xamarin and C#, Flutter, React Native, Web, and games with Unity. Today\u2019s blog post shows how UWP and WinUI [&hellip;]<\/p>\n","_links":{"self":[{"href":"https:\/\/devblogs.microsoft.com\/surface-duo\/wp-json\/wp\/v2\/posts\/872","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/devblogs.microsoft.com\/surface-duo\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/devblogs.microsoft.com\/surface-duo\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/surface-duo\/wp-json\/wp\/v2\/users\/40869"}],"replies":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/surface-duo\/wp-json\/wp\/v2\/comments?post=872"}],"version-history":[{"count":0,"href":"https:\/\/devblogs.microsoft.com\/surface-duo\/wp-json\/wp\/v2\/posts\/872\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/surface-duo\/wp-json\/wp\/v2\/media\/879"}],"wp:attachment":[{"href":"https:\/\/devblogs.microsoft.com\/surface-duo\/wp-json\/wp\/v2\/media?parent=872"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/surface-duo\/wp-json\/wp\/v2\/categories?post=872"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/surface-duo\/wp-json\/wp\/v2\/tags?post=872"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}