From b1ac4d03aae3e1c6404cb54822f4ad67117a8e17 Mon Sep 17 00:00:00 2001 From: David Britch Date: Wed, 20 Dec 2023 18:37:08 +0000 Subject: [PATCH] Merge main to live (#1970) * Fix globbing pattern. (#1957) * Add constraints warning (#1960) * Add constraints warning. * Fix xrefs. * Edits. * Edits. * Emulator can be ran in VMs (#1962) * Emulator can be ran in VMs. * Edit. * Android emulator overview (#1964) * Android emulator overview. * Fix link. * Add icons to table. * Fix linting error. * Remove stray link. * Edit. * Resize images * Edit. * Edits. * Add .NET 8 VSMac enablement instructions to installation doc (#1966) * Add .NET 8 VSMac enablement instructions to installation doc * Edit. * Update for .NET (#1967) * Clearly specify the build action (#1968) * Clearly specify the build action. * Fix typo. * UWP manual upgrade (#1849) * Draft of UWP manual upgrade; used generative ai. * address: lint, comments, links * spaces * Make the PR build successfully. * Try again. * Initial edits. * Update uwp-projects.md to address comments * rm long link * Edits. * Major edits. * Fix warning. * More edits. * Edits. * Edits. * Edits. * Final edits. * Remove next steps section. --------- Co-authored-by: Diana Soltani Co-authored-by: David Britch --------- Co-authored-by: Diana Soltani <31975705+DianaSoltani@users.noreply.github.com> Co-authored-by: Diana Soltani --- docs/TOC.yml | 6 +- docs/android/device/setup.md | 9 +- docs/android/emulator/device-manager.md | 2 +- docs/android/emulator/device-properties.md | 2 +- .../android/emulator/hardware-acceleration.md | 11 +- docs/android/emulator/index.md | 80 +++++++++++ docs/android/emulator/media/back.png | Bin 0 -> 3562 bytes docs/android/emulator/media/close.png | Bin 0 -> 3617 bytes docs/android/emulator/media/home.png | Bin 0 -> 3587 bytes docs/android/emulator/media/minimize.png | Bin 0 -> 3209 bytes docs/android/emulator/media/more.png | Bin 0 -> 3229 bytes docs/android/emulator/media/overview.png | Bin 0 -> 3314 bytes docs/android/emulator/media/power.png | Bin 0 -> 3767 bytes docs/android/emulator/media/rotate-left.png | Bin 0 -> 3826 bytes docs/android/emulator/media/rotate-right.png | Bin 0 -> 3877 bytes docs/android/emulator/media/screenshot.png | Bin 0 -> 3531 bytes docs/android/emulator/media/volume-down.png | Bin 0 -> 3390 bytes docs/android/emulator/media/volume-up.png | Bin 0 -> 3706 bytes docs/android/emulator/media/zoom.png | Bin 0 -> 3662 bytes docs/android/emulator/troubleshooting.md | 2 +- docs/get-started/first-app.md | 3 +- docs/get-started/includes/vsmac-net8.md | 7 + docs/get-started/installation.md | 2 + docs/mac-catalyst/user-interface-idiom.md | 9 ++ docs/migration/index.md | 3 +- docs/migration/native-projects.md | 20 +-- docs/migration/renderer-to-handler.md | 8 +- docs/migration/uwp-projects.md | 132 ++++++++++++++++++ .../configure-multi-targeting.md | 32 ++--- docs/user-interface/handlers/create.md | 8 +- docs/user-interface/images/app-icons.md | 12 +- .../namespaces/custom-namespace-schemas.md | 9 +- 32 files changed, 299 insertions(+), 58 deletions(-) create mode 100644 docs/android/emulator/index.md create mode 100644 docs/android/emulator/media/back.png create mode 100644 docs/android/emulator/media/close.png create mode 100644 docs/android/emulator/media/home.png create mode 100644 docs/android/emulator/media/minimize.png create mode 100644 docs/android/emulator/media/more.png create mode 100644 docs/android/emulator/media/overview.png create mode 100644 docs/android/emulator/media/power.png create mode 100644 docs/android/emulator/media/rotate-left.png create mode 100644 docs/android/emulator/media/rotate-right.png create mode 100644 docs/android/emulator/media/screenshot.png create mode 100644 docs/android/emulator/media/volume-down.png create mode 100644 docs/android/emulator/media/volume-up.png create mode 100644 docs/android/emulator/media/zoom.png create mode 100644 docs/get-started/includes/vsmac-net8.md create mode 100644 docs/migration/uwp-projects.md diff --git a/docs/TOC.yml b/docs/TOC.yml index 95d03fc44..308200902 100644 --- a/docs/TOC.yml +++ b/docs/TOC.yml @@ -17,6 +17,8 @@ items: - name: Emulator items: + - name: Overview + href: android/emulator/index.md - name: How to enable hardware acceleration href: android/emulator/hardware-acceleration.md - name: Manage and create virtual devices @@ -67,6 +69,8 @@ href: migration/apple-projects.md - name: iOS binding project migration href: migration/ios-binding-projects.md + - name: UWP project migration + href: migration/uwp-projects.md - name: Xamarin.Essentials migration href: migration/native-essentials.md - name: Xamarin.Forms projects @@ -823,6 +827,6 @@ - name: MVVM community toolkit features href: /dotnet/architecture/maui/mvvm-community-toolkit-features?toc=/dotnet/maui/toc.json&bc=/dotnet/maui/breadcrumb/toc.json - name: Unit testing - href: /dotnet/architecture/maui/unit-testing?toc=/dotnet/maui/toc.json&bc=/dotnet/maui/breadcrumb/toc.json + href: /dotnet/architecture/maui/unit-testing?toc=/dotnet/maui/toc.json&bc=/dotnet/maui/breadcrumb/toc.json - name: Troubleshooting href: troubleshooting.md diff --git a/docs/android/device/setup.md b/docs/android/device/setup.md index 2d411985f..6af56f481 100644 --- a/docs/android/device/setup.md +++ b/docs/android/device/setup.md @@ -6,7 +6,7 @@ ms.date: 02/23/2022 # Set up Android device for debugging -While the [Android emulator](../emulator/debug-on-emulator.md) is a great way to rapidly develop and test your app, you'll want to test your apps on a real Android device. To run on a device, you'll need to enable developer mode on the device and connect it to your computer. +While the [Android emulator](../emulator/debug-on-emulator.md) is a great way to rapidly develop and test your app, you'll want to test your apps on a real Android device. To run on a device, you'll need to enable developer mode on the device and connect it to your computer. For more information, see [Run apps on a hardware device](https://developer.android.com/studio/run/device) on developer.android.com. > [!IMPORTANT] > The steps in this article are written generically, to work on as many devices as possible. If you can't find these settings on your device, consult your device manufacturer's documentation. @@ -53,6 +53,9 @@ It's possible to debug an android device over WiFi, without keeping the device p By default, the Android Debug Bridge (adb) is configured to communicate with an Android device via USB. It's possible to reconfigure it to use TCP/IP instead of USB. To do this, both the device and the computer must be on the same WiFi network. +> [!NOTE] +> The Google USB driver is required to perform `adb` debugging on Windows with Google devices. For more information, see [Get the Google USB Driver](https://developer.android.com/studio/run/win-usb) on developer.android.com. Windows drivers for all other devices are provided by the respective hardware manufacturer. For more information, see [Install OEM USB drivers](https://developer.android.com/studio/run/oem-usb) on developer.android.com. + First, enable Wireless debugging on your Android device: 01. Follow the steps in the [Enable developer mode on the device](#enable-developer-mode-on-the-device) section. @@ -100,3 +103,7 @@ Next, use adb to connect to your device, first through a USB connection: ```command adb devices ``` + +## Configure on-device developer options + +The Settings app on Android includes a screen called **Developer options** where you can configure system behaviors that help you profile and debug your app performance. For more information, see [Configure on-device developer options](https://developer.android.com/studio/debug/dev-options) on developer.android.com. diff --git a/docs/android/emulator/device-manager.md b/docs/android/emulator/device-manager.md index 172d85771..a3f8b7760 100644 --- a/docs/android/emulator/device-manager.md +++ b/docs/android/emulator/device-manager.md @@ -7,7 +7,7 @@ no-loc: ["user.config"] # Managing virtual devices with the Android Device Manager -This article explains how to use the Android Device Manager to create and configure Android Virtual Devices (AVDs) that emulate physical Android devices. You can use these virtual devices to run and test your app without having to rely on a physical device. +This article explains how to use the Android Device Manager to create and configure Android Virtual Devices (AVDs) that emulate physical Android devices. You can use these virtual devices to run and test your app without having to rely on a physical device. For more information about Android virtual devices, see [Create and manage virtual devices](https://developer.android.com/studio/run/managing-avds) on developer.android.com. > [!IMPORTANT] > Enable hardware acceleration for the Android devices. For more information, see [Hardware Acceleration for Emulator Performance](hardware-acceleration.md). diff --git a/docs/android/emulator/device-properties.md b/docs/android/emulator/device-properties.md index 5bd21595e..b5728424a 100644 --- a/docs/android/emulator/device-properties.md +++ b/docs/android/emulator/device-properties.md @@ -6,7 +6,7 @@ ms.date: 02/23/2022 # Editing Android virtual device properties -This article explains how to use the Android Device Manager (AVD) to edit the profile properties of an Android virtual device. +This article explains how to use the Android Device Manager (AVD) to edit the profile properties of an Android virtual device. For more information about Android virtual devices, see [Create and manage virtual devices](https://developer.android.com/studio/run/managing-avds) on developer.android.com. diff --git a/docs/android/emulator/hardware-acceleration.md b/docs/android/emulator/hardware-acceleration.md index c89e60029..42f1afd39 100644 --- a/docs/android/emulator/hardware-acceleration.md +++ b/docs/android/emulator/hardware-acceleration.md @@ -7,7 +7,7 @@ ms.topic: how-to # How to enable hardware acceleration with Android emulators (Hyper-V & AEHD) -With Visual Studio, you can easily test and debug your .NET MAUI app for Android in emulators for situations where an Android device isn't available. However, if hardware acceleration isn't available or enabled, the emulator will run very slowly. You can significantly improve the performance of the emulator by enabling hardware acceleration and using *x86-64* or *x86* virtual device images. +With Visual Studio, you can easily test and debug your .NET MAUI app for Android in emulators for situations where an Android device isn't available. However, if hardware acceleration isn't available or enabled, the emulator will run very slowly. You can significantly improve the performance of the emulator by enabling hardware acceleration and by using virtual device images that are appropriate for your processor architecture. For more information, see [Configure hardware acceleration for the Android Emulator](https://developer.android.com/studio/run/emulator-acceleration) on developer.android.com ## Accelerate Android emulators on Windows @@ -25,7 +25,7 @@ For the best experience on Windows, it's recommended you use WHPX to accelerate - The emulator is running a system image created for an **x86-64** or **x86**-based virtual device. > [!IMPORTANT] -> You can't run a VM-accelerated emulator inside another VM, such as a VM hosted by VirtualBox, VMware, or Docker (unless using WSL2). You must run the Android emulator [directly on your system hardware](https://developer.android.com/studio/run/emulator-acceleration.html#extensions). +> A Virtual Machine (VM) accelerated emulator can run inside another VM, including Microsoft Dev Box, provided that nested virtualization is enabled in the VM. For information about launching and debugging with the Android emulator, see [Debugging on the Android Emulator](debug-on-emulator.md). @@ -62,6 +62,9 @@ If all listed Hyper-V requirements have a value of **Yes**, then your computer c If the Hyper-V result indicates that a hypervisor is currently running, Hyper-V is already enabled. +> [!IMPORTANT] +> If Windows is running inside a virtual machine, nested virtualization must be enabled in the host hypervisor. + ### Enable Hyper-V acceleration in Windows If your computer meets the above criteria, use the following steps to accelerate the Android emulator with Hyper-V: @@ -202,7 +205,3 @@ For help with troubleshooting hardware acceleration issues, see the Android emul ::: zone-end --> - -## See also - -- [Configure hardware acceleration for the Android Emulator](https://developer.android.com/studio/run/emulator-acceleration) on developer.android.com diff --git a/docs/android/emulator/index.md b/docs/android/emulator/index.md new file mode 100644 index 000000000..bdf73a75f --- /dev/null +++ b/docs/android/emulator/index.md @@ -0,0 +1,80 @@ +--- +title: "Android emulator" +description: "Learn how to get started with the Android emulator, so that you can test your apps on a variety of devices and Android API levels without requiring physical devices." +ms.date: 12/18/2023 +--- + +# Android emulator + +The Android emulator, which is produced by Google, simulates Android devices on your computer so that you can test your apps on a variety of devices and Android API levels, without needing to have each physical device. When you deploy and test your app on the emulator you select a pre-configured or custom virtual device, known as an Android Virtual Device (AVD) that simulates a physical Android device such as a Pixel phone. Alternatively, you can deploy your app to a physical device. For more information about deploying your app to physical device, see [Set up Android device for debugging](~/android/device/setup.md). + +The Android emulator is installed by Visual Studio, and an AVD created, when you build your first .NET Multi-platform App UI (.NET MAUI) app for Android. For more information, see [Build your first app](~/get-started/first-app.md?pivots=devices-android). + +If hardware acceleration isn't available or enabled, the emulator will run very slowly. You can significantly improve the performance of the emulator by enabling hardware acceleration and by using virtual device images that are appropriate for your processor architecture. For more information, see [How to enable hardware acceleration with Android emulators](hardware-acceleration.md). + +Physical Android devices are emulated by AVDs, which specify the Android version and hardware characteristics of the simulated device. To test an app, create AVDs that model each device your app is designed to run on. Each AVD runs as an independent device with its own storage for user data, and SD card data. The emulator stores the user data, and SD card data in a folder specific to the AVD. When you launch the emulator, it loads the user data and SD card data from the AVD folder. For information about managing virtual devices, see [Managing virtual devices with the Android Device Manager](device-manager.md). For information about editing the configuration of a virtual device, see [Editing Android virtual device properties](device-properties.md). + +After you've created an AVD you can launch the emulator and debug an app in it. For more information, see [Debug on the Android emulator](debug-on-emulator.md). Once an app is installed on an AVD, you can run it from the device as you would run any app on a device. + +For information about diagnosing emulator issues, see [Android emulator troubleshooting](troubleshooting.md). + +## Use the emulator + +When the Android emulator is running, you use your computer mouse pointer to mimic your finger on the touch screen, select menu items and input fields, and click buttons and controls. You can type in the emulator by using your computer keyboard or by using the onscreen keyboard that appears in the emulator. + +Common actions can be performed in the emulator via its panel on the right hand side: + +| Action | Icon | Description | +| ------ | ---- | ----------- | +| Close | :::image type="content" source="media/close.png" alt-text="Screenshot of the close button in the Android emulator window." border="false"::: | Close the emulator. | +| Minimize | :::image type="content" source="media/minimize.png" alt-text="Screenshot of the minimize button in the Android emulator window." border="false"::: | Minimize the emulator window. | +| Power | :::image type="content" source="media/power.png" alt-text="Screenshot of the power button in the Android emulator window." border="false"::: | Click to turn the screen on/off. Click and hold to turn the device on/off. | +| Volume up | :::image type="content" source="media/volume-up.png" alt-text="Screenshot of the volume up button in the Android emulator window." border="false"::: | Increase the volume. | +| Volume down | :::image type="content" source="media/volume-down.png" alt-text="Screenshot of the volume down button in the Android emulator window." border="false"::: | Decrease the volume. | +| Rotate left | :::image type="content" source="media/rotate-left.png" alt-text="Screenshot of the rotate left button in the Android emulator window." border="false"::: | Rotate the screen 90 degrees left. | +| Rotate right | :::image type="content" source="media/rotate-right.png" alt-text="Screenshot of the rotate right button in the Android emulator window." border="false"::: | Rotate the screen 90 degrees right. | +| Take screenshot | :::image type="content" source="media/screenshot.png" alt-text="Screenshot of the screenshot button in the Android emulator window." border="false"::: | Click to take a screenshot of the device. | +| Enter zoom mode | :::image type="content" source="media/zoom.png" alt-text="Screenshot of the zoom button in the Android emulator window." border="false"::: | Click to change the cursor to the zoom icon. Click again to exit zoom mode. | +| Back | :::image type="content" source="media/back.png" alt-text="Screenshot of the back button in the Android emulator window." border="false"::: | Return to the previous screen, or close an options menu, dialog, onscreen keyboard, or Notifications panel. | +| Home | :::image type="content" source="media/home.png" alt-text="Screenshot of the home button in the Android emulator window." border="false"::: | Return to the Home screen. | +| Overview (recent apps) | :::image type="content" source="media/overview.png" alt-text="Screenshot of the overview button in the Android emulator window." border="false"::: | Click to open a list of apps you've worked with recently. To open an app, tap its thumbnail. | +| More | :::image type="content" source="media/more.png" alt-text="Screenshot of the more button in the Android emulator window." border="false"::: | Click for more features and settings. | + +The following gestures can be simulated in the emulator: + +| Gesture | Description | +| ------- | ----------- | +| Tap | Press and release the primary mouse button. | +| Double tap | Double-click and then release the primary mouse button. | +| Drag | Press and hold the primary mouse button, move the item, and then release. | +| Touch and hold | Press the primary mouse button, hold, and release. | +| Pinch | Press the CTRL key on Windows, or the Command key on macOS, to display a pinch gesture multi-touch interface. The mouse acts as the first finger, which can be moved by dragging the cursor. The second finger is across from the anchor point. Pressing the left mouse button simulates touching both points, and releasing simulates removing both points. | +| Swipe | Press and hold the primary mouse button, swipe, and then release. | +| Vertical swipe | Open a vertical menu on the screen and use the mouse scroll wheel to scroll through the menu items. | + +## Advanced emulator scenarios + +You might want to test your app on a virtual device using more than just basic touch gestures. For example, you might want to simulate different network conditions. The following table lists where to find more information about advanced Android emulator scenarios: + +| Scenarios | More information | +| ------- | ---------------- | +| Use the camera | [Camera support](https://developer.android.com/studio/run/emulator-use-camera) on developer.android.com | +| Install and add files | [Install and add files](https://developer.android.com/studio/run/emulator-install-add-files) on developer.android.com | +| Use Wi-Fi | [Wi-Fi](https://developer.android.com/studio/run/emulator-wifi) on developer.android.com | +| Use extended controls | [Extended controls, settings, and help](https://developer.android.com/studio/run/emulator-extended-controls) on developer.android.com | +| Use snapshots | [Snapshots](https://developer.android.com/studio/run/emulator-snapshots) on developer.android.com | +| Use the emulator from the command line | [Start the emulator from the command line](https://developer.android.com/studio/run/emulator-commandline) on developer.android.com | +| Send console commands | [Send emulator console commands](https://developer.android.com/studio/run/emulator-console) on developer.android.com | +| Set up networking | [Set up Android Emulator networking](https://developer.android.com/studio/run/emulator-networking) on developer.android.com | +| Configure hardware acceleration | [Configure hardware acceleration for the Android Emulator](https://developer.android.com/studio/run/emulator-acceleration) on developer.android.com | +| Android emulator tools | [Comparison of Android Emulator tools](https://developer.android.com/studio/run/emulator-comparison) on developer.android.com | + +## Limitations + +The Android Emulator doesn't include virtual hardware for the following: + +- Bluetooth +- NFC +- SD card insert/eject +- Device-attached headphones +- USB diff --git a/docs/android/emulator/media/back.png b/docs/android/emulator/media/back.png new file mode 100644 index 0000000000000000000000000000000000000000..aa522c1dd15132a31638aa78168c8dd8dc541549 GIT binary patch literal 3562 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 literal 0 HcmV?d00001 diff --git a/docs/android/emulator/media/close.png b/docs/android/emulator/media/close.png new file mode 100644 index 0000000000000000000000000000000000000000..8d0d2f9ae681a44c551ef2651e0a5e670e30cfb1 GIT binary patch literal 3617 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 literal 0 HcmV?d00001 diff --git a/docs/android/emulator/media/minimize.png b/docs/android/emulator/media/minimize.png new file mode 100644 index 0000000000000000000000000000000000000000..bac244c523b794a88a6100afd29748d3bb10f197 GIT binary patch literal 3209 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 b-?jwV)cMBUqzgNri20zosN8hQP}lk&j_oa^ literal 0 HcmV?d00001 diff --git a/docs/android/emulator/media/overview.png b/docs/android/emulator/media/overview.png new file mode 100644 index 0000000000000000000000000000000000000000..bf8b8f3f5fb65c43f643c0a6446577eb31d4c968 GIT binary patch literal 3314 zcma)83s4hB7`}i!)lpF_1+^iHGC(f5gh$B02}yWFc|?d9Y^%K_7dgDkWiA&9)Jh8o zLUl%I$Jf{vYlrD$C|E`4*a~&%Xc-@E$FU;=6s_absV(^Gw1v^`C4mG=NH5v!X7~HP z|MuVAfB!~JLC(U^$WRD^7OHbqMW9{>N=&dH_$>(8K|l}>Ba}*wTB+n~7}`XTI0VHW zq7L?K^ur=9^&F1wds@5C5**faIPU>#$rHv|WO*kCu0573)3^Ttf7Etz*U7_WAukUM zloP+Mj}4Agd>C{5xZ+6jZZ4cxuG({9_e2#s@}9jQpxjVBetuhZNmBTa zi{dt6^#R>AeMPtQCn_3q7RsCcI(X*hJ?XV$$=f@tioTOQ6h7=|e&WS`F%A1B2scYZ=Wp zWqsBPIzlYDrB(=4Gwr zwa7)Hii!%jLJHH&4iS=?nko`YL=uS*AcWRRGmF`UX6tIF$fS-6w;CA2!VL z>Rf7APna>L(wlWo)Td?VDrrcJHPH-(QkbEz*qh)CtWWL9ZRm9gCjmZ{oR$?ff;6Hy zZb*{qjdQ=G6Y5h}Z3HeQOa#uL%G8uBS*ipPB3aTDVWLDK5h}zR`V@7p^W?U0Tz}qFr$arILCBUX8JxRBwKPql z?g;3gQum_d9jN}fd zmZ}I4k{maUG$l%go;od+@1ljt!plepQ6GfJA`VxUJ<16QFV)5s)e^iB?t1ebxx zNzA+>U0@d)aT8`ES%JqvNfU7?1xd_Mb@Wb`b-n2AOeR!l zXwEky!yw0cqE=;Ubs>g{vD^OsL%gL!)Vxwzd3;;#8;Nx}%A-}$V(}-9dm|Q2Jik8n zXlVTBp64T*uJrc{;5C;o@5>2MGur T_v2+Gmt?B53RIsfUaR>R3ja_X literal 0 HcmV?d00001 diff --git a/docs/android/emulator/media/power.png b/docs/android/emulator/media/power.png new file mode 100644 index 0000000000000000000000000000000000000000..292310ba3e5f15e87d3352599fedc916d6dcf169 GIT binary patch literal 3767 zcma)92~-o;8lFH|MPDB-51~p3#mDoQWfInuL`lLD3ld30Km{jZQbs44I7uWT#exgC zv;v+dVkx5d@TtdwMHCemER^!<(z>*wfNRw*78QNR0@ZgXVF^59Iyralo%?^^_s{+B zo&Vl!l+BA7@9ymmLC|<-*_y9AR2;+#WJZ_OqY>_8pBZt3M|$X zoq68@@oGJ@-LLt@+CrVH=ces(zZ!IL%$d5dxZO7{_VC4m^xs%}5A9yLdwZtaq8m4s zVUK19x_XQD1nk@?DlPeCRXzVuS7||a0sB(VlP6BuZboBMRngl;9V>WNw3dNYzuqJd|F$wt*$wt`Bhv&jZt^F z_E1je*_yv81gGZyr+Zqf!<6F6Zm~Dx+>WZ$>MgH!xgAsA4a`GaoR3!exoobky3d(Z z=~*+UARp>)X5=gUDqeJZOsi2iF^rYR?wZQ{ZEsr2|En_@Jpl4G7(& z!L@q6Nx(28_@GU7vl(IX(9$Vg zL`fJ80tSO}G;~?sb2x$u6w!?EsT&F|3k;YI#>a+P9JUtGpn4smLdTK=pdk&dejrF@ zHez9qMKWOO;n9v@Q5Lh)v1q6Xvq7UQ7MeM>mLW%s94cRqWuPjAlpqEq2_^L)Rzf&} zZ67ooL>r0=Nz8zfkvbiYsSs)ogu{^ptJIc{|EK*)PZD$`rb31Bhzbsx1#{o5KLGxd z(g|`Q%wvVHcyAU3FuQ_LT11JX8A1hVL~W@JV(f}7P)LQ;M>rf<16aLQkE{$rWz?Wr z15-y5Ouc2QSxQWckgIHYr$p^~w#Hyp`=h89vT%E&V`w96fcw+#1(OwB2F-e85San z4246u;lWYSwtQO2*mW64417eG7$=N2hcN`RD=0$rXf!wjP4ky6jEj5Bl{v%MM1meLCmjMzfNT#T8IFJfBn9m94!`xJh!U&j^1eNCb ziKw2yja0r|pv4SA@DYsFJ(`t3Vqi&H(kw{dW{P#+Xne}B8(}Dy11>g9-3O@F=F!yT zH&d<6R#a*);+un-BEdjLGH*1z&UxCqLpDZae*Es#e{}RfmTTk?1bin zMkGF}chG=i)B%K#BiauH3==a0RU<~+z_9vGBG}Z40>?(FntMme4!r3YZ(`A~I;EJ! zEWO|iBy}d z6Ysf0O;FEe_MIPKb$VWlPv>*x={VgA=fbi;d0NP%+P$Adq8~k9e_mc1f!(Ng+Hnk3XS5{%!xA9#~buDg3gwK4hHKt#GeX@3Si)W+Y2dF#At=46Cu&ndU zv7GkDza~w1y5`|m(|xn@zK=c~pOf2g;`0jf$M1Uo+sghK&RpnN*3sAdZa+&-7hk&d zB*&+%sOf1=rhoaxZClfc?%y63r?<$&A&btZzWY^edFxLNcRu}cMO;Pf)_b&DlP@)U zt!rxiLz%p4OLNtRjxB%x_grHkJwJEXm6d6GB;UC8#eREcDc5_y`>Cm~KkA>mf$>EP z+1{U3bi5U>n_gP-s(H5lJ7W{d;w9k7}Y)|;a!sQ>U^Y}%90i5gW zf0FmlcmDEOOu)v{S(C?&TT#~~eR<(Q+e>XUW818%HpNl8NAJ{{MPCG@AMjhdxhLdc z*^f7Cl<$R?lx$9jIL>f->>9&aR^O4jSmrLy4c=SK=}37tG5f>)is&sE0k|EI@i57Hlg-Is9bsM4dg3ICMbdUD#zeM=r?H?VcN?G9~E zHMcv{p51B;*|+Ymef7m}pW1d~&56m(E5V07+x?SzI?uj1cqQ%r{7}9~9fSYV?{jlebo>I} m{V9989D3J3KBV1w;MPIxH8gw2A5qjl1!>eg$>*Y_`Tql8T1v$L literal 0 HcmV?d00001 diff --git a/docs/android/emulator/media/rotate-left.png b/docs/android/emulator/media/rotate-left.png new file mode 100644 index 0000000000000000000000000000000000000000..5751d02a1ccecafa185960e08daf72dc17d02816 GIT binary patch literal 3826 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 H4ORaKz(UCK literal 0 HcmV?d00001 diff --git a/docs/android/emulator/media/volume-down.png b/docs/android/emulator/media/volume-down.png new file mode 100644 index 0000000000000000000000000000000000000000..9dc7096c927e609454e6df7905aa199e92bb7d2e GIT binary patch literal 3390 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 Va?vvD!c*$9FPoDrJtSUU^ncrcI|Tp$ literal 0 HcmV?d00001 diff --git a/docs/android/emulator/media/zoom.png b/docs/android/emulator/media/zoom.png new file mode 100644 index 0000000000000000000000000000000000000000..13759851775164dfdbaa382b1896e1ea4b4cd0cd GIT binary patch literal 3662 zcma)84Ommx8NLaEfS?eqQq(p?LFdfRO$d+}t|0*=0)h|~oK-H#ja-}LrZ+bdL2#fI zboLQh#hRa>yz#7!)tXdU};8(6JXu(ER#Ab}Cno9Enfa=!O{ zzk9xO&Uenf^fjvj{X_jB2ntjs#bE*to^&)GN|GE+>->AN={OO>%({>%I5?CI^NtMdGQ zcK7Z!{2wcq`i3fM!jB(U9I1S`)lY=p3$9qB7fhiKawYRjd9j2khJxR2^8e|fPzt^H+6 z*?EiULfzS&e{DTKPaWH|`tyN>*O+q;*#?xMoVKGMZmd1Zfn&5p-AV zs-)yYyi`VCl?N|%}n zEdy;|$cMp#yg-Wqeh?!R^0v1jXgy>8czZKr=_m%w83TssnR^WsT^SBd8^!MgHT@)k z0+bweI&Q`E29zR5dS=-oUL;QhY+jXnq3NJzfl_N@j%zHod5yQjfenhwRH{^<&eV_? zW;Ev!6r<{J3+V7OC1sl-XvS>1FrecnLO>shtFx%A)D)?PFz`?7`n$A`dB*u>733vhy;?HKYWu#Uo&4^DN zrGtO5oIHv$N%{Qz{Cr-%h)0lH`LIMH;R}R(p^ys@T=Nbig<82r^CE}Hm`*%q){wY~ z!U-dr)bWyCa%RaC>f7Z=z5Ga zgIFQ3jPDub45Ayw4J1xsWSq&Q$2BND2Z%G0V3oS_@&B|R=_wxDj%zR^71h9z%VFWG z^+&-!QaUXYfknJ1p6J!00OnCJ!HDMSF)gAdEtosCF^osCb!rttZ$f8aDX@B7{_?bh z#$v#X6xT!&T(e`UdAYa|C3m>DB{9G zE*!%~DK;$T2|#*|VN2W%VuFrGubFuSNhP7?yz#)f({&;}iaMrwY*pA#KXDx|m?VF6xcDg~Lg#z&KVfsBvbu~|> zX1$u~YIdR0XOYw%)a-a1WF-4RBZ`*sr!-7S%yJ<{xe{FrlZorh7^x%-bP9AyYTzWa zUo_(MlX}MtdYrz1NcE_3Yb?jg)nYo-qNg}6`$Wd4ZxniblB&ITqU`9GPVprU4VPPr zUChx7?m&n?ST1AtDa1eSlQbCwG1sc%6B@KY9L_ft3vs$@^!*Pj&`=l<;owvhp05wS4}_55p}F z+Z$s)z6n~hy5%}u#5|EQdd8xNh(zr>GJPB3b+`WUv+Rh7h$WdtUgB^#tYpIgvZ=u` z(Au3WeVUpI$ zN@BNKnR`#|zQF6LZR^br`e_O0>1PG=n#eAN(9^ox|t~2#EbnqP%@T#`sm3 zPf)oi=dRar=7A+_zwc-7`Qw%o5i{qGy!>Vf9L2aDR2Ojc^OZ%w~;t$&H_C$05mx0jbU)Q4PXd=L0IF{2}`RXsDMFle~1m$`p| ztkCc1jRmPs>ZIP86^%7D%*;8wwric<9bNfvtXyIK;pvxOw@A9XC3o(eYAVhj>^Xe9 zaHiLp1LAdOpIqwu*CUbd1CdQ<+jlkX)K^8UrfH0!8%fH)bzJ(Ybf>KGUa_3jk}A(` ztBN}S^&4}FnYAPsP_1u{jG;`+i2nqC`sw%8&AyKw_3s&G)gR3I!qga=ckBJbAADUj zw7h-R<%9F8M|>9tZQ9=Y`;unHkYC=ds|Tw~E;o<7@aDaH!`3CV?PCwO*`B7p)#!b& zNL?4O?ae#8jyA{5Jso+oqO [!IMPORTANT] -> To use Visual Studio for Mac with .NET 8, enable the **Visual Studio > Preferences > Other > Preview Features > Use the .NET 8 SDK if installed (requires restart)** checkbox. +[!INCLUDE [Enable .NET 8 support in Visual Studio Mac](includes/vsmac-net8.md)] ## Create an app diff --git a/docs/get-started/includes/vsmac-net8.md b/docs/get-started/includes/vsmac-net8.md new file mode 100644 index 000000000..fb3cfb51b --- /dev/null +++ b/docs/get-started/includes/vsmac-net8.md @@ -0,0 +1,7 @@ +--- +ms.topic: include +ms.date: 12/19/2023 +--- + +> [!IMPORTANT] +> To use Visual Studio for Mac with .NET 8, enable the **Visual Studio > Preferences > Other > Preview Features > Use the .NET 8 SDK if installed (requires restart)** checkbox. diff --git a/docs/get-started/installation.md b/docs/get-started/installation.md index 97b094d29..80d94ebef 100644 --- a/docs/get-started/installation.md +++ b/docs/get-started/installation.md @@ -86,6 +86,8 @@ To build, sign, and deploy .NET MAUI apps for iOS or macOS, you'll also need: 1. Install .NET 8 through the [standalone installer](https://dotnet.microsoft.com/en-us/download/dotnet/8.0). 1. After .NET 8 has finished installing, run `dotnet workload install maui` in a terminal. + [!INCLUDE [Enable .NET 8 support in Visual Studio Mac](includes/vsmac-net8.md)] + If you have network trouble while installing in a corporate environment, review the [installing behind a firewall or proxy](#installation-behind-a-firewall-or-proxy-server) instructions. ## Installation behind a firewall or proxy server diff --git a/docs/mac-catalyst/user-interface-idiom.md b/docs/mac-catalyst/user-interface-idiom.md index af0267e7f..bb6b02db6 100644 --- a/docs/mac-catalyst/user-interface-idiom.md +++ b/docs/mac-catalyst/user-interface-idiom.md @@ -34,6 +34,15 @@ You might discover that adopting the Mac user interface idiom enhances the user Adopting the Mac user interface idiom may require you to make additional changes to your app. For example, if your app uses images sized for iPad or has hard-coded sizes, you may need to update your app to accommodate the size differences. +> [!WARNING] +> , , and aren't supported in the Mac user interface idiom by Apple. This means that the .NET MAUI controls that consume these native controls (, and ) can't be used in the Mac user interface idiom. Attempting to do so will throw a macOS exception. +> +> In addition, the following constraints apply in the Mac user interface idiom: +> +> - throws a macOS exception when it's title is set in a non-Mac idiom view. +> - throws a macOS exception when is called, or when or are called for any state except `UIControlStateNormal.Normal`. +> - throws a macOS exception when the , , methods are called and when the , , , , properties are set. + ## Determine the user interface idiom It's possible to determine at runtime which user interface idiom your .NET MAUI Mac Catalyst app is using. This can be achieved by examining the value of the property on your : diff --git a/docs/migration/index.md b/docs/migration/index.md index 4cda8e277..93295402e 100644 --- a/docs/migration/index.md +++ b/docs/migration/index.md @@ -24,6 +24,7 @@ Xamarin projects can run on .NET after completing an upgrade process. The follow | Metal | ✅ | [Upgrade Xamarin native projects](native-projects.md) | | OpenGL | ❌ (iOS) | Removed from iOS since OpenTK isn't available | | Xamarin.watchOS | ❌ | Recommendation: bundle Swift extensions with .NET for iOS apps | +| Xamarin.Forms UWP | ✅ | [Upgrade Xamarin native projects](native-projects.md) | > [!IMPORTANT] @@ -33,7 +34,7 @@ Xamarin projects can run on .NET after completing an upgrade process. The follow > - Multi-project solutions **don't** need to become a multi-targeted single project. -To upgrade your Xamarin native projects to .NET, you'll first have to update the projects to be SDK-style projects and then update your dependencies to .NET 8. For more information, see [Upgrade Xamarin.Android, Xamarin.iOS, and Xamarin.Mac apps to .NET](native-projects.md). +To upgrade your Xamarin native projects to .NET, you'll first have to update the projects to be SDK-style projects and then update your dependencies to .NET 8. For more information, see [Upgrade Xamarin.Android, Xamarin.iOS, Xamarin.Mac, and UWP projects to .NET](native-projects.md). The .NET Upgrade Assistant is a command-line tool that can help you upgrade multi-project Xamarin.Forms apps to multi-project .NET Multi-platform App UI (.NET MAUI) apps. After running the tool, in most cases the app will require additional effort to complete the upgrade. For more information, see [Upgrade a Xamarin.Forms app to a .NET MAUI app with the .NET Upgrade Assistant](upgrade-assistant.md). diff --git a/docs/migration/native-projects.md b/docs/migration/native-projects.md index c8057cb04..2e785fdc5 100644 --- a/docs/migration/native-projects.md +++ b/docs/migration/native-projects.md @@ -1,10 +1,10 @@ --- -title: "Upgrade Xamarin.Android, Xamarin.iOS, and Xamarin.Mac projects to .NET" -description: "Learn how to manually upgrade Xamarin native project files to .NET." +title: "Upgrade Xamarin.Android, Xamarin.iOS, Xamarin.Mac, and UWP projects to .NET" +description: "Learn how to manually upgrade Xamarin native projects to .NET." ms.date: 02/15/2023 --- -# Upgrade Xamarin.Android, Xamarin.iOS, and Xamarin.Mac projects to .NET +# Upgrade Xamarin.Android, Xamarin.iOS, Xamarin.Mac, and UWP projects to .NET To upgrade your Xamarin native projects to .NET, you must: @@ -14,13 +14,13 @@ To upgrade your Xamarin native projects to .NET, you must: > - Update or replace incompatible dependencies with .NET 8 versions. > - Compile and test your app. -For most apps, you won't need to change namespaces or undertake other rewrites. +For most projects, with the exception of UWP projects, you won't need to change namespaces or undertake other rewrites. -To simplify the upgrade process, we recommend creating a new .NET project of the same type and name as your Xamarin native project, and then copying in your code. This is the approach outlined below. +To simplify the upgrade process, we recommend creating a new .NET or WinUI 3 project of the same type and name as your Xamarin native project, and then copy in your code. This is the approach outlined below. ## Create a new project -In Visual Studio, create a new .NET project of the same type and name as your Xamarin native project. For example, to upgrade from Xamarin.Android to .NET Android select the **Android Application** project template: +In Visual Studio, create a new .NET or WinUI 3 project of the same type and name as your Xamarin native project. For example, to upgrade from Xamarin.Android to .NET Android select the **Android Application** project template: :::image type="content" source="media/new-android-app.png" alt-text="Screenshot of selecting the Android app project template in Visual Studio."::: @@ -42,17 +42,17 @@ The new project should be given the same project and package name as your existi ``` > [!IMPORTANT] -> The target framework moniker (TFM) is what denotes the project as using .NET, in this case .NET 8. Valid TFMs for equivalent Xamarin native projects are net8.0-android, net8.0-ios, net8.0-macos, net8.0-tvos. For information about target frameworks in SDK-style projects, see [Target frameworks in SDK-style projects](/dotnet/standard/frameworks). +> The target framework moniker (TFM) is what denotes the project as using .NET, in this case .NET 8. Valid TFMs for equivalent Xamarin native projects are net8.0-android, net8.0-ios, net8.0-macos, net8.0-tvos, and net8.0-windows*. For information about target frameworks in SDK-style projects, see [Target frameworks in SDK-style projects](/dotnet/standard/frameworks). Launch the app to confirm that your development environment can build the app. ## Merge files -Copy your code and resource files from the folders of your Xamarin native app to identical folders within your new app. You should overwrite any files of the same name. +Copy your code and resource files from the folders of your Xamarin native project to identical folders within your new app. You should overwrite any files of the same name. If you have other library projects, you should add them to your new solution and [add project references](/visualstudio/ide/managing-references-in-a-project) to them from your new .NET project. -You'll also need to copy some project properties from your Xamarin native project to your new .NET project, for settings like conditional compilation arguments and code signing. Opening the projects side-by-side in separate Visual Studio instances will enable you to compare the project properties. Alternatively, you can migrate the settings by editing the new project file directly. For more information, see [Xamarin.Android project migration](android-projects.md) and [Xamarin Apple project migration](apple-projects.md). +You'll also need to copy some project properties from your Xamarin native project to your new .NET project or WinUI 3 project, for settings like conditional compilation arguments and code signing. Opening the projects side-by-side in separate Visual Studio instances will enable you to compare the project properties. Alternatively, you can migrate the settings by editing the new project file directly. For more information, see [Xamarin.Android project migration](android-projects.md), [Xamarin Apple project migration](apple-projects.md), and [Xamarin.Forms UWP project migration](uwp-projects.md). ## Update dependencies @@ -83,7 +83,7 @@ For information about migrating Xamarin.Essentials code in a .NET Android or .NE ## Compile and troubleshoot -Once your dependencies are resolved and your code and resource files are added to your .NET native project, you should build your project. Any errors will guide you towards next steps. +Once your dependencies are resolved and your code and resource files are added to your .NET native or Windows App SDK project, you should build your project. Any errors will guide you towards next steps. > [!TIP] diff --git a/docs/migration/renderer-to-handler.md b/docs/migration/renderer-to-handler.md index 184ec1985..ca4cf0cf4 100644 --- a/docs/migration/renderer-to-handler.md +++ b/docs/migration/renderer-to-handler.md @@ -127,14 +127,14 @@ Filename-based multi-targeting is configured by adding the following XML to the ```xml - - + + - - + + diff --git a/docs/migration/uwp-projects.md b/docs/migration/uwp-projects.md new file mode 100644 index 000000000..447b3548b --- /dev/null +++ b/docs/migration/uwp-projects.md @@ -0,0 +1,132 @@ +--- +title: "Xamarin.Forms UWP project migration" +description: "Learn how to migrate a Xamarin.Forms UWP project to a WinUI 3 project." +ms.date: 11/13/2023 +--- + +# Xamarin.Forms UWP project migration + +A .NET 8 project for a .NET MAUI WinUI 3 app is similar to the following example: + +```xml + + + WinExe + net8.0-windows10.0.19041.0 + 10.0.17763.0 + MyApp.WinUI + app.manifest + x86;x64;ARM64 + win10-x86;win10-x64;win10-arm64 + true + true + true + + false + + +``` + +For a library project, omit the `$(OutputType)` property completely or specify `Library` as the property value. + +## Changes to MSBuild properties + +While upgrading your project, it's recommended to remove the following UWP MSBuild properties from your project file: + +- `WindowsXamlEnableOverview` +- `AppxPackageSigningEnabled` +- `GenerateAssemblyInfo` + +You'll also need to ensure that the platform architectures in the target project are specified with the following .NET runtime identifiers: + +```xml + + + x86;x64;ARM64 + +``` + +For more information about runtime identifiers, see [.NET RID Catalog](/dotnet/core/rid-catalog). + +## Namespace changes + +There are differences in the names of namespaces between UWP and WinUI 3. In many cases it's as easy as changing a namespace name and then your code will compile. For example, you'll need to replace the `Windows.UI.Xaml` namespace with the `Microsoft.UI.Xaml` namespace. Similarly, you'll need to replace the `Windows.UI.Xaml.Controls` namespace with the `Microsoft.UI.Xaml.Controls` namespace. + +Other times, the mapping takes a bit more work, and in rare cases requires a change in approach. For more information, see [Mapping UWP APIs and libraries to the Windows App SDK](/windows/apps/windows-app-sdk/migrate-to-windows-app-sdk/api-mapping-table). + +## API changes + +You'll need to address any API changes that may affect your app. For example, some types, methods, and properties may have been renamed, deprecated or removed. For information on what's supported when upgrading your UWP project to WinUI 3, see [What's supported when migrating from UWP to WinUI 3](/windows/apps/windows-app-sdk/migrate-to-windows-app-sdk/what-is-supported). For information about mapping UWP features and APIs to WinUI 3, see [Mapping UWP features to the Windows App SDK](/windows/apps/windows-app-sdk/migrate-to-windows-app-sdk/feature-mapping-table) and [Mapping UWP APIs and libraries to the Windows App SDK](/windows/apps/windows-app-sdk/migrate-to-windows-app-sdk/api-mapping-table). + +Your project can be made compatible with earlier OS versions by setting the `$(SupportedOSPlatformVersion)` property in your project file: + +```xml + + 10.0.19041.0 + +``` + +The `$(SupportedOSPlatformVersion)` property indicates the minimum OS version required to run your app or library. If you don't explicitly specify this minimum runtime OS version in your project, it defaults to the platform version from the Target Framework Moniker (TFM). + +If your project only targets Windows, it's sufficient to omit the platform checking condition and set the `$(SupportedOSPlatformVersion)` property directly: + +```xml + + 10.0.19041.0 + +``` + +For more information about the `$(SupportedOSPlatformVersion)` property, see [Support older OS versions](/dotnet/standard/frameworks#support-older-os-versions). + +For an app to run correctly on an older OS version, it can't call APIs that don't exist on that version of the OS. However, you can add guards around calls to newer APIs so they are only called when running on a version of the OS that supports them. This can be achieved with the method: + +```csharp +if (OperatingSystem.IsWindowsVersionAtLeast(10)) +{ + // Use the API here +} +``` + +## Remove files + +The following files, which are present in Xamarin.Forms UWP projects, don't exist in WinUI 3 projects: + +- *MainPage.xaml* and *MainPage.xaml.cs* +- *AssemblyInfo.cs* +- *Default.rd.xml* + +Therefore, you should remove these files if you've copied them from your UWP project to your WinUI 3 project. Any required business logic contained in these files should be moved elsewhere. + +[!INCLUDE [AssemblyInfo changes](includes/assemblyinfo-changes.md)] + +## Add files + +You'll need to add the following files to your WinUI 3 project: + +- [*MauiProgram.cs*](https://github.com/mattleibow/MultiHeadMauiTemplates/blob/main/sample/MauiMultiHeadApp/MauiMultiHeadApp.WinUI/MauiProgram.cs) +- [*App.xaml*](https://github.com/mattleibow/MultiHeadMauiTemplates/blob/main/sample/MauiMultiHeadApp/MauiMultiHeadApp.WinUI/App.xaml) and [*App.xaml.cs*](https://github.com/mattleibow/MultiHeadMauiTemplates/blob/main/sample/MauiMultiHeadApp/MauiMultiHeadApp.WinUI/App.xaml.cs) + - Your Xamarin.Forms UWP project includes *App.xaml* and *App.xaml.cs* files, to which you may have added additional business logic. Therefore, migrate any business logic over to the new versions of these files. +- [*launchSettings.json*](https://github.com/mattleibow/MultiHeadMauiTemplates/blob/main/sample/MauiMultiHeadApp/MauiMultiHeadApp.WinUI/Properties/launchSettings.json) + +These files are required to bootstrap your .NET MAUI WinUI 3 project. + +## Changes to Package.appxmanifest + +The following changes must be made to your migrated project's *Package.appxmanifest* file: + +1. Set the application entry point to `$targetentrypoint$`. For more information, see [Target entry point](https://github.com/mattleibow/MultiHeadMauiTemplates/blob/6e7cb786ed18756749a617d303df46130eab45d9/sample/MauiMultiHeadApp/MauiMultiHeadApp.WinUI/Package.appxmanifest#L34). +2. Add the `runFullTrust` capability. For more information, see [Run full trust capability](https://github.com/mattleibow/MultiHeadMauiTemplates/blob/6e7cb786ed18756749a617d303df46130eab45d9/sample/MauiMultiHeadApp/MauiMultiHeadApp.WinUI/Package.appxmanifest#L48). +3. Add the `Windows.Universal` and `Windows.Desktop` target device families. For more information, see [Universal target device family](https://github.com/mattleibow/MultiHeadMauiTemplates/blob/6e7cb786ed18756749a617d303df46130eab45d9/sample/MauiMultiHeadApp/MauiMultiHeadApp.WinUI/Package.appxmanifest#L23) and [Desktop target device family](https://github.com/mattleibow/MultiHeadMauiTemplates/blob/6e7cb786ed18756749a617d303df46130eab45d9/sample/MauiMultiHeadApp/MauiMultiHeadApp.WinUI/Package.appxmanifest#L24). + +Making these changes fixes common deployment errors for your app on Windows. + +For an example of a compliant *Package.appxmanifest* file, see [*Package.appxmanifest*](https://github.com/mattleibow/MultiHeadMauiTemplates/blob/main/sample/MauiMultiHeadApp/MauiMultiHeadApp.WinUI/Package.appxmanifest). + +## Runtime behavior + +There are behavioral changes to the `String.IndexOf()` method in .NET 5+ on different platforms. For more information, see [.NET globalization and ICU](/dotnet/standard/globalization-localization/globalization-icu). + +## See also + +- [Manually upgrade a Xamarin.Forms app to a multi-project .NET MAUI app](multi-project-to-multi-project.md) +- [Manually upgrade a Xamarin.Forms app to a single project .NET MAUI app](multi-project-to-single-project.md) diff --git a/docs/platform-integration/configure-multi-targeting.md b/docs/platform-integration/configure-multi-targeting.md index 888fd27fa..c1fce1309 100644 --- a/docs/platform-integration/configure-multi-targeting.md +++ b/docs/platform-integration/configure-multi-targeting.md @@ -23,26 +23,26 @@ A standard multi-targeting pattern is to include the platform as an extension in ```xml - - + + - - + + - - + + - - + + @@ -117,32 +117,32 @@ Filename-based multi-targeting can be combined with folder-based multi-targeting ```xml - - + + - - + + - - + + - - + + diff --git a/docs/user-interface/handlers/create.md b/docs/user-interface/handlers/create.md index 53744a097..229ede2c3 100644 --- a/docs/user-interface/handlers/create.md +++ b/docs/user-interface/handlers/create.md @@ -209,14 +209,14 @@ The `VideoHandler` class containing the mappers is named *VideoHandler.cs*. Its ```xml - - + + - - + + diff --git a/docs/user-interface/images/app-icons.md b/docs/user-interface/images/app-icons.md index 669282e1c..47f275b5f 100644 --- a/docs/user-interface/images/app-icons.md +++ b/docs/user-interface/images/app-icons.md @@ -18,9 +18,7 @@ A .NET MAUI app icon can use any of the standard platform image formats, includi ## Change the icon -In your project file, the `` item designates the icon to use for your app. You may only have one icon defined for your app. Any subsequent `` items are ignored. - -To comply with Android resource naming rules, app icon filenames must be lowercase, start and end with a letter character, and contain only alphanumeric characters or underscores. For more information, see [App resources overview](https://developer.android.com/guide/topics/resources/providing-resources) on developer.android.com. +In your .NET MAUI project, the image with the **MauiIcon** build action designates the icon to use for your app. This is represented in your project file as the `` item. You may only have one icon defined for your app. Any subsequent `` items are ignored. The icon defined by your app can be composed of a single image, by specifying the file as the `Include` attribute: @@ -30,8 +28,12 @@ The icon defined by your app can be composed of a single image, by specifying th ``` -> [!IMPORTANT] -> Only the first `` item defined in the project file is processed by .NET MAUI. If you want to use a different file as the icon, first delete the existing icon from your project, and then add the new icon. Next, in the **Solution Explorer** pane, select the file, and then in the **Properties** pane, set the **Build Action** to **MauiIcon**. Instead of adding a new icon file to the project, consider replacing the existing icon file instead. +Only the first `` item defined in the project file is processed by .NET MAUI. If you want to use a different file as the icon, first delete the existing icon from your project, and then add the new icon by dragging it to the *Resources\AppIcon* folder of your project. Visual Studio will automatically set its build action to **MauiIcon** and will create a corresponding `` item in your project file. + +> [!NOTE] +> An app icon can also be added to other folders of your app project. However, in this scenario its build action must be manually set to **MauiIcon** in the **Properties** window. + +To comply with Android resource naming rules, app icon filenames must be lowercase, start and end with a letter character, and contain only alphanumeric characters or underscores. For more information, see [App resources overview](https://developer.android.com/guide/topics/resources/providing-resources) on developer.android.com. After changing the icon file, you may need to clean the project in Visual Studio. To clean the project, right-click on the project file in the **Solution Explorer** pane, and select **Clean**. You also may need to uninstall the app from the target platform you're testing with. diff --git a/docs/xaml/namespaces/custom-namespace-schemas.md b/docs/xaml/namespaces/custom-namespace-schemas.md index 2bb815424..7f77aa9f9 100644 --- a/docs/xaml/namespaces/custom-namespace-schemas.md +++ b/docs/xaml/namespaces/custom-namespace-schemas.md @@ -23,7 +23,7 @@ For more information about XAML namespaces, see [XAML namespaces](index.md). ## Define a custom namespace schema -The sample application contains a library that exposes some simple controls, such as `CircleButton`: +Imagine a library that exposes some simple controls, such as `CircleButton`: ```csharp namespace MyCompany.Controls @@ -42,19 +42,18 @@ A custom namespace schema is defined with the `XmlnsDefinitionAttribute` class, > [!NOTE] > The `XmlnsDefinitionAttribute` class also has a property named `AssemblyName`, which can be optionally set to the name of the assembly. This is only required when a CLR namespace referenced from a `XmlnsDefinitionAttribute` is in a external assembly. -The `XmlnsDefinitionAttribute` should be defined at the assembly level in the project that contains the CLR namespaces that will be mapped in the custom namespace schema. The following example shows the **AssemblyInfo.cs** file from a class library: +The `XmlnsDefinitionAttribute` should be defined at the assembly level in the project that contains the CLR namespaces that will be mapped in the custom namespace schema: ```csharp using MyCompany.Controls; -[assembly: Preserve] [assembly: XmlnsDefinition("http://mycompany.com/schemas/controls", "MyCompany.Controls")] ``` -This code creates a custom namespace schema that maps the `http://mycompany.com/schemas/controls` URL to the `MyCompany.Controls` CLR namespace. In addition, the `Preserve` attribute is specified on the assembly, to ensure that the linker preserves all the types in the assembly. +This code creates a custom namespace schema that maps the `http://mycompany.com/schemas/controls` URL to the `MyCompany.Controls` CLR namespace. > [!IMPORTANT] -> The `Preserve` attribute should be applied to classes in the assembly that are mapped through the custom namespace schema, or applied to the entire assembly. +> You should instruct the linker to preserve types in the assembly that are mapped through the custom namespace schema, or preserve the entire assembly. For more information, see [Preserve code](~/android/linking.md#preserve-code). The custom namespace schema can then be used for type resolution in XAML files.