diff --git a/.github/ISSUE_TEMPLATE/0-customer-feedback-repo.yml b/.github/ISSUE_TEMPLATE/0-customer-feedback-repo.yml new file mode 100644 index 0000000000..16f29e9e4e --- /dev/null +++ b/.github/ISSUE_TEMPLATE/0-customer-feedback-repo.yml @@ -0,0 +1,35 @@ +name: "Post a general documentation issue using the repo link" +title: "" +description: >- + Post an issue for Windows developer docs. Use the feedback link from the bottom of the learn.microsoft.com page to link the associated doc or this template for a general issue. + - "needs-triage" +body: + - type: markdown + attributes: + value: "## Enter your feedback" + - type: markdown + attributes: + value: Select the issue type, and describe the issue in the text box below. Add as much detail as needed to help us resolve the issue. + - type: dropdown + id: issue-type + attributes: + label: Type of issue + options: + - Typo + - Code doesn't work + - Missing information + - Outdated article + - Other (describe below) + validations: + required: true + - type: textarea + id: userfeedback + validations: + required: true + attributes: + label: Feedback + description: >- + If possible, please provide extended details that will add context and help the team update + the documentation. Additional details not needed for typos, grammar, formatting, etc. + For technical or factual errors, please include code snippets and output to show how the + documentation is incorrect. diff --git a/.github/ISSUE_TEMPLATE/1-customer-feedback.yml b/.github/ISSUE_TEMPLATE/1-customer-feedback.yml new file mode 100644 index 0000000000..693cae9102 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/1-customer-feedback.yml @@ -0,0 +1,73 @@ +name: "Post a documentation issue" +title: "" +description: >- + Post an issue specific to Windows dev docs. ⛔ This template connects to the feedback link on the bottom of learn.microsoft.com. If posting an issue from the GitHub repo, choose a different template.⛔ +labels: + - "needs-triage" +body: + - type: markdown + attributes: + value: "## Enter your feedback" + - type: markdown + attributes: + value: Select the issue type, and describe the issue in the text box below. Add as much detail as needed to help us resolve the issue. + - type: dropdown + id: issue-type + attributes: + label: Type of issue + options: + - Typo + - Code doesn't work + - Missing information + - Outdated article + - Other (describe below) + validations: + required: true + - type: textarea + id: userfeedback + validations: + required: true + attributes: + label: Feedback + description: >- + If possible, please provide extended details that will add context and help the team update + the documentation. Additional details not needed for typos, grammar, formatting, etc. + For technical or factual errors, please include code snippets and output to show how the + documentation is incorrect. + - type: markdown + attributes: + value: "## 🚧 Article information 🚧" + - type: markdown + attributes: + value: "*Don't modify the following fields*. They are automatically filled in for you. Doing so will disconnect your issue from the affected article. *Don't edit them*." + - type: input + id: pageUrl + validations: + required: true + attributes: + label: Page URL + - type: input + id: contentSourceUrl + validations: + required: true + attributes: + label: Content source URL + - type: input + id: author + validations: + required: true + attributes: + label: Author + description: GitHub Id of the author + - type: input + id: documentVersionIndependentId + validations: + required: true + attributes: + label: Document Id + - type: input + id: platformId + validations: + required: true + attributes: + label: Platform Id diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 0000000000..8768252099 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,17 @@ +blank_issues_enabled: false +contact_links: + - name: Report issues, bugs, or file feature requests related to Windows development. + url: https://www.microsoft.com/en-us/windowsinsider/feedbackhub/fb + about: Windows Feedback Hub (for reporting issues, bugs, or feature requests) + - name: Report issues, bugs, or file feature requests for PowerToys. + url: https://github.com/Microsoft/powertoys/issues + about: Windows PowerToys product repo on GitHub (for reporting issues, bugs, or feature requests) + - name: Report issues, bugs, or file feature requests for Windows Package Manager. + url: https://github.com/microsoft/winget-cli/issues + about: Windows Package Manager product repo on GitHub (for reporting issues, bugs, or feature requests) + - name: Report issues, bugs, or file feature requests for Windows Terminal. + url: https://github.com/Microsoft/terminal/issues + about: Windows Terminal product repo on GitHub (for reporting issues, bugs, or feature requests) + - name: Report issues, bugs, or file feature requests for Windows Subsystem for Linux. + url: https://github.com/Microsoft/WSL/issues + about: Report issues, bugs, or file feature requests for Windows Subsystem for Linux. diff --git a/.openpublishing.build.ps1 b/.openpublishing.build.ps1 deleted file mode 100644 index f442860e08..0000000000 --- a/.openpublishing.build.ps1 +++ /dev/null @@ -1,18 +0,0 @@ -param( - [string]$buildCorePowershellUrl = "https://opbuildstorageprod.blob.core.windows.net/opps1container/.openpublishing.buildcore.ps1", - [string]$parameters -) -# Main -$errorActionPreference = 'Stop' - -# Step-1 Download buildcore script to local -echo "download build core script to local with source url: $buildCorePowershellUrl" -$repositoryRoot = Split-Path -Parent $MyInvocation.MyCommand.Definition -$buildCorePowershellDestination = "$repositoryRoot\.openpublishing.buildcore.ps1" -Invoke-WebRequest $buildCorePowershellUrl -OutFile $buildCorePowershellDestination - -# Step-2: Run build core -echo "run build core script with parameters: $parameters" -$arguments = "-parameters:'$parameters'" -Invoke-Expression "$buildCorePowershellDestination $arguments" -exit $LASTEXITCODE \ No newline at end of file diff --git a/.openpublishing.publish.config.json b/.openpublishing.publish.config.json index a799014aca..6cc79eb63b 100644 --- a/.openpublishing.publish.config.json +++ b/.openpublishing.publish.config.json @@ -65,12 +65,11 @@ ], "notification_subscribers": [], "sync_notification_subscribers": [ - "quradic@microsoft.com" + "jkendir@microsoft.com" ], "branches_to_filter": [], "git_repository_url_open_to_public_contributors": "https://github.com/MicrosoftDocs/windows-dev-docs", "git_repository_branch_open_to_public_contributors": "docs", - "skip_source_output_uploading": false, "need_preview_pull_request": true, "resolve_user_profile_using_github": true, "dependent_repositories": [ @@ -83,7 +82,7 @@ { "path_to_root": "samples-xaml-gallery", "url": "https://github.com/microsoft/Xaml-Controls-Gallery", - "branch": "master", + "branch": "main", "branch_mapping": {} }, { @@ -111,6 +110,7 @@ } }, "docs_build_engine": {}, + "skip_source_output_uploading": false, "contribution_branch_mappings": {}, "need_generate_pdf_url_template": true, "need_generate_pdf": false diff --git a/.openpublishing.redirection.json b/.openpublishing.redirection.json index ba008e287f..e01e0bd710 100644 --- a/.openpublishing.redirection.json +++ b/.openpublishing.redirection.json @@ -1,7587 +1,10614 @@ { "redirections": [ { - "source_path": "uwp/monetize/get-xbox-live-analytics.md", - "redirect_url": "/windows/uwp/publish/xbox-analytics-report", + "source_path": "hub/android/emulator.md", + "redirect_url": "/windows/dev-environment/", "redirect_document_id": false }, { - "source_path": "uwp/monetize/get-xbox-live-achievements-data.md", - "redirect_url": "/windows/uwp/publish/xbox-analytics-report", + "source_path": "hub/android/native-android.md", + "redirect_url": "/windows/dev-environment/", "redirect_document_id": false }, { - "source_path": "uwp/monetize/get-xbox-live-health-data.md", - "redirect_url": "/windows/uwp/publish/xbox-analytics-report", + "source_path": "hub/android/overview.md", + "redirect_url": "/windows/dev-environment/", "redirect_document_id": false }, { - "source_path": "uwp/monetize/get-xbox-live-game-hub-data.md", - "redirect_url": "/windows/uwp/publish/xbox-analytics-report", + "source_path": "hub/android/pwa.md", + "redirect_url": "/windows/dev-environment/", "redirect_document_id": false }, { - "source_path": "uwp/monetize/get-xbox-live-club-data.md", - "redirect_url": "/windows/uwp/publish/xbox-analytics-report", + "source_path": "hub/apps/how-tos/uno-multiplatform.md", + "redirect_url": "/previous-versions/windows/app-dev/how-tos/uno-multiplatform", "redirect_document_id": false }, - { - "source_path": "uwp/monetize/get-xbox-live-multiplayer-data.md", - "redirect_url": "/windows/uwp/publish/xbox-analytics-report", + { + "source_path": "hub/apps/whats-new/windows-11-build-22000.md", + "redirect_url": "/windows/apps/whats-new/whats-new-for-developers", "redirect_document_id": false }, { - "source_path": "uwp/monetize/get-xbox-live-concurrent-usage-data.md", - "redirect_url": "/windows/uwp/publish/xbox-analytics-report", + "source_path": "hub/apps/get-started/uno-simple-photo-viewer.md", + "redirect_url": "/previous-versions/windows/app-dev/get-started/uno-simple-photo-viewer", "redirect_document_id": false }, { - "source_path": "uwp/debug-test-perf/device-portal-hololens.md", - "redirect_url": "/windows/mixed-reality/develop/platform-capabilities-and-apis/using-the-windows-device-portal", + "source_path": "hub/apps/windows-dotnet-maui/index.md", + "redirect_url": "/previous-versions/windows/app-dev/windows-dotnet-maui/index", "redirect_document_id": false }, { - "source_path": "uwp/debug-test-perf/device-portal-api-hololens.md", - "redirect_url": "/windows/mixed-reality/develop/platform-capabilities-and-apis/device-portal-api-reference", + "source_path": "hub/apps/windows-dotnet-maui/tutorial-csharp-ui-maui-toolkit.md", + "redirect_url": "/previous-versions/windows/app-dev/windows-dotnet-maui/tutorial-csharp-ui-maui-toolkit", "redirect_document_id": false }, { - "source_path": "uwp/get-started/get-uwp-app-samples.md", - "redirect_url": "/windows/apps/get-started/samples", + "source_path": "hub/apps/windows-dotnet-maui/tutorial-graph-api.md", + "redirect_url": "/previous-versions/windows/app-dev/windows-dotnet-maui/tutorial-graph-api", "redirect_document_id": false - }, + }, { - "source_path": "uwp/home.md", - "redirect_url": "/windows/uwp/", + "source_path": "hub/apps/windows-dotnet-maui/walkthrough-first-app.md", + "redirect_url": "/previous-versions/windows/app-dev/windows-dotnet-maui/walkthrough-first-app", "redirect_document_id": false }, { - "source_path": "uwp/app-to-app/use-edp-to-protect-enterprise-data-transferred-between-apps.md", - "redirect_url": "/windows/uwp/enterprise/wip-dev-guide", + "source_path": "uwp/enterprise/customer-database-app-structure.md", + "redirect_url": "/previous-versions/windows/uwp/enterprise/customer-database-app-structure", "redirect_document_id": false }, { - "source_path": "uwp/audio-video-camera/capture-photos-and-video-with-mediacapture.md", - "redirect_url": "/windows/uwp/audio-video-camera/", + "source_path": "uwp/enterprise/customer-database-tutorial.md", + "redirect_url": "/previous-versions/windows/uwp/enterprise/customer-database-tutorial", "redirect_document_id": false }, - { - "source_path": "uwp/contacts-and-calendar/integrating-social-feeds-into-contact-cards.md", - "redirect_url": "/windows/uwp/contacts-and-calendar", + { + "source_path": "hub/apps/get-started/sign-up.md", + "redirect_url": "/windows/apps/publish/partner-center/open-a-developer-account", "redirect_document_id": false }, { - "source_path": "uwp/controls-and-patterns/dialogs-popups-menus.md", - "redirect_url": "/windows/uwp/design/controls-and-patterns/dialogs-and-flyouts", + "source_path": "uwp/enterprise/enterprise-shared-storage.md", + "redirect_url": "/previous-versions/windows/uwp/enterprise/enterprise-shared-storage", "redirect_document_id": false }, { - "source_path": "uwp/controls-and-patterns/nav-pane.md", - "redirect_url": "/windows/uwp/design/controls-and-patterns/navigationview", + "source_path": "uwp/enterprise/index.md", + "redirect_url": "/previous-versions/windows/uwp/enterprise/index", "redirect_document_id": false }, { - "source_path": "uwp/controls-and-patterns/segoe-ui-symbol-font.md", - "redirect_url": "/windows/uwp/design/style/segoe-ui-symbol-font", + "source_path": "uwp/enterprise/wip-dev-guide.md", + "redirect_url": "/previous-versions/windows/uwp/enterprise/wip-dev-guide", "redirect_document_id": false }, { - "source_path": "uwp/controls-and-patterns/spell-checking-and-prediction.md", - "redirect_url": "/windows/uwp/controls-and-patterns/text-controls", + "source_path": "uwp/enterprise/wip-hub.md", + "redirect_url": "/previous-versions/windows/uwp/enterprise/wip-hub", "redirect_document_id": false }, { - "source_path": "uwp/controls-and-patterns/styling-controls.md", - "redirect_url": "/windows/uwp/controls-and-patterns/xaml-styles", + "source_path": "uwp/porting/desktop-to-uwp-migrate.md", + "redirect_url": "/previous-versions/windows/uwp/porting/desktop-to-uwp-migrate", "redirect_document_id": false }, { - "source_path": "uwp/design/controls-and-patterns/hub.md", - "redirect_url": "/windows/uwp/design/basics/navigation-basics", + "source_path": "uwp/porting/index.md", + "redirect_url": "/previous-versions/windows/uwp/porting/index", "redirect_document_id": false }, { - "source_path": "uwp/files/protect-your-enterprise-data-with-edp.md", - "redirect_url": "/windows/uwp/files/../enterprise/wip-dev-guide", + "source_path": "uwp/porting/w8x-to-uwp-case-study-bookstore1.md", + "redirect_url": "/previous-versions/windows/uwp/porting/w8x-to-uwp-case-study-bookstore1", "redirect_document_id": false }, { - "source_path": "uwp/files/use-edp-to-protect-streams-and-buffers.md", - "redirect_url": "/windows/uwp/files/../enterprise/wip-dev-guide", + "source_path": "uwp/porting/w8x-to-uwp-case-study-bookstore2.md", + "redirect_url": "/previous-versions/windows/uwp/porting/w8x-to-uwp-case-study-bookstore2", "redirect_document_id": false }, { - "source_path": "uwp/get-started/application-development-for-windows-as-a-service.md", - "redirect_url": "/windows/uwp/get-started/../updates-and-versions/application-development-for-windows-as-a-service/", + "source_path": "uwp/porting/w8x-to-uwp-case-study-quizgame.md", + "redirect_url": "/previous-versions/windows/uwp/porting/w8x-to-uwp-case-study-quizgame", "redirect_document_id": false }, { - "source_path": "uwp/get-started/create-js-apps.md", - "redirect_url": "/windows/uwp/get-started/your-first-app#javascript-and-html", + "source_path": "uwp/porting/w8x-to-uwp-input-and-sensors.md", + "redirect_url": "/previous-versions/windows/uwp/porting/w8x-to-uwp-input-and-sensors", "redirect_document_id": false }, { - "source_path": "uwp/get-started/radialcontroller-walkthrough.md", - "redirect_url": "/windows/uwp/design/input/radialcontroller-walkthrough/", + "source_path": "uwp/porting/w8x-to-uwp-porting-to-a-uwp-project.md", + "redirect_url": "/previous-versions/windows/uwp/porting/w8x-to-uwp-porting-to-a-uwp-project", "redirect_document_id": false }, { - "source_path": "uwp/get-started/ink-walkthrough.md", - "redirect_url": "/windows/uwp/design/input/ink-walkthrough/", + "source_path": "uwp/porting/w8x-to-uwp-porting-xaml-and-ui.md", + "redirect_url": "/previous-versions/windows/uwp/porting/w8x-to-uwp-porting-xaml-and-ui", "redirect_document_id": false }, { - "source_path": "uwp/get-started/xaml-basics-intro.md", - "redirect_url": "/windows/uwp/design/basics/xaml-basics-ui", + "source_path": "uwp/porting/w8x-to-uwp-root.md", + "redirect_url": "/previous-versions/windows/uwp/porting/w8x-to-uwp-root", "redirect_document_id": false }, { - "source_path": "uwp/get-started/xaml-basics-ui.md", - "redirect_url": "/windows/uwp/design/basics/xaml-basics-ui", + "source_path": "uwp/porting/w8x-to-uwp-troubleshooting.md", + "redirect_url": "/previous-versions/windows/uwp/porting/w8x-to-uwp-troubleshooting", "redirect_document_id": false }, { - "source_path": "uwp/get-started/xaml-basics-style.md", - "redirect_url": "/windows/uwp/design/controls-and-patterns/xaml-styles", + "source_path": "uwp/porting/wpsl-to-uwp-business-and-data.md", + "redirect_url": "/previous-versions/windows/uwp/porting/wpsl-to-uwp-business-and-data", "redirect_document_id": false }, { - "source_path": "uwp/get-started/xaml-basics-adaptive-layout.md", - "redirect_url": "/windows/uwp/design/basics/xaml-basics-adaptive-layout", + "source_path": "uwp/porting/wpsl-to-uwp-case-study-bookstore1.md", + "redirect_url": "/previous-versions/windows/uwp/porting/wpsl-to-uwp-case-study-bookstore1", "redirect_document_id": false }, { - "source_path": "uwp/get-started/xaml-basics-data-binding.md", - "redirect_url": "/windows/uwp/data-binding/xaml-basics-data-binding", + "source_path": "uwp/porting/wpsl-to-uwp-case-study-bookstore2.md", + "redirect_url": "/previous-versions/windows/uwp/porting/wpsl-to-uwp-case-study-bookstore2", "redirect_document_id": false }, { - "source_path": "uwp/get-started/choose-a-uwp-version.md", - "redirect_url": "/windows/uwp/get-started/../updates-and-versions/choose-a-uwp-version/", + "source_path": "uwp/porting/wpsl-to-uwp-form-factors-and-ux.md", + "redirect_url": "/previous-versions/windows/uwp/porting/wpsl-to-uwp-form-factors-and-ux", "redirect_document_id": false }, { - "source_path": "uwp/get-started/enable-your-device-for-development.md", - "redirect_url": "/windows/apps/get-started/enable-your-device-for-development", + "source_path": "uwp/porting/wpsl-to-uwp-input-and-sensors.md", + "redirect_url": "/previous-versions/windows/uwp/porting/wpsl-to-uwp-input-and-sensors", "redirect_document_id": false }, { - "source_path": "uwp/get-started/get-set-up.md", - "redirect_url": "/windows/apps/windows-app-sdk/set-up-your-development-environment", + "source_path": "uwp/porting/wpsl-to-uwp-namespace-and-class-mappings.md", + "redirect_url": "/previous-versions/windows/uwp/porting/wpsl-to-uwp-namespace-and-class-mappings", "redirect_document_id": false }, { - "source_path": "hub/apps/get-started/get-set-up.md", - "redirect_url": "/windows/apps/windows-app-sdk/set-up-your-development-environment", + "source_path": "uwp/porting/wpsl-to-uwp-porting-to-a-uwp-project.md", + "redirect_url": "/previous-versions/windows/uwp/porting/wpsl-to-uwp-porting-to-a-uwp-project", "redirect_document_id": false }, { - "source_path": "uwp/get-started/sign-up.md", - "redirect_url": "/windows/apps/get-started/sign-up", + "source_path": "uwp/porting/wpsl-to-uwp-porting-xaml-and-ui.md", + "redirect_url": "/previous-versions/windows/uwp/porting/wpsl-to-uwp-porting-xaml-and-ui", "redirect_document_id": false }, { - "source_path": "uwp/get-started/adding-webvr-to-a-babylonjs-game.md", - "redirect_url": "/windows/apps/get-started/", + "source_path": "uwp/porting/wpsl-to-uwp-root.md", + "redirect_url": "/previous-versions/windows/uwp/porting/wpsl-to-uwp-root", "redirect_document_id": false }, { - "source_path": "uwp/get-started/create-a-hello-world-app-js-uwp.md", - "redirect_url": "/windows/apps/get-started/", + "source_path": "uwp/porting/wpsl-to-uwp-troubleshooting.md", + "redirect_url": "/previous-versions/windows/uwp/porting/wpsl-to-uwp-troubleshooting", "redirect_document_id": false }, { - "source_path": "uwp/get-started/get-started-tutorial-fullstack-web-app.md", - "redirect_url": "/windows/uwp/get-started/", + "source_path": "uwp/monetize/ad-mediation-service.md", + "redirect_url": "/previous-versions/windows/uwp/monetize/ad-mediation-service", "redirect_document_id": false }, { - "source_path": "uwp/get-started/get-started-tutorial-game-js2d.md", - "redirect_url": "/windows/uwp/get-started/", + "source_path": "uwp/monetize/adcontrol-in-html-5-and-javascript.md", + "redirect_url": "/previous-versions/windows/uwp/monetize/adcontrol-in-html-5-and-javascript", "redirect_document_id": false }, { - "source_path": "uwp/get-started/get-started-tutorial-game-js3d.md", - "redirect_url": "/windows/uwp/get-started/", + "source_path": "uwp/monetize/adcontrol-in-xaml-and--net.md", + "redirect_url": "/previous-versions/windows/uwp/monetize/adcontrol-in-xaml-and--net", "redirect_document_id": false }, { - "source_path": "uwp/get-started/get-started-tutorial-game-mg2d.md", - "redirect_url": "/windows/uwp/get-started/", + "source_path": "uwp/monetize/add-advertisements-to-video-content.md", + "redirect_url": "/previous-versions/windows/uwp/monetize/add-advertisements-to-video-content", "redirect_document_id": false }, { - "source_path": "uwp/graphics/composition-animation.md", - "redirect_url": "/windows/uwp/composition/composition-animation", + "source_path": "uwp/monetize/banner-ads.md", + "redirect_url": "/previous-versions/windows/uwp/monetize/banner-ads", "redirect_document_id": false }, { - "source_path": "uwp/graphics/composition-brushes.md", - "redirect_url": "/windows/uwp/composition/composition-brushes", + "source_path": "uwp/monetize/best-practices-for-ads-in-apps.md", + "redirect_url": "/previous-versions/windows/uwp/monetize/best-practices-for-ads-in-apps", "redirect_document_id": false }, { - "source_path": "uwp/graphics/composition-effects.md", - "redirect_url": "/windows/uwp/composition/composition-effects", + "source_path": "uwp/monetize/developer-walkthroughs.md", + "redirect_url": "/previous-versions/windows/uwp/monetize/developer-walkthroughs", "redirect_document_id": false }, { - "source_path": "uwp/graphics/composition-native-interop.md", - "redirect_url": "/windows/uwp/composition/composition-native-interop", + "source_path": "uwp/monetize/display-ads-in-your-app.md", + "redirect_url": "/previous-versions/windows/uwp/monetize/display-ads-in-your-app", "redirect_document_id": false }, { - "source_path": "uwp/graphics/composition-visual-tree.md", - "redirect_url": "/windows/uwp/composition/composition-visual-tree", + "source_path": "uwp/monetize/error-handling-in-javascript-walkthrough.md", + "redirect_url": "/previous-versions/windows/uwp/monetize/error-handling-in-javascript-walkthrough", "redirect_document_id": false }, { - "source_path": "uwp/graphics/using-the-visual-layer-with-xaml.md", - "redirect_url": "/windows/uwp/composition/using-the-visual-layer-with-xaml", + "source_path": "uwp/monetize/error-handling-in-xamlc-walkthrough.md", + "redirect_url": "/previous-versions/windows/uwp/monetize/error-handling-in-xamlc-walkthrough", "redirect_document_id": false }, { - "source_path": "uwp/graphics/visual-layer.md", - "redirect_url": "/windows/uwp/composition/visual-layer", + "source_path": "uwp/monetize/error-handling-with-advertising-libraries.md", + "redirect_url": "/previous-versions/windows/uwp/monetize/error-handling-with-advertising-libraries", "redirect_document_id": false }, { - "source_path": "uwp/input-and-devices/guidelines-for-user-interaction.md", - "redirect_url": "/windows/uwp/input-and-devices/touch-interactions", + "source_path": "uwp/monetize/html-and-javascript-troubleshooting-guide.md", + "redirect_url": "/previous-versions/windows/uwp/monetize/html-and-javascript-troubleshooting-guide", "redirect_document_id": false }, { - "source_path": "uwp/layout/peer-to-peer-navigation-between-two-pages.md", - "redirect_url": "/windows/uwp/layout/navigate-between-two-pages", + "source_path": "uwp/monetize/install-the-microsoft-advertising-libraries.md", + "redirect_url": "/previous-versions/windows/uwp/monetize/install-the-microsoft-advertising-libraries", "redirect_document_id": false }, { - "source_path": "uwp/maps-and-location/controls-map.md", - "redirect_url": "/windows/uwp/maps-and-location/display-maps#display-map-in-a-control", + "source_path": "uwp/monetize/interstitial-ad-sample-code-in-c.md", + "redirect_url": "/previous-versions/windows/uwp/monetize/interstitial-ad-sample-code-in-c", "redirect_document_id": false }, { - "source_path": "uwp/maps-and-location/display-maps#map-control", - "redirect_url": "/windows/uwp/maps-and-location/display-maps#display-map-in-a-control", + "source_path": "uwp/monetize/interstitial-ad-sample-code-in-javascript.md", + "redirect_url": "/previous-versions/windows/uwp/monetize/interstitial-ad-sample-code-in-javascript", "redirect_document_id": false }, { - "source_path": "uwp/monetize/adcontrol-error-handling.md", - "redirect_url": "/windows/uwp/monetize/error-handling-in-xamlc-walkthrough", + "source_path": "uwp/monetize/interstitial-ads.md", + "redirect_url": "/previous-versions/windows/uwp/monetize/interstitial-ads", "redirect_document_id": false }, { - "source_path": "uwp/monetize/adcontrol-events-in-c.md", - "redirect_url": "/windows/uwp/monetize/adcontrol-in-xaml-and--net", + "source_path": "uwp/monetize/known-issues-for-the-advertising-libraries.md", + "redirect_url": "/previous-versions/windows/uwp/monetize/known-issues-for-the-advertising-libraries", "redirect_document_id": false }, { - "source_path": "uwp/monetize/adcontrol-events-in-javascript.md", - "redirect_url": "/windows/uwp/monetize/adcontrol-in-html-5-and-javascript", + "source_path": "uwp/monetize/native-ads.md", + "redirect_url": "/previous-versions/windows/uwp/monetize/native-ads", "redirect_document_id": false }, { - "source_path": "uwp/monetize/adcontrol-in-windows-phone-silverlight.md", - "redirect_url": "/previous-versions/windows/apps/mt842563(v=win.10)", + "source_path": "uwp/monetize/optimize-ad-unit-viewability.md", + "redirect_url": "/previous-versions/windows/uwp/monetize/optimize-ad-unit-viewability", "redirect_document_id": false }, { - "source_path": "uwp/monetize/add-ads-to-apps-with-microsoft-advertising.md", - "redirect_url": "/windows/uwp/monetize/display-ads-in-your-app", + "source_path": "uwp/monetize/release-notes-for-the-advertising-libraries.md", + "redirect_url": "/previous-versions/windows/uwp/monetize/release-notes-for-the-advertising-libraries", "redirect_document_id": false }, { - "source_path": "uwp/monetize/add-and-use-the-ad-mediator-control.md", - "redirect_url": "/previous-versions/windows/apps/dn792120(v=win.10", + "source_path": "uwp/monetize/set-up-ad-units-in-your-app.md", + "redirect_url": "/previous-versions/windows/uwp/monetize/set-up-ad-units-in-your-app", "redirect_document_id": false }, { - "source_path": "uwp/monetize/additional-help.md", - "redirect_url": "/windows/uwp/monetize/display-ads-in-your-app#additional-help", + "source_path": "uwp/monetize/supported-ad-sizes-for-banner-ads.md", + "redirect_url": "/previous-versions/windows/uwp/monetize/supported-ad-sizes-for-banner-ads", "redirect_document_id": false }, { - "source_path": "uwp/monetize/claim-a-targeted-offer.md", - "redirect_url": "/windows/uwp/monetize/manage-targeted-offers-using-windows-store-services", + "source_path": "uwp/monetize/ui-and-user-experience-guidelines.md", + "redirect_url": "/previous-versions/windows/uwp/monetize/ui-and-user-experience-guidelines", "redirect_document_id": false }, { - "source_path": "uwp/monetize/code-samples.md", - "redirect_url": "/windows/uwp/monetize/developer-walkthroughs", + "source_path": "uwp/monetize/update-your-app-to-the-latest-advertising-libraries.md", + "redirect_url": "/previous-versions/windows/uwp/monetize/update-your-app-to-the-latest-advertising-libraries", "redirect_document_id": false }, { - "source_path": "uwp/monetize/create-an-adcontrol-in-javascript.md", - "redirect_url": "/windows/uwp/monetize/adcontrol-in-html-5-and-javascript", + "source_path": "uwp/monetize/windows-premium-ads-publishers-program.md", + "redirect_url": "/previous-versions/windows/uwp/monetize/windows-premium-ads-publishers-program", "redirect_document_id": false }, { - "source_path": "uwp/monetize/developer-information.md", - "redirect_url": "/windows/uwp/monetize/display-ads-in-your-app", + "source_path": "uwp/monetize/xaml-and-c-troubleshooting-guide.md", + "redirect_url": "/previous-versions/windows/uwp/monetize/xaml-and-c-troubleshooting-guide", "redirect_document_id": false }, { - "source_path": "uwp/monetize/display-ads-using-the-microsoft-advertising-libraries.md", - "redirect_url": "/windows/uwp/monetize/display-ads-in-your-app", + "source_path": "hub/powertoys/video-conference-mute.md", + "redirect_url": "/previous-versions/windows/powertoys/video-conference-mute", "redirect_document_id": false }, { - "source_path": "uwp/monetize/get-app-failures.md", - "redirect_url": "/windows/uwp/monetize/get-error-reporting-data", + "source_path": "hub/android/wsa/index.md", + "redirect_url": "/previous-versions/windows/android/wsa/index", "redirect_document_id": false }, { - "source_path": "uwp/monetize/get-started-with-microsoft-advertising-libraries.md", - "redirect_url": "/windows/uwp/monetize/display-ads-in-your-app", + "source_path": "hub/android/wsa/release-notes.md", + "redirect_url": "/previous-versions/windows/android/wsa/release-notes", "redirect_document_id": false }, { - "source_path": "uwp/monetize/html-properties-example.md", - "redirect_url": "/windows/uwp/monetize/adcontrol-in-html-5-and-javascript", + "source_path": "hub/dev-home/environments.md", + "redirect_url": "/previous-versions/windows/dev-home/environments", "redirect_document_id": false }, { - "source_path": "uwp/monetize/important-notice-eula.md", - "redirect_url": "/windows/uwp/monetize/display-ads-in-your-app", + "source_path": "hub/dev-home/extensions.md", + "redirect_url": "/previous-versions/windows/dev-home/extensions", "redirect_document_id": false }, { - "source_path": "uwp/monetize/install-the-microsoft-universal-ad-client-sdk.md", - "redirect_url": "/windows/uwp/monetize/microsoft-store-services-sdk", + "source_path": "hub/dev-home/index.md", + "redirect_url": "/previous-versions/windows/dev-home/index", "redirect_document_id": false }, { - "source_path": "uwp/monetize/migrate-from-admediatorcontrol-to-adcontrol.md", - "redirect_url": "/windows/uwp/monetize/display-ads-in-your-app", + "source_path": "hub/dev-home/setup.md", + "redirect_url": "/previous-versions/windows/dev-home/setup", "redirect_document_id": false }, { - "source_path": "uwp/monetize/monetize-your-app-with-the-microsoft-store-engagement-and-monetization-sdk.md", - "redirect_url": "/windows/uwp/monetize/microsoft-store-services-sdk", + "source_path": "hub/dev-home/utilities.md", + "redirect_url": "/previous-versions/windows/dev-home/utilities", "redirect_document_id": false }, { - "source_path": "uwp/monetize/select-and-manage-your-ad-networks.md", - "redirect_url": "/previous-versions/windows/apps/dn792120(v=win.10)", + "source_path": "hub/dev-home/windows-customization.md", + "redirect_url": "/previous-versions/windows/dev-home/windows-customization", "redirect_document_id": false }, { - "source_path": "uwp/monetize/submit-an-app-with-ads-to-the-windows-store.md", - "redirect_url": "/windows/uwp/monetize/display-ads-in-your-app", + "source_path": "hub/apps/whats-new/latest-docs-updates.md", + "redirect_url": "/windows/apps/whats-new/whats-new-for-developers", "redirect_document_id": false }, { - "source_path": "uwp/monetize/submit-your-app-and-configure-ad-mediation.md", - "redirect_url": "/previous-versions/windows/apps/dn792120(v=win.10)", + "source_path": "hub/apps/design/devices/kinect-for-windows.md", + "redirect_url": "https://azure.microsoft.com/en-us/products/kinect-dk", "redirect_document_id": false }, { - "source_path": "uwp/monetize/supported-markets-for-microsoft-advertising.md", - "redirect_url": "/windows/uwp/monetize/display-ads-in-your-app", + "source_path": "uwp/xbox-apps/automate-launching-uwp-apps.md", + "redirect_url": "/previous-versions/windows/uwp/xbox-apps/automate-launching-uwp-apps", "redirect_document_id": false }, { - "source_path": "uwp/monetize/test-mode-values.md", - "redirect_url": "/windows/uwp/monetize/set-up-ad-units-in-your-app", + "source_path": "uwp/xbox-apps/cpusets-games.md", + "redirect_url": "/previous-versions/windows/uwp/xbox-apps/cpusets-games", "redirect_document_id": false }, { - "source_path": "uwp/monetize/test-your-ad-mediation-implementation.md", - "redirect_url": "/previous-versions/windows/apps/dn792120(v=win.10)", + "source_path": "uwp/xbox-apps/dev-home.md", + "redirect_url": "/previous-versions/windows/uwp/xbox-apps/dev-home", "redirect_document_id": false }, { - "source_path": "uwp/monetize/troubleshoot-ad-mediation.md", - "redirect_url": "/previous-versions/windows/apps/dn792120(v=win.10)", + "source_path": "uwp/xbox-apps/development-environment-setup.md", + "redirect_url": "/previous-versions/windows/uwp/xbox-apps/development-environment-setup", "redirect_document_id": false }, { - "source_path": "uwp/monetize/troubleshooting-guides.md", - "redirect_url": "/windows/uwp/monetize/known-issues-for-the-advertising-libraries", + "source_path": "uwp/xbox-apps/development-lanes-custom-cpp.md", + "redirect_url": "/previous-versions/windows/uwp/xbox-apps/development-lanes-custom-cpp", "redirect_document_id": false }, { - "source_path": "uwp/monetize/use-ad-mediation-to-maximize-revenue.md", - "redirect_url": "/previous-versions/windows/apps/dn792120(v=win.10)", + "source_path": "uwp/xbox-apps/development-lanes-html.md", + "redirect_url": "/previous-versions/windows/uwp/xbox-apps/development-lanes-html", "redirect_document_id": false }, { - "source_path": "uwp/monetize/what-is-the-difference-admediatorcontrol-or-adcontrol.md", - "redirect_url": "/windows/uwp/monetize/display-ads-in-your-app", + "source_path": "uwp/xbox-apps/development-lanes-landing.md", + "redirect_url": "/previous-versions/windows/uwp/xbox-apps/development-lanes-landing", "redirect_document_id": false }, { - "source_path": "uwp/monetize/workflows-for-creating-apps-with-ads.md", - "redirect_url": "/windows/uwp/monetize/display-ads-in-your-app", + "source_path": "uwp/xbox-apps/development-lanes-unity-versioning.md", + "redirect_url": "/previous-versions/windows/uwp/xbox-apps/development-lanes-unity-versioning", "redirect_document_id": false }, { - "source_path": "uwp/monetize/xaml-properties-example.md", - "redirect_url": "/windows/uwp/monetize/adcontrol-in-xaml-and--net", + "source_path": "uwp/xbox-apps/development-lanes-unity.md", + "redirect_url": "/previous-versions/windows/uwp/xbox-apps/development-lanes-unity", "redirect_document_id": false }, { - "source_path": "uwp/networking/tagging_network_connections_with_edp_identity.md", - "redirect_url": "/windows/uwp/networking/../enterprise/wip-dev-guide", + "source_path": "uwp/xbox-apps/devhome-capture.md", + "redirect_url": "/previous-versions/windows/uwp/xbox-apps/devhome-capture", "redirect_document_id": false }, { - "source_path": "uwp/porting/desktop-to-uwp-deploy-and-debug.md", - "redirect_url": "/windows/uwp/porting/desktop-to-uwp-debug", + "source_path": "uwp/xbox-apps/devhome-home.md", + "redirect_url": "/previous-versions/windows/uwp/xbox-apps/devhome-home", "redirect_document_id": false }, { - "source_path": "uwp/porting/desktop-to-uwp-signing.md", - "redirect_url": "/windows/uwp/porting/desktop-to-uwp-debug#test-your-app", + "source_path": "uwp/xbox-apps/devhome-live.md", + "redirect_url": "/previous-versions/windows/uwp/xbox-apps/devhome-live", "redirect_document_id": false }, { - "source_path": "uwp/porting/update-your-visual-studio-2015-rc-project-to-rtm.md", - "redirect_url": "/visualstudio/porting/port-migrate-and-upgrade-visual-studio-projects", + "source_path": "uwp/xbox-apps/devhome-networking.md", + "redirect_url": "/previous-versions/windows/uwp/xbox-apps/devhome-networking", "redirect_document_id": false }, { - "source_path": "uwp/publish/about-affiliate-ads.md", - "redirect_url": "/windows/uwp/publish/in-app-ads", + "source_path": "uwp/xbox-apps/devhome-performance.md", + "redirect_url": "/previous-versions/windows/uwp/xbox-apps/devhome-performance", "redirect_document_id": false }, { - "source_path": "uwp/publish/ad-mediation-report.md", - "redirect_url": "/windows/uwp/publish/advertising-performance-report", + "source_path": "uwp/xbox-apps/devhome-settings.md", + "redirect_url": "/previous-versions/windows/uwp/xbox-apps/devhome-settings", "redirect_document_id": false }, { - "source_path": "uwp/publish/affiliates-performance-report.md", - "redirect_url": "/windows/uwp/publish/advertising-performance-report", + "source_path": "uwp/xbox-apps/device-portal-xbox.md", + "redirect_url": "/previous-versions/windows/uwp/xbox-apps/device-portal-xbox", "redirect_document_id": false }, { - "source_path": "uwp/publish/app-install-ads-reports.md", - "redirect_url": "/windows/uwp/publish/ad-campaign-report", + "source_path": "uwp/xbox-apps/devkit-activation.md", + "redirect_url": "/previous-versions/windows/uwp/xbox-apps/devkit-activation", "redirect_document_id": false }, { - "source_path": "uwp/publish/app-promotion-and-customer-engagement.md", - "redirect_url": "/windows/uwp/publish/attract-customers-and-promote-your-apps", + "source_path": "uwp/xbox-apps/devkit-deactivation.md", + "redirect_url": "/previous-versions/windows/uwp/xbox-apps/devkit-deactivation", "redirect_document_id": false }, { - "source_path": "uwp/publish/channels-and-conversions-report.md", - "redirect_url": "/windows/uwp/publish/acquisitions-report", + "source_path": "uwp/xbox-apps/disable-scaling.md", + "redirect_url": "/previous-versions/windows/uwp/xbox-apps/disable-scaling", "redirect_document_id": false }, { - "source_path": "uwp/publish/create-add-on-descriptions.md", - "redirect_url": "/windows/uwp/publish/create-app-store-listings", + "source_path": "uwp/xbox-apps/getting-started.md", + "redirect_url": "/previous-versions/windows/uwp/xbox-apps/getting-started", "redirect_document_id": false }, { - "source_path": "uwp/publish/create-app-descriptions.md", - "redirect_url": "/windows/uwp/publish/create-app-store-listings", + "source_path": "uwp/xbox-apps/how-to-disable-mouse-mode.md", + "redirect_url": "/previous-versions/windows/uwp/xbox-apps/how-to-disable-mouse-mode", "redirect_document_id": false }, { - "source_path": "uwp/publish/create-iap-descriptions.md", - "redirect_url": "/windows/uwp/publish/create-add-on-store-listings", + "source_path": "uwp/xbox-apps/index.md", + "redirect_url": "/previous-versions/windows/uwp/xbox-apps/index", "redirect_document_id": false }, { - "source_path": "uwp/publish/create-platform-specific-descriptions.md", - "redirect_url": "/windows/uwp/publish/create-platform-specific-store-listings", + "source_path": "uwp/xbox-apps/introduction-to-xbox-tools.md", + "redirect_url": "/previous-versions/windows/uwp/xbox-apps/introduction-to-xbox-tools", "redirect_document_id": false }, { - "source_path": "uwp/publish/enter-iap-properties.md", - "redirect_url": "/windows/uwp/publish/enter-add-on-properties", + "source_path": "uwp/xbox-apps/known-issues.md", + "redirect_url": "/previous-versions/windows/uwp/xbox-apps/known-issues", "redirect_document_id": false }, { - "source_path": "uwp/publish/how-your-app-appears-in-the-store-for-windows-10-customers.md", - "redirect_url": "/windows/uwp/publish/using-the-windows-dev-center-dashboard", + "source_path": "uwp/xbox-apps/multi-user-applications.md", + "redirect_url": "/previous-versions/windows/uwp/xbox-apps/multi-user-applications", "redirect_document_id": false }, { - "source_path": "uwp/publish/iap-acquisitions-report.md", - "redirect_url": "/windows/uwp/publish/add-on-acquisitions-report", + "source_path": "uwp/xbox-apps/reference.md", + "redirect_url": "/previous-versions/windows/uwp/xbox-apps/reference", "redirect_document_id": false }, { - "source_path": "uwp/publish/iap-submissions.md", - "redirect_url": "/windows/uwp/publish/add-on-submissions", + "source_path": "uwp/xbox-apps/samples-xaml-dev.md", + "redirect_url": "/previous-versions/windows/uwp/xbox-apps/samples-xaml-dev", "redirect_document_id": false }, { - "source_path": "uwp/publish/installs-report.md", - "redirect_url": "/windows/uwp/publish/acquisitions-report", + "source_path": "uwp/xbox-apps/samples-xaml-media.md", + "redirect_url": "/previous-versions/windows/uwp/xbox-apps/samples-xaml-media", "redirect_document_id": false }, { - "source_path": "uwp/publish/manage-iaps-in-bulk.md", - "redirect_url": "/windows/uwp/publish/add-on-submissions", + "source_path": "uwp/xbox-apps/samples.md", + "redirect_url": "/previous-versions/windows/uwp/xbox-apps/samples", "redirect_document_id": false }, { - "source_path": "uwp/publish/microsoft-advertising-payment-process.md", - "redirect_url": "/windows/uwp/publish/payout-summary", + "source_path": "uwp/xbox-apps/system-resource-allocation.md", + "redirect_url": "/previous-versions/windows/uwp/xbox-apps/system-resource-allocation", "redirect_document_id": false }, { - "source_path": "uwp/publish/monetize-with-ads.md", - "redirect_url": "/windows/uwp/publish/in-app-ads", + "source_path": "uwp/xbox-apps/tailoring-for-xbox.md", + "redirect_url": "/previous-versions/windows/uwp/xbox-apps/tailoring-for-xbox", "redirect_document_id": false }, { - "source_path": "uwp/publish/pubcenter-dev-center-integration.md", - "redirect_url": "/windows/uwp/publish/in-app-ads", + "source_path": "uwp/xbox-apps/turn-off-overscan.md", + "redirect_url": "/previous-versions/windows/uwp/xbox-apps/turn-off-overscan", "redirect_document_id": false }, { - "source_path": "uwp/publish/pubcenter-devcenter-payout-account-and-tax-profile-consolidation.md", - "redirect_url": "/windows/uwp/publish/setting-up-your-payout-account-and-tax-forms", + "source_path": "uwp/xbox-apps/uwp-deployinfo-api.md", + "redirect_url": "/previous-versions/windows/uwp/xbox-apps/uwp-deployinfo-api", "redirect_document_id": false }, { - "source_path": "uwp/publish/put-apps-and-iaps-on-sale.md", - "redirect_url": "/windows/uwp/publish/put-apps-and-add-ons-on-sale", + "source_path": "uwp/xbox-apps/uwp-fiddler.md", + "redirect_url": "/previous-versions/windows/uwp/xbox-apps/uwp-fiddler", "redirect_document_id": false }, { - "source_path": "uwp/publish/set-iap-pricing-and-availability.md", - "redirect_url": "/windows/uwp/publish/set-add-on-pricing-and-availability", + "source_path": "uwp/xbox-apps/uwp-networkcredentials-api.md", + "redirect_url": "/previous-versions/windows/uwp/xbox-apps/uwp-networkcredentials-api", "redirect_document_id": false }, { - "source_path": "uwp/publish/set-your-iap-product-id.md", - "redirect_url": "/windows/uwp/publish/set-your-add-on-product-id", + "source_path": "uwp/xbox-apps/uwp-remoteinput-api.md", + "redirect_url": "/previous-versions/windows/uwp/xbox-apps/uwp-remoteinput-api", "redirect_document_id": false }, { - "source_path": "uwp/publish/using-the-windows-dev-center-dashboard.md", - "redirect_url": "/windows/uwp/publish/", + "source_path": "uwp/xbox-apps/uwp-remoteinput-controllers-api.md", + "redirect_url": "/previous-versions/windows/uwp/xbox-apps/uwp-remoteinput-controllers-api", "redirect_document_id": false }, { - "source_path": "uwp/publish/use-map-services.md", - "redirect_url": "/windows/uwp/publish/app-management-and-services", + "source_path": "uwp/xbox-apps/uwp-sshpins-api.md", + "redirect_url": "/previous-versions/windows/uwp/xbox-apps/uwp-sshpins-api", "redirect_document_id": false }, { - "source_path": "uwp/whats-new/windows-10-build-15021-api-diff.md", - "redirect_url": "/windows/uwp/whats-new/windows-10-build-16299-api-diff", + "source_path": "uwp/xbox-apps/ves-on-xbox.md", + "redirect_url": "/previous-versions/windows/uwp/xbox-apps/ves-on-xbox", "redirect_document_id": false }, { - "source_path": "uwp/whats-new/windows-10-build-16190-api-diff.md", - "redirect_url": "/windows/uwp/whats-new/windows-10-build-16299-api-diff", + "source_path": "uwp/xbox-apps/wdp-fiddler-api.md", + "redirect_url": "/previous-versions/windows/uwp/xbox-apps/wdp-fiddler-api", "redirect_document_id": false }, { - "source_path": "uwp/whats-new/windows-10-build-16225-api-diff.md", - "redirect_url": "/windows/uwp/whats-new/windows-10-build-16299-api-diff", + "source_path": "uwp/xbox-apps/wdp-folder-upload.md", + "redirect_url": "/previous-versions/windows/uwp/xbox-apps/wdp-folder-upload", "redirect_document_id": false }, { - "source_path": "uwp/whats-new/windows-10-creators-preview.md", - "redirect_url": "/windows/uwp/whats-new/windows-10-build-15063", + "source_path": "uwp/xbox-apps/wdp-httpMonitor-api.md", + "redirect_url": "/previous-versions/windows/uwp/xbox-apps/wdp-httpMonitor-api", "redirect_document_id": false }, { - "source_path": "uwp/whats-new/windows-10-latest-preview-api-diff.md", - "redirect_url": "/windows/uwp/whats-new/windows-10-build-19041-api-diff", + "source_path": "uwp/xbox-apps/wdp-loose-folder-register-api.md", + "redirect_url": "/previous-versions/windows/uwp/xbox-apps/wdp-loose-folder-register-api", "redirect_document_id": false }, { - "source_path": "uwp/whats-new/windows-10-version-1710-api-diff.md", - "redirect_url": "/windows/uwp/whats-new/windows-10-build-16299-api-diff", + "source_path": "uwp/xbox-apps/wdp-media-capture-api.md", + "redirect_url": "/previous-versions/windows/uwp/xbox-apps/wdp-media-capture-api", "redirect_document_id": false }, { - "source_path": "uwp/whats-new/windows-10-version-1507.md", - "redirect_url": "/windows/uwp/whats-new/windows-10-build-10240", + "source_path": "uwp/xbox-apps/wdp-sandbox-api.md", + "redirect_url": "/previous-versions/windows/uwp/xbox-apps/wdp-sandbox-api", "redirect_document_id": false }, { - "source_path": "uwp/whats-new/windows-10-version-1511.md", - "redirect_url": "/windows/uwp/whats-new/windows-10-build-10586", + "source_path": "uwp/xbox-apps/wdp-smb-api.md", + "redirect_url": "/previous-versions/windows/uwp/xbox-apps/wdp-smb-api", "redirect_document_id": false }, { - "source_path": "uwp/whats-new/windows-10-sdk-preview.md", - "redirect_url": "/windows/uwp/whats-new/windows-10-build-14393", + "source_path": "uwp/xbox-apps/wdp-user-management.md", + "redirect_url": "/previous-versions/windows/uwp/xbox-apps/wdp-user-management", "redirect_document_id": false }, { - "source_path": "uwp/whats-new/windows-10-version-1607.md", - "redirect_url": "/windows/uwp/whats-new/windows-10-build-14393", + "source_path": "uwp/xbox-apps/wdp-xboxinfo-api.md", + "redirect_url": "/previous-versions/windows/uwp/xbox-apps/wdp-xboxinfo-api", "redirect_document_id": false }, { - "source_path": "uwp/whats-new/windows-10-version-1607-api-diff.md", - "redirect_url": "/windows/uwp/whats-new/windows-10-build-14393-api-diff", + "source_path": "uwp/xbox-apps/wdp-xboxsettings-api.md", + "redirect_url": "/previous-versions/windows/uwp/xbox-apps/wdp-xboxsettings-api", "redirect_document_id": false }, { - "source_path": "uwp/whats-new/windows-10-version-1703.md", - "redirect_url": "/windows/uwp/whats-new/windows-10-build-15063", + "source_path": "uwp/xbox-apps/whats-new.md", + "redirect_url": "/previous-versions/windows/uwp/xbox-apps/whats-new", "redirect_document_id": false }, { - "source_path": "uwp/whats-new/windows-10-version-1703-api-diff.md", - "redirect_url": "/windows/uwp/whats-new/windows-10-build-15063-api-diff", + "source_path": "uwp/xbox-apps/xbox-dev-mode-companion.md", + "redirect_url": "/previous-versions/windows/uwp/xbox-apps/xbox-dev-mode-companion", "redirect_document_id": false }, { - "source_path": "uwp/whats-new/windows-10-build-16190.md", - "redirect_url": "/windows/uwp/whats-new/windows-10-build-17134", + "source_path": "uwp/whats-new/windows-docs-august-2017.md", + "redirect_url": "/windows/uwp/", "redirect_document_id": false }, { - "source_path": "uwp/whats-new/windows-10-version-latest.md", - "redirect_url": "/windows/uwp/whats-new/windows-10-build-19041", + "source_path": "uwp/whats-new/windows-docs-august-2018.md", + "redirect_url": "/windows/uwp/", "redirect_document_id": false }, { - "source_path": "uwp/whats-new/windows-10-version-latest-diff.md", - "redirect_url": "/windows/uwp/whats-new/windows-10-build-19041-api-diff", + "source_path": "uwp/whats-new/windows-docs-december-2017.md", + "redirect_url": "/windows/uwp/", "redirect_document_id": false }, { - "source_path": "uwp/whats-new/windows-10-build-17110.md", - "redirect_url": "/windows/uwp/whats-new/windows-10-build-17134", + "source_path": "uwp/whats-new/windows-docs-february-2018.md", + "redirect_url": "/windows/uwp/", "redirect_document_id": false }, { - "source_path": "uwp/whats-new/windows-10-build-17110-api-diff.md", - "redirect_url": "/windows/uwp/whats-new/windows-10-build-17134-api-diff", + "source_path": "uwp/whats-new/windows-docs-january-2019.md", + "redirect_url": "/windows/uwp/", "redirect_document_id": false }, { - "source_path": "uwp/whats-new/windows-docs-latest.md", - "redirect_url": "/windows/uwp/whats-new/windows-docs-january-2019", + "source_path": "uwp/whats-new/windows-docs-july-2017.md", + "redirect_url": "/windows/uwp/", "redirect_document_id": false }, { - "source_path": "uwp/whats-new/windows-10-version-1709-api-diff.md", - "redirect_url": "/windows/uwp/whats-new/windows-10-build-16299-api-diff", + "source_path": "uwp/whats-new/windows-docs-july-2018.md", + "redirect_url": "/windows/uwp/", "redirect_document_id": false }, { - "source_path": "hub/apps/whats-new/windows-11-build-22000-apis.md", - "redirect_url": "/windows/apps/whats-new/windows-11-build-22000", + "source_path": "uwp/whats-new/windows-docs-may-2018.md", + "redirect_url": "/windows/uwp/", "redirect_document_id": false }, { - "source_path": "uwp/accessibility/accessibility-checklist.md", - "redirect_url": "/windows/uwp/design/accessibility/accessibility-checklist", - "redirect_document_id": true + "source_path": "uwp/whats-new/windows-docs-september-2017.md", + "redirect_url": "/windows/uwp/", + "redirect_document_id": false }, { - "source_path": "uwp/accessibility/accessibility-in-the-store.md", - "redirect_url": "/windows/uwp/design/accessibility/accessibility-in-the-store", - "redirect_document_id": true + "source_path": "uwp/whats-new/windows-docs-september-2018.md", + "redirect_url": "/windows/uwp/", + "redirect_document_id": false }, { - "source_path": "uwp/accessibility/accessibility-overview.md", - "redirect_url": "/windows/uwp/design/accessibility/accessibility-overview", - "redirect_document_id": true + "source_path": "uwp/monetize/get-xbox-live-analytics.md", + "redirect_url": "/windows/uwp/publish/xbox-analytics-report", + "redirect_document_id": false }, { - "source_path": "uwp/accessibility/accessibility-testing.md", - "redirect_url": "/windows/uwp/design/accessibility/accessibility-testing", - "redirect_document_id": true + "source_path": "uwp/monetize/get-xbox-live-achievements-data.md", + "redirect_url": "/windows/uwp/publish/xbox-analytics-report", + "redirect_document_id": false }, { - "source_path": "uwp/accessibility/accessibility.md", - "redirect_url": "/windows/uwp/design/accessibility/accessibility", - "redirect_document_id": true + "source_path": "uwp/monetize/get-xbox-live-health-data.md", + "redirect_url": "/windows/uwp/publish/xbox-analytics-report", + "redirect_document_id": false }, { - "source_path": "uwp/accessibility/accessible-text-requirements.md", - "redirect_url": "/windows/uwp/design/accessibility/accessible-text-requirements", - "redirect_document_id": true + "source_path": "uwp/monetize/get-xbox-live-game-hub-data.md", + "redirect_url": "/windows/uwp/publish/xbox-analytics-report", + "redirect_document_id": false }, { - "source_path": "uwp/accessibility/basic-accessibility-information.md", - "redirect_url": "/windows/uwp/design/accessibility/basic-accessibility-information", - "redirect_document_id": true + "source_path": "uwp/monetize/get-xbox-live-club-data.md", + "redirect_url": "/windows/uwp/publish/xbox-analytics-report", + "redirect_document_id": false }, { - "source_path": "uwp/accessibility/control-patterns-and-interfaces.md", - "redirect_url": "/windows/uwp/design/accessibility/control-patterns-and-interfaces", - "redirect_document_id": true + "source_path": "uwp/monetize/get-xbox-live-multiplayer-data.md", + "redirect_url": "/windows/uwp/publish/xbox-analytics-report", + "redirect_document_id": false }, { - "source_path": "uwp/accessibility/custom-automation-peers.md", - "redirect_url": "/windows/uwp/design/accessibility/custom-automation-peers", - "redirect_document_id": true + "source_path": "uwp/monetize/get-xbox-live-concurrent-usage-data.md", + "redirect_url": "/windows/uwp/publish/xbox-analytics-report", + "redirect_document_id": false }, { - "source_path": "uwp/accessibility/designing-inclusive-software.md", - "redirect_url": "/windows/uwp/design/accessibility/designing-inclusive-software", - "redirect_document_id": true + "source_path": "uwp/debug-test-perf/device-portal-hololens.md", + "redirect_url": "/windows/mixed-reality/develop/platform-capabilities-and-apis/using-the-windows-device-portal", + "redirect_document_id": false }, { - "source_path": "uwp/accessibility/developing-inclusive-windows-apps.md", - "redirect_url": "/windows/uwp/design/accessibility/developing-inclusive-windows-apps", - "redirect_document_id": true + "source_path": "uwp/debug-test-perf/device-portal-api-hololens.md", + "redirect_url": "/windows/mixed-reality/develop/platform-capabilities-and-apis/device-portal-api-reference", + "redirect_document_id": false }, { - "source_path": "uwp/accessibility/high-contrast-themes.md", - "redirect_url": "/windows/uwp/design/accessibility/high-contrast-themes", - "redirect_document_id": true + "source_path": "uwp/get-started/get-uwp-app-samples.md", + "redirect_url": "/windows/apps/get-started/samples", + "redirect_document_id": false }, { - "source_path": "uwp/accessibility/keyboard-accessibility.md", - "redirect_url": "/windows/uwp/design/accessibility/keyboard-accessibility", - "redirect_document_id": true + "source_path": "uwp/home.md", + "redirect_url": "/windows/uwp/", + "redirect_document_id": false }, { - "source_path": "uwp/accessibility/practices-to-avoid.md", - "redirect_url": "/windows/uwp/design/accessibility/practices-to-avoid", - "redirect_document_id": true + "source_path": "uwp/app-to-app/use-edp-to-protect-enterprise-data-transferred-between-apps.md", + "redirect_url": "/windows/uwp/enterprise/wip-dev-guide", + "redirect_document_id": false }, { - "source_path": "uwp/app-settings/app-settings-and-data.md", - "redirect_url": "/windows/uwp/design/app-settings/app-settings-and-data", - "redirect_document_id": true + "source_path": "uwp/audio-video-camera/capture-photos-and-video-with-mediacapture.md", + "redirect_url": "/windows/uwp/audio-video-camera/", + "redirect_document_id": false }, { - "source_path": "uwp/design/app-settings/app-settings-and-data.md", - "redirect_url": "/windows/uwp/design/app-settings/guidelines-for-app-settings", + "source_path": "uwp/contacts-and-calendar/integrating-social-feeds-into-contact-cards.md", + "redirect_url": "/windows/uwp/contacts-and-calendar", "redirect_document_id": false }, { - "source_path": "uwp/app-settings/guidelines-for-app-settings.md", - "redirect_url": "/windows/uwp/design/app-settings/guidelines-for-app-settings", - "redirect_document_id": true + "source_path": "uwp/controls-and-patterns/dialogs-popups-menus.md", + "redirect_url": "/windows/uwp/design/controls-and-patterns/dialogs-and-flyouts", + "redirect_document_id": false }, { - "source_path": "uwp/app-settings/store-and-retrieve-app-data.md", - "redirect_url": "/windows/uwp/design/app-settings/store-and-retrieve-app-data", - "redirect_document_id": true + "source_path": "uwp/controls-and-patterns/nav-pane.md", + "redirect_url": "/windows/uwp/design/controls-and-patterns/navigationview", + "redirect_document_id": false }, { - "source_path": "uwp/controls-and-patterns/app-bars.md", - "redirect_url": "/windows/uwp/design/controls-and-patterns/app-bars", - "redirect_document_id": true + "source_path": "uwp/controls-and-patterns/segoe-ui-symbol-font.md", + "redirect_url": "/windows/uwp/design/style/segoe-ui-symbol-font", + "redirect_document_id": false }, { - "source_path": "uwp/controls-and-patterns/auto-suggest-box.md", - "redirect_url": "/windows/uwp/design/controls-and-patterns/auto-suggest-box", - "redirect_document_id": true + "source_path": "uwp/controls-and-patterns/spell-checking-and-prediction.md", + "redirect_url": "/windows/uwp/controls-and-patterns/text-controls", + "redirect_document_id": false }, { - "source_path": "uwp/controls-and-patterns/buttons.md", - "redirect_url": "/windows/uwp/design/controls-and-patterns/buttons", - "redirect_document_id": true + "source_path": "uwp/controls-and-patterns/styling-controls.md", + "redirect_url": "/windows/uwp/controls-and-patterns/xaml-styles", + "redirect_document_id": false }, { - "source_path": "uwp/controls-and-patterns/calendar-date-picker.md", - "redirect_url": "/windows/uwp/design/controls-and-patterns/calendar-date-picker", - "redirect_document_id": true + "source_path": "uwp/design/controls-and-patterns/hub.md", + "redirect_url": "/windows/uwp/design/basics/navigation-basics", + "redirect_document_id": false }, { - "source_path": "uwp/controls-and-patterns/calendar-view.md", - "redirect_url": "/windows/uwp/design/controls-and-patterns/calendar-view", - "redirect_document_id": true + "source_path": "uwp/files/protect-your-enterprise-data-with-edp.md", + "redirect_url": "/windows/uwp/files/../enterprise/wip-dev-guide", + "redirect_document_id": false }, { - "source_path": "uwp/controls-and-patterns/checkbox.md", - "redirect_url": "/windows/uwp/design/controls-and-patterns/checkbox", - "redirect_document_id": true + "source_path": "uwp/files/use-edp-to-protect-streams-and-buffers.md", + "redirect_url": "/windows/uwp/files/../enterprise/wip-dev-guide", + "redirect_document_id": false }, { - "source_path": "uwp/controls-and-patterns/collection-commanding.md", - "redirect_url": "/windows/uwp/design/controls-and-patterns/collection-commanding", - "redirect_document_id": true + "source_path": "uwp/get-started/application-development-for-windows-as-a-service.md", + "redirect_url": "/windows/uwp/get-started/../updates-and-versions/application-development-for-windows-as-a-service/", + "redirect_document_id": false }, { - "source_path": "uwp/controls-and-patterns/color-picker.md", - "redirect_url": "/windows/uwp/design/controls-and-patterns/color-picker", - "redirect_document_id": true + "source_path": "uwp/get-started/create-js-apps.md", + "redirect_url": "/windows/uwp/get-started/your-first-app#javascript-and-html", + "redirect_document_id": false }, { - "source_path": "uwp/controls-and-patterns/control-templates.md", - "redirect_url": "/windows/uwp/design/controls-and-patterns/control-templates", - "redirect_document_id": true + "source_path": "uwp/get-started/radialcontroller-walkthrough.md", + "redirect_url": "/windows/uwp/design/input/radialcontroller-walkthrough/", + "redirect_document_id": false }, { - "source_path": "uwp/controls-and-patterns/controls-and-events-intro.md", - "redirect_url": "/windows/uwp/design/controls-and-patterns/controls-and-events-intro", - "redirect_document_id": true + "source_path": "uwp/get-started/ink-walkthrough.md", + "redirect_url": "/windows/uwp/design/input/ink-walkthrough/", + "redirect_document_id": false }, { - "source_path": "uwp/controls-and-patterns/controls-by-function.md", - "redirect_url": "/windows/uwp/design/controls-and-patterns/index", + "source_path": "uwp/get-started/xaml-basics-intro.md", + "redirect_url": "/windows/uwp/design/basics/xaml-basics-ui", "redirect_document_id": false }, { - "source_path": "uwp/design/controls-and-patterns/controls-by-function.md", - "redirect_url": "/windows/uwp/design/controls-and-patterns/index", - "redirect_document_id": true + "source_path": "uwp/get-started/xaml-basics-ui.md", + "redirect_url": "/windows/uwp/design/basics/xaml-basics-ui", + "redirect_document_id": false }, { - "source_path": "uwp/controls-and-patterns/custom-transport-controls.md", - "redirect_url": "/windows/uwp/design/controls-and-patterns/custom-transport-controls", - "redirect_document_id": true + "source_path": "uwp/get-started/xaml-basics-style.md", + "redirect_url": "/windows/uwp/design/controls-and-patterns/xaml-styles", + "redirect_document_id": false }, { - "source_path": "uwp/controls-and-patterns/date-and-time.md", - "redirect_url": "/windows/uwp/design/controls-and-patterns/date-and-time", - "redirect_document_id": true + "source_path": "uwp/get-started/xaml-basics-adaptive-layout.md", + "redirect_url": "/windows/uwp/design/basics/xaml-basics-adaptive-layout", + "redirect_document_id": false }, { - "source_path": "uwp/controls-and-patterns/date-picker.md", - "redirect_url": "/windows/uwp/design/controls-and-patterns/date-picker", - "redirect_document_id": true + "source_path": "uwp/get-started/xaml-basics-data-binding.md", + "redirect_url": "/windows/uwp/data-binding/xaml-basics-data-binding", + "redirect_document_id": false }, { - "source_path": "uwp/controls-and-patterns/dialogs.md", - "redirect_url": "/windows/uwp/design/controls-and-patterns/dialogs", - "redirect_document_id": true + "source_path": "uwp/get-started/choose-a-uwp-version.md", + "redirect_url": "/windows/uwp/get-started/../updates-and-versions/choose-a-uwp-version/", + "redirect_document_id": false }, { - "source_path": "uwp/controls-and-patterns/flipview.md", - "redirect_url": "/windows/uwp/design/controls-and-patterns/flipview", - "redirect_document_id": true + "source_path": "uwp/get-started/enable-your-device-for-development.md", + "redirect_url": "/windows/advanced-settings/developer-mode", + "redirect_document_id": false }, { - "source_path": "uwp/controls-and-patterns/hub.md", - "redirect_url": "/windows/uwp/design/controls-and-patterns/hub", - "redirect_document_id": true + "source_path": "uwp/get-started/sign-up.md", + "redirect_url": "/windows/apps/publish/partner-center/open-a-developer-account", + "redirect_document_id": false }, { - "source_path": "uwp/controls-and-patterns/hyperlinks.md", - "redirect_url": "/windows/uwp/design/controls-and-patterns/hyperlinks", - "redirect_document_id": true + "source_path": "uwp/get-started/adding-webvr-to-a-babylonjs-game.md", + "redirect_url": "/windows/apps/get-started/", + "redirect_document_id": false }, { - "source_path": "uwp/controls-and-patterns/images-imagebrushes.md", - "redirect_url": "/windows/uwp/design/controls-and-patterns/images-imagebrushes", - "redirect_document_id": true + "source_path": "uwp/get-started/create-a-hello-world-app-js-uwp.md", + "redirect_url": "/windows/apps/get-started/", + "redirect_document_id": false }, { - "source_path": "uwp/controls-and-patterns/index.md", - "redirect_url": "/windows/uwp/design/controls-and-patterns/index", + "source_path": "uwp/get-started/get-started-tutorial-fullstack-web-app.md", + "redirect_url": "/windows/uwp/get-started/", "redirect_document_id": false }, { - "source_path": "uwp/controls-and-patterns/inking-controls.md", - "redirect_url": "/windows/uwp/design/controls-and-patterns/inking-controls", - "redirect_document_id": true + "source_path": "uwp/get-started/get-started-tutorial-game-js2d.md", + "redirect_url": "/windows/uwp/get-started/", + "redirect_document_id": false }, { - "source_path": "uwp/controls-and-patterns/inverted-lists.md", - "redirect_url": "/windows/uwp/design/controls-and-patterns/inverted-lists", - "redirect_document_id": true - }, - { - "source_path": "uwp/controls-and-patterns/item-templates-gridview.md", - "redirect_url": "/windows/uwp/design/controls-and-patterns/item-templates-gridview", - "redirect_document_id": true + "source_path": "uwp/get-started/get-started-tutorial-game-js3d.md", + "redirect_url": "/windows/uwp/get-started/", + "redirect_document_id": false }, { - "source_path": "uwp/controls-and-patterns/item-templates-listview.md", - "redirect_url": "/windows/uwp/design/controls-and-patterns/item-templates-listview", + "source_path": "uwp/get-started/get-started-tutorial-game-mg2d.md", + "redirect_url": "/windows/uwp/get-started/", "redirect_document_id": false }, { - "source_path": "uwp/controls-and-patterns/labels.md", - "redirect_url": "/windows/uwp/design/controls-and-patterns/labels", - "redirect_document_id": true + "source_path": "uwp/graphics/composition-animation.md", + "redirect_url": "/windows/uwp/composition/composition-animation", + "redirect_document_id": false }, { - "source_path": "uwp/controls-and-patterns/lists.md", - "redirect_url": "/windows/uwp/design/controls-and-patterns/lists", - "redirect_document_id": true + "source_path": "uwp/graphics/composition-brushes.md", + "redirect_url": "/windows/uwp/composition/composition-brushes", + "redirect_document_id": false }, { - "source_path": "uwp/controls-and-patterns/listview-and-gridview.md", - "redirect_url": "/windows/uwp/design/controls-and-patterns/listview-and-gridview", - "redirect_document_id": true + "source_path": "uwp/graphics/composition-effects.md", + "redirect_url": "/windows/uwp/composition/composition-effects", + "redirect_document_id": false }, { - "source_path": "uwp/controls-and-patterns/listview-item-templates.md", - "redirect_url": "/windows/uwp/design/controls-and-patterns/item-templates-listview", + "source_path": "uwp/graphics/composition-native-interop.md", + "redirect_url": "/windows/uwp/composition/composition-native-interop", "redirect_document_id": false }, { - "source_path": "uwp/controls-and-patterns/master-details.md", - "redirect_url": "/windows/uwp/design/controls-and-patterns/master-details", - "redirect_document_id": true + "source_path": "uwp/graphics/composition-visual-tree.md", + "redirect_url": "/windows/uwp/composition/composition-visual-tree", + "redirect_document_id": false }, { - "source_path": "uwp/controls-and-patterns/media-playback.md", - "redirect_url": "/windows/uwp/design/controls-and-patterns/media-playback", - "redirect_document_id": true + "source_path": "uwp/graphics/using-the-visual-layer-with-xaml.md", + "redirect_url": "/windows/uwp/composition/using-the-visual-layer-with-xaml", + "redirect_document_id": false }, { - "source_path": "uwp/controls-and-patterns/menus.md", - "redirect_url": "/windows/uwp/design/controls-and-patterns/menus", - "redirect_document_id": true + "source_path": "uwp/graphics/visual-layer.md", + "redirect_url": "/windows/uwp/composition/visual-layer", + "redirect_document_id": false }, { - "source_path": "uwp/controls-and-patterns/navigationview.md", - "redirect_url": "/windows/uwp/design/controls-and-patterns/navigationview", - "redirect_document_id": true + "source_path": "uwp/input-and-devices/guidelines-for-user-interaction.md", + "redirect_url": "/windows/uwp/input-and-devices/touch-interactions", + "redirect_document_id": false }, { - "source_path": "uwp/controls-and-patterns/nested-ui.md", - "redirect_url": "/windows/uwp/design/controls-and-patterns/nested-ui", - "redirect_document_id": true + "source_path": "uwp/layout/peer-to-peer-navigation-between-two-pages.md", + "redirect_url": "/windows/uwp/layout/navigate-between-two-pages", + "redirect_document_id": false }, { - "source_path": "uwp/controls-and-patterns/password-box.md", - "redirect_url": "/windows/uwp/design/controls-and-patterns/password-box", - "redirect_document_id": true + "source_path": "uwp/maps-and-location/controls-map.md", + "redirect_url": "/windows/uwp/maps-and-location/display-maps#display-map-in-a-control", + "redirect_document_id": false }, { - "source_path": "uwp/controls-and-patterns/person-picture.md", - "redirect_url": "/windows/uwp/design/controls-and-patterns/person-picture", - "redirect_document_id": true + "source_path": "uwp/maps-and-location/display-maps#map-control", + "redirect_url": "/windows/uwp/maps-and-location/display-maps#display-map-in-a-control", + "redirect_document_id": false }, { - "source_path": "uwp/controls-and-patterns/pin-to-taskbar.md", - "redirect_url": "/windows/uwp/design/shell/pin-to-taskbar", - "redirect_document_id": true + "source_path": "uwp/monetize/adcontrol-error-handling.md", + "redirect_url": "/windows/uwp/monetize/error-handling-in-xamlc-walkthrough", + "redirect_document_id": false }, { - "source_path": "uwp/controls-and-patterns/progress-controls.md", - "redirect_url": "/windows/uwp/design/controls-and-patterns/progress-controls", - "redirect_document_id": true + "source_path": "uwp/monetize/adcontrol-events-in-c.md", + "redirect_url": "/windows/uwp/monetize/adcontrol-in-xaml-and--net", + "redirect_document_id": false }, { - "source_path": "uwp/controls-and-patterns/pull-to-refresh.md", - "redirect_url": "/windows/uwp/design/controls-and-patterns/pull-to-refresh", - "redirect_document_id": true + "source_path": "uwp/monetize/adcontrol-events-in-javascript.md", + "redirect_url": "/windows/uwp/monetize/adcontrol-in-html-5-and-javascript", + "redirect_document_id": false }, { - "source_path": "uwp/controls-and-patterns/radio-button.md", - "redirect_url": "/windows/uwp/design/controls-and-patterns/radio-button", - "redirect_document_id": true + "source_path": "uwp/monetize/adcontrol-in-windows-phone-silverlight.md", + "redirect_url": "/previous-versions/windows/apps/mt842563(v=win.10)", + "redirect_document_id": false }, { - "source_path": "uwp/controls-and-patterns/rating.md", - "redirect_url": "/windows/uwp/design/controls-and-patterns/rating", - "redirect_document_id": true + "source_path": "uwp/monetize/add-ads-to-apps-with-microsoft-advertising.md", + "redirect_url": "/windows/uwp/monetize/display-ads-in-your-app", + "redirect_document_id": false }, { - "source_path": "uwp/controls-and-patterns/resourcedictionary-and-xaml-resource-references.md", - "redirect_url": "/windows/apps/design/style/xaml-resource-dictionary", + "source_path": "uwp/monetize/add-and-use-the-ad-mediator-control.md", + "redirect_url": "/previous-versions/windows/apps/dn792120(v=win.10", "redirect_document_id": false }, { - "source_path": "uwp/controls-and-patterns/rich-edit-box.md", - "redirect_url": "/windows/uwp/design/controls-and-patterns/rich-edit-box", - "redirect_document_id": true + "source_path": "uwp/monetize/additional-help.md", + "redirect_url": "/windows/uwp/monetize/display-ads-in-your-app#additional-help", + "redirect_document_id": false }, { - "source_path": "uwp/controls-and-patterns/rich-text-block.md", - "redirect_url": "/windows/uwp/design/controls-and-patterns/rich-text-block", - "redirect_document_id": true + "source_path": "uwp/monetize/claim-a-targeted-offer.md", + "redirect_url": "/windows/uwp/monetize/manage-targeted-offers-using-windows-store-services", + "redirect_document_id": false }, { - "source_path": "uwp/controls-and-patterns/scroll-controls.md", - "redirect_url": "/windows/uwp/design/controls-and-patterns/scroll-controls", - "redirect_document_id": true + "source_path": "uwp/monetize/code-samples.md", + "redirect_url": "/windows/uwp/monetize/developer-walkthroughs", + "redirect_document_id": false }, { - "source_path": "uwp/controls-and-patterns/search.md", - "redirect_url": "/windows/uwp/design/controls-and-patterns/index", + "source_path": "uwp/monetize/create-an-adcontrol-in-javascript.md", + "redirect_url": "/windows/uwp/monetize/adcontrol-in-html-5-and-javascript", "redirect_document_id": false }, { - "source_path": "uwp/design/controls-and-patterns/search.md", - "redirect_url": "/windows/uwp/design/controls-and-patterns/index", + "source_path": "uwp/monetize/developer-information.md", + "redirect_url": "/windows/uwp/monetize/display-ads-in-your-app", "redirect_document_id": false }, { - "source_path": "uwp/controls-and-patterns/semantic-zoom.md", - "redirect_url": "/windows/uwp/design/controls-and-patterns/semantic-zoom", - "redirect_document_id": true + "source_path": "uwp/monetize/display-ads-using-the-microsoft-advertising-libraries.md", + "redirect_url": "/windows/uwp/monetize/display-ads-in-your-app", + "redirect_document_id": false }, { - "source_path": "uwp/controls-and-patterns/slider.md", - "redirect_url": "/windows/uwp/design/controls-and-patterns/slider", - "redirect_document_id": true + "source_path": "uwp/monetize/get-app-failures.md", + "redirect_url": "/windows/uwp/monetize/get-error-reporting-data", + "redirect_document_id": false }, { - "source_path": "uwp/controls-and-patterns/split-view.md", - "redirect_url": "/windows/uwp/design/controls-and-patterns/split-view", - "redirect_document_id": true + "source_path": "uwp/monetize/get-started-with-microsoft-advertising-libraries.md", + "redirect_url": "/windows/uwp/monetize/display-ads-in-your-app", + "redirect_document_id": false }, { - "source_path": "uwp/controls-and-patterns/swipe.md", - "redirect_url": "/windows/uwp/design/controls-and-patterns/swipe", - "redirect_document_id": true + "source_path": "uwp/monetize/html-properties-example.md", + "redirect_url": "/windows/uwp/monetize/adcontrol-in-html-5-and-javascript", + "redirect_document_id": false }, { - "source_path": "uwp/controls-and-patterns/tabs-pivot.md", - "redirect_url": "/windows/uwp/design/controls-and-patterns/tab-view", - "redirect_document_id": true + "source_path": "uwp/monetize/important-notice-eula.md", + "redirect_url": "/windows/uwp/monetize/display-ads-in-your-app", + "redirect_document_id": false }, { - "source_path": "uwp/controls-and-patterns/text-block.md", - "redirect_url": "/windows/uwp/design/controls-and-patterns/text-block", - "redirect_document_id": true + "source_path": "uwp/monetize/install-the-microsoft-universal-ad-client-sdk.md", + "redirect_url": "/windows/uwp/monetize/microsoft-store-services-sdk", + "redirect_document_id": false }, { - "source_path": "uwp/controls-and-patterns/text-box.md", - "redirect_url": "/windows/uwp/design/controls-and-patterns/text-box", - "redirect_document_id": true + "source_path": "uwp/monetize/migrate-from-admediatorcontrol-to-adcontrol.md", + "redirect_url": "/windows/uwp/monetize/display-ads-in-your-app", + "redirect_document_id": false }, { - "source_path": "uwp/controls-and-patterns/text-controls.md", - "redirect_url": "/windows/uwp/design/controls-and-patterns/text-controls", - "redirect_document_id": true + "source_path": "uwp/monetize/monetize-your-app-with-the-microsoft-store-engagement-and-monetization-sdk.md", + "redirect_url": "/windows/uwp/monetize/microsoft-store-services-sdk", + "redirect_document_id": false }, { - "source_path": "uwp/controls-and-patterns/tiles-and-notifications-adaptive-interactive-toasts.md", - "redirect_url": "/windows/uwp/design/shell/tiles-and-notifications/adaptive-interactive-toasts", - "redirect_document_id": true + "source_path": "uwp/monetize/select-and-manage-your-ad-networks.md", + "redirect_url": "/previous-versions/windows/apps/dn792120(v=win.10)", + "redirect_document_id": false }, { - "source_path": "uwp/controls-and-patterns/tiles-and-notifications-adaptive-tiles-schema.md", - "redirect_url": "/windows/uwp/design/shell/tiles-and-notifications/adaptive-tiles-schema", - "redirect_document_id": true + "source_path": "uwp/monetize/submit-an-app-with-ads-to-the-windows-store.md", + "redirect_url": "/windows/uwp/monetize/display-ads-in-your-app", + "redirect_document_id": false }, { - "source_path": "uwp/controls-and-patterns/tiles-and-notifications-app-assets.md", - "redirect_url": "/windows/uwp/app-resources/images-tailored-for-scale-theme-contrast", - "redirect_document_id": true + "source_path": "uwp/monetize/submit-your-app-and-configure-ad-mediation.md", + "redirect_url": "/previous-versions/windows/apps/dn792120(v=win.10)", + "redirect_document_id": false }, { - "source_path": "uwp/controls-and-patterns/tiles-and-notifications-badges.md", - "redirect_url": "/windows/uwp/design/shell/tiles-and-notifications/badges", - "redirect_document_id": true + "source_path": "uwp/monetize/supported-markets-for-microsoft-advertising.md", + "redirect_url": "/windows/uwp/monetize/display-ads-in-your-app", + "redirect_document_id": false }, { - "source_path": "uwp/controls-and-patterns/tiles-and-notifications-choosing-a-notification-delivery-method.md", - "redirect_url": "/windows/uwp/design/shell/tiles-and-notifications/choosing-a-notification-delivery-method", - "redirect_document_id": true + "source_path": "uwp/monetize/test-mode-values.md", + "redirect_url": "/windows/uwp/monetize/set-up-ad-units-in-your-app", + "redirect_document_id": false }, { - "source_path": "uwp/controls-and-patterns/tiles-and-notifications-create-adaptive-tiles.md", - "redirect_url": "/windows/uwp/design/shell/tiles-and-notifications/create-adaptive-tiles", - "redirect_document_id": true + "source_path": "uwp/monetize/test-your-ad-mediation-implementation.md", + "redirect_url": "/previous-versions/windows/apps/dn792120(v=win.10)", + "redirect_document_id": false }, { - "source_path": "uwp/controls-and-patterns/tiles-and-notifications-creating-tiles.md", - "redirect_url": "/windows/uwp/design/shell/tiles-and-notifications/creating-tiles", - "redirect_document_id": true + "source_path": "uwp/monetize/troubleshoot-ad-mediation.md", + "redirect_url": "/previous-versions/windows/apps/dn792120(v=win.10)", + "redirect_document_id": false }, { - "source_path": "uwp/controls-and-patterns/tiles-and-notifications-notifications-visualizer.md", - "redirect_url": "/windows/uwp/design/shell/tiles-and-notifications/notifications-visualizer", - "redirect_document_id": true + "source_path": "uwp/monetize/troubleshooting-guides.md", + "redirect_url": "/windows/uwp/monetize/known-issues-for-the-advertising-libraries", + "redirect_document_id": false }, { - "source_path": "uwp/controls-and-patterns/tiles-and-notifications-periodic-notification-overview.md", - "redirect_url": "/windows/uwp/design/shell/tiles-and-notifications/periodic-notification-overview", - "redirect_document_id": true + "source_path": "uwp/monetize/use-ad-mediation-to-maximize-revenue.md", + "redirect_url": "/previous-versions/windows/apps/dn792120(v=win.10)", + "redirect_document_id": false }, { - "source_path": "uwp/controls-and-patterns/tiles-and-notifications-primary-tile-apis.md", - "redirect_url": "/windows/uwp/design/shell/tiles-and-notifications/primary-tile-apis", - "redirect_document_id": true + "source_path": "uwp/monetize/what-is-the-difference-admediatorcontrol-or-adcontrol.md", + "redirect_url": "/windows/uwp/monetize/display-ads-in-your-app", + "redirect_document_id": false }, { - "source_path": "uwp/controls-and-patterns/tiles-and-notifications-raw-notification-overview.md", - "redirect_url": "/windows/uwp/design/shell/tiles-and-notifications/raw-notification-overview", - "redirect_document_id": true + "source_path": "uwp/monetize/workflows-for-creating-apps-with-ads.md", + "redirect_url": "/windows/uwp/monetize/display-ads-in-your-app", + "redirect_document_id": false }, { - "source_path": "uwp/controls-and-patterns/tiles-and-notifications-secondary-tiles-desktop-pinning.md", - "redirect_url": "/windows/uwp/design/shell/tiles-and-notifications/secondary-tiles-desktop-pinning", - "redirect_document_id": true + "source_path": "uwp/monetize/xaml-properties-example.md", + "redirect_url": "/windows/uwp/monetize/adcontrol-in-xaml-and--net", + "redirect_document_id": false }, { - "source_path": "uwp/controls-and-patterns/tiles-and-notifications-secondary-tiles-guidance.md", - "redirect_url": "/windows/uwp/design/shell/tiles-and-notifications/secondary-tiles-guidance", + "source_path": "uwp/networking/tagging_network_connections_with_edp_identity.md", + "redirect_url": "/windows/uwp/networking/../enterprise/wip-dev-guide", + "redirect_document_id": false + }, + { + "source_path": "uwp/porting/desktop-to-uwp-deploy-and-debug.md", + "redirect_url": "/windows/uwp/porting/desktop-to-uwp-debug", + "redirect_document_id": false + }, + { + "source_path": "uwp/porting/desktop-to-uwp-signing.md", + "redirect_url": "/windows/uwp/porting/desktop-to-uwp-debug#test-your-app", + "redirect_document_id": false + }, + { + "source_path": "uwp/porting/update-your-visual-studio-2015-rc-project-to-rtm.md", + "redirect_url": "/visualstudio/porting/port-migrate-and-upgrade-visual-studio-projects", + "redirect_document_id": false + }, + { + "source_path": "uwp/publish/about-affiliate-ads.md", + "redirect_url": "/windows/uwp/publish/in-app-ads", + "redirect_document_id": false + }, + { + "source_path": "uwp/publish/ad-mediation-report.md", + "redirect_url": "/windows/uwp/publish/advertising-performance-report", + "redirect_document_id": false + }, + { + "source_path": "uwp/publish/affiliates-performance-report.md", + "redirect_url": "/windows/uwp/publish/advertising-performance-report", + "redirect_document_id": false + }, + { + "source_path": "uwp/publish/app-install-ads-reports.md", + "redirect_url": "/windows/uwp/publish/ad-campaign-report", + "redirect_document_id": false + }, + { + "source_path": "uwp/publish/app-promotion-and-customer-engagement.md", + "redirect_url": "/windows/uwp/publish/attract-customers-and-promote-your-apps", + "redirect_document_id": false + }, + { + "source_path": "uwp/publish/channels-and-conversions-report.md", + "redirect_url": "/windows/uwp/publish/acquisitions-report", + "redirect_document_id": false + }, + { + "source_path": "uwp/publish/create-add-on-descriptions.md", + "redirect_url": "/windows/uwp/publish/create-app-store-listings", + "redirect_document_id": false + }, + { + "source_path": "uwp/publish/create-app-descriptions.md", + "redirect_url": "/windows/uwp/publish/create-app-store-listings", + "redirect_document_id": false + }, + { + "source_path": "uwp/publish/create-iap-descriptions.md", + "redirect_url": "/windows/uwp/publish/create-add-on-store-listings", + "redirect_document_id": false + }, + { + "source_path": "uwp/publish/create-platform-specific-descriptions.md", + "redirect_url": "/windows/uwp/publish/create-platform-specific-store-listings", + "redirect_document_id": false + }, + { + "source_path": "uwp/publish/enter-iap-properties.md", + "redirect_url": "/windows/uwp/publish/enter-add-on-properties", + "redirect_document_id": false + }, + { + "source_path": "uwp/publish/how-your-app-appears-in-the-store-for-windows-10-customers.md", + "redirect_url": "/windows/uwp/publish/using-the-windows-dev-center-dashboard", + "redirect_document_id": false + }, + { + "source_path": "uwp/publish/iap-acquisitions-report.md", + "redirect_url": "/windows/uwp/publish/add-on-acquisitions-report", + "redirect_document_id": false + }, + { + "source_path": "uwp/publish/iap-submissions.md", + "redirect_url": "/windows/uwp/publish/add-on-submissions", + "redirect_document_id": false + }, + { + "source_path": "uwp/publish/installs-report.md", + "redirect_url": "/windows/uwp/publish/acquisitions-report", + "redirect_document_id": false + }, + { + "source_path": "uwp/publish/manage-iaps-in-bulk.md", + "redirect_url": "/windows/uwp/publish/add-on-submissions", + "redirect_document_id": false + }, + { + "source_path": "uwp/publish/microsoft-advertising-payment-process.md", + "redirect_url": "/windows/uwp/publish/payout-summary", + "redirect_document_id": false + }, + { + "source_path": "uwp/publish/monetize-with-ads.md", + "redirect_url": "/windows/uwp/publish/in-app-ads", + "redirect_document_id": false + }, + { + "source_path": "uwp/publish/pubcenter-dev-center-integration.md", + "redirect_url": "/windows/uwp/publish/in-app-ads", + "redirect_document_id": false + }, + { + "source_path": "uwp/publish/pubcenter-devcenter-payout-account-and-tax-profile-consolidation.md", + "redirect_url": "/windows/uwp/publish/setting-up-your-payout-account-and-tax-forms", + "redirect_document_id": false + }, + { + "source_path": "uwp/publish/put-apps-and-iaps-on-sale.md", + "redirect_url": "/windows/uwp/publish/put-apps-and-add-ons-on-sale", + "redirect_document_id": false + }, + { + "source_path": "uwp/publish/set-iap-pricing-and-availability.md", + "redirect_url": "/windows/uwp/publish/set-add-on-pricing-and-availability", + "redirect_document_id": false + }, + { + "source_path": "uwp/publish/set-your-iap-product-id.md", + "redirect_url": "/windows/uwp/publish/set-your-add-on-product-id", + "redirect_document_id": false + }, + { + "source_path": "uwp/publish/using-the-windows-dev-center-dashboard.md", + "redirect_url": "/windows/uwp/publish/", + "redirect_document_id": false + }, + { + "source_path": "uwp/publish/use-map-services.md", + "redirect_url": "/windows/uwp/publish/app-management-and-services", + "redirect_document_id": false + }, + { + "source_path": "uwp/whats-new/windows-10-build-15021-api-diff.md", + "redirect_url": "/windows/uwp/whats-new/windows-10-build-16299-api-diff", + "redirect_document_id": false + }, + { + "source_path": "uwp/whats-new/windows-10-build-16190-api-diff.md", + "redirect_url": "/windows/uwp/whats-new/windows-10-build-16299-api-diff", + "redirect_document_id": false + }, + { + "source_path": "uwp/whats-new/windows-10-build-16225-api-diff.md", + "redirect_url": "/windows/uwp/whats-new/windows-10-build-16299-api-diff", + "redirect_document_id": false + }, + { + "source_path": "uwp/whats-new/windows-10-creators-preview.md", + "redirect_url": "/windows/uwp/whats-new/windows-10-build-15063", + "redirect_document_id": false + }, + { + "source_path": "uwp/whats-new/windows-10-latest-preview-api-diff.md", + "redirect_url": "/windows/uwp/whats-new/windows-10-build-19041-api-diff", + "redirect_document_id": false + }, + { + "source_path": "uwp/whats-new/windows-10-version-1710-api-diff.md", + "redirect_url": "/windows/uwp/whats-new/windows-10-build-16299-api-diff", + "redirect_document_id": false + }, + { + "source_path": "uwp/whats-new/windows-10-version-1507.md", + "redirect_url": "/windows/uwp/whats-new/windows-10-build-10240", + "redirect_document_id": false + }, + { + "source_path": "uwp/whats-new/windows-10-version-1511.md", + "redirect_url": "/windows/uwp/whats-new/windows-10-build-10586", + "redirect_document_id": false + }, + { + "source_path": "uwp/whats-new/windows-10-sdk-preview.md", + "redirect_url": "/windows/uwp/whats-new/windows-10-build-14393", + "redirect_document_id": false + }, + { + "source_path": "uwp/whats-new/windows-10-version-1607.md", + "redirect_url": "/windows/uwp/whats-new/windows-10-build-14393", + "redirect_document_id": false + }, + { + "source_path": "uwp/whats-new/windows-10-version-1607-api-diff.md", + "redirect_url": "/windows/uwp/whats-new/windows-10-build-14393-api-diff", + "redirect_document_id": false + }, + { + "source_path": "uwp/whats-new/windows-10-version-1703.md", + "redirect_url": "/windows/uwp/whats-new/windows-10-build-15063", + "redirect_document_id": false + }, + { + "source_path": "uwp/whats-new/windows-10-version-1703-api-diff.md", + "redirect_url": "/windows/uwp/whats-new/windows-10-build-15063-api-diff", + "redirect_document_id": false + }, + { + "source_path": "uwp/whats-new/windows-10-build-16190.md", + "redirect_url": "/windows/uwp/whats-new/windows-10-build-17134", + "redirect_document_id": false + }, + { + "source_path": "uwp/whats-new/windows-10-version-latest.md", + "redirect_url": "/windows/uwp/whats-new/windows-10-build-19041", + "redirect_document_id": false + }, + { + "source_path": "uwp/whats-new/windows-10-version-latest-diff.md", + "redirect_url": "/windows/uwp/whats-new/windows-10-build-19041-api-diff", + "redirect_document_id": false + }, + { + "source_path": "uwp/whats-new/windows-10-build-17110.md", + "redirect_url": "/windows/uwp/whats-new/windows-10-build-17134", + "redirect_document_id": false + }, + { + "source_path": "uwp/whats-new/windows-10-build-17110-api-diff.md", + "redirect_url": "/windows/uwp/whats-new/windows-10-build-17134-api-diff", + "redirect_document_id": false + }, + { + "source_path": "uwp/whats-new/windows-docs-latest.md", + "redirect_url": "/windows/uwp/whats-new/windows-docs-january-2019", + "redirect_document_id": false + }, + { + "source_path": "uwp/whats-new/windows-10-version-1709-api-diff.md", + "redirect_url": "/windows/uwp/whats-new/windows-10-build-16299-api-diff", + "redirect_document_id": false + }, + { + "source_path": "hub/apps/whats-new/windows-11-build-22000-apis.md", + "redirect_url": "/windows/apps/whats-new/whats-new-for-developers", + "redirect_document_id": false + }, + { + "source_path": "uwp/accessibility/accessibility-checklist.md", + "redirect_url": "/windows/uwp/design/accessibility/accessibility-checklist", "redirect_document_id": true }, { - "source_path": "uwp/controls-and-patterns/tiles-and-notifications-secondary-tiles-pinning.md", - "redirect_url": "/windows/uwp/design/shell/tiles-and-notifications/secondary-tiles-pinning", - "redirect_document_id": true + "source_path": "uwp/accessibility/accessibility-in-the-store.md", + "redirect_url": "/windows/uwp/design/accessibility/accessibility-in-the-store", + "redirect_document_id": true + }, + { + "source_path": "uwp/accessibility/accessibility-overview.md", + "redirect_url": "/windows/uwp/design/accessibility/accessibility-overview", + "redirect_document_id": true + }, + { + "source_path": "uwp/accessibility/accessibility-testing.md", + "redirect_url": "/windows/uwp/design/accessibility/accessibility-testing", + "redirect_document_id": true + }, + { + "source_path": "uwp/accessibility/accessibility.md", + "redirect_url": "/windows/uwp/design/accessibility/accessibility", + "redirect_document_id": true + }, + { + "source_path": "uwp/accessibility/accessible-text-requirements.md", + "redirect_url": "/windows/uwp/design/accessibility/accessible-text-requirements", + "redirect_document_id": true + }, + { + "source_path": "uwp/accessibility/basic-accessibility-information.md", + "redirect_url": "/windows/uwp/design/accessibility/basic-accessibility-information", + "redirect_document_id": true + }, + { + "source_path": "uwp/accessibility/control-patterns-and-interfaces.md", + "redirect_url": "/windows/uwp/design/accessibility/control-patterns-and-interfaces", + "redirect_document_id": true + }, + { + "source_path": "uwp/accessibility/custom-automation-peers.md", + "redirect_url": "/windows/uwp/design/accessibility/custom-automation-peers", + "redirect_document_id": true + }, + { + "source_path": "uwp/accessibility/designing-inclusive-software.md", + "redirect_url": "/windows/uwp/design/accessibility/designing-inclusive-software", + "redirect_document_id": true + }, + { + "source_path": "uwp/accessibility/developing-inclusive-windows-apps.md", + "redirect_url": "/windows/uwp/design/accessibility/developing-inclusive-windows-apps", + "redirect_document_id": true + }, + { + "source_path": "uwp/accessibility/high-contrast-themes.md", + "redirect_url": "/windows/uwp/design/accessibility/high-contrast-themes", + "redirect_document_id": true + }, + { + "source_path": "uwp/accessibility/keyboard-accessibility.md", + "redirect_url": "/windows/uwp/design/accessibility/keyboard-accessibility", + "redirect_document_id": true + }, + { + "source_path": "uwp/accessibility/practices-to-avoid.md", + "redirect_url": "/windows/uwp/design/accessibility/practices-to-avoid", + "redirect_document_id": true + }, + { + "source_path": "uwp/app-settings/app-settings-and-data.md", + "redirect_url": "/windows/uwp/design/app-settings/app-settings-and-data", + "redirect_document_id": true + }, + { + "source_path": "uwp/design/app-settings/app-settings-and-data.md", + "redirect_url": "/windows/uwp/design/app-settings/guidelines-for-app-settings", + "redirect_document_id": false + }, + { + "source_path": "uwp/app-settings/guidelines-for-app-settings.md", + "redirect_url": "/windows/uwp/design/app-settings/guidelines-for-app-settings", + "redirect_document_id": true + }, + { + "source_path": "uwp/app-settings/store-and-retrieve-app-data.md", + "redirect_url": "/windows/uwp/design/app-settings/store-and-retrieve-app-data", + "redirect_document_id": true + }, + { + "source_path": "uwp/controls-and-patterns/app-bars.md", + "redirect_url": "/windows/uwp/design/controls-and-patterns/app-bars", + "redirect_document_id": true + }, + { + "source_path": "uwp/controls-and-patterns/auto-suggest-box.md", + "redirect_url": "/windows/uwp/design/controls-and-patterns/auto-suggest-box", + "redirect_document_id": true + }, + { + "source_path": "uwp/controls-and-patterns/buttons.md", + "redirect_url": "/windows/uwp/design/controls-and-patterns/buttons", + "redirect_document_id": true + }, + { + "source_path": "uwp/controls-and-patterns/calendar-date-picker.md", + "redirect_url": "/windows/uwp/design/controls-and-patterns/calendar-date-picker", + "redirect_document_id": true + }, + { + "source_path": "uwp/controls-and-patterns/calendar-view.md", + "redirect_url": "/windows/uwp/design/controls-and-patterns/calendar-view", + "redirect_document_id": true + }, + { + "source_path": "uwp/controls-and-patterns/checkbox.md", + "redirect_url": "/windows/uwp/design/controls-and-patterns/checkbox", + "redirect_document_id": true + }, + { + "source_path": "uwp/controls-and-patterns/collection-commanding.md", + "redirect_url": "/windows/uwp/design/controls-and-patterns/collection-commanding", + "redirect_document_id": true + }, + { + "source_path": "uwp/controls-and-patterns/color-picker.md", + "redirect_url": "/windows/uwp/design/controls-and-patterns/color-picker", + "redirect_document_id": true + }, + { + "source_path": "uwp/controls-and-patterns/control-templates.md", + "redirect_url": "/windows/uwp/design/controls-and-patterns/control-templates", + "redirect_document_id": true + }, + { + "source_path": "uwp/controls-and-patterns/controls-and-events-intro.md", + "redirect_url": "/windows/uwp/design/controls-and-patterns/controls-and-events-intro", + "redirect_document_id": true + }, + { + "source_path": "uwp/controls-and-patterns/controls-by-function.md", + "redirect_url": "/windows/uwp/design/controls-and-patterns/index", + "redirect_document_id": false + }, + { + "source_path": "uwp/design/controls-and-patterns/controls-by-function.md", + "redirect_url": "/windows/uwp/design/controls-and-patterns/index", + "redirect_document_id": true + }, + { + "source_path": "uwp/controls-and-patterns/custom-transport-controls.md", + "redirect_url": "/windows/uwp/design/controls-and-patterns/custom-transport-controls", + "redirect_document_id": true + }, + { + "source_path": "uwp/controls-and-patterns/date-and-time.md", + "redirect_url": "/windows/uwp/design/controls-and-patterns/date-and-time", + "redirect_document_id": true + }, + { + "source_path": "uwp/controls-and-patterns/date-picker.md", + "redirect_url": "/windows/uwp/design/controls-and-patterns/date-picker", + "redirect_document_id": true + }, + { + "source_path": "uwp/controls-and-patterns/dialogs.md", + "redirect_url": "/windows/uwp/design/controls-and-patterns/dialogs", + "redirect_document_id": true + }, + { + "source_path": "uwp/controls-and-patterns/flipview.md", + "redirect_url": "/windows/uwp/design/controls-and-patterns/flipview", + "redirect_document_id": true + }, + { + "source_path": "uwp/controls-and-patterns/hub.md", + "redirect_url": "/windows/uwp/design/controls-and-patterns/hub", + "redirect_document_id": true + }, + { + "source_path": "uwp/controls-and-patterns/hyperlinks.md", + "redirect_url": "/windows/uwp/design/controls-and-patterns/hyperlinks", + "redirect_document_id": true + }, + { + "source_path": "uwp/controls-and-patterns/images-imagebrushes.md", + "redirect_url": "/windows/uwp/design/controls-and-patterns/images-imagebrushes", + "redirect_document_id": true + }, + { + "source_path": "uwp/controls-and-patterns/index.md", + "redirect_url": "/windows/uwp/design/controls-and-patterns/index", + "redirect_document_id": false + }, + { + "source_path": "uwp/controls-and-patterns/inking-controls.md", + "redirect_url": "/windows/uwp/design/controls-and-patterns/inking-controls", + "redirect_document_id": true + }, + { + "source_path": "uwp/controls-and-patterns/inverted-lists.md", + "redirect_url": "/windows/uwp/design/controls-and-patterns/inverted-lists", + "redirect_document_id": true + }, + { + "source_path": "uwp/controls-and-patterns/item-templates-gridview.md", + "redirect_url": "/windows/uwp/design/controls-and-patterns/item-templates-gridview", + "redirect_document_id": true + }, + { + "source_path": "uwp/controls-and-patterns/item-templates-listview.md", + "redirect_url": "/windows/uwp/design/controls-and-patterns/item-templates-listview", + "redirect_document_id": false + }, + { + "source_path": "uwp/controls-and-patterns/labels.md", + "redirect_url": "/windows/uwp/design/controls-and-patterns/labels", + "redirect_document_id": true + }, + { + "source_path": "uwp/controls-and-patterns/lists.md", + "redirect_url": "/windows/uwp/design/controls-and-patterns/lists", + "redirect_document_id": true + }, + { + "source_path": "uwp/controls-and-patterns/listview-and-gridview.md", + "redirect_url": "/windows/uwp/design/controls-and-patterns/listview-and-gridview", + "redirect_document_id": true + }, + { + "source_path": "uwp/controls-and-patterns/listview-item-templates.md", + "redirect_url": "/windows/uwp/design/controls-and-patterns/item-templates-listview", + "redirect_document_id": false + }, + { + "source_path": "uwp/controls-and-patterns/master-details.md", + "redirect_url": "/windows/uwp/design/controls-and-patterns/master-details", + "redirect_document_id": true + }, + { + "source_path": "uwp/controls-and-patterns/media-playback.md", + "redirect_url": "/windows/uwp/design/controls-and-patterns/media-playback", + "redirect_document_id": true + }, + { + "source_path": "uwp/controls-and-patterns/menus.md", + "redirect_url": "/windows/uwp/design/controls-and-patterns/menus", + "redirect_document_id": true + }, + { + "source_path": "uwp/controls-and-patterns/navigationview.md", + "redirect_url": "/windows/uwp/design/controls-and-patterns/navigationview", + "redirect_document_id": true + }, + { + "source_path": "uwp/controls-and-patterns/nested-ui.md", + "redirect_url": "/windows/uwp/design/controls-and-patterns/nested-ui", + "redirect_document_id": true + }, + { + "source_path": "uwp/controls-and-patterns/password-box.md", + "redirect_url": "/windows/uwp/design/controls-and-patterns/password-box", + "redirect_document_id": true + }, + { + "source_path": "uwp/controls-and-patterns/person-picture.md", + "redirect_url": "/windows/uwp/design/controls-and-patterns/person-picture", + "redirect_document_id": true + }, + { + "source_path": "uwp/controls-and-patterns/pin-to-taskbar.md", + "redirect_url": "/windows/uwp/design/shell/pin-to-taskbar", + "redirect_document_id": true + }, + { + "source_path": "uwp/controls-and-patterns/progress-controls.md", + "redirect_url": "/windows/uwp/design/controls-and-patterns/progress-controls", + "redirect_document_id": true + }, + { + "source_path": "uwp/controls-and-patterns/pull-to-refresh.md", + "redirect_url": "/windows/uwp/design/controls-and-patterns/pull-to-refresh", + "redirect_document_id": true + }, + { + "source_path": "uwp/controls-and-patterns/radio-button.md", + "redirect_url": "/windows/uwp/design/controls-and-patterns/radio-button", + "redirect_document_id": true + }, + { + "source_path": "uwp/controls-and-patterns/rating.md", + "redirect_url": "/windows/uwp/design/controls-and-patterns/rating", + "redirect_document_id": true + }, + { + "source_path": "uwp/controls-and-patterns/resourcedictionary-and-xaml-resource-references.md", + "redirect_url": "/windows/apps/design/style/xaml-resource-dictionary", + "redirect_document_id": false + }, + { + "source_path": "uwp/controls-and-patterns/rich-edit-box.md", + "redirect_url": "/windows/uwp/design/controls-and-patterns/rich-edit-box", + "redirect_document_id": true + }, + { + "source_path": "uwp/controls-and-patterns/rich-text-block.md", + "redirect_url": "/windows/uwp/design/controls-and-patterns/rich-text-block", + "redirect_document_id": true + }, + { + "source_path": "uwp/controls-and-patterns/scroll-controls.md", + "redirect_url": "/windows/uwp/design/controls-and-patterns/scroll-controls", + "redirect_document_id": true + }, + { + "source_path": "uwp/controls-and-patterns/search.md", + "redirect_url": "/windows/uwp/design/controls-and-patterns/index", + "redirect_document_id": false + }, + { + "source_path": "uwp/design/controls-and-patterns/search.md", + "redirect_url": "/windows/uwp/design/controls-and-patterns/index", + "redirect_document_id": false + }, + { + "source_path": "uwp/controls-and-patterns/semantic-zoom.md", + "redirect_url": "/windows/uwp/design/controls-and-patterns/semantic-zoom", + "redirect_document_id": true + }, + { + "source_path": "uwp/controls-and-patterns/slider.md", + "redirect_url": "/windows/uwp/design/controls-and-patterns/slider", + "redirect_document_id": true + }, + { + "source_path": "uwp/controls-and-patterns/split-view.md", + "redirect_url": "/windows/uwp/design/controls-and-patterns/split-view", + "redirect_document_id": true + }, + { + "source_path": "uwp/controls-and-patterns/swipe.md", + "redirect_url": "/windows/uwp/design/controls-and-patterns/swipe", + "redirect_document_id": true + }, + { + "source_path": "uwp/controls-and-patterns/tabs-pivot.md", + "redirect_url": "/windows/uwp/design/controls-and-patterns/tab-view", + "redirect_document_id": true + }, + { + "source_path": "uwp/controls-and-patterns/text-block.md", + "redirect_url": "/windows/uwp/design/controls-and-patterns/text-block", + "redirect_document_id": true + }, + { + "source_path": "uwp/controls-and-patterns/text-box.md", + "redirect_url": "/windows/uwp/design/controls-and-patterns/text-box", + "redirect_document_id": true + }, + { + "source_path": "uwp/controls-and-patterns/text-controls.md", + "redirect_url": "/windows/uwp/design/controls-and-patterns/text-controls", + "redirect_document_id": true + }, + { + "source_path": "uwp/controls-and-patterns/tiles-and-notifications-adaptive-interactive-toasts.md", + "redirect_url": "/windows/uwp/design/shell/tiles-and-notifications/adaptive-interactive-toasts", + "redirect_document_id": true + }, + { + "source_path": "uwp/controls-and-patterns/tiles-and-notifications-adaptive-tiles-schema.md", + "redirect_url": "/windows/uwp/design/shell/tiles-and-notifications/adaptive-tiles-schema", + "redirect_document_id": true + }, + { + "source_path": "uwp/controls-and-patterns/tiles-and-notifications-app-assets.md", + "redirect_url": "/windows/uwp/app-resources/images-tailored-for-scale-theme-contrast", + "redirect_document_id": true + }, + { + "source_path": "uwp/controls-and-patterns/tiles-and-notifications-badges.md", + "redirect_url": "/windows/uwp/design/shell/tiles-and-notifications/badges", + "redirect_document_id": true + }, + { + "source_path": "uwp/controls-and-patterns/tiles-and-notifications-choosing-a-notification-delivery-method.md", + "redirect_url": "/windows/uwp/design/shell/tiles-and-notifications/choosing-a-notification-delivery-method", + "redirect_document_id": true + }, + { + "source_path": "uwp/controls-and-patterns/tiles-and-notifications-create-adaptive-tiles.md", + "redirect_url": "/windows/uwp/design/shell/tiles-and-notifications/create-adaptive-tiles", + "redirect_document_id": true + }, + { + "source_path": "uwp/controls-and-patterns/tiles-and-notifications-creating-tiles.md", + "redirect_url": "/windows/uwp/design/shell/tiles-and-notifications/creating-tiles", + "redirect_document_id": true + }, + { + "source_path": "uwp/controls-and-patterns/tiles-and-notifications-notifications-visualizer.md", + "redirect_url": "/windows/uwp/design/shell/tiles-and-notifications/notifications-visualizer", + "redirect_document_id": true + }, + { + "source_path": "uwp/controls-and-patterns/tiles-and-notifications-periodic-notification-overview.md", + "redirect_url": "/windows/uwp/design/shell/tiles-and-notifications/periodic-notification-overview", + "redirect_document_id": true + }, + { + "source_path": "uwp/controls-and-patterns/tiles-and-notifications-primary-tile-apis.md", + "redirect_url": "/windows/uwp/design/shell/tiles-and-notifications/primary-tile-apis", + "redirect_document_id": true + }, + { + "source_path": "uwp/controls-and-patterns/tiles-and-notifications-raw-notification-overview.md", + "redirect_url": "/windows/uwp/design/shell/tiles-and-notifications/raw-notification-overview", + "redirect_document_id": true + }, + { + "source_path": "uwp/controls-and-patterns/tiles-and-notifications-secondary-tiles-desktop-pinning.md", + "redirect_url": "/windows/uwp/design/shell/tiles-and-notifications/secondary-tiles-desktop-pinning", + "redirect_document_id": true + }, + { + "source_path": "uwp/controls-and-patterns/tiles-and-notifications-secondary-tiles-guidance.md", + "redirect_url": "/windows/uwp/design/shell/tiles-and-notifications/secondary-tiles-guidance", + "redirect_document_id": true + }, + { + "source_path": "uwp/controls-and-patterns/tiles-and-notifications-secondary-tiles-pinning.md", + "redirect_url": "/windows/uwp/design/shell/tiles-and-notifications/secondary-tiles-pinning", + "redirect_document_id": true + }, + { + "source_path": "uwp/controls-and-patterns/tiles-and-notifications-secondary-tiles.md", + "redirect_url": "/windows/uwp/design/shell/tiles-and-notifications/secondary-tiles", + "redirect_document_id": true + }, + { + "source_path": "uwp/controls-and-patterns/tiles-and-notifications-send-local-toast.md", + "redirect_url": "/windows/uwp/design/shell/tiles-and-notifications/send-local-toast", + "redirect_document_id": true + }, + { + "source_path": "uwp/controls-and-patterns/tiles-and-notifications-sending-a-local-tile-notification.md", + "redirect_url": "/windows/uwp/design/shell/tiles-and-notifications/sending-a-local-tile-notification", + "redirect_document_id": true + }, + { + "source_path": "uwp/controls-and-patterns/tiles-and-notifications-special-tile-templates-catalog.md", + "redirect_url": "/windows/uwp/design/shell/tiles-and-notifications/special-tile-templates-catalog", + "redirect_document_id": true + }, + { + "source_path": "uwp/controls-and-patterns/tiles-and-notifications-the-code-generated-by-the-push-notification-wizard.md", + "redirect_url": "/windows/uwp/design/shell/tiles-and-notifications/the-code-generated-by-the-push-notification-wizard", + "redirect_document_id": true + }, + { + "source_path": "uwp/controls-and-patterns/tiles-and-notifications-toast-schema.md", + "redirect_url": "/windows/uwp/design/shell/tiles-and-notifications/toast-schema", + "redirect_document_id": true + }, + { + "source_path": "uwp/controls-and-patterns/tiles-and-notifications-toast-xml-schema.md", + "redirect_url": "/windows/uwp/design/shell/tiles-and-notifications/toast-xml-schema", + "redirect_document_id": true + }, + { + "source_path": "uwp/controls-and-patterns/tiles-and-notifications-windows-push-notification-services--wns--overview.md", + "redirect_url": "/windows/uwp/design/shell/tiles-and-notifications/windows-push-notification-services--wns--overview", + "redirect_document_id": true + }, + { + "source_path": "uwp/controls-and-patterns/tiles-badges-notifications.md", + "redirect_url": "/windows/uwp/design/shell/tiles-and-notifications/index", + "redirect_document_id": true + }, + { + "source_path": "uwp/controls-and-patterns/time-picker.md", + "redirect_url": "/windows/uwp/design/controls-and-patterns/time-picker", + "redirect_document_id": true + }, + { + "source_path": "uwp/controls-and-patterns/toggles.md", + "redirect_url": "/windows/uwp/design/controls-and-patterns/toggles", + "redirect_document_id": true + }, + { + "source_path": "uwp/controls-and-patterns/tooltips.md", + "redirect_url": "/windows/uwp/design/controls-and-patterns/tooltips", + "redirect_document_id": true + }, + { + "source_path": "uwp/controls-and-patterns/tree-view.md", + "redirect_url": "/windows/uwp/design/controls-and-patterns/tree-view", + "redirect_document_id": true + }, + { + "source_path": "uwp/controls-and-patterns/web-view.md", + "redirect_url": "/windows/uwp/design/controls-and-patterns/web-view", + "redirect_document_id": true + }, + { + "source_path": "uwp/controls-and-patterns/xaml-styles.md", + "redirect_url": "/windows/apps/develop/platform/xaml/xaml-styles", + "redirect_document_id": false + }, + { + "source_path": "uwp/controls-and-patterns/xaml-theme-resources.md", + "redirect_url": "/windows/apps/develop/platform/xaml/xaml-theme-resources", + "redirect_document_id": false + }, + { + "source_path": "uwp/controls-and-patterns/tiles-and-notifications/channel-types.md", + "redirect_url": "/windows/uwp/design/shell/tiles-and-notifications/channel-types", + "redirect_document_id": true + }, + { + "source_path": "uwp/controls-and-patterns/tiles-and-notifications/chaseable-tile-notifications.md", + "redirect_url": "/windows/uwp/design/shell/tiles-and-notifications/chaseable-tile-notifications", + "redirect_document_id": true + }, + { + "source_path": "uwp/controls-and-patterns/tiles-and-notifications/notification-listener.md", + "redirect_url": "/windows/uwp/design/shell/tiles-and-notifications/notification-listener", + "redirect_document_id": true + }, + { + "source_path": "uwp/controls-and-patterns/tiles-and-notifications/tile-schema.md", + "redirect_url": "/windows/uwp/design/shell/tiles-and-notifications/tile-schema", + "redirect_document_id": true + }, + { + "source_path": "uwp/design-downloads/index.md", + "redirect_url": "/windows/uwp/design/downloads/index", + "redirect_document_id": true + }, + { + "source_path": "uwp/in-app-help/external-help.md", + "redirect_url": "/windows/uwp/design/in-app-help/external-help", + "redirect_document_id": true + }, + { + "source_path": "uwp/in-app-help/guidelines-for-app-help.md", + "redirect_url": "/windows/uwp/design/in-app-help/guidelines-for-app-help", + "redirect_document_id": true + }, + { + "source_path": "uwp/in-app-help/in-app-help.md", + "redirect_url": "/windows/uwp/design/in-app-help/in-app-help", + "redirect_document_id": true + }, + { + "source_path": "uwp/in-app-help/instructional-ui.md", + "redirect_url": "/windows/uwp/design/in-app-help/instructional-ui", + "redirect_document_id": true + }, + { + "source_path": "uwp/in-app-help/voice-and-tone.md", + "redirect_url": "/windows/uwp/design/style/writing-style", + "redirect_document_id": false + }, + { + "source_path": "uwp/design/style/voice-and-tone.md", + "redirect_url": "/windows/uwp/design/style/writing-style", + "redirect_document_id": true + }, + { + "source_path": "uwp/input-and-devices/access-keys.md", + "redirect_url": "/windows/uwp/design/input/access-keys", + "redirect_document_id": true + }, + { + "source_path": "uwp/input-and-devices/convert-ink-to-text.md", + "redirect_url": "/windows/uwp/design/input/convert-ink-to-text", + "redirect_document_id": true + }, + { + "source_path": "uwp/input-and-devices/custom-keyboard-interactions.md", + "redirect_url": "/windows/uwp/design/input/custom-keyboard-interactions", + "redirect_document_id": true + }, + { + "source_path": "uwp/input-and-devices/custom-text-input.md", + "redirect_url": "/windows/uwp/design/input/custom-text-input", + "redirect_document_id": true + }, + { + "source_path": "uwp/input-and-devices/define-custom-recognition-constraints.md", + "redirect_url": "/windows/uwp/design/input/define-custom-recognition-constraints", + "redirect_document_id": true + }, + { + "source_path": "uwp/input-and-devices/designing-for-tv.md", + "redirect_url": "/windows/uwp/design/devices/designing-for-tv", + "redirect_document_id": true + }, + { + "source_path": "uwp/input-and-devices/device-primer.md", + "redirect_url": "/windows/uwp/design/devices/index", + "redirect_document_id": true + }, + { + "source_path": "uwp/input-and-devices/enable-continuous-dictation.md", + "redirect_url": "/windows/uwp/design/input/enable-continuous-dictation", + "redirect_document_id": true + }, + { + "source_path": "uwp/input-and-devices/gamepad-and-remote-interactions.md", + "redirect_url": "/windows/uwp/design/input/gamepad-and-remote-interactions", + "redirect_document_id": true + }, + { + "source_path": "uwp/input-and-devices/guidelines-for-cross-slide.md", + "redirect_url": "/windows/uwp/design/input/guidelines-for-cross-slide", + "redirect_document_id": true + }, + { + "source_path": "uwp/input-and-devices/guidelines-for-optical-zoom.md", + "redirect_url": "/windows/uwp/design/input/guidelines-for-optical-zoom", + "redirect_document_id": true + }, + { + "source_path": "uwp/input-and-devices/guidelines-for-panning.md", + "redirect_url": "/windows/uwp/design/input/guidelines-for-panning", + "redirect_document_id": true + }, + { + "source_path": "uwp/input-and-devices/guidelines-for-rotation.md", + "redirect_url": "/windows/uwp/design/input/guidelines-for-rotation", + "redirect_document_id": true + }, + { + "source_path": "uwp/input-and-devices/guidelines-for-targeting.md", + "redirect_url": "/windows/uwp/design/input/guidelines-for-targeting", + "redirect_document_id": true + }, + { + "source_path": "uwp/input-and-devices/guidelines-for-textselection.md", + "redirect_url": "/windows/uwp/design/input/guidelines-for-textselection", + "redirect_document_id": true + }, + { + "source_path": "uwp/input-and-devices/guidelines-for-visualfeedback.md", + "redirect_url": "/windows/uwp/design/input/guidelines-for-visualfeedback", + "redirect_document_id": true + }, + { + "source_path": "uwp/input-and-devices/handle-pointer-input.md", + "redirect_url": "/windows/uwp/design/input/handle-pointer-input", + "redirect_document_id": true + }, + { + "source_path": "uwp/input-and-devices/identify-input-devices.md", + "redirect_url": "/windows/uwp/design/input/identify-input-devices", + "redirect_document_id": true + }, + { + "source_path": "uwp/input-and-devices/index.md", + "redirect_url": "/windows/uwp/design/input/index", + "redirect_document_id": true + }, + { + "source_path": "uwp/input-and-devices/ink-toolbar.md", + "redirect_url": "/windows/uwp/design/input/ink-toolbar", + "redirect_document_id": true + }, + { + "source_path": "uwp/input-and-devices/input-primer.md", + "redirect_url": "/windows/uwp/design/input/input-primer", + "redirect_document_id": true + }, + { + "source_path": "uwp/input-and-devices/keyboard-accelerators.md", + "redirect_url": "/windows/uwp/design/input/keyboard-accelerators", + "redirect_document_id": true + }, + { + "source_path": "uwp/input-and-devices/keyboard-events.md", + "redirect_url": "/windows/uwp/design/input/keyboard-events", + "redirect_document_id": true + }, + { + "source_path": "uwp/input-and-devices/keyboard-interactions.md", + "redirect_url": "/windows/uwp/design/input/keyboard-interactions", + "redirect_document_id": true + }, + { + "source_path": "uwp/input-and-devices/manage-issues-with-audio-input.md", + "redirect_url": "/windows/uwp/design/input/manage-issues-with-audio-input", + "redirect_document_id": true + }, + { + "source_path": "uwp/input-and-devices/managing-focus-navigation.md", + "redirect_url": "/windows/uwp/design/input/managing-focus-navigation", + "redirect_document_id": true + }, + { + "source_path": "uwp/input-and-devices/mouse-interactions.md", + "redirect_url": "/windows/uwp/design/input/mouse-interactions", + "redirect_document_id": true + }, + { + "source_path": "uwp/input-and-devices/multiple-input-design-guidelines.md", + "redirect_url": "/windows/uwp/design/input/multiple-input-design-guidelines", + "redirect_document_id": true + }, + { + "source_path": "uwp/input-and-devices/pen-and-stylus-interactions.md", + "redirect_url": "/windows/uwp/design/input/pen-and-stylus-interactions", + "redirect_document_id": true + }, + { + "source_path": "uwp/input-and-devices/respond-to-the-presence-of-the-touch-keyboard.md", + "redirect_url": "/windows/uwp/design/input/respond-to-the-presence-of-the-touch-keyboard", + "redirect_document_id": true + }, + { + "source_path": "uwp/input-and-devices/save-and-load-ink.md", + "redirect_url": "/windows/uwp/design/input/save-and-load-ink", + "redirect_document_id": true + }, + { + "source_path": "uwp/input-and-devices/set-speech-recognition-timeouts.md", + "redirect_url": "/windows/uwp/design/input/set-speech-recognition-timeouts", + "redirect_document_id": true + }, + { + "source_path": "uwp/input-and-devices/specify-the-speech-recognizer-language.md", + "redirect_url": "/windows/uwp/design/input/specify-the-speech-recognizer-language", + "redirect_document_id": true + }, + { + "source_path": "uwp/input-and-devices/speech-interactions.md", + "redirect_url": "/windows/uwp/design/input/speech-interactions", + "redirect_document_id": true + }, + { + "source_path": "uwp/input-and-devices/speech-recognition.md", + "redirect_url": "/windows/uwp/design/input/speech-recognition", + "redirect_document_id": true + }, + { + "source_path": "uwp/input-and-devices/touch-interactions.md", + "redirect_url": "/windows/uwp/design/input/touch-interactions", + "redirect_document_id": true + }, + { + "source_path": "uwp/input-and-devices/touchpad-interactions.md", + "redirect_url": "/windows/uwp/design/input/touchpad-interactions", + "redirect_document_id": true + }, + { + "source_path": "uwp/input-and-devices/use-input-scope-to-change-the-touch-keyboard.md", + "redirect_url": "/windows/uwp/design/input/use-input-scope-to-change-the-touch-keyboard", + "redirect_document_id": true + }, + { + "source_path": "uwp/input-and-devices/windows-wheel-interactions.md", + "redirect_url": "/windows/uwp/design/input/windows-wheel-interactions", + "redirect_document_id": true + }, + { + "source_path": "uwp/layout/alignment-margin-padding.md", + "redirect_url": "/windows/uwp/design/layout/alignment-margin-padding", + "redirect_document_id": true + }, + { + "source_path": "uwp/layout/boxpanel-example-custom-panel.md", + "redirect_url": "/windows/uwp/design/layout/boxpanel-example-custom-panel", + "redirect_document_id": true + }, + { + "source_path": "uwp/layout/commanding-basics.md", + "redirect_url": "/windows/uwp/design/basics/commanding-basics", + "redirect_document_id": true + }, + { + "source_path": "uwp/layout/content-as-objects.md", + "redirect_url": "/windows/uwp/design", + "redirect_document_id": false + }, + { + "source_path": "uwp/layout/content-basics.md", + "redirect_url": "/windows/uwp/design/basics/content-basics", + "redirect_document_id": true + }, + { + "source_path": "uwp/layout/custom-panels-overview.md", + "redirect_url": "/windows/uwp/design/layout/custom-panels-overview", + "redirect_document_id": true + }, + { + "source_path": "uwp/layout/design-and-ui-intro.md", + "redirect_url": "/windows/uwp/design/basics/design-and-ui-intro", + "redirect_document_id": true + }, + { + "source_path": "uwp/layout/grid-tutorial.md", + "redirect_url": "/windows/uwp/design/layout/grid-tutorial", + "redirect_document_id": true + }, + { + "source_path": "uwp/layout/index.md", + "redirect_url": "/windows/uwp/design/layout/index", + "redirect_document_id": true + }, + { + "source_path": "uwp/layout/layout-panels.md", + "redirect_url": "/windows/uwp/design/layout/layout-panels", + "redirect_document_id": true + }, + { + "source_path": "uwp/layout/layouts-with-xaml.md", + "redirect_url": "/windows/uwp/design/layout/layouts-with-xaml", + "redirect_document_id": true + }, + { + "source_path": "uwp/layout/navigate-between-two-pages.md", + "redirect_url": "/windows/uwp/design/basics/navigate-between-two-pages", + "redirect_document_id": true + }, + { + "source_path": "uwp/layout/navigation-basics.md", + "redirect_url": "/windows/uwp/design/basics/navigation-basics", + "redirect_document_id": true + }, + { + "source_path": "uwp/layout/navigation-history-and-backwards-navigation.md", + "redirect_url": "/windows/uwp/design/basics/navigation-history-and-backwards-navigation", + "redirect_document_id": true + }, + { + "source_path": "uwp/layout/screen-sizes-and-breakpoints-for-responsive-design.md", + "redirect_url": "/windows/uwp/design/layout/screen-sizes-and-breakpoints-for-responsive-design", + "redirect_document_id": true + }, + { + "source_path": "uwp/layout/show-multiple-views.md", + "redirect_url": "/windows/uwp/ui-input/show-multiple-views", + "redirect_document_id": true + }, + { + "source_path": "uwp/style/acrylic.md", + "redirect_url": "/windows/uwp/design/style/acrylic", + "redirect_document_id": true + }, + { + "source_path": "uwp/style/balancing-style-and-consistency.md", + "redirect_url": "/windows/uwp/design/style/balancing-style-and-consistency", + "redirect_document_id": true + }, + { + "source_path": "uwp/style/color.md", + "redirect_url": "/windows/uwp/design/style/color", + "redirect_document_id": true + }, + { + "source_path": "uwp/style/connected-animation.md", + "redirect_url": "/windows/uwp/design/motion/connected-animation", + "redirect_document_id": true + }, + { + "source_path": "uwp/style/content-transition-animations.md", + "redirect_url": "/windows/uwp/design/motion/content-transition-animations", + "redirect_document_id": true + }, + { + "source_path": "uwp/style/icons.md", + "redirect_url": "/windows/uwp/design/style/icons", + "redirect_document_id": true + }, + { + "source_path": "uwp/style/index.md", + "redirect_url": "/windows/uwp/design/style/index", + "redirect_document_id": true + }, + { + "source_path": "uwp/style/motion-dragdrop.md", + "redirect_url": "/previous-versions/windows/uwp/ui-input/motion-dragdrop", + "redirect_document_id": false + }, + { + "source_path": "uwp/style/motion-edgebased.md", + "redirect_url": "/previous-versions/windows/uwp/ui-input/motion-edgebased", + "redirect_document_id": false + }, + { + "source_path": "uwp/style/motion-fade.md", + "redirect_url": "/previous-versions/windows/uwp/ui-input/motion-fade", + "redirect_document_id": false + }, + { + "source_path": "uwp/style/motion-list.md", + "redirect_url": "/previous-versions/windows/uwp/ui-input/motion-list", + "redirect_document_id": false + }, + { + "source_path": "uwp/style/motion-pointer.md", + "redirect_url": "/previous-versions/windows/uwp/ui-input/motion-pointer", + "redirect_document_id": false + }, + { + "source_path": "uwp/style/motion-popup-animations.md", + "redirect_url": "/previous-versions/windows/uwp/ui-input/motion-popup-animations", + "redirect_document_id": false + }, + { + "source_path": "uwp/style/motion-reposition.md", + "redirect_url": "/previous-versions/windows/uwp/ui-input/motion-reposition", + "redirect_document_id": false + }, + { + "source_path": "uwp/style/motion.md", + "redirect_url": "/windows/uwp/design/motion/index", + "redirect_document_id": true + }, + { + "source_path": "uwp/style/parallax.md", + "redirect_url": "/windows/uwp/design/motion/parallax", + "redirect_document_id": true + }, + { + "source_path": "uwp/style/reveal.md", + "redirect_url": "/windows/uwp/design/style/index", + "redirect_document_id": false + }, + { + "source_path": "uwp/design/style/reveal.md", + "redirect_url": "/windows/uwp/design/style/index", + "redirect_document_id": false + }, + { + "source_path": "uwp/style/segoe-ui-symbol-font.md", + "redirect_url": "/windows/uwp/design/style/segoe-ui-symbol-font", + "redirect_document_id": true + }, + { + "source_path": "uwp/style/sound.md", + "redirect_url": "/windows/uwp/design/style/sound", + "redirect_document_id": true + }, + { + "source_path": "uwp/style/title-bar.md", + "redirect_url": "/windows/uwp/design/shell/title-bar", + "redirect_document_id": true + }, + { + "source_path": "uwp/design/style/fonts.md", + "redirect_url": "/windows/uwp/design/style/typography", + "redirect_document_id": true + }, + { + "source_path": "uwp/usability/index.md", + "redirect_url": "/windows/uwp/design/usability/index", + "redirect_document_id": true + }, + { + "source_path": "uwp/globalizing/adjust-layout-and-fonts--and-support-rtl.md", + "redirect_url": "/windows/uwp/design/globalizing/adjust-layout-and-fonts--and-support-rtl", + "redirect_document_id": true + }, + { + "source_path": "uwp/globalizing/glob-numeralsystem-values.md", + "redirect_url": "/windows/uwp/design/globalizing/glob-numeralsystem-values", + "redirect_document_id": true + }, + { + "source_path": "uwp/globalizing/globalizing-portal.md", + "redirect_url": "/windows/uwp/design/globalizing/globalizing-portal", + "redirect_document_id": true + }, + { + "source_path": "uwp/globalizing/guidelines-and-checklist-for-globalizing-your-app.md", + "redirect_url": "/windows/uwp/design/globalizing/guidelines-and-checklist-for-globalizing-your-app", + "redirect_document_id": true + }, + { + "source_path": "uwp/globalizing/loc-international-fonts.md", + "redirect_url": "/windows/uwp/design/globalizing/loc-international-fonts", + "redirect_document_id": true + }, + { + "source_path": "uwp/globalizing/manage-language-and-region.md", + "redirect_url": "/windows/uwp/design/globalizing/manage-language-and-region", + "redirect_document_id": true + }, + { + "source_path": "uwp/globalizing/prepare-your-app-for-localization.md", + "redirect_url": "/windows/uwp/design/globalizing/prepare-your-app-for-localization", + "redirect_document_id": true + }, + { + "source_path": "uwp/globalizing/use-global-ready-formats.md", + "redirect_url": "/windows/uwp/design/globalizing/use-global-ready-formats", + "redirect_document_id": true + }, + { + "source_path": "uwp/globalizing/use-patterns-to-format-dates-and-times.md", + "redirect_url": "/windows/uwp/design/globalizing/use-patterns-to-format-dates-and-times", + "redirect_document_id": true + }, + { + "source_path": "uwp/data-access/entity-framework-7-with-sqlite-for-csharp-apps.md", + "redirect_url": "/ef/core/get-started/uwp/getting-started", + "redirect_document_id": false + }, + { + "source_path": "uwp/app-resources/tile-toast-language-scale-contrast.md", + "redirect_url": "/windows/uwp/design/shell/tiles-and-notifications/tile-toast-language-scale-contrast", + "redirect_document_id": false + }, + { + "source_path": "uwp/graphics/using-brushes.md", + "redirect_url": "/windows/uwp/design/style/brushes", + "redirect_document_id": false + }, + { + "source_path": "uwp/graphics/animations-overview.md", + "redirect_url": "/windows/uwp/design/motion/xaml-animation", + "redirect_document_id": false + }, + { + "source_path": "uwp/graphics/storyboarded-animations.md", + "redirect_url": "/windows/uwp/design/motion/storyboarded-animations", + "redirect_document_id": false + }, + { + "source_path": "uwp/graphics/key-frame-and-easing-function-animations.md", + "redirect_url": "/windows/uwp/design/motion/key-frame-and-easing-function-animations", + "redirect_document_id": false + }, + { + "source_path": "uwp/graphics/drawing-shapes.md", + "redirect_url": "/windows/uwp/design/controls-and-patterns/shapes", + "redirect_document_id": false + }, + { + "source_path": "uwp/graphics/transforms-overview.md", + "redirect_url": "/windows/uwp/design/layout/transforms", + "redirect_document_id": false + }, + { + "source_path": "uwp/graphics/3-d-perspective-effects.md", + "redirect_url": "/windows/apps/develop/platform/xaml/3-d-perspective-effects", + "redirect_document_id": false + }, + { + "source_path": "uwp/graphics/index.md", + "redirect_url": "/windows/uwp/design/style", + "redirect_document_id": false + }, + { + "source_path": "uwp/debug-test-perf/device-portal-xbox.md", + "redirect_url": "/windows/uwp/xbox-apps/device-portal-xbox", + "redirect_document_id": true + }, + { + "source_path": "uwp/xbox-live/social-platform/people-system/xbox-360-friends-backward-compatibility.md", + "redirect_url": "/gaming/xbox-live/social-platform/people-system/people-system_nav", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/get-started-with-creators/sign-in-to-xbox-live-in-unity.md", + "redirect_url": "/gaming/xbox-live/get-started/setup-ide/creators/unity-win10/signin/unity-signin_nav", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/multiplayer/xbox-integrated-multiplayer-overview.md", + "redirect_url": "/gaming/xbox-live/multiplayer/xbox-integrated-multiplayer/xbox-integrated-multiplayer", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/storage-platform/connected-storage/connected-storage-clearing.md", + "redirect_url": "/windows/uwp/xbox-live/storage-platform/connected-storage/connected-storage-xb-storage", + "redirect_document_id": true + }, + { + "source_path": "uwp/design/input/custom-keyboard-interactions.md", + "redirect_url": "/windows/uwp/design/input/focus-navigation", + "redirect_document_id": true + }, + { + "source_path": "uwp/design/input/managing-focus-navigation.md", + "redirect_url": "/windows/uwp/design/input/focus-navigation-programmatic", + "redirect_document_id": true + }, + { + "source_path": "uwp/xbox-live/social-platform/people-system/privacy-and-people-i-know.md", + "redirect_url": "/windows/uwp/xbox-live/social-platform/people-system/xbox-live-people-system", + "redirect_document_id": true + }, + { + "source_path": "uwp/get-started/whats-a-uwp.md", + "redirect_url": "/windows/uwp/get-started/universal-application-platform-guide", + "redirect_document_id": true + }, + { + "source_path": "uwp/porting/hwa-to-uwp-root.md", + "redirect_url": "/microsoft-edge/progressive-web-apps", + "redirect_document_id": false + }, + { + "source_path": "uwp/porting/hwa-access-features.md", + "redirect_url": "/microsoft-edge/progressive-web-apps", + "redirect_document_id": false + }, + { + "source_path": "uwp/porting/hwa-chrome-conversion.md", + "redirect_url": "/microsoft-edge/progressive-web-apps", + "redirect_document_id": false + }, + { + "source_path": "uwp/porting/hwa-create-mac.md", + "redirect_url": "/microsoft-edge/progressive-web-apps", + "redirect_document_id": false + }, + { + "source_path": "uwp/publish/resolve-package-upload-errors.md", + "redirect_url": "/windows/uwp/publish/upload-app-packages", + "redirect_document_id": false + }, + { + "source_path": "uwp/publish/manage-add-ons-in-bulk.md", + "redirect_url": "/windows/uwp/publish/add-on-submissions", + "redirect_document_id": false + }, + { + "source_path": "uwp/publish/associate-azure-ad-with-dev-center.md", + "redirect_url": "/windows/uwp/publish/associate-azure-ad-with-partner-center", + "redirect_document_id": false + }, + { + "source_path": "uwp/publish/managing-your-profile.md", + "redirect_url": "/partner-center/partner-center-account-setup", + "redirect_document_id": false + }, + { + "source_path": "uwp/publish/define-pricing-and-market-selection.md", + "redirect_url": "/windows/uwp/publish/define-market-selection", + "redirect_document_id": false + }, + { + "source_path": "uwp/publish/promote-your-app-report.md", + "redirect_url": "/windows/uwp/publish/ad-campaign-report", + "redirect_document_id": false + }, + { + "source_path": "uwp/publish/app-declarations.md", + "redirect_url": "/windows/uwp/publish/product-declarations", + "redirect_document_id": false + }, + { + "source_path": "uwp/porting/hwa-create-windows.md", + "redirect_url": "/microsoft-edge/progressive-web-apps", + "redirect_document_id": false + }, + { + "source_path": "uwp/design/controls-and-patterns/tabs-pivot.md", + "redirect_url": "/windows/uwp/design/controls-and-patterns/pivot", + "redirect_document_id": false + }, + { + "source_path": "uwp/design/controls-and-patterns/dialogs.md", + "redirect_url": "/windows/uwp/design/controls-and-patterns/dialogs-and-flyouts/index", + "redirect_document_id": true + }, + { + "source_path": "uwp/monetize/download-the-cab-file-for-an-oem-hardware-error.md", + "redirect_url": "/windows-hardware/drivers/dashboard/download-the-cab-file-for-an-oem-hardware-error", + "redirect_document_id": false + }, + { + "source_path": "uwp/monetize/download-the-cab-file-for-a-windows-10-driver-error.md", + "redirect_url": "/windows-hardware/drivers/dashboard/download-the-cab-file-for-a-windows-10-driver-error", + "redirect_document_id": false + }, + { + "source_path": "uwp/monetize/download-the-cab-file-for-a-windows-7-or-windows-8.x-driver-error.md", + "redirect_url": "/windows-hardware/drivers/dashboard/download-the-cab-file-for-a-windows-7-or-windows-8.x-driver-error", + "redirect_document_id": false + }, + { + "source_path": "uwp/monetize/get-details-for-an-oem-hardware-error.md", + "redirect_url": "/windows-hardware/drivers/dashboard/get-details-for-an-oem-hardware-error", + "redirect_document_id": false + }, + { + "source_path": "uwp/monetize/get-details-for-a-windows-10-driver-error.md", + "redirect_url": "/windows-hardware/drivers/dashboard/get-details-for-a-windows-10-driver-error", + "redirect_document_id": false + }, + { + "source_path": "uwp/monetize/get-details-for-a-windows-7-or-windows-8.x-driver-error.md", + "redirect_url": "/windows-hardware/drivers/dashboard/get-details-for-a-windows-7-or-windows-8.x-driver-error", + "redirect_document_id": false + }, + { + "source_path": "uwp/monetize/get-error-reporting-data-for-windows-10-drivers.md", + "redirect_url": "/windows-hardware/drivers/dashboard/get-error-reporting-data-for-windows-10-drivers", + "redirect_document_id": false + }, + { + "source_path": "uwp/monetize/get-error-reporting-data-for-windows-7-and-windows-8.x-drivers.md", + "redirect_url": "/windows-hardware/drivers/dashboard/get-error-reporting-data-for-windows-7-and-windows-8.x-drivers", + "redirect_document_id": false + }, + { + "source_path": "uwp/monetize/get-oem-hardware-error-reporting-data.md", + "redirect_url": "/windows-hardware/drivers/dashboard/get-oem-hardware-error-reporting-data", + "redirect_document_id": false + }, + { + "source_path": "uwp/machine-learning/index.md", + "redirect_url": "/windows/ai", + "redirect_document_id": false + }, + { + "source_path": "uwp/machine-learning/get-started.md", + "redirect_url": "/windows/ai", + "redirect_document_id": false + }, + { + "source_path": "uwp/machine-learning/overview.md", + "redirect_url": "/windows/ai", + "redirect_document_id": false + }, + { + "source_path": "uwp/machine-learning/conversion-samples.md", + "redirect_url": "/windows/ai/convert-model-winmltools", + "redirect_document_id": false + }, + { + "source_path": "uwp/machine-learning/integrate-model.md", + "redirect_url": "/windows/ai/integrate-model", + "redirect_document_id": false + }, + { + "source_path": "uwp/machine-learning/samples.md", + "redirect_url": "https://github.com/Microsoft/Windows-Machine-Learning", + "redirect_document_id": false + }, + { + "source_path": "uwp/machine-learning/train-ai-model.md", + "redirect_url": "/windows/ai/get-onnx-model", + "redirect_document_id": false + }, + { + "source_path": "uwp/composition/lighting.md", + "redirect_url": "/windows/uwp/composition/xaml-lighting", + "redirect_document_id": true + }, + { + "source_path": "uwp/devices-sensors/nfc.md", + "redirect_url": "/windows/uwp/devices-sensors/", + "redirect_document_id": false + }, + { + "source_path": "uwp/devices-sensors/generate-3mf.md", + "redirect_url": "/windows/uwp/devices-sensors/3d-generate-3mf", + "redirect_document_id": false + }, + { + "source_path": "uwp/devices-sensors/pos-advanced-connectivity.md", + "redirect_url": "/windows/uwp/devices-sensors/point-of-service", + "redirect_document_id": true + }, + { + "source_path": "uwp/devices-sensors/pos-barcodescanner-get-started.md", + "redirect_url": "/windows/uwp/devices-sensors/pos-barcodescanner-configure", + "redirect_document_id": true + }, + { + "source_path": "uwp/design/shell/tiles-and-notifications/app-assets.md", + "redirect_url": "/windows/apps/design/style/iconography/overview", + "redirect_document_id": false + }, + { + "source_path": "hub/apps/design/style/app-icons-and-logos.md", + "redirect_url": "/windows/apps/design/style/iconography/overview", + "redirect_document_id": true + }, + { + "source_path": "uwp/xbox-live/configure-xbl/dev-center/data-sharing-udc.md", + "redirect_url": "/windows/uwp/xbox-live/configure-xbl/dev-center/access-policies-udc", + "redirect_document_id": true + }, + { + "source_path": "uwp/packaging/appinstaller-root.md", + "redirect_url": "/windows/msix/app-installer/app-installer-root", + "redirect_document_id": false + }, + { + "source_path": "uwp/packaging/create-appinstallerfile-vs.md", + "redirect_url": "/windows/msix/app-installer/create-appinstallerfile-vs", + "redirect_document_id": false + }, + { + "source_path": "uwp/packaging/installing-UWP-apps-web.md", + "redirect_url": "/windows/msix/app-installer/installing-windows10-apps-web", + "redirect_document_id": false + }, + { + "source_path": "uwp/packaging/install-related-set.md", + "redirect_url": "/windows/msix/app-installer/install-related-set", + "redirect_document_id": false + }, + { + "source_path": "uwp/packaging/troubleshoot-appinstaller-issues.md", + "redirect_url": "/windows/msix/app-installer/troubleshoot-appinstaller-issues", + "redirect_document_id": false + }, + { + "source_path": "uwp/packaging/web-install-azure.md", + "redirect_url": "/windows/msix/app-installer/web-install-azure", + "redirect_document_id": false + }, + { + "source_path": "uwp/packaging/web-install-IIS.md", + "redirect_url": "/windows/msix/app-installer/web-install-iis", + "redirect_document_id": false + }, + { + "source_path": "uwp/packaging/web-install-aws.md", + "redirect_url": "/windows/msix/app-installer/web-install-aws", + "redirect_document_id": false + }, + { + "source_path": "uwp/publish/dev-center-insider-program.md", + "redirect_url": "/windows/uwp/publish", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/advanced-xbox-live-sandboxes.md", + "redirect_url": "/gaming/xbox-live/advanced-xbox-live-sandboxes", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/developer-program-overview.md", + "redirect_url": "/gaming/gdk/_content/gc/live/get-started/live-getstarted-nav", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/flatc-async-patterns.md", + "redirect_url": "/gaming/xbox-live/flatc-async-patterns", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/index.md", + "redirect_url": "/gaming/xbox-live/index", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/introduction-to-xbox-live-apis.md", + "redirect_url": "/gaming/xbox-live/introduction-to-xbox-live-apis", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/samples.md", + "redirect_url": "/gaming/xbox-live/samples", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/testing-on-console.md", + "redirect_url": "/gaming/xbox-live/testing-on-console", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/what-is-xbox-live.md", + "redirect_url": "/gaming/xbox-live/get-started/what-is-xbox-live", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/xbox-live-resources.md", + "redirect_url": "/gaming/xbox-live/xbox-live-resources", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/xbox-live-sandboxes.md", + "redirect_url": "/gaming/xbox-live/xbox-live-sandboxes", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/xbox-live-service-configuration.md", + "redirect_url": "/gaming/xbox-live/xbox-live-service-configuration", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/xbox-live-test-accounts.md", + "redirect_url": "/gaming/xbox-live/xbox-live-test-accounts", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/xbox-live.md", + "redirect_url": "/gaming/xbox-live/", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/xboxlive-policies.md", + "redirect_url": "/gaming/xbox-live/xboxlive-policies", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/xboxservices-config.md", + "redirect_url": "/gaming/xbox-live/get-started/setup-ide/managed-partners/vs-win10/xboxservices-config", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/xsapi-flat-c.md", + "redirect_url": "/gaming/xbox-live/xsapi-flat-c", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/achievements-2017/achievement-rewards.md", + "redirect_url": "/gaming/xbox-live/achievements-2017/achievement-rewards", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/achievements-2017/achievements.md", + "redirect_url": "/gaming/xbox-live/achievements-2017/achievements_nav", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/achievements-2017/simplified-achievements.md", + "redirect_url": "/gaming/xbox-live/achievements-2017/simplified-achievements", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/configure-xbl/windows-dev-center.md", + "redirect_url": "/gaming/xbox-live/get-started/setup-partner-center/setup-partner-center_nav", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/configure-xbl/dev-center/access-policies-udc.md", + "redirect_url": "/gaming/xbox-live/configure-xbl/dev-center/access-policies-udc", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/configure-xbl/dev-center/achievements-in-udc.md", + "redirect_url": "/gaming/xbox-live/configure-xbl/dev-center/achievements-in-udc", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/configure-xbl/dev-center/featured-stats-and-leaderboards.md", + "redirect_url": "/gaming/xbox-live/configure-xbl/dev-center/featured-stats-and-leaderboards", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/configure-xbl/dev-center/game-dvr.md", + "redirect_url": "/gaming/xbox-live/configure-xbl/dev-center/game-dvr", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/configure-xbl/dev-center/localized-strings.md", + "redirect_url": "/gaming/xbox-live/configure-xbl/dev-center/localized-strings", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/configure-xbl/dev-center/privileges.md", + "redirect_url": "/gaming/xbox-live/configure-xbl/dev-center/privileges", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/configure-xbl/dev-center/rich-presence-configuration.md", + "redirect_url": "/gaming/xbox-live/configure-xbl/dev-center/rich-presence-configuration", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/configure-xbl/dev-center/single-sign-on.md", + "redirect_url": "/gaming/xbox-live/configure-xbl/dev-center/single-sign-on", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/configure-xbl/dev-center/summary.md", + "redirect_url": "/gaming/xbox-live/configure-xbl/dev-center/summary", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/configure-xbl/dev-center/title-storage.md", + "redirect_url": "/gaming/xbox-live/configure-xbl/dev-center/title-storage", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/configure-xbl/dev-center/web-services.md", + "redirect_url": "/gaming/xbox-live/configure-xbl/dev-center/web-services", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/configure-xbl/dev-center/xbox-live-setup.md", + "redirect_url": "/gaming/xbox-live/configure-xbl/dev-center/xbox-live-setup", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/contextual-search/configuring-contextual-search.md", + "redirect_url": "/gaming/xbox-live/contextual-search/configuring-contextual-search", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/contextual-search/introduction-to-contextual-search.md", + "redirect_url": "/gaming/xbox-live/contextual-search/introduction-to-contextual-search", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/data-platform/data-platform.md", + "redirect_url": "/gaming/xbox-live/data-platform/player-data_nav", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/data-platform/designing-xbox-live-experiences.md", + "redirect_url": "/gaming/xbox-live/data-platform/designing-xbox-live-experiences", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/get-started-with-creators/add-controller-support-to-xbox-live-prefabs.md", + "redirect_url": "/gaming/xbox-live/get-started/setup-ide/creators/unity-win10/add-controller-support-to-xbox-live-prefabs", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/get-started-with-creators/add-multi-user-support.md", + "redirect_url": "/gaming/xbox-live/get-started/setup-ide/creators/unity-win10/add-multi-user-support", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/get-started-with-creators/add-stats-and-leaderboards-in-unity.md", + "redirect_url": "/gaming/xbox-live/get-started-with-creators/add-stats-and-leaderboards-in-unity", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/get-started-with-creators/authorize-xbox-live-accounts.md", + "redirect_url": "/gaming/xbox-live/get-started/setup-partner-center/legacy/authorize-xbox-live-accounts", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/get-started-with-creators/check-user-privileges-in-unity.md", + "redirect_url": "/gaming/xbox-live/get-started/setup-ide/creators/unity-win10/check-user-privileges-in-unity", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/get-started-with-creators/configure-xbox-live-in-unity.md", + "redirect_url": "/gaming/xbox-live/get-started/setup-ide/creators/unity-win10/configure-xbox-live-in-unity", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/get-started-with-creators/create-and-test-a-new-creators-title.md", + "redirect_url": "/gaming/xbox-live/get-started/setup-partner-center/legacy/create-and-test-a-new-creators-title", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/get-started-with-creators/creators-step-by-step-guide.md", + "redirect_url": "/gaming/xbox-live/get-started-with-creators/creators-step-by-step-guide", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/get-started-with-creators/develop-creators-title-with-unity.md", + "redirect_url": "/gaming/xbox-live/get-started/setup-ide/creators/unity-win10/cr-unity-win10_nav", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/get-started-with-creators/develop-creators-title-with-visual-studio.md", + "redirect_url": "/gaming/xbox-live/get-started/setup-ide/creators/vs-win10/develop-creators-title-with-visual-studio", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/get-started-with-creators/get-started-with-xbox-live-creators.md", + "redirect_url": "/gaming/xbox-live/get-started/setup-partner-center/setup-partner-center-creators", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/get-started-with-creators/playerauthentication-prefab-sign-in.md", + "redirect_url": "/gaming/xbox-live/get-started/setup-ide/creators/unity-win10/signin/playerauthentication-prefab-sign-in", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/get-started-with-creators/setup-leaderboard-example-scene.md", + "redirect_url": "/gaming/xbox-live/get-started-with-creators/setup-leaderboard-example-scene", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/get-started-with-creators/sign-in-manager.md", + "redirect_url": "/gaming/xbox-live/using-xbox-live/auth/authentication_nav", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/get-started-with-creators/test-visual-studio-build.md", + "redirect_url": "/gaming/xbox-live/get-started/setup-ide/creators/unity-win10/test-visual-studio-build", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/get-started-with-creators/unity-leaderboard-from-scratch-pre1804.md", + "redirect_url": "/gaming/xbox-live/get-started-with-creators/unity-leaderboard-from-scratch-pre1804", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/get-started-with-creators/unity-leaderboard-from-scratch.md", + "redirect_url": "/gaming/xbox-live/get-started-with-creators/unity-leaderboard-from-scratch", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/get-started-with-creators/unity-prefabs-and-sign-in.md", + "redirect_url": "/gaming/xbox-live/get-started/setup-ide/creators/unity-win10/signin/unity-prefabs-and-sign-in", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/get-started-with-creators/xbox-live-sandboxes-creators.md", + "redirect_url": "/gaming/xbox-live/get-started-with-creators/xbox-live-sandboxes-creators", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/get-started-with-creators/xbox-live-service-configuration-creators.md", + "redirect_url": "/gaming/xbox-live/get-started-with-creators/xbox-live-service-configuration-creators", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/get-started-with-partner/add-xbox-live-apis-binary-to-a-uwp-project.md", + "redirect_url": "/gaming/xbox-live/get-started/setup-ide/managed-partners/vs-win10/add-xbox-live-apis-binary-to-a-uwp-project", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/get-started-with-partner/add-xbox-live-apis-source-to-a-uwp-project.md", + "redirect_url": "/gaming/xbox-live/get-started/setup-ide/managed-partners/vs-win10/add-xbox-live-apis-source-to-a-uwp-project", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/get-started-with-partner/add-xbox-live-to-an-xdk-project.md", + "redirect_url": "/gaming/xbox-live/get-started/setup-ide/managed-partners/vs-xbox/add-xbox-live-to-an-xdk-project", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/get-started-with-partner/advanced-xbox-live-sandboxes.md", + "redirect_url": "/gaming/xbox-live/advanced-xbox-live-sandboxes", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/get-started-with-partner/compile-the-xdk-xbox-live-api-source.md", + "redirect_url": "/gaming/xbox-live/get-started/setup-ide/managed-partners/vs-xbox/compile-the-xdk-xbox-live-api-source", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/get-started-with-partner/configure-your-development-console.md", + "redirect_url": "/gaming/xbox-live/get-started/setup-ide/managed-partners/vs-xbox/configure-your-development-console", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/get-started-with-partner/create-a-new-title.md", + "redirect_url": "/gaming/xbox-live/get-started/setup-partner-center/legacy/create-a-new-title", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/get-started-with-partner/get-started-with-cross-play-games.md", + "redirect_url": "/gaming/xbox-live/get-started-with-partner/get-started-with-cross-play-games", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/get-started-with-partner/get-started-with-visual-studio-and-uwp.md", + "redirect_url": "/gaming/xbox-live/get-started/setup-ide/managed-partners/vs-win10/get-started-with-visual-studio-and-uwp", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/get-started-with-partner/get-started-with-xbox-live-partner.md", + "redirect_url": "/gaming/xbox-live/get-started/setup-partner-center/legacy/get-started-with-xbox-live-partner", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/get-started-with-partner/partner-add-xbox-live-to-unity-uwp.md", + "redirect_url": "/gaming/xbox-live/get-started/setup-ide/managed-partners/unity-win10/partner-add-xbox-live-to-unity-uwp", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/get-started-with-partner/partner-unity-uwp-il2cpp.md", + "redirect_url": "/gaming/xbox-live/get-started/setup-ide/managed-partners/unity-win10/partner-unity-uwp-il2cpp", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/get-started-with-partner/partner-unity-xdk-il2cpp.md", + "redirect_url": "/gaming/xbox-live/get-started/setup-ide/managed-partners/unity-xbox/partner-unity-xdk-il2cpp", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/get-started-with-partner/partners-step-by-step-guide.md", + "redirect_url": "/gaming/xbox-live/get-started/setup-partner-center/legacy/get-started-with-xbox-live-partner", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/get-started-with-partner/use-xbox-live-nuget-with-xdk.md", + "redirect_url": "/gaming/xbox-live/get-started/setup-ide/managed-partners/vs-xbox/use-xbox-live-nuget-with-xdk", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/get-started-with-partner/using-xbox-live-apis-built-into-the-xdk.md", + "redirect_url": "/gaming/xbox-live/get-started/setup-ide/managed-partners/vs-xbox/using-xbox-live-apis-built-into-the-xdk", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/get-started-with-partner/where-to-get-xdk.md", + "redirect_url": "/gaming/xbox-live/get-started/setup-ide/managed-partners/vs-xbox/where-to-get-xdk", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/get-started-with-partner/xdk-developers.md", + "redirect_url": "/gaming/xbox-live/get-started/setup-ide/managed-partners/vs-xbox/mp-vs-xbox_nav", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/leaderboards-and-stats-2017/leaderboards.md", + "redirect_url": "/gaming/xbox-live/leaderboards-and-stats-2017/leaderboards", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/leaderboards-and-stats-2017/player-stats-configure-2017.md", + "redirect_url": "/gaming/xbox-live/leaderboards-and-stats-2017/player-stats-configure-2017", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/leaderboards-and-stats-2017/player-stats-updating.md", + "redirect_url": "/gaming/xbox-live/leaderboards-and-stats-2017/player-stats-updating", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/leaderboards-and-stats-2017/player-stats.md", + "redirect_url": "/gaming/xbox-live/data-platform/player-data_nav", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/leaderboards-and-stats-2017/stats2017.md", + "redirect_url": "/gaming/xbox-live/leaderboards-and-stats-2017/stats2017", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/multiplayer/multiplayer-concepts.md", + "redirect_url": "/gaming/xbox-live/multiplayer/multiplayer-concepts", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/multiplayer/multiplayer-intro.md", + "redirect_url": "/gaming/xbox-live/multiplayer/multiplayer-intro", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/multiplayer/multiplayer-manager.md", + "redirect_url": "/gaming/xbox-live/multiplayer/multiplayer-platform", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/multiplayer/multiplayer-roles.md", + "redirect_url": "/gaming/xbox-live/multiplayer/multiplayer-roles", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/multiplayer/multiplayer-scenarios.md", + "redirect_url": "/gaming/xbox-live/multiplayer/multiplayer-scenarios", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/multiplayer/session-browse.md", + "redirect_url": "/gaming/xbox-live/multiplayer/session-browse", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/multiplayer/xbox-integrated-multiplayer.md", + "redirect_url": "/gaming/xbox-live/multiplayer/xbox-integrated-multiplayer/xbox-integrated-multiplayer", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/multiplayer/arena/arena-apis-metadata.md", + "redirect_url": "/gaming/xbox-live/multiplayer/arena/arena-apis-metadata", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/multiplayer/arena/arena-notifications.md", + "redirect_url": "/gaming/xbox-live/multiplayer/arena/arena-notifications", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/multiplayer/arena/arena-title-integration.md", + "redirect_url": "/gaming/xbox-live/multiplayer/arena/arena-title-integration", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/multiplayer/arena/arena-user-scenarios.md", + "redirect_url": "/gaming/xbox-live/multiplayer/arena/arena-user-scenarios", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/multiplayer/arena/arena-ux-join-tournament.md", + "redirect_url": "/gaming/xbox-live/multiplayer/arena/arena-ux-join-tournament", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/multiplayer/arena/arena-ux-match-engagement.md", + "redirect_url": "/gaming/xbox-live/multiplayer/arena/arena-ux-match-engagement", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/multiplayer/arena/discovering-xbox-tournaments.md", + "redirect_url": "/gaming/xbox-live/multiplayer/arena/discovering-xbox-tournaments", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/multiplayer/arena/operations-portal.md", + "redirect_url": "/gaming/xbox-live/multiplayer/arena/operations-portal", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/multiplayer/arena/xbox-arena.md", + "redirect_url": "/gaming/xbox-live/multiplayer/arena/xbox-arena", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/multiplayer/chat/game-chat-2-migration.md", + "redirect_url": "/gaming/xbox-live/multiplayer/chat/game-chat-2-migration", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/multiplayer/chat/game-chat-2-overview.md", + "redirect_url": "/gaming/xbox-live/multiplayer/chat/game-chat-2-overview", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/multiplayer/chat/real-time-audio-manipulation.md", + "redirect_url": "/gaming/xbox-live/multiplayer/chat/real-time-audio-manipulation", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/multiplayer/chat/using-game-chat-2-winrt.md", + "redirect_url": "/gaming/xbox-live/multiplayer/chat/using-game-chat-2-winrt", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/multiplayer/chat/using-game-chat-2.md", + "redirect_url": "/gaming/xbox-live/multiplayer/chat/using-game-chat-2", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/multiplayer/multiplayer-appendix/common-issues-when-adapting-multiplayer.md", + "redirect_url": "/gaming/xbox-live/multiplayer/multiplayer-appendix/common-issues-when-adapting-multiplayer", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/multiplayer/multiplayer-appendix/flows-for-multiplayer-game-invites.md", + "redirect_url": "/gaming/xbox-live/multiplayer/invite/multiplayer-invite-flows", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/multiplayer/multiplayer-appendix/game-session-and-game-party-visibility-and-joinability.md", + "redirect_url": "/gaming/xbox-live/multiplayer/multiplayer-appendix/game-session-and-game-party-visibility-and-joinability", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/multiplayer/multiplayer-appendix/introduction-to-the-multiplayer-system.md", + "redirect_url": "/gaming/xbox-live/multiplayer/multiplayer-appendix/introduction-to-the-multiplayer-system", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/multiplayer/multiplayer-appendix/migrating-an-arbiter.md", + "redirect_url": "/gaming/xbox-live/multiplayer/multiplayer-appendix/migrating-an-arbiter", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/multiplayer/multiplayer-appendix/mpsd-session-details.md", + "redirect_url": "/gaming/xbox-live/multiplayer/multiplayer-session/mpsd-details", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/multiplayer/multiplayer-appendix/multiplayer-2015-faq.md", + "redirect_url": "/gaming/xbox-live/multiplayer/multiplayer-appendix/multiplayer-2015-faq", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/multiplayer/multiplayer-appendix/multiplayer-appendix.md", + "redirect_url": "/gaming/xbox-live/multiplayer/multiplayer-appendix/multiplayer-appendix", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/multiplayer/multiplayer-appendix/multiplayer-how-tos.md", + "redirect_url": "/gaming/xbox-live/multiplayer/multiplayer-session/mpsd-how-tos", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/multiplayer/multiplayer-appendix/multiplayer-session-directory.md", + "redirect_url": "/gaming/xbox-live/multiplayer/multiplayer-appendix/xbox-one-multiplayer-session-directory", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/multiplayer/multiplayer-appendix/multiplayer-session-status-codes.md", + "redirect_url": "/gaming/xbox-live/multiplayer/multiplayer-session/mpsd-status-codes", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/multiplayer/multiplayer-appendix/smartmatch-matchmaking.md", + "redirect_url": "/gaming/xbox-live/multiplayer/multiplayer-manager/mpm-flowcharts/mpm-play-with-smartmatch-matchmaking", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/multiplayer/multiplayer-appendix/using-smartmatch-matchmaking.md", + "redirect_url": "/gaming/xbox-live/multiplayer/matchmaking/matchmaking", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/multiplayer/multiplayer-appendix/xbox-one-multiplayer-session-directory.md", + "redirect_url": "/gaming/xbox-live/multiplayer/multiplayer-appendix/xbox-one-multiplayer-session-directory", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/multiplayer/multiplayer-manager/handle-protocol-activation.md", + "redirect_url": "/gaming/xbox-live/multiplayer/multiplayer-manager/handle-protocol-activation", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/multiplayer/multiplayer-manager/mpm-flowcharts.md", + "redirect_url": "/gaming/xbox-live/multiplayer/multiplayer-manager/mpm-flowcharts", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/multiplayer/multiplayer-manager/multiplayer-manager-api-overview.md", + "redirect_url": "/gaming/xbox-live/multiplayer/multiplayer-manager/multiplayer-manager-api-overview", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/multiplayer/multiplayer-manager/play-multiplayer-with-friends.md", + "redirect_url": "/gaming/xbox-live/multiplayer/multiplayer-manager/play-multiplayer-with-friends", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/multiplayer/multiplayer-manager/play-multiplayer-with-matchmaking.md", + "redirect_url": "/gaming/xbox-live/multiplayer/multiplayer-manager/play-multiplayer-with-matchmaking", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/multiplayer/multiplayer-manager/send-game-invites.md", + "redirect_url": "/gaming/xbox-live/multiplayer/multiplayer-manager/send-game-invites", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/multiplayer/multiplayer-manager/mpm-flowcharts/mpm-fill-open-slots.md", + "redirect_url": "/gaming/xbox-live/multiplayer/multiplayer-manager/mpm-flowcharts/mpm-fill-open-slots", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/multiplayer/multiplayer-manager/mpm-flowcharts/mpm-host-migration.md", + "redirect_url": "/gaming/xbox-live/multiplayer/multiplayer-manager/mpm-flowcharts/mpm-host-migration", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/multiplayer/multiplayer-manager/mpm-flowcharts/mpm-on-protocol-activation.md", + "redirect_url": "/gaming/xbox-live/multiplayer/multiplayer-manager/mpm-flowcharts/mpm-on-protocol-activation", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/multiplayer/multiplayer-manager/mpm-flowcharts/mpm-play-with-friends.md", + "redirect_url": "/gaming/xbox-live/multiplayer/multiplayer-manager/mpm-flowcharts/mpm-play-with-friends", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/multiplayer/multiplayer-manager/mpm-flowcharts/mpm-play-with-smartmatch-matchmaking.md", + "redirect_url": "/gaming/xbox-live/multiplayer/multiplayer-manager/mpm-flowcharts/mpm-play-with-smartmatch-matchmaking", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/multiplayer/multiplayer-manager/mpm-flowcharts/mpm-send-invites.md", + "redirect_url": "/gaming/xbox-live/multiplayer/multiplayer-manager/mpm-flowcharts/mpm-send-invites", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/multiplayer/multiplayer-manager/mpm-flowcharts/mpm-shut-down.md", + "redirect_url": "/gaming/xbox-live/multiplayer/multiplayer-manager/mpm-flowcharts/mpm-shut-down", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/multiplayer/multiplayer-manager/mpm-flowcharts/mpm-use-matchmaking-and-qos.md", + "redirect_url": "/gaming/xbox-live/multiplayer/multiplayer-manager/mpm-flowcharts/mpm-use-matchmaking-and-qos", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/multiplayer/service-configuration/configure-the-multiplayer-service.md", + "redirect_url": "/gaming/xbox-live/multiplayer/service-configuration/configure-the-multiplayer-service", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/multiplayer/service-configuration/configure-your-appxmanifest-for-multiplayer.md", + "redirect_url": "/gaming/xbox-live/multiplayer/xbox-integrated-multiplayer/xim-manifest", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/multiplayer/service-configuration/large-sessions.md", + "redirect_url": "/gaming/xbox-live/multiplayer/service-configuration/large-sessions", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/multiplayer/service-configuration/session-template-constants.md", + "redirect_url": "/gaming/xbox-live/multiplayer/service-configuration/session-template-constants", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/multiplayer/service-configuration/session-templates.md", + "redirect_url": "/gaming/xbox-live/multiplayer/service-configuration/session-templates", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/multiplayer/xbox-integrated-multiplayer/using-xim-cs.md", + "redirect_url": "/gaming/xbox-live/multiplayer/xbox-integrated-multiplayer/using-xim-cs", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/multiplayer/xbox-integrated-multiplayer/using-xim.md", + "redirect_url": "/gaming/xbox-live/multiplayer/xbox-integrated-multiplayer/using-xim", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/multiplayer/xbox-integrated-multiplayer/xim-manifest.md", + "redirect_url": "/gaming/xbox-live/multiplayer/xbox-integrated-multiplayer/xim-manifest", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/multiplayer/xbox-integrated-multiplayer/xim-release-notes.md", + "redirect_url": "/gaming/xbox-live/multiplayer/xbox-integrated-multiplayer/xim-release-notes", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/multiplayer/xbox-integrated-multiplayer/xim-reservations.md", + "redirect_url": "/gaming/xbox-live/multiplayer/xbox-integrated-multiplayer/xim-reservations", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/multiplayer/xbox-integrated-multiplayer/xim-unity-uwp-il2cpp.md", + "redirect_url": "/gaming/xbox-live/multiplayer/xbox-integrated-multiplayer/xim-unity-uwp-il2cpp", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/real-time-activity-service/programming-the-real-time-activity-service.md", + "redirect_url": "/gaming/xbox-live/real-time-activity-service/programming-the-real-time-activity-service", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/real-time-activity-service/real-time-activity-service.md", + "redirect_url": "/gaming/xbox-live/real-time-activity-service/real-time-activity-service_nav", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/real-time-activity-service/register-for-stat-notifications.md", + "redirect_url": "/gaming/xbox-live/real-time-activity-service/register-for-stat-notifications", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/real-time-activity-service/rta-best-practices.md", + "redirect_url": "/gaming/xbox-live/real-time-activity-service/rta-best-practices", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/social-platform/intro-to-social-manager.md", + "redirect_url": "/gaming/xbox-live/social-platform/intro-to-social-manager", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/social-platform/social-manager-memory-and-performance-overview.md", + "redirect_url": "/gaming/xbox-live/social-platform/social-manager-memory-and-performance-overview", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/social-platform/social-platform.md", + "redirect_url": "/gaming/xbox-live/social-platform/social-platform_nav", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/social-platform/people-system/displaying-people-from-the-people-system.md", + "redirect_url": "/gaming/xbox-live/social-platform/people-system/displaying-people-from-the-people-system", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/social-platform/people-system/programming-social-services.md", + "redirect_url": "/gaming/xbox-live/social-platform/people-system/programming-social-services", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/social-platform/people-system/reputation.md", + "redirect_url": "/gaming/xbox-live/social-platform/people-system/reputation_nav", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/social-platform/people-system/sending-player-feedback-from-your-title.md", + "redirect_url": "/gaming/xbox-live/social-platform/people-system/sending-player-feedback-from-your-title", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/social-platform/people-system/xbox-live-people-system.md", + "redirect_url": "/gaming/xbox-live/social-platform/people-system/xbox-live-people-system", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/social-platform/rich-presence-strings/programming-rich-presence.md", + "redirect_url": "/gaming/xbox-live/social-platform/rich-presence-strings/programming-rich-presence", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/social-platform/rich-presence-strings/rich-presence-strings-appendix.md", + "redirect_url": "/gaming/xbox-live/social-platform/rich-presence-strings/rich-presence-strings-appendix", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/social-platform/rich-presence-strings/rich-presence-strings-best-practices.md", + "redirect_url": "/gaming/xbox-live/social-platform/rich-presence-strings/rich-presence-strings-best-practices", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/social-platform/rich-presence-strings/rich-presence-strings-configuration.md", + "redirect_url": "/gaming/xbox-live/social-platform/rich-presence-strings/rich-presence-strings-configuration", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/social-platform/rich-presence-strings/rich-presence-strings-overview.md", + "redirect_url": "/gaming/xbox-live/social-platform/rich-presence-strings/rich-presence-strings-overview", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/social-platform/rich-presence-strings/rich-presence-strings-policies-and-limitations.md", + "redirect_url": "/gaming/xbox-live/social-platform/rich-presence-strings/rich-presence-strings-policies-and-limitations", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/social-platform/rich-presence-strings/rich-presence-strings-updating-strings.md", + "redirect_url": "/gaming/xbox-live/social-platform/rich-presence-strings/rich-presence-strings-updating-strings", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/storage-platform/storage-platform.md", + "redirect_url": "/gaming/xbox-live/storage-platform/cloud-storage_nav", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/storage-platform/connected-storage/connected-storage-best-practices.md", + "redirect_url": "/gaming/xbox-live/storage-platform/connected-storage/connected-storage-best-practices", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/storage-platform/connected-storage/connected-storage-deleting.md", + "redirect_url": "/gaming/xbox-live/storage-platform/connected-storage/connected-storage-deleting", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/storage-platform/connected-storage/connected-storage-loading-on-demand.md", + "redirect_url": "/gaming/xbox-live/storage-platform/connected-storage/connected-storage-loading-on-demand", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/storage-platform/connected-storage/connected-storage-loading.md", + "redirect_url": "/gaming/xbox-live/storage-platform/connected-storage/connected-storage-loading", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/storage-platform/connected-storage/connected-storage-overview.md", + "redirect_url": "/gaming/xbox-live/storage-platform/connected-storage/connected-storage-overview", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/storage-platform/connected-storage/connected-storage-saving.md", + "redirect_url": "/gaming/xbox-live/storage-platform/connected-storage/connected-storage-saving", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/storage-platform/connected-storage/connected-storage-technical-overview.md", + "redirect_url": "/gaming/xbox-live/storage-platform/connected-storage/connected-storage-technical-overview", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/storage-platform/connected-storage/connected-storage-using-buffers.md", + "redirect_url": "/gaming/xbox-live/storage-platform/connected-storage/connected-storage-using-buffers", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/storage-platform/connected-storage/connected-storage-xb-storage.md", + "redirect_url": "/gaming/xbox-live/storage-platform/connected-storage/connected-storage-xb-storage", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/storage-platform/xbox-live-title-storage/reading-binary-blobs.md", + "redirect_url": "/gaming/xbox-live/storage-platform/xbox-live-title-storage/reading-binary-blobs", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/storage-platform/xbox-live-title-storage/reading-configuration-blobs.md", + "redirect_url": "/gaming/xbox-live/storage-platform/xbox-live-title-storage/reading-configuration-blobs", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/storage-platform/xbox-live-title-storage/reading-jsonblobs.md", + "redirect_url": "/gaming/xbox-live/storage-platform/xbox-live-title-storage/reading-jsonblobs", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/storage-platform/xbox-live-title-storage/storing-binary-blobs.md", + "redirect_url": "/gaming/xbox-live/storage-platform/xbox-live-title-storage/storing-binary-blobs", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/storage-platform/xbox-live-title-storage/storing-jsonblobs.md", + "redirect_url": "/gaming/xbox-live/storage-platform/xbox-live-title-storage/storing-jsonblobs", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/storage-platform/xbox-live-title-storage/xbox-live-title-storage.md", + "redirect_url": "/gaming/xbox-live/storage-platform/xbox-live-title-storage/xbox-live-title-storage", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/tools/analyze-service-calls.md", + "redirect_url": "/gaming/xbox-live/tools/analyze-service-calls", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/tools/tools.md", + "redirect_url": "/gaming/xbox-live/tools/tools", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/tools/xbox-live-account-tool.md", + "redirect_url": "/gaming/xbox-live/tools/xbox-live-account-tool", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/using-xbox-live/porting-xbox-live-code-from-xdk-to-uwp.md", + "redirect_url": "/gaming/xbox-live/using-xbox-live/porting-xbox-live-code-from-xdk-to-uwp", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/using-xbox-live/using-xbox-live.md", + "redirect_url": "/gaming/xbox-live/using-xbox-live/using-xbox-live", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/using-xbox-live/auth/authentication-for-UWP-projects.md", + "redirect_url": "/gaming/xbox-live/using-xbox-live/auth/authentication-for-UWP-projects", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/using-xbox-live/auth/authentication-for-XDK-projects.md", + "redirect_url": "/gaming/xbox-live/using-xbox-live/auth/authentication-for-XDK-projects", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/using-xbox-live/auth/authentication.md", + "redirect_url": "/gaming/xbox-live/using-xbox-live/auth/authentication_nav", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/using-xbox-live/auth/retrieving-windows-system-user-on-UWP.md", + "redirect_url": "/gaming/xbox-live/using-xbox-live/auth/retrieving-windows-system-user-on-UWP", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/using-xbox-live/auth/single-point-of-presence.md", + "redirect_url": "/gaming/xbox-live/using-xbox-live/auth/single-point-of-presence", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/using-xbox-live/best-practices/best-practices-for-calling-xbox-live.md", + "redirect_url": "/gaming/xbox-live/using-xbox-live/best-practices/best-practices-for-calling-xbox-live", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/using-xbox-live/best-practices/best-practices-for-offline.md", + "redirect_url": "/gaming/xbox-live/using-xbox-live/best-practices/best-practices-for-offline", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/using-xbox-live/best-practices/fine-grained-rate-limiting.md", + "redirect_url": "/gaming/xbox-live/using-xbox-live/best-practices/fine-grained-rate-limiting", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/using-xbox-live/error-handling/error-handling-cpp.md", + "redirect_url": "/gaming/xbox-live/using-xbox-live/error-handling/error-handling-cpp", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/using-xbox-live/error-handling/error-handling-winrt.md", + "redirect_url": "/gaming/xbox-live/using-xbox-live/error-handling/error-handling-winrt", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/using-xbox-live/error-handling/error-handling.md", + "redirect_url": "/gaming/xbox-live/using-xbox-live/error-handling/error-handling_nav", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/using-xbox-live/troubleshooting/how-to-set-up-fiddler-for-debugging.md", + "redirect_url": "/gaming/xbox-live/using-xbox-live/troubleshooting/how-to-set-up-fiddler-for-debugging", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/using-xbox-live/troubleshooting/troubleshooting-pc-setup.md", + "redirect_url": "/gaming/xbox-live/using-xbox-live/troubleshooting/troubleshooting-pc-setup", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/using-xbox-live/troubleshooting/troubleshooting-sign-in.md", + "redirect_url": "/gaming/xbox-live/using-xbox-live/troubleshooting/troubleshooting-sign-in", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/using-xbox-live/troubleshooting/troubleshooting-the-xbox-live-services-api.md", + "redirect_url": "/gaming/xbox-live/using-xbox-live/troubleshooting/troubleshooting-the-xbox-live-services-api", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/using-xbox-live/troubleshooting/troubleshooting.md", + "redirect_url": "/gaming/xbox-live/using-xbox-live/troubleshooting/troubleshooting_nav", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/whats-new/1506-whats-new.md", + "redirect_url": "/gaming/xbox-live/whats-new/1506-whats-new", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/whats-new/1508-whats-new.md", + "redirect_url": "/gaming/xbox-live/whats-new/1508-whats-new", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/whats-new/1509-whats-new.md", + "redirect_url": "/gaming/xbox-live/whats-new/1509-whats-new", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/whats-new/1510-whats-new.md", + "redirect_url": "/gaming/xbox-live/whats-new/1510-whats-new", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/whats-new/1602-whats-new.md", + "redirect_url": "/gaming/xbox-live/whats-new/1602-whats-new", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/whats-new/1603-whats-new.md", + "redirect_url": "/gaming/xbox-live/whats-new/1603-whats-new", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/whats-new/1604-whats-new.md", + "redirect_url": "/gaming/xbox-live/whats-new/1604-whats-new", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/whats-new/1606-whats-new.md", + "redirect_url": "/gaming/xbox-live/whats-new/1606-whats-new", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/whats-new/1608-whats-new.md", + "redirect_url": "/gaming/xbox-live/whats-new/1608-whats-new", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/whats-new/1611-whats-new.md", + "redirect_url": "/gaming/xbox-live/whats-new/1611-whats-new", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/whats-new/1612-whats-new.md", + "redirect_url": "/gaming/xbox-live/whats-new/1612-whats-new", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/whats-new/1703-whats-new.md", + "redirect_url": "/gaming/xbox-live/whats-new/1703-whats-new", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/whats-new/1704-whats-new.md", + "redirect_url": "/gaming/xbox-live/whats-new/1704-whats-new", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/whats-new/1705-whats-new.md", + "redirect_url": "/gaming/xbox-live/whats-new/1705-whats-new", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/whats-new/1706-whats-new.md", + "redirect_url": "/gaming/xbox-live/whats-new/1706-whats-new", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/whats-new/1707-whats-new.md", + "redirect_url": "/gaming/xbox-live/whats-new/1707-whats-new", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/whats-new/1708-whats-new.md", + "redirect_url": "/gaming/xbox-live/whats-new/1708-whats-new", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/whats-new/whats-new.md", + "redirect_url": "/gaming/xbox-live/whats-new/whats-new", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/xbox-live-rest/atoc-xboxlivews-reference.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/atoc-xboxlivews-reference", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/xbox-live-rest/additional/atoc-xboxlivews-reference-additional.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/additional/atoc-xboxlivews-reference-additional", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/xbox-live-rest/additional/authorizationtypes.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/additional/authorizationtypes", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/xbox-live-rest/additional/datatypeoverview.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/additional/datatypeoverview", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/xbox-live-rest/additional/eds-apis.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/additional/eds-apis", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/xbox-live-rest/additional/edsauthorization.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/additional/edsauthorization", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/xbox-live-rest/additional/edscommonheaders.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/additional/edscommonheaders", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/xbox-live-rest/additional/edsparameters.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/additional/edsparameters", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/xbox-live-rest/additional/edsqueryrefiners.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/additional/edsqueryrefiners", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/xbox-live-rest/additional/edsreverselookup.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/additional/edsreverselookup", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/xbox-live-rest/additional/edstables.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/additional/edstables", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/xbox-live-rest/additional/httpstandardheaders.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/additional/httpstandardheaders", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/xbox-live-rest/additional/httpstatuscodes.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/additional/httpstatuscodes", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/xbox-live-rest/additional/pagingparameters.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/additional/pagingparameters", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/xbox-live-rest/enums/atoc-xboxlivews-reference-enums.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/enums/atoc-xboxlivews-reference-enums", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/xbox-live-rest/enums/gvr-enum-gameclipsource.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/enums/gvr-enum-gameclipsource", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/xbox-live-rest/enums/gvr-enum-gameclipstate.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/enums/gvr-enum-gameclipstate", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/xbox-live-rest/enums/gvr-enum-gamecliptypes.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/enums/gvr-enum-gamecliptypes", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/xbox-live-rest/enums/gvr-enum-gameclipuritype.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/enums/gvr-enum-gameclipuritype", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/xbox-live-rest/enums/gvr-enum-gameclipvisibility.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/enums/gvr-enum-gameclipvisibility", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/xbox-live-rest/enums/gvr-enum-thumbnailsource.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/enums/gvr-enum-thumbnailsource", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/xbox-live-rest/enums/gvr-enum-thumbnailtype.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/enums/gvr-enum-thumbnailtype", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/xbox-live-rest/enums/privacy-enum-permissionid.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/enums/privacy-enum-permissionid", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/xbox-live-rest/json/atoc-xboxlivews-reference-json.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/json/atoc-xboxlivews-reference-json", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/xbox-live-rest/json/json-achievementv2.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/json/json-achievementv2", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/xbox-live-rest/json/json-activityrecord.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/json/json-activityrecord", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/xbox-live-rest/json/json-activityrequest.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/json/json-activityrequest", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/xbox-live-rest/json/json-aggregatesessionsresponse.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/json/json-aggregatesessionsresponse", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/xbox-live-rest/json/json-batchrequest.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/json/json-batchrequest", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/xbox-live-rest/json/json-deviceendpoint.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/json/json-deviceendpoint", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/xbox-live-rest/json/json-devicerecord.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/json/json-devicerecord", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/xbox-live-rest/json/json-feedback.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/json/json-feedback", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/xbox-live-rest/json/json-gameclip.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/json/json-gameclip", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/xbox-live-rest/json/json-gameclipsserviceerrorresponse.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/json/json-gameclipsserviceerrorresponse", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/xbox-live-rest/json/json-gameclipthumbnail.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/json/json-gameclipthumbnail", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/xbox-live-rest/json/json-gameclipuri.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/json/json-gameclipuri", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/xbox-live-rest/json/json-gamemessage.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/json/json-gamemessage", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/xbox-live-rest/json/json-gameresult.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/json/json-gameresult", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/xbox-live-rest/json/json-gamesession.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/json/json-gamesession", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/xbox-live-rest/json/json-gamesessionsummary.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/json/json-gamesessionsummary", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/xbox-live-rest/json/json-getclipresponse.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/json/json-getclipresponse", + "redirect_document_id": false }, { - "source_path": "uwp/controls-and-patterns/tiles-and-notifications-secondary-tiles.md", - "redirect_url": "/windows/uwp/design/shell/tiles-and-notifications/secondary-tiles", - "redirect_document_id": true + "source_path": "uwp/xbox-live/xbox-live-rest/json/json-hopperstatsresults.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/json/json-hopperstatsresults", + "redirect_document_id": false }, { - "source_path": "uwp/controls-and-patterns/tiles-and-notifications-send-local-toast.md", - "redirect_url": "/windows/uwp/design/shell/tiles-and-notifications/send-local-toast", - "redirect_document_id": true + "source_path": "uwp/xbox-live/xbox-live-rest/json/json-initialuploadrequest.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/json/json-initialuploadrequest", + "redirect_document_id": false }, { - "source_path": "uwp/controls-and-patterns/tiles-and-notifications-sending-a-local-tile-notification.md", - "redirect_url": "/windows/uwp/design/shell/tiles-and-notifications/sending-a-local-tile-notification", - "redirect_document_id": true + "source_path": "uwp/xbox-live/xbox-live-rest/json/json-initialuploadresponse.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/json/json-initialuploadresponse", + "redirect_document_id": false }, { - "source_path": "uwp/controls-and-patterns/tiles-and-notifications-special-tile-templates-catalog.md", - "redirect_url": "/windows/uwp/design/shell/tiles-and-notifications/special-tile-templates-catalog", - "redirect_document_id": true + "source_path": "uwp/xbox-live/xbox-live-rest/json/json-inventoryitem.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/json/json-inventoryitem", + "redirect_document_id": false }, { - "source_path": "uwp/controls-and-patterns/tiles-and-notifications-the-code-generated-by-the-push-notification-wizard.md", - "redirect_url": "/windows/uwp/design/shell/tiles-and-notifications/the-code-generated-by-the-push-notification-wizard", - "redirect_document_id": true + "source_path": "uwp/xbox-live/xbox-live-rest/json/json-lastseenrecord.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/json/json-lastseenrecord", + "redirect_document_id": false }, { - "source_path": "uwp/controls-and-patterns/tiles-and-notifications-toast-schema.md", - "redirect_url": "/windows/uwp/design/shell/tiles-and-notifications/toast-schema", - "redirect_document_id": true + "source_path": "uwp/xbox-live/xbox-live-rest/json/json-matchticket.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/json/json-matchticket", + "redirect_document_id": false }, { - "source_path": "uwp/controls-and-patterns/tiles-and-notifications-toast-xml-schema.md", - "redirect_url": "/windows/uwp/design/shell/tiles-and-notifications/toast-xml-schema", - "redirect_document_id": true + "source_path": "uwp/xbox-live/xbox-live-rest/json/json-mediaasset.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/json/json-mediaasset", + "redirect_document_id": false }, { - "source_path": "uwp/controls-and-patterns/tiles-and-notifications-windows-push-notification-services--wns--overview.md", - "redirect_url": "/windows/uwp/design/shell/tiles-and-notifications/windows-push-notification-services--wns--overview", - "redirect_document_id": true + "source_path": "uwp/xbox-live/xbox-live-rest/json/json-mediarecord.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/json/json-mediarecord", + "redirect_document_id": false }, { - "source_path": "uwp/controls-and-patterns/tiles-badges-notifications.md", - "redirect_url": "/windows/uwp/design/shell/tiles-and-notifications/index", - "redirect_document_id": true + "source_path": "uwp/xbox-live/xbox-live-rest/json/json-mediarequest.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/json/json-mediarequest", + "redirect_document_id": false }, { - "source_path": "uwp/controls-and-patterns/time-picker.md", - "redirect_url": "/windows/uwp/design/controls-and-patterns/time-picker", - "redirect_document_id": true + "source_path": "uwp/xbox-live/xbox-live-rest/json/json-multiplayeractivitydetails.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/json/json-multiplayeractivitydetails", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/xbox-live-rest/json/json-multiplayersession.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/json/json-multiplayersession", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/xbox-live-rest/json/json-multiplayersessionreference.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/json/json-multiplayersessionreference", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/xbox-live-rest/json/json-multiplayersessionrequest.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/json/json-multiplayersessionrequest", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/xbox-live-rest/json/json-paginginfo.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/json/json-paginginfo", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/xbox-live-rest/json/json-peoplelist.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/json/json-peoplelist", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/xbox-live-rest/json/json-permissioncheckbatchrequest.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/json/json-permissioncheckbatchrequest", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/xbox-live-rest/json/json-permissioncheckbatchresponse.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/json/json-permissioncheckbatchresponse", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/xbox-live-rest/json/json-permissioncheckbatchuserresponse.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/json/json-permissioncheckbatchuserresponse", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/xbox-live-rest/json/json-permissioncheckresponse.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/json/json-permissioncheckresponse", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/xbox-live-rest/json/json-permissioncheckresult.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/json/json-permissioncheckresult", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/xbox-live-rest/json/json-person.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/json/json-person", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/xbox-live-rest/json/json-personsummary.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/json/json-personsummary", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/xbox-live-rest/json/json-player.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/json/json-player", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/xbox-live-rest/json/json-presencerecord.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/json/json-presencerecord", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/xbox-live-rest/json/json-profile.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/json/json-profile", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/xbox-live-rest/json/json-progression.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/json/json-progression", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/xbox-live-rest/json/json-property.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/json/json-property", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/xbox-live-rest/json/json-queryclipsresponse.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/json/json-queryclipsresponse", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/xbox-live-rest/json/json-quota.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/json/json-quota", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/xbox-live-rest/json/json-requirement.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/json/json-requirement", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/xbox-live-rest/json/json-resetreputation.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/json/json-resetreputation", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/xbox-live-rest/json/json-reward.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/json/json-reward", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/xbox-live-rest/json/json-richpresencerequest.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/json/json-richpresencerequest", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/xbox-live-rest/json/json-serviceerror.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/json/json-serviceerror", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/xbox-live-rest/json/json-serviceerrorresponse.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/json/json-serviceerrorresponse", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/xbox-live-rest/json/json-sessionentry.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/json/json-sessionentry", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/xbox-live-rest/json/json-titleassociation.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/json/json-titleassociation", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/xbox-live-rest/json/json-titleblob.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/json/json-titleblob", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/xbox-live-rest/json/json-titlerecord.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/json/json-titlerecord", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/xbox-live-rest/json/json-titlerequest.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/json/json-titlerequest", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/xbox-live-rest/json/json-updatemetadatarequest.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/json/json-updatemetadatarequest", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/xbox-live-rest/json/json-user.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/json/json-user", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/xbox-live-rest/json/json-userclaims.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/json/json-userclaims", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/xbox-live-rest/json/json-userlist.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/json/json-userlist", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/xbox-live-rest/json/json-usersettings.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/json/json-usersettings", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/xbox-live-rest/json/json-usertitlev2.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/json/json-usertitlev2", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/xbox-live-rest/json/json-verifystringresult.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/json/json-verifystringresult", + "redirect_document_id": false + }, + { + "source_path": "uwp/xbox-live/xbox-live-rest/json/json-xuidlist.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/json/json-xuidlist", + "redirect_document_id": false }, { - "source_path": "uwp/controls-and-patterns/toggles.md", - "redirect_url": "/windows/uwp/design/controls-and-patterns/toggles", - "redirect_document_id": true + "source_path": "uwp/xbox-live/xbox-live-rest/uri/atoc-xboxlivews-reference-uris.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/atoc-xboxlivews-reference-uris", + "redirect_document_id": false }, { - "source_path": "uwp/controls-and-patterns/tooltips.md", - "redirect_url": "/windows/uwp/design/controls-and-patterns/tooltips", - "redirect_document_id": true + "source_path": "uwp/xbox-live/xbox-live-rest/uri/achievements/atoc-reference-achievementsv2.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/achievements/atoc-reference-achievementsv2", + "redirect_document_id": false }, { - "source_path": "uwp/controls-and-patterns/tree-view.md", - "redirect_url": "/windows/uwp/design/controls-and-patterns/tree-view", - "redirect_document_id": true + "source_path": "uwp/xbox-live/xbox-live-rest/uri/achievements/uri-achievementsusersxuidachievementsgetv2.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/achievements/uri-achievementsusersxuidachievementsgetv2", + "redirect_document_id": false }, { - "source_path": "uwp/controls-and-patterns/web-view.md", - "redirect_url": "/windows/uwp/design/controls-and-patterns/web-view", - "redirect_document_id": true + "source_path": "uwp/xbox-live/xbox-live-rest/uri/achievements/uri-achievementsusersxuidachievementsv2.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/achievements/uri-achievementsusersxuidachievementsv2", + "redirect_document_id": false }, { - "source_path": "uwp/controls-and-patterns/xaml-styles.md", - "redirect_url": "/windows/uwp/design/controls-and-patterns/xaml-styles", - "redirect_document_id": true + "source_path": "uwp/xbox-live/xbox-live-rest/uri/achievements/uri-usersxuidachievementsscidachievementid.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/achievements/uri-usersxuidachievementsscidachievementid", + "redirect_document_id": false }, { - "source_path": "uwp/controls-and-patterns/xaml-theme-resources.md", - "redirect_url": "/windows/uwp/design/controls-and-patterns/xaml-theme-resources", - "redirect_document_id": true + "source_path": "uwp/xbox-live/xbox-live-rest/uri/achievements/uri-usersxuidachievementsscidachievementidget.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/achievements/uri-usersxuidachievementsscidachievementidget", + "redirect_document_id": false }, { - "source_path": "uwp/controls-and-patterns/tiles-and-notifications/channel-types.md", - "redirect_url": "/windows/uwp/design/shell/tiles-and-notifications/channel-types", - "redirect_document_id": true + "source_path": "uwp/xbox-live/xbox-live-rest/uri/dvr/atoc-reference-dvr.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/dvr/atoc-reference-dvr", + "redirect_document_id": false }, { - "source_path": "uwp/controls-and-patterns/tiles-and-notifications/chaseable-tile-notifications.md", - "redirect_url": "/windows/uwp/design/shell/tiles-and-notifications/chaseable-tile-notifications", - "redirect_document_id": true + "source_path": "uwp/xbox-live/xbox-live-rest/uri/dvr/uri-publicscidclips.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/dvr/uri-publicscidclips", + "redirect_document_id": false }, { - "source_path": "uwp/controls-and-patterns/tiles-and-notifications/notification-listener.md", - "redirect_url": "/windows/uwp/design/shell/tiles-and-notifications/notification-listener", - "redirect_document_id": true + "source_path": "uwp/xbox-live/xbox-live-rest/uri/dvr/uri-publicscidclipsget.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/dvr/uri-publicscidclipsget", + "redirect_document_id": false }, { - "source_path": "uwp/controls-and-patterns/tiles-and-notifications/tile-schema.md", - "redirect_url": "/windows/uwp/design/shell/tiles-and-notifications/tile-schema", - "redirect_document_id": true + "source_path": "uwp/xbox-live/xbox-live-rest/uri/dvr/uri-uri.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/dvr/uri-uri", + "redirect_document_id": false }, { - "source_path": "uwp/design-downloads/index.md", - "redirect_url": "/windows/uwp/design/downloads/index", - "redirect_document_id": true + "source_path": "uwp/xbox-live/xbox-live-rest/uri/dvr/uri-uriget.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/dvr/uri-uriget", + "redirect_document_id": false }, { - "source_path": "uwp/in-app-help/external-help.md", - "redirect_url": "/windows/uwp/design/in-app-help/external-help", - "redirect_document_id": true + "source_path": "uwp/xbox-live/xbox-live-rest/uri/dvr/uri-uriput.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/dvr/uri-uriput", + "redirect_document_id": false }, { - "source_path": "uwp/in-app-help/guidelines-for-app-help.md", - "redirect_url": "/windows/uwp/design/in-app-help/guidelines-for-app-help", - "redirect_document_id": true + "source_path": "uwp/xbox-live/xbox-live-rest/uri/dvr/uri-usersmescidclips.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/dvr/uri-usersmescidclips", + "redirect_document_id": false }, { - "source_path": "uwp/in-app-help/in-app-help.md", - "redirect_url": "/windows/uwp/design/in-app-help/in-app-help", - "redirect_document_id": true + "source_path": "uwp/xbox-live/xbox-live-rest/uri/dvr/uri-usersmescidclipsgameclipid.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/dvr/uri-usersmescidclipsgameclipid", + "redirect_document_id": false }, { - "source_path": "uwp/in-app-help/instructional-ui.md", - "redirect_url": "/windows/uwp/design/in-app-help/instructional-ui", - "redirect_document_id": true + "source_path": "uwp/xbox-live/xbox-live-rest/uri/dvr/uri-usersmescidclipsgameclipiddelete.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/dvr/uri-usersmescidclipsgameclipiddelete", + "redirect_document_id": false }, { - "source_path": "uwp/in-app-help/voice-and-tone.md", - "redirect_url": "/windows/uwp/design/style/writing-style", + "source_path": "uwp/xbox-live/xbox-live-rest/uri/dvr/uri-usersmescidclipsgameclipidpost.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/dvr/uri-usersmescidclipsgameclipidpost", "redirect_document_id": false }, { - "source_path": "uwp/design/style/voice-and-tone.md", - "redirect_url": "/windows/uwp/design/style/writing-style", - "redirect_document_id": true + "source_path": "uwp/xbox-live/xbox-live-rest/uri/dvr/uri-usersmescidclipspost.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/dvr/uri-usersmescidclipspost", + "redirect_document_id": false }, { - "source_path": "uwp/input-and-devices/access-keys.md", - "redirect_url": "/windows/uwp/design/input/access-keys", - "redirect_document_id": true + "source_path": "uwp/xbox-live/xbox-live-rest/uri/dvr/uri-usersowneridclips.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/dvr/uri-usersowneridclips", + "redirect_document_id": false }, { - "source_path": "uwp/input-and-devices/convert-ink-to-text.md", - "redirect_url": "/windows/uwp/design/input/convert-ink-to-text", - "redirect_document_id": true + "source_path": "uwp/xbox-live/xbox-live-rest/uri/dvr/uri-usersowneridclipsget.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/dvr/uri-usersowneridclipsget", + "redirect_document_id": false }, { - "source_path": "uwp/input-and-devices/custom-keyboard-interactions.md", - "redirect_url": "/windows/uwp/design/input/custom-keyboard-interactions", - "redirect_document_id": true + "source_path": "uwp/xbox-live/xbox-live-rest/uri/dvr/uri-usersowneridscidclipsgameclipid.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/dvr/uri-usersowneridscidclipsgameclipid", + "redirect_document_id": false }, { - "source_path": "uwp/input-and-devices/custom-text-input.md", - "redirect_url": "/windows/uwp/design/input/custom-text-input", - "redirect_document_id": true + "source_path": "uwp/xbox-live/xbox-live-rest/uri/dvr/uri-usersowneridscidclipsgameclipidget.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/dvr/uri-usersowneridscidclipsgameclipidget", + "redirect_document_id": false }, { - "source_path": "uwp/input-and-devices/define-custom-recognition-constraints.md", - "redirect_url": "/windows/uwp/design/input/define-custom-recognition-constraints", - "redirect_document_id": true + "source_path": "uwp/xbox-live/xbox-live-rest/uri/gamerpic/atoc-reference-gamerpic.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/gamerpic/atoc-reference-gamerpic", + "redirect_document_id": false }, { - "source_path": "uwp/input-and-devices/designing-for-tv.md", - "redirect_url": "/windows/uwp/design/devices/designing-for-tv", - "redirect_document_id": true + "source_path": "uwp/xbox-live/xbox-live-rest/uri/gamerpic/uri-usersmegamerpic.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/gamerpic/uri-usersmegamerpic", + "redirect_document_id": false }, { - "source_path": "uwp/input-and-devices/device-primer.md", - "redirect_url": "/windows/uwp/design/devices/index", - "redirect_document_id": true + "source_path": "uwp/xbox-live/xbox-live-rest/uri/gamerpic/uri-usersmegamerpicput.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/gamerpic/uri-usersmegamerpicput", + "redirect_document_id": false }, { - "source_path": "uwp/input-and-devices/enable-continuous-dictation.md", - "redirect_url": "/windows/uwp/design/input/enable-continuous-dictation", - "redirect_document_id": true + "source_path": "uwp/xbox-live/xbox-live-rest/uri/gsdk/atoc-gsdk-uri-reference.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/gsdk/atoc-gsdk-uri-reference", + "redirect_document_id": false }, { - "source_path": "uwp/input-and-devices/gamepad-and-remote-interactions.md", - "redirect_url": "/windows/uwp/design/input/gamepad-and-remote-interactions", - "redirect_document_id": true + "source_path": "uwp/xbox-live/xbox-live-rest/uri/gsdk/uri-qosservers-get.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/gsdk/uri-qosservers-get", + "redirect_document_id": false }, { - "source_path": "uwp/input-and-devices/guidelines-for-cross-slide.md", - "redirect_url": "/windows/uwp/design/input/guidelines-for-cross-slide", - "redirect_document_id": true + "source_path": "uwp/xbox-live/xbox-live-rest/uri/gsdk/uri-qosservers.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/gsdk/uri-qosservers", + "redirect_document_id": false }, { - "source_path": "uwp/input-and-devices/guidelines-for-optical-zoom.md", - "redirect_url": "/windows/uwp/design/input/guidelines-for-optical-zoom", - "redirect_document_id": true + "source_path": "uwp/xbox-live/xbox-live-rest/uri/gsdk/uri-titlestitleidclusters-post.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/gsdk/uri-titlestitleidclusters-post", + "redirect_document_id": false }, { - "source_path": "uwp/input-and-devices/guidelines-for-panning.md", - "redirect_url": "/windows/uwp/design/input/guidelines-for-panning", - "redirect_document_id": true + "source_path": "uwp/xbox-live/xbox-live-rest/uri/gsdk/uri-titlestitleidclusters.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/gsdk/uri-titlestitleidclusters", + "redirect_document_id": false }, { - "source_path": "uwp/input-and-devices/guidelines-for-rotation.md", - "redirect_url": "/windows/uwp/design/input/guidelines-for-rotation", - "redirect_document_id": true + "source_path": "uwp/xbox-live/xbox-live-rest/uri/gsdk/uri-titlestitleidsessionhosts-post.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/gsdk/uri-titlestitleidsessionhosts-post", + "redirect_document_id": false }, { - "source_path": "uwp/input-and-devices/guidelines-for-targeting.md", - "redirect_url": "/windows/uwp/design/input/guidelines-for-targeting", - "redirect_document_id": true + "source_path": "uwp/xbox-live/xbox-live-rest/uri/gsdk/uri-titlestitleidsessionhosts.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/gsdk/uri-titlestitleidsessionhosts", + "redirect_document_id": false }, { - "source_path": "uwp/input-and-devices/guidelines-for-textselection.md", - "redirect_url": "/windows/uwp/design/input/guidelines-for-textselection", - "redirect_document_id": true + "source_path": "uwp/xbox-live/xbox-live-rest/uri/gsdk/uri-titlestitleidsessionssessionidallocationstatus-get.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/gsdk/uri-titlestitleidsessionssessionidallocationstatus-get", + "redirect_document_id": false }, { - "source_path": "uwp/input-and-devices/guidelines-for-visualfeedback.md", - "redirect_url": "/windows/uwp/design/input/guidelines-for-visualfeedback", - "redirect_document_id": true + "source_path": "uwp/xbox-live/xbox-live-rest/uri/gsdk/uri-titlestitleidsessionssessionidallocationstatus.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/gsdk/uri-titlestitleidsessionssessionidallocationstatus", + "redirect_document_id": false }, { - "source_path": "uwp/input-and-devices/handle-pointer-input.md", - "redirect_url": "/windows/uwp/design/input/handle-pointer-input", - "redirect_document_id": true + "source_path": "uwp/xbox-live/xbox-live-rest/uri/gsdk/uri-titlestitleidvariants-post.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/gsdk/uri-titlestitleidvariants-post", + "redirect_document_id": false }, { - "source_path": "uwp/input-and-devices/identify-input-devices.md", - "redirect_url": "/windows/uwp/design/input/identify-input-devices", - "redirect_document_id": true + "source_path": "uwp/xbox-live/xbox-live-rest/uri/gsdk/uri-titlestitleidvariants.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/gsdk/uri-titlestitleidvariants", + "redirect_document_id": false }, { - "source_path": "uwp/input-and-devices/index.md", - "redirect_url": "/windows/uwp/design/input/index", - "redirect_document_id": true + "source_path": "uwp/xbox-live/xbox-live-rest/uri/leaderboard/atoc-reference-leaderboard.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/leaderboard/atoc-reference-leaderboard", + "redirect_document_id": false }, { - "source_path": "uwp/input-and-devices/ink-toolbar.md", - "redirect_url": "/windows/uwp/design/input/ink-toolbar", - "redirect_document_id": true + "source_path": "uwp/xbox-live/xbox-live-rest/uri/leaderboard/uri-scidsscidleaderboardsleaderboardname.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/leaderboard/uri-scidsscidleaderboardsleaderboardname", + "redirect_document_id": false }, { - "source_path": "uwp/input-and-devices/input-primer.md", - "redirect_url": "/windows/uwp/design/input/input-primer", - "redirect_document_id": true + "source_path": "uwp/xbox-live/xbox-live-rest/uri/leaderboard/uri-scidsscidleaderboardsleaderboardnameget.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/leaderboard/uri-scidsscidleaderboardsleaderboardnameget", + "redirect_document_id": false }, { - "source_path": "uwp/input-and-devices/keyboard-accelerators.md", - "redirect_url": "/windows/uwp/design/input/keyboard-accelerators", - "redirect_document_id": true + "source_path": "uwp/xbox-live/xbox-live-rest/uri/leaderboard/uri-scidsscidleaderboardsleaderboardnamegetvaluemetadata.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/leaderboard/uri-scidsscidleaderboardsleaderboardnamegetvaluemetadata", + "redirect_document_id": false }, { - "source_path": "uwp/input-and-devices/keyboard-events.md", - "redirect_url": "/windows/uwp/design/input/keyboard-events", - "redirect_document_id": true + "source_path": "uwp/xbox-live/xbox-live-rest/uri/leaderboard/uri-usersxuidscidstatnamepeople.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/leaderboard/uri-usersxuidscidstatnamepeople", + "redirect_document_id": false }, { - "source_path": "uwp/input-and-devices/keyboard-interactions.md", - "redirect_url": "/windows/uwp/design/input/keyboard-interactions", - "redirect_document_id": true + "source_path": "uwp/xbox-live/xbox-live-rest/uri/leaderboard/uri-usersxuidscidstatnamepeopleget.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/leaderboard/uri-usersxuidscidstatnamepeopleget", + "redirect_document_id": false }, { - "source_path": "uwp/input-and-devices/manage-issues-with-audio-input.md", - "redirect_url": "/windows/uwp/design/input/manage-issues-with-audio-input", - "redirect_document_id": true + "source_path": "uwp/xbox-live/xbox-live-rest/uri/lists/atoc-reference-lists.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/lists/atoc-reference-lists", + "redirect_document_id": false }, { - "source_path": "uwp/input-and-devices/managing-focus-navigation.md", - "redirect_url": "/windows/uwp/design/input/managing-focus-navigation", - "redirect_document_id": true + "source_path": "uwp/xbox-live/xbox-live-rest/uri/lists/uri-usersxuidlistspinslistname.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/lists/uri-usersxuidlistspinslistname", + "redirect_document_id": false }, { - "source_path": "uwp/input-and-devices/mouse-interactions.md", - "redirect_url": "/windows/uwp/design/input/mouse-interactions", - "redirect_document_id": true + "source_path": "uwp/xbox-live/xbox-live-rest/uri/lists/uri-usersxuidlistspinslistnamecontainsitems.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/lists/uri-usersxuidlistspinslistnamecontainsitems", + "redirect_document_id": false }, { - "source_path": "uwp/input-and-devices/multiple-input-design-guidelines.md", - "redirect_url": "/windows/uwp/design/input/multiple-input-design-guidelines", - "redirect_document_id": true + "source_path": "uwp/xbox-live/xbox-live-rest/uri/lists/uri-usersxuidlistspinslistnamecontainsitemspost.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/lists/uri-usersxuidlistspinslistnamecontainsitemspost", + "redirect_document_id": false }, { - "source_path": "uwp/input-and-devices/pen-and-stylus-interactions.md", - "redirect_url": "/windows/uwp/design/input/pen-and-stylus-interactions", - "redirect_document_id": true + "source_path": "uwp/xbox-live/xbox-live-rest/uri/lists/uri-usersxuidlistspinslistnamedelete.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/lists/uri-usersxuidlistspinslistnamedelete", + "redirect_document_id": false }, { - "source_path": "uwp/input-and-devices/respond-to-the-presence-of-the-touch-keyboard.md", - "redirect_url": "/windows/uwp/design/input/respond-to-the-presence-of-the-touch-keyboard", - "redirect_document_id": true + "source_path": "uwp/xbox-live/xbox-live-rest/uri/lists/uri-usersxuidlistspinslistnameget.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/lists/uri-usersxuidlistspinslistnameget", + "redirect_document_id": false }, { - "source_path": "uwp/input-and-devices/save-and-load-ink.md", - "redirect_url": "/windows/uwp/design/input/save-and-load-ink", - "redirect_document_id": true + "source_path": "uwp/xbox-live/xbox-live-rest/uri/lists/uri-usersxuidlistspinslistnameindex.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/lists/uri-usersxuidlistspinslistnameindex", + "redirect_document_id": false }, { - "source_path": "uwp/input-and-devices/set-speech-recognition-timeouts.md", - "redirect_url": "/windows/uwp/design/input/set-speech-recognition-timeouts", - "redirect_document_id": true + "source_path": "uwp/xbox-live/xbox-live-rest/uri/lists/uri-usersxuidlistspinslistnameindexpost.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/lists/uri-usersxuidlistspinslistnameindexpost", + "redirect_document_id": false }, { - "source_path": "uwp/input-and-devices/specify-the-speech-recognizer-language.md", - "redirect_url": "/windows/uwp/design/input/specify-the-speech-recognizer-language", - "redirect_document_id": true + "source_path": "uwp/xbox-live/xbox-live-rest/uri/lists/uri-usersxuidlistspinslistnamepost.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/lists/uri-usersxuidlistspinslistnamepost", + "redirect_document_id": false }, { - "source_path": "uwp/input-and-devices/speech-interactions.md", - "redirect_url": "/windows/uwp/design/input/speech-interactions", - "redirect_document_id": true + "source_path": "uwp/xbox-live/xbox-live-rest/uri/lists/uri-usersxuidlistspinslistnameput.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/lists/uri-usersxuidlistspinslistnameput", + "redirect_document_id": false }, { - "source_path": "uwp/input-and-devices/speech-recognition.md", - "redirect_url": "/windows/uwp/design/input/speech-recognition", - "redirect_document_id": true + "source_path": "uwp/xbox-live/xbox-live-rest/uri/lists/uri-usersxuidlistspinslistnameremoveitems.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/lists/uri-usersxuidlistspinslistnameremoveitems", + "redirect_document_id": false }, { - "source_path": "uwp/input-and-devices/touch-interactions.md", - "redirect_url": "/windows/uwp/design/input/touch-interactions", - "redirect_document_id": true + "source_path": "uwp/xbox-live/xbox-live-rest/uri/lists/uri-usersxuidlistspinslistnameremoveitemsdelete.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/lists/uri-usersxuidlistspinslistnameremoveitemsdelete", + "redirect_document_id": false }, { - "source_path": "uwp/input-and-devices/touchpad-interactions.md", - "redirect_url": "/windows/uwp/design/input/touchpad-interactions", - "redirect_document_id": true + "source_path": "uwp/xbox-live/xbox-live-rest/uri/lists/uri-usersxuidlistspinslistnameremoveitemspost.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/lists/uri-usersxuidlistspinslistnameremoveitemspost", + "redirect_document_id": false }, { - "source_path": "uwp/input-and-devices/use-input-scope-to-change-the-touch-keyboard.md", - "redirect_url": "/windows/uwp/design/input/use-input-scope-to-change-the-touch-keyboard", - "redirect_document_id": true + "source_path": "uwp/xbox-live/xbox-live-rest/uri/marketplace/atoc-reference-marketplace.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/marketplace/atoc-reference-marketplace", + "redirect_document_id": false }, { - "source_path": "uwp/input-and-devices/windows-wheel-interactions.md", - "redirect_url": "/windows/uwp/design/input/windows-wheel-interactions", - "redirect_document_id": true + "source_path": "uwp/xbox-live/xbox-live-rest/uri/marketplace/uri-inventory.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/marketplace/uri-inventory", + "redirect_document_id": false }, { - "source_path": "uwp/layout/alignment-margin-padding.md", - "redirect_url": "/windows/uwp/design/layout/alignment-margin-padding", - "redirect_document_id": true + "source_path": "uwp/xbox-live/xbox-live-rest/uri/marketplace/uri-inventoryconsumablesitemurl.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/marketplace/uri-inventoryconsumablesitemurl", + "redirect_document_id": false }, { - "source_path": "uwp/layout/boxpanel-example-custom-panel.md", - "redirect_url": "/windows/uwp/design/layout/boxpanel-example-custom-panel", - "redirect_document_id": true + "source_path": "uwp/xbox-live/xbox-live-rest/uri/marketplace/uri-inventoryconsumablesitemurlpost.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/marketplace/uri-inventoryconsumablesitemurlpost", + "redirect_document_id": false }, { - "source_path": "uwp/layout/commanding-basics.md", - "redirect_url": "/windows/uwp/design/basics/commanding-basics", - "redirect_document_id": true + "source_path": "uwp/xbox-live/xbox-live-rest/uri/marketplace/uri-inventoryget.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/marketplace/uri-inventoryget", + "redirect_document_id": false }, { - "source_path": "uwp/layout/content-as-objects.md", - "redirect_url": "/windows/uwp/design", + "source_path": "uwp/xbox-live/xbox-live-rest/uri/marketplace/uri-inventoryitemurl.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/marketplace/uri-inventoryitemurl", "redirect_document_id": false }, { - "source_path": "uwp/layout/content-basics.md", - "redirect_url": "/windows/uwp/design/basics/content-basics", - "redirect_document_id": true + "source_path": "uwp/xbox-live/xbox-live-rest/uri/marketplace/uri-inventoryitemurlget.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/marketplace/uri-inventoryitemurlget", + "redirect_document_id": false }, { - "source_path": "uwp/layout/custom-panels-overview.md", - "redirect_url": "/windows/uwp/design/layout/custom-panels-overview", - "redirect_document_id": true + "source_path": "uwp/xbox-live/xbox-live-rest/uri/marketplace/uri-localecrossmediagroupsearch.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/marketplace/uri-localecrossmediagroupsearch", + "redirect_document_id": false }, { - "source_path": "uwp/layout/design-and-ui-intro.md", - "redirect_url": "/windows/uwp/design/basics/design-and-ui-intro", - "redirect_document_id": true + "source_path": "uwp/xbox-live/xbox-live-rest/uri/marketplace/uri-localecrossmediagroupsearchget.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/marketplace/uri-localecrossmediagroupsearchget", + "redirect_document_id": false }, { - "source_path": "uwp/layout/grid-tutorial.md", - "redirect_url": "/windows/uwp/design/layout/grid-tutorial", - "redirect_document_id": true + "source_path": "uwp/xbox-live/xbox-live-rest/uri/marketplace/uri-medialocalebrowse.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/marketplace/uri-medialocalebrowse", + "redirect_document_id": false }, { - "source_path": "uwp/layout/index.md", - "redirect_url": "/windows/uwp/design/layout/index", - "redirect_document_id": true + "source_path": "uwp/xbox-live/xbox-live-rest/uri/marketplace/uri-medialocalebrowseget.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/marketplace/uri-medialocalebrowseget", + "redirect_document_id": false }, { - "source_path": "uwp/layout/layout-panels.md", - "redirect_url": "/windows/uwp/design/layout/layout-panels", - "redirect_document_id": true + "source_path": "uwp/xbox-live/xbox-live-rest/uri/marketplace/uri-medialocalecontentrating.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/marketplace/uri-medialocalecontentrating", + "redirect_document_id": false }, { - "source_path": "uwp/layout/layouts-with-xaml.md", - "redirect_url": "/windows/uwp/design/layout/layouts-with-xaml", - "redirect_document_id": true + "source_path": "uwp/xbox-live/xbox-live-rest/uri/marketplace/uri-medialocalecontentratingget.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/marketplace/uri-medialocalecontentratingget", + "redirect_document_id": false }, { - "source_path": "uwp/layout/navigate-between-two-pages.md", - "redirect_url": "/windows/uwp/design/basics/navigate-between-two-pages", - "redirect_document_id": true + "source_path": "uwp/xbox-live/xbox-live-rest/uri/marketplace/uri-medialocaledetails.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/marketplace/uri-medialocaledetails", + "redirect_document_id": false }, { - "source_path": "uwp/layout/navigation-basics.md", - "redirect_url": "/windows/uwp/design/basics/navigation-basics", - "redirect_document_id": true + "source_path": "uwp/xbox-live/xbox-live-rest/uri/marketplace/uri-medialocaledetailsget.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/marketplace/uri-medialocaledetailsget", + "redirect_document_id": false }, { - "source_path": "uwp/layout/navigation-history-and-backwards-navigation.md", - "redirect_url": "/windows/uwp/design/basics/navigation-history-and-backwards-navigation", - "redirect_document_id": true + "source_path": "uwp/xbox-live/xbox-live-rest/uri/marketplace/uri-medialocalefields.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/marketplace/uri-medialocalefields", + "redirect_document_id": false }, { - "source_path": "uwp/layout/screen-sizes-and-breakpoints-for-responsive-design.md", - "redirect_url": "/windows/uwp/design/layout/screen-sizes-and-breakpoints-for-responsive-design", - "redirect_document_id": true + "source_path": "uwp/xbox-live/xbox-live-rest/uri/marketplace/uri-medialocalefieldsget.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/marketplace/uri-medialocalefieldsget", + "redirect_document_id": false }, { - "source_path": "uwp/layout/show-multiple-views.md", - "redirect_url": "/windows/uwp/design/layout/show-multiple-views", - "redirect_document_id": true + "source_path": "uwp/xbox-live/xbox-live-rest/uri/marketplace/uri-medialocalemediaitemtypequeryrefinersubqueryrefinervalues.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/marketplace/uri-medialocalemediaitemtypequeryrefinersubqueryrefinervalues", + "redirect_document_id": false }, { - "source_path": "uwp/style/acrylic.md", - "redirect_url": "/windows/uwp/design/style/acrylic", - "redirect_document_id": true + "source_path": "uwp/xbox-live/xbox-live-rest/uri/marketplace/uri-medialocalemediaitemtypequeryrefinersubqueryrefinervaluesget.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/marketplace/uri-medialocalemediaitemtypequeryrefinersubqueryrefinervaluesget", + "redirect_document_id": false }, { - "source_path": "uwp/style/balancing-style-and-consistency.md", - "redirect_url": "/windows/uwp/design/style/balancing-style-and-consistency", - "redirect_document_id": true + "source_path": "uwp/xbox-live/xbox-live-rest/uri/marketplace/uri-medialocalemetadatamediagroups.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/marketplace/uri-medialocalemetadatamediagroups", + "redirect_document_id": false }, { - "source_path": "uwp/style/color.md", - "redirect_url": "/windows/uwp/design/style/color", - "redirect_document_id": true + "source_path": "uwp/xbox-live/xbox-live-rest/uri/marketplace/uri-medialocalemetadatamediagroupsget.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/marketplace/uri-medialocalemetadatamediagroupsget", + "redirect_document_id": false }, { - "source_path": "uwp/style/connected-animation.md", - "redirect_url": "/windows/uwp/design/motion/connected-animation", - "redirect_document_id": true + "source_path": "uwp/xbox-live/xbox-live-rest/uri/marketplace/uri-medialocalemetadatamediagroupsmediaitemtypes.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/marketplace/uri-medialocalemetadatamediagroupsmediaitemtypes", + "redirect_document_id": false }, { - "source_path": "uwp/style/content-transition-animations.md", - "redirect_url": "/windows/uwp/design/motion/content-transition-animations", - "redirect_document_id": true + "source_path": "uwp/xbox-live/xbox-live-rest/uri/marketplace/uri-medialocalemetadatamediagroupsmediaitemtypesget.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/marketplace/uri-medialocalemetadatamediagroupsmediaitemtypesget", + "redirect_document_id": false }, { - "source_path": "uwp/style/icons.md", - "redirect_url": "/windows/uwp/design/style/icons", - "redirect_document_id": true + "source_path": "uwp/xbox-live/xbox-live-rest/uri/marketplace/uri-medialocalemetadatamediaitemtypefields.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/marketplace/uri-medialocalemetadatamediaitemtypefields", + "redirect_document_id": false }, { - "source_path": "uwp/style/index.md", - "redirect_url": "/windows/uwp/design/style/index", - "redirect_document_id": true + "source_path": "uwp/xbox-live/xbox-live-rest/uri/marketplace/uri-medialocalemetadatamediaitemtypefieldsget.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/marketplace/uri-medialocalemetadatamediaitemtypefieldsget", + "redirect_document_id": false }, { - "source_path": "uwp/style/motion-dragdrop.md", - "redirect_url": "/windows/uwp/design/motion/motion-dragdrop", - "redirect_document_id": true + "source_path": "uwp/xbox-live/xbox-live-rest/uri/marketplace/uri-medialocalemetadatamediaitemtypequeryrefiners.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/marketplace/uri-medialocalemetadatamediaitemtypequeryrefiners", + "redirect_document_id": false }, { - "source_path": "uwp/style/motion-edgebased.md", - "redirect_url": "/windows/uwp/design/motion/motion-edgebased", - "redirect_document_id": true + "source_path": "uwp/xbox-live/xbox-live-rest/uri/marketplace/uri-medialocalemetadatamediaitemtypequeryrefinersget.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/marketplace/uri-medialocalemetadatamediaitemtypequeryrefinersget", + "redirect_document_id": false }, { - "source_path": "uwp/style/motion-fade.md", - "redirect_url": "/windows/uwp/design/motion/motion-fade", - "redirect_document_id": true + "source_path": "uwp/xbox-live/xbox-live-rest/uri/marketplace/uri-medialocalemetadatamediaitemtypequeryrefinersqueryrefinername.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/marketplace/uri-medialocalemetadatamediaitemtypequeryrefinersqueryrefinername", + "redirect_document_id": false }, { - "source_path": "uwp/style/motion-list.md", - "redirect_url": "/windows/uwp/design/motion/motion-list", - "redirect_document_id": true + "source_path": "uwp/xbox-live/xbox-live-rest/uri/marketplace/uri-medialocalemetadatamediaitemtypequeryrefinersqueryrefinernameget.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/marketplace/uri-medialocalemetadatamediaitemtypequeryrefinersqueryrefinernameget", + "redirect_document_id": false }, { - "source_path": "uwp/style/motion-pointer.md", - "redirect_url": "/windows/uwp/design/motion/motion-pointer", - "redirect_document_id": true + "source_path": "uwp/xbox-live/xbox-live-rest/uri/marketplace/uri-medialocalemetadatamediaitemtypes.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/marketplace/uri-medialocalemetadatamediaitemtypes", + "redirect_document_id": false }, { - "source_path": "uwp/style/motion-popup-animations.md", - "redirect_url": "/windows/uwp/design/motion/motion-popup-animations", - "redirect_document_id": true + "source_path": "uwp/xbox-live/xbox-live-rest/uri/marketplace/uri-medialocalemetadatamediaitemtypesget.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/marketplace/uri-medialocalemetadatamediaitemtypesget", + "redirect_document_id": false }, { - "source_path": "uwp/style/motion-reposition.md", - "redirect_url": "/windows/uwp/design/motion/motion-reposition", - "redirect_document_id": true + "source_path": "uwp/xbox-live/xbox-live-rest/uri/marketplace/uri-medialocalemetadatamediaitemtypesortorders.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/marketplace/uri-medialocalemetadatamediaitemtypesortorders", + "redirect_document_id": false }, { - "source_path": "uwp/style/motion.md", - "redirect_url": "/windows/uwp/design/motion/index", - "redirect_document_id": true + "source_path": "uwp/xbox-live/xbox-live-rest/uri/marketplace/uri-medialocalemetadatamediaitemtypesortordersget.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/marketplace/uri-medialocalemetadatamediaitemtypesortordersget", + "redirect_document_id": false }, { - "source_path": "uwp/style/parallax.md", - "redirect_url": "/windows/uwp/design/motion/parallax", - "redirect_document_id": true + "source_path": "uwp/xbox-live/xbox-live-rest/uri/marketplace/uri-medialocalesinglemediagroupsearch.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/marketplace/uri-medialocalesinglemediagroupsearch", + "redirect_document_id": false }, { - "source_path": "uwp/style/reveal.md", - "redirect_url": "/windows/uwp/design/style/index", + "source_path": "uwp/xbox-live/xbox-live-rest/uri/marketplace/uri-medialocalesinglemediagroupsearchget.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/marketplace/uri-medialocalesinglemediagroupsearchget", "redirect_document_id": false }, { - "source_path": "uwp/design/style/reveal.md", - "redirect_url": "/windows/uwp/design/style/index", + "source_path": "uwp/xbox-live/xbox-live-rest/uri/matchtickets/atoc-reference-matchtickets.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/matchtickets/atoc-reference-matchtickets", "redirect_document_id": false }, { - "source_path": "uwp/style/segoe-ui-symbol-font.md", - "redirect_url": "/windows/uwp/design/style/segoe-ui-symbol-font", - "redirect_document_id": true + "source_path": "uwp/xbox-live/xbox-live-rest/uri/matchtickets/uri-scidhoppernameticketid.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/matchtickets/uri-scidhoppernameticketid", + "redirect_document_id": false }, { - "source_path": "uwp/style/sound.md", - "redirect_url": "/windows/uwp/design/style/sound", - "redirect_document_id": true + "source_path": "uwp/xbox-live/xbox-live-rest/uri/matchtickets/uri-scidhoppernameticketiddelete.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/matchtickets/uri-scidhoppernameticketiddelete", + "redirect_document_id": false }, { - "source_path": "uwp/style/title-bar.md", - "redirect_url": "/windows/uwp/design/shell/title-bar", - "redirect_document_id": true + "source_path": "uwp/xbox-live/xbox-live-rest/uri/matchtickets/uri-serviceconfigsscidhoppershoppername.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/matchtickets/uri-serviceconfigsscidhoppershoppername", + "redirect_document_id": false }, { - "source_path": "uwp/design/style/fonts.md", - "redirect_url": "/windows/uwp/design/style/typography", - "redirect_document_id": true + "source_path": "uwp/xbox-live/xbox-live-rest/uri/matchtickets/uri-serviceconfigsscidhoppershoppernamepost.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/matchtickets/uri-serviceconfigsscidhoppershoppernamepost", + "redirect_document_id": false }, { - "source_path": "uwp/usability/index.md", - "redirect_url": "/windows/uwp/design/usability/index", - "redirect_document_id": true + "source_path": "uwp/xbox-live/xbox-live-rest/uri/matchtickets/uri-serviceconfigsscidhoppershoppernamestats.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/matchtickets/uri-serviceconfigsscidhoppershoppernamestats", + "redirect_document_id": false }, { - "source_path": "uwp/globalizing/adjust-layout-and-fonts--and-support-rtl.md", - "redirect_url": "/windows/uwp/design/globalizing/adjust-layout-and-fonts--and-support-rtl", - "redirect_document_id": true + "source_path": "uwp/xbox-live/xbox-live-rest/uri/matchtickets/uri-serviceconfigsscidhoppershoppernamestatsget.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/matchtickets/uri-serviceconfigsscidhoppershoppernamestatsget", + "redirect_document_id": false }, { - "source_path": "uwp/globalizing/glob-numeralsystem-values.md", - "redirect_url": "/windows/uwp/design/globalizing/glob-numeralsystem-values", - "redirect_document_id": true + "source_path": "uwp/xbox-live/xbox-live-rest/uri/people/atoc-reference-people.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/people/atoc-reference-people", + "redirect_document_id": false }, { - "source_path": "uwp/globalizing/globalizing-portal.md", - "redirect_url": "/windows/uwp/design/globalizing/globalizing-portal", - "redirect_document_id": true + "source_path": "uwp/xbox-live/xbox-live-rest/uri/people/uri-usersowneridpeople.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/people/uri-usersowneridpeople", + "redirect_document_id": false }, { - "source_path": "uwp/globalizing/guidelines-and-checklist-for-globalizing-your-app.md", - "redirect_url": "/windows/uwp/design/globalizing/guidelines-and-checklist-for-globalizing-your-app", - "redirect_document_id": true + "source_path": "uwp/xbox-live/xbox-live-rest/uri/people/uri-usersowneridpeopleget.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/people/uri-usersowneridpeopleget", + "redirect_document_id": false }, { - "source_path": "uwp/globalizing/loc-international-fonts.md", - "redirect_url": "/windows/uwp/design/globalizing/loc-international-fonts", - "redirect_document_id": true + "source_path": "uwp/xbox-live/xbox-live-rest/uri/people/uri-usersowneridpeopletargetid.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/people/uri-usersowneridpeopletargetid", + "redirect_document_id": false }, { - "source_path": "uwp/globalizing/manage-language-and-region.md", - "redirect_url": "/windows/uwp/design/globalizing/manage-language-and-region", - "redirect_document_id": true + "source_path": "uwp/xbox-live/xbox-live-rest/uri/people/uri-usersowneridpeopletargetidget.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/people/uri-usersowneridpeopletargetidget", + "redirect_document_id": false }, { - "source_path": "uwp/globalizing/prepare-your-app-for-localization.md", - "redirect_url": "/windows/uwp/design/globalizing/prepare-your-app-for-localization", - "redirect_document_id": true + "source_path": "uwp/xbox-live/xbox-live-rest/uri/people/uri-usersowneridpeoplexuids.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/people/uri-usersowneridpeoplexuids", + "redirect_document_id": false }, { - "source_path": "uwp/globalizing/use-global-ready-formats.md", - "redirect_url": "/windows/uwp/design/globalizing/use-global-ready-formats", - "redirect_document_id": true + "source_path": "uwp/xbox-live/xbox-live-rest/uri/people/uri-usersowneridpeoplexuidspost.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/people/uri-usersowneridpeoplexuidspost", + "redirect_document_id": false }, { - "source_path": "uwp/globalizing/use-patterns-to-format-dates-and-times.md", - "redirect_url": "/windows/uwp/design/globalizing/use-patterns-to-format-dates-and-times", - "redirect_document_id": true + "source_path": "uwp/xbox-live/xbox-live-rest/uri/people/uri-usersowneridsummary.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/people/uri-usersowneridsummary", + "redirect_document_id": false }, { - "source_path": "uwp/data-access/entity-framework-7-with-sqlite-for-csharp-apps.md", - "redirect_url": "/ef/core/get-started/uwp/getting-started", + "source_path": "uwp/xbox-live/xbox-live-rest/uri/people/uri-usersowneridsummaryget.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/people/uri-usersowneridsummaryget", "redirect_document_id": false }, { - "source_path": "uwp/app-resources/tile-toast-language-scale-contrast.md", - "redirect_url": "/windows/uwp/design/shell/tiles-and-notifications/tile-toast-language-scale-contrast", + "source_path": "uwp/xbox-live/xbox-live-rest/uri/presence/atoc-reference-presence.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/presence/atoc-reference-presence", "redirect_document_id": false }, { - "source_path": "uwp/graphics/using-brushes.md", - "redirect_url": "/windows/uwp/design/style/brushes", + "source_path": "uwp/xbox-live/xbox-live-rest/uri/presence/uri-usersbatch.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/presence/uri-usersbatch", "redirect_document_id": false }, { - "source_path": "uwp/graphics/animations-overview.md", - "redirect_url": "/windows/uwp/design/motion/xaml-animation", + "source_path": "uwp/xbox-live/xbox-live-rest/uri/presence/uri-usersbatchpost.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/presence/uri-usersbatchpost", "redirect_document_id": false }, { - "source_path": "uwp/graphics/storyboarded-animations.md", - "redirect_url": "/windows/uwp/design/motion/storyboarded-animations", + "source_path": "uwp/xbox-live/xbox-live-rest/uri/presence/uri-usersme.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/presence/uri-usersme", "redirect_document_id": false }, { - "source_path": "uwp/graphics/key-frame-and-easing-function-animations.md", - "redirect_url": "/windows/uwp/design/motion/key-frame-and-easing-function-animations", + "source_path": "uwp/xbox-live/xbox-live-rest/uri/presence/uri-usersmeget.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/presence/uri-usersmeget", "redirect_document_id": false }, { - "source_path": "uwp/graphics/drawing-shapes.md", - "redirect_url": "/windows/uwp/design/controls-and-patterns/shapes", + "source_path": "uwp/xbox-live/xbox-live-rest/uri/presence/uri-usersmegroupsmoniker.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/presence/uri-usersmegroupsmoniker", "redirect_document_id": false }, { - "source_path": "uwp/graphics/transforms-overview.md", - "redirect_url": "/windows/uwp/design/layout/transforms", + "source_path": "uwp/xbox-live/xbox-live-rest/uri/presence/uri-usersmegroupsmonikerget.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/presence/uri-usersmegroupsmonikerget", "redirect_document_id": false }, { - "source_path": "uwp/graphics/3-d-perspective-effects.md", - "redirect_url": "/windows/uwp/design/layout/3-d-perspective-effects", + "source_path": "uwp/xbox-live/xbox-live-rest/uri/presence/uri-usersxuid.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/presence/uri-usersxuid", "redirect_document_id": false }, { - "source_path": "uwp/graphics/index.md", - "redirect_url": "/windows/uwp/design/style", + "source_path": "uwp/xbox-live/xbox-live-rest/uri/presence/uri-usersxuiddevicescurrenttitlescurrent.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/presence/uri-usersxuiddevicescurrenttitlescurrent", "redirect_document_id": false }, { - "source_path": "uwp/debug-test-perf/device-portal-xbox.md", - "redirect_url": "/windows/uwp/xbox-apps/device-portal-xbox", - "redirect_document_id": true + "source_path": "uwp/xbox-live/xbox-live-rest/uri/presence/uri-usersxuiddevicescurrenttitlescurrentdelete.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/presence/uri-usersxuiddevicescurrenttitlescurrentdelete", + "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/social-platform/people-system/xbox-360-friends-backward-compatibility.md", - "redirect_url": "/gaming/xbox-live/social-platform/people-system/people-system_nav", + "source_path": "uwp/xbox-live/xbox-live-rest/uri/presence/uri-usersxuiddevicescurrenttitlescurrentpost.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/presence/uri-usersxuiddevicescurrenttitlescurrentpost", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/get-started-with-creators/sign-in-to-xbox-live-in-unity.md", - "redirect_url": "/gaming/xbox-live/get-started/setup-ide/creators/unity-win10/signin/unity-signin_nav", + "source_path": "uwp/xbox-live/xbox-live-rest/uri/presence/uri-usersxuidget.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/presence/uri-usersxuidget", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/multiplayer/xbox-integrated-multiplayer-overview.md", - "redirect_url": "/gaming/xbox-live/multiplayer/xbox-integrated-multiplayer/xbox-integrated-multiplayer", + "source_path": "uwp/xbox-live/xbox-live-rest/uri/presence/uri-usersxuidgroupsmoniker.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/presence/uri-usersxuidgroupsmoniker", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/storage-platform/connected-storage/connected-storage-clearing.md", - "redirect_url": "/windows/uwp/xbox-live/storage-platform/connected-storage/connected-storage-xb-storage", - "redirect_document_id": true + "source_path": "uwp/xbox-live/xbox-live-rest/uri/presence/uri-usersxuidgroupsmonikerbroadcasting.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/presence/uri-usersxuidgroupsmonikerbroadcasting", + "redirect_document_id": false }, { - "source_path": "uwp/design/input/custom-keyboard-interactions.md", - "redirect_url": "/windows/uwp/design/input/focus-navigation", - "redirect_document_id": true + "source_path": "uwp/xbox-live/xbox-live-rest/uri/presence/uri-usersxuidgroupsmonikerbroadcastingcount.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/presence/uri-usersxuidgroupsmonikerbroadcastingcount", + "redirect_document_id": false }, { - "source_path": "uwp/design/input/managing-focus-navigation.md", - "redirect_url": "/windows/uwp/design/input/focus-navigation-programmatic", - "redirect_document_id": true + "source_path": "uwp/xbox-live/xbox-live-rest/uri/presence/uri-usersxuidgroupsmonikerbroadcastingcountget.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/presence/uri-usersxuidgroupsmonikerbroadcastingcountget", + "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/social-platform/people-system/privacy-and-people-i-know.md", - "redirect_url": "/windows/uwp/xbox-live/social-platform/people-system/xbox-live-people-system", - "redirect_document_id": true + "source_path": "uwp/xbox-live/xbox-live-rest/uri/presence/uri-usersxuidgroupsmonikerbroadcastingget.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/presence/uri-usersxuidgroupsmonikerbroadcastingget", + "redirect_document_id": false }, { - "source_path": "uwp/get-started/whats-a-uwp.md", - "redirect_url": "/windows/uwp/get-started/universal-application-platform-guide", - "redirect_document_id": true + "source_path": "uwp/xbox-live/xbox-live-rest/uri/presence/uri-usersxuidgroupsmonikerget.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/presence/uri-usersxuidgroupsmonikerget", + "redirect_document_id": false }, { - "source_path": "uwp/porting/hwa-to-uwp-root.md", - "redirect_url": "/microsoft-edge/progressive-web-apps", + "source_path": "uwp/xbox-live/xbox-live-rest/uri/privacy/atoc-reference-privacyv2.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/privacy/atoc-reference-privacyv2", "redirect_document_id": false }, { - "source_path": "uwp/porting/hwa-access-features.md", - "redirect_url": "/microsoft-edge/progressive-web-apps", + "source_path": "uwp/xbox-live/xbox-live-rest/uri/privacy/uri-privacyusersowneridpeoplemute.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/privacy/uri-privacyusersowneridpeoplemute", "redirect_document_id": false }, { - "source_path": "uwp/porting/hwa-chrome-conversion.md", - "redirect_url": "/microsoft-edge/progressive-web-apps", + "source_path": "uwp/xbox-live/xbox-live-rest/uri/privacy/uri-privacyusersowneridpeoplemuteget.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/privacy/uri-privacyusersowneridpeoplemuteget", "redirect_document_id": false }, { - "source_path": "uwp/porting/hwa-create-mac.md", - "redirect_url": "/microsoft-edge/progressive-web-apps", + "source_path": "uwp/xbox-live/xbox-live-rest/uri/privacy/uri-privacyusersrequestoridpermissionvalidate.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/privacy/uri-privacyusersrequestoridpermissionvalidate", "redirect_document_id": false }, { - "source_path": "uwp/publish/resolve-package-upload-errors.md", - "redirect_url": "/windows/uwp/publish/upload-app-packages", + "source_path": "uwp/xbox-live/xbox-live-rest/uri/privacy/uri-privacyusersrequestoridpermissionvalidateget.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/privacy/uri-privacyusersrequestoridpermissionvalidateget", "redirect_document_id": false }, { - "source_path": "uwp/publish/manage-add-ons-in-bulk.md", - "redirect_url": "/windows/uwp/publish/add-on-submissions", + "source_path": "uwp/xbox-live/xbox-live-rest/uri/privacy/uri-privacyusersrequestoridpermissionvalidatepost.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/privacy/uri-privacyusersrequestoridpermissionvalidatepost", "redirect_document_id": false }, { - "source_path": "uwp/publish/associate-azure-ad-with-dev-center.md", - "redirect_url": "/windows/uwp/publish/associate-azure-ad-with-partner-center", + "source_path": "uwp/xbox-live/xbox-live-rest/uri/privacy/uri-privacyusersxuidpeopleavoid.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/privacy/uri-privacyusersxuidpeopleavoid", "redirect_document_id": false }, { - "source_path": "uwp/publish/managing-your-profile.md", - "redirect_url": "/partner-center/partner-center-account-setup", + "source_path": "uwp/xbox-live/xbox-live-rest/uri/privacy/uri-privacyusersxuidpeopleavoidget.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/privacy/uri-privacyusersxuidpeopleavoidget", "redirect_document_id": false }, { - "source_path": "uwp/publish/define-pricing-and-market-selection.md", - "redirect_url": "/windows/uwp/publish/define-market-selection", + "source_path": "uwp/xbox-live/xbox-live-rest/uri/profileV2/atoc-reference-profiles.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/profileV2/atoc-reference-profiles", "redirect_document_id": false }, { - "source_path": "uwp/publish/promote-your-app-report.md", - "redirect_url": "/windows/uwp/publish/ad-campaign-report", + "source_path": "uwp/xbox-live/xbox-live-rest/uri/profileV2/uri-usersbatchprofilesettings.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/profileV2/uri-usersbatchprofilesettings", "redirect_document_id": false }, { - "source_path": "uwp/publish/app-declarations.md", - "redirect_url": "/windows/uwp/publish/product-declarations", + "source_path": "uwp/xbox-live/xbox-live-rest/uri/profileV2/uri-usersbatchprofilesettingspost.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/profileV2/uri-usersbatchprofilesettingspost", "redirect_document_id": false }, { - "source_path": "uwp/porting/hwa-create-windows.md", - "redirect_url": "/microsoft-edge/progressive-web-apps", + "source_path": "uwp/xbox-live/xbox-live-rest/uri/profileV2/uri-usersuseridprofilesettingspeopleuserlist.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/profileV2/uri-usersuseridprofilesettingspeopleuserlist", "redirect_document_id": false }, { - "source_path": "uwp/design/controls-and-patterns/tabs-pivot.md", - "redirect_url": "/windows/uwp/design/controls-and-patterns/pivot", + "source_path": "uwp/xbox-live/xbox-live-rest/uri/profileV2/uri-usersuseridprofilesettingspeopleuserlistget.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/profileV2/uri-usersuseridprofilesettingspeopleuserlistget", "redirect_document_id": false }, { - "source_path": "uwp/design/controls-and-patterns/dialogs.md", - "redirect_url": "/windows/uwp/design/controls-and-patterns/dialogs-and-flyouts/index", - "redirect_document_id": true + "source_path": "uwp/xbox-live/xbox-live-rest/uri/reputation/atoc-reference-reputation.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/reputation/atoc-reference-reputation", + "redirect_document_id": false }, { - "source_path": "uwp/monetize/download-the-cab-file-for-an-oem-hardware-error.md", - "redirect_url": "/windows-hardware/drivers/dashboard/download-the-cab-file-for-an-oem-hardware-error", + "source_path": "uwp/xbox-live/xbox-live-rest/uri/reputation/uri-reputationusersbatchfeedback.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/reputation/uri-reputationusersbatchfeedback", "redirect_document_id": false }, { - "source_path": "uwp/monetize/download-the-cab-file-for-a-windows-10-driver-error.md", - "redirect_url": "/windows-hardware/drivers/dashboard/download-the-cab-file-for-a-windows-10-driver-error", + "source_path": "uwp/xbox-live/xbox-live-rest/uri/reputation/uri-reputationusersbatchfeedbackpost.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/reputation/uri-reputationusersbatchfeedbackpost", "redirect_document_id": false }, { - "source_path": "uwp/monetize/download-the-cab-file-for-a-windows-7-or-windows-8.x-driver-error.md", - "redirect_url": "/windows-hardware/drivers/dashboard/download-the-cab-file-for-a-windows-7-or-windows-8.x-driver-error", + "source_path": "uwp/xbox-live/xbox-live-rest/uri/reputation/uri-reputationusersxuidfeedback.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/reputation/uri-reputationusersxuidfeedback", "redirect_document_id": false }, { - "source_path": "uwp/monetize/get-details-for-an-oem-hardware-error.md", - "redirect_url": "/windows-hardware/drivers/dashboard/get-details-for-an-oem-hardware-error", + "source_path": "uwp/xbox-live/xbox-live-rest/uri/reputation/uri-reputationusersxuidfeedbackpost.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/reputation/uri-reputationusersxuidfeedbackpost", "redirect_document_id": false }, { - "source_path": "uwp/monetize/get-details-for-a-windows-10-driver-error.md", - "redirect_url": "/windows-hardware/drivers/dashboard/get-details-for-a-windows-10-driver-error", + "source_path": "uwp/xbox-live/xbox-live-rest/uri/reputation/uri-usersmeresetreputation.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/reputation/uri-usersmeresetreputation", "redirect_document_id": false }, { - "source_path": "uwp/monetize/get-details-for-a-windows-7-or-windows-8.x-driver-error.md", - "redirect_url": "/windows-hardware/drivers/dashboard/get-details-for-a-windows-7-or-windows-8.x-driver-error", + "source_path": "uwp/xbox-live/xbox-live-rest/uri/reputation/uri-usersmeresetreputationpost.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/reputation/uri-usersmeresetreputationpost", "redirect_document_id": false }, { - "source_path": "uwp/monetize/get-error-reporting-data-for-windows-10-drivers.md", - "redirect_url": "/windows-hardware/drivers/dashboard/get-error-reporting-data-for-windows-10-drivers", + "source_path": "uwp/xbox-live/xbox-live-rest/uri/reputation/uri-usersxuiddeleteuserdata.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/reputation/uri-usersxuiddeleteuserdata", "redirect_document_id": false }, { - "source_path": "uwp/monetize/get-error-reporting-data-for-windows-7-and-windows-8.x-drivers.md", - "redirect_url": "/windows-hardware/drivers/dashboard/get-error-reporting-data-for-windows-7-and-windows-8.x-drivers", + "source_path": "uwp/xbox-live/xbox-live-rest/uri/reputation/uri-usersxuiddeleteuserdatapost.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/reputation/uri-usersxuiddeleteuserdatapost", "redirect_document_id": false }, { - "source_path": "uwp/monetize/get-oem-hardware-error-reporting-data.md", - "redirect_url": "/windows-hardware/drivers/dashboard/get-oem-hardware-error-reporting-data", + "source_path": "uwp/xbox-live/xbox-live-rest/uri/reputation/uri-usersxuidresetreputation.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/reputation/uri-usersxuidresetreputation", "redirect_document_id": false }, { - "source_path": "uwp/machine-learning/index.md", - "redirect_url": "/windows/ai", + "source_path": "uwp/xbox-live/xbox-live-rest/uri/reputation/uri-usersxuidresetreputationpost.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/reputation/uri-usersxuidresetreputationpost", "redirect_document_id": false }, { - "source_path": "uwp/machine-learning/get-started.md", - "redirect_url": "/windows/ai", + "source_path": "uwp/xbox-live/xbox-live-rest/uri/sessiondirectory/atoc-reference-sessiondirectory.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/sessiondirectory/atoc-reference-sessiondirectory", "redirect_document_id": false }, { - "source_path": "uwp/machine-learning/overview.md", - "redirect_url": "/windows/ai", + "source_path": "uwp/xbox-live/xbox-live-rest/uri/sessiondirectory/uri-handles.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/sessiondirectory/uri-handles", "redirect_document_id": false }, { - "source_path": "uwp/machine-learning/conversion-samples.md", - "redirect_url": "/windows/ai/convert-model-winmltools", + "source_path": "uwp/xbox-live/xbox-live-rest/uri/sessiondirectory/uri-handleshandleid.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/sessiondirectory/uri-handleshandleid", "redirect_document_id": false }, { - "source_path": "uwp/machine-learning/integrate-model.md", - "redirect_url": "/windows/ai/integrate-model", + "source_path": "uwp/xbox-live/xbox-live-rest/uri/sessiondirectory/uri-handleshandleiddelete.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/sessiondirectory/uri-handleshandleiddelete", "redirect_document_id": false }, { - "source_path": "uwp/machine-learning/samples.md", - "redirect_url": "https://github.com/Microsoft/Windows-Machine-Learning", + "source_path": "uwp/xbox-live/xbox-live-rest/uri/sessiondirectory/uri-handleshandleidget.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/sessiondirectory/uri-handleshandleidget", "redirect_document_id": false }, { - "source_path": "uwp/machine-learning/train-ai-model.md", - "redirect_url": "/windows/ai/get-onnx-model", + "source_path": "uwp/xbox-live/xbox-live-rest/uri/sessiondirectory/uri-handleshandleidsession.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/sessiondirectory/uri-handleshandleidsession", "redirect_document_id": false }, { - "source_path": "uwp/composition/lighting.md", - "redirect_url": "/windows/uwp/composition/xaml-lighting", - "redirect_document_id": true - }, - { - "source_path": "uwp/devices-sensors/nfc.md", - "redirect_url": "/windows/uwp/devices-sensors/", + "source_path": "uwp/xbox-live/xbox-live-rest/uri/sessiondirectory/uri-handleshandleidsessionget.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/sessiondirectory/uri-handleshandleidsessionget", "redirect_document_id": false }, { - "source_path": "uwp/devices-sensors/generate-3mf.md", - "redirect_url": "/windows/uwp/devices-sensors/3d-generate-3mf", + "source_path": "uwp/xbox-live/xbox-live-rest/uri/sessiondirectory/uri-handleshandleidsessionput.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/sessiondirectory/uri-handleshandleidsessionput", "redirect_document_id": false }, { - "source_path": "uwp/devices-sensors/pos-advanced-connectivity.md", - "redirect_url": "/windows/uwp/devices-sensors/point-of-service", - "redirect_document_id": true + "source_path": "uwp/xbox-live/xbox-live-rest/uri/sessiondirectory/uri-handlespost.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/sessiondirectory/uri-handlespost", + "redirect_document_id": false }, { - "source_path": "uwp/devices-sensors/pos-barcodescanner-get-started.md", - "redirect_url": "/windows/uwp/devices-sensors/pos-barcodescanner-configure", - "redirect_document_id": true + "source_path": "uwp/xbox-live/xbox-live-rest/uri/sessiondirectory/uri-handlesquery.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/sessiondirectory/uri-handlesquery", + "redirect_document_id": false }, { - "source_path": "uwp/design/shell/tiles-and-notifications/app-assets.md", - "redirect_url": "/windows/apps/design/style/iconography/overview", + "source_path": "uwp/xbox-live/xbox-live-rest/uri/sessiondirectory/uri-handlesqueryincludepost.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/sessiondirectory/uri-handlesqueryincludepost", "redirect_document_id": false }, { - "source_path": "hub/apps/design/style/app-icons-and-logos.md", - "redirect_url": "/windows/apps/design/style/iconography/overview", - "redirect_document_id": true + "source_path": "uwp/xbox-live/xbox-live-rest/uri/sessiondirectory/uri-handlesquerypost.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/sessiondirectory/uri-handlesquerypost", + "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/configure-xbl/dev-center/data-sharing-udc.md", - "redirect_url": "/windows/uwp/xbox-live/configure-xbl/dev-center/access-policies-udc", - "redirect_document_id": true + "source_path": "uwp/xbox-live/xbox-live-rest/uri/sessiondirectory/uri-serviceconfigscidsessiontemplatessessiontemplatenamebatch.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/sessiondirectory/uri-serviceconfigscidsessiontemplatessessiontemplatenamebatch", + "redirect_document_id": false }, { - "source_path": "uwp/packaging/appinstaller-root.md", - "redirect_url": "/windows/msix/app-installer/app-installer-root", + "source_path": "uwp/xbox-live/xbox-live-rest/uri/sessiondirectory/uri-serviceconfigscidsessiontemplatessessiontemplatenamebatchpost.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/sessiondirectory/uri-serviceconfigscidsessiontemplatessessiontemplatenamebatchpost", "redirect_document_id": false }, { - "source_path": "uwp/packaging/create-appinstallerfile-vs.md", - "redirect_url": "/windows/msix/app-installer/create-appinstallerfile-vs", + "source_path": "uwp/xbox-live/xbox-live-rest/uri/sessiondirectory/uri-serviceconfigsscidbatch.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/sessiondirectory/uri-serviceconfigsscidbatch", "redirect_document_id": false }, { - "source_path": "uwp/packaging/installing-UWP-apps-web.md", - "redirect_url": "/windows/msix/app-installer/installing-windows10-apps-web", + "source_path": "uwp/xbox-live/xbox-live-rest/uri/sessiondirectory/uri-serviceconfigsscidbatchpost.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/sessiondirectory/uri-serviceconfigsscidbatchpost", "redirect_document_id": false }, { - "source_path": "uwp/packaging/install-related-set.md", - "redirect_url": "/windows/msix/app-installer/install-related-set", + "source_path": "uwp/xbox-live/xbox-live-rest/uri/sessiondirectory/uri-serviceconfigsscidsessions.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/sessiondirectory/uri-serviceconfigsscidsessions", "redirect_document_id": false }, { - "source_path": "uwp/packaging/troubleshoot-appinstaller-issues.md", - "redirect_url": "/windows/msix/app-installer/troubleshoot-appinstaller-issues", + "source_path": "uwp/xbox-live/xbox-live-rest/uri/sessiondirectory/uri-serviceconfigsscidsessionsget.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/sessiondirectory/uri-serviceconfigsscidsessionsget", "redirect_document_id": false }, { - "source_path": "uwp/packaging/web-install-azure.md", - "redirect_url": "/windows/msix/app-installer/web-install-azure", + "source_path": "uwp/xbox-live/xbox-live-rest/uri/sessiondirectory/uri-serviceconfigsscidsessiontemplates.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/sessiondirectory/uri-serviceconfigsscidsessiontemplates", "redirect_document_id": false }, { - "source_path": "uwp/packaging/web-install-IIS.md", - "redirect_url": "/windows/msix/app-installer/web-install-iis", + "source_path": "uwp/xbox-live/xbox-live-rest/uri/sessiondirectory/uri-serviceconfigsscidsessiontemplatesget.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/sessiondirectory/uri-serviceconfigsscidsessiontemplatesget", "redirect_document_id": false }, { - "source_path": "uwp/packaging/web-install-aws.md", - "redirect_url": "/windows/msix/app-installer/web-install-aws", + "source_path": "uwp/xbox-live/xbox-live-rest/uri/sessiondirectory/uri-serviceconfigsscidsessiontemplatessessiontemplatename.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/sessiondirectory/uri-serviceconfigsscidsessiontemplatessessiontemplatename", "redirect_document_id": false }, { - "source_path": "uwp/publish/dev-center-insider-program.md", - "redirect_url": "/windows/uwp/publish", + "source_path": "uwp/xbox-live/xbox-live-rest/uri/sessiondirectory/uri-serviceconfigsscidsessiontemplatessessiontemplatenameget.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/sessiondirectory/uri-serviceconfigsscidsessiontemplatessessiontemplatenameget", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/advanced-xbox-live-sandboxes.md", - "redirect_url": "/gaming/xbox-live/advanced-xbox-live-sandboxes", + "source_path": "uwp/xbox-live/xbox-live-rest/uri/sessiondirectory/uri-serviceconfigsscidsessiontemplatessessiontemplatenamesessionnamemembersindex.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/sessiondirectory/uri-serviceconfigsscidsessiontemplatessessiontemplatenamesessionnamemembersindex", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/developer-program-overview.md", - "redirect_url": "/gaming/gdk/_content/gc/live/get-started/live-getstarted-nav", + "source_path": "uwp/xbox-live/xbox-live-rest/uri/sessiondirectory/uri-serviceconfigsscidsessiontemplatessessiontemplatenamesessionnamemembersindexdelete.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/sessiondirectory/uri-serviceconfigsscidsessiontemplatessessiontemplatenamesessionnamemembersindexdelete", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/flatc-async-patterns.md", - "redirect_url": "/gaming/xbox-live/flatc-async-patterns", + "source_path": "uwp/xbox-live/xbox-live-rest/uri/sessiondirectory/uri-serviceconfigsscidsessiontemplatessessiontemplatenamesessionnamemembersservername.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/sessiondirectory/uri-serviceconfigsscidsessiontemplatessessiontemplatenamesessionnamemembersservername", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/index.md", - "redirect_url": "/gaming/xbox-live/index", + "source_path": "uwp/xbox-live/xbox-live-rest/uri/sessiondirectory/uri-serviceconfigsscidsessiontemplatessessiontemplatenamesessionnamemembersservernamedelete.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/sessiondirectory/uri-serviceconfigsscidsessiontemplatessessiontemplatenamesessionnamemembersservernamedelete", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/introduction-to-xbox-live-apis.md", - "redirect_url": "/gaming/xbox-live/introduction-to-xbox-live-apis", + "source_path": "uwp/xbox-live/xbox-live-rest/uri/sessiondirectory/uri-serviceconfigsscidsessiontemplatessessiontemplatenamesessions.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/sessiondirectory/uri-serviceconfigsscidsessiontemplatessessiontemplatenamesessions", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/samples.md", - "redirect_url": "/gaming/xbox-live/samples", + "source_path": "uwp/xbox-live/xbox-live-rest/uri/sessiondirectory/uri-serviceconfigsscidsessiontemplatessessiontemplatenamesessionsget.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/sessiondirectory/uri-serviceconfigsscidsessiontemplatessessiontemplatenamesessionsget", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/testing-on-console.md", - "redirect_url": "/gaming/xbox-live/testing-on-console", + "source_path": "uwp/xbox-live/xbox-live-rest/uri/sessiondirectory/uri-serviceconfigsscidsessiontemplatessessiontemplatenamesessionssessionname.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/sessiondirectory/uri-serviceconfigsscidsessiontemplatessessiontemplatenamesessionssessionname", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/what-is-xbox-live.md", - "redirect_url": "/gaming/xbox-live/get-started/what-is-xbox-live", + "source_path": "uwp/xbox-live/xbox-live-rest/uri/sessiondirectory/uri-serviceconfigsscidsessiontemplatessessiontemplatenamesessionssessionnameget.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/sessiondirectory/uri-serviceconfigsscidsessiontemplatessessiontemplatenamesessionssessionnameget", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-resources.md", - "redirect_url": "/gaming/xbox-live/xbox-live-resources", + "source_path": "uwp/xbox-live/xbox-live-rest/uri/sessiondirectory/uri-serviceconfigsscidsessiontemplatessessiontemplatenamesessionssessionnamemembersme.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/sessiondirectory/uri-serviceconfigsscidsessiontemplatessessiontemplatenamesessionssessionnamemembersme", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-sandboxes.md", - "redirect_url": "/gaming/xbox-live/xbox-live-sandboxes", + "source_path": "uwp/xbox-live/xbox-live-rest/uri/sessiondirectory/uri-serviceconfigsscidsessiontemplatessessiontemplatenamesessionssessionnamemembersmedelete.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/sessiondirectory/uri-serviceconfigsscidsessiontemplatessessiontemplatenamesessionssessionnamemembersmedelete", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-service-configuration.md", - "redirect_url": "/gaming/xbox-live/xbox-live-service-configuration", + "source_path": "uwp/xbox-live/xbox-live-rest/uri/sessiondirectory/uri-serviceconfigsscidsessiontemplatessessiontemplatenamesessionssessionnameput.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/sessiondirectory/uri-serviceconfigsscidsessiontemplatessessiontemplatenamesessionssessionnameput", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-test-accounts.md", - "redirect_url": "/gaming/xbox-live/xbox-live-test-accounts", + "source_path": "uwp/xbox-live/xbox-live-rest/uri/storage/atoc-reference-storagev2.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/storage/atoc-reference-storagev2", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live.md", - "redirect_url": "/gaming/xbox-live/", + "source_path": "uwp/xbox-live/xbox-live-rest/uri/storage/uri-globalscidsscid-get.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/storage/uri-globalscidsscid-get", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xboxlive-policies.md", - "redirect_url": "/gaming/xbox-live/xboxlive-policies", + "source_path": "uwp/xbox-live/xbox-live-rest/uri/storage/uri-globalscidsscid.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/storage/uri-globalscidsscid", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xboxservices-config.md", - "redirect_url": "/gaming/xbox-live/get-started/setup-ide/managed-partners/vs-win10/xboxservices-config", + "source_path": "uwp/xbox-live/xbox-live-rest/uri/storage/uri-globalscidssciddatapath-get.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/storage/uri-globalscidssciddatapath-get", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xsapi-flat-c.md", - "redirect_url": "/gaming/xbox-live/xsapi-flat-c", + "source_path": "uwp/xbox-live/xbox-live-rest/uri/storage/uri-globalscidssciddatapath.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/storage/uri-globalscidssciddatapath", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/achievements-2017/achievement-rewards.md", - "redirect_url": "/gaming/xbox-live/achievements-2017/achievement-rewards", + "source_path": "uwp/xbox-live/xbox-live-rest/uri/storage/uri-globalscidssciddatapathandfilenametype-get.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/storage/uri-globalscidssciddatapathandfilenametype-get", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/achievements-2017/achievements.md", - "redirect_url": "/gaming/xbox-live/achievements-2017/achievements_nav", + "source_path": "uwp/xbox-live/xbox-live-rest/uri/storage/uri-globalscidssciddatapathandfilenametype.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/storage/uri-globalscidssciddatapathandfilenametype", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/achievements-2017/simplified-achievements.md", - "redirect_url": "/gaming/xbox-live/achievements-2017/simplified-achievements", + "source_path": "uwp/xbox-live/xbox-live-rest/uri/storage/uri-jsonusersbatchscidssciddatapathandfilenametype-post.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/storage/uri-jsonusersbatchscidssciddatapathandfilenametype-post", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/configure-xbl/windows-dev-center.md", - "redirect_url": "/gaming/xbox-live/get-started/setup-partner-center/setup-partner-center_nav", + "source_path": "uwp/xbox-live/xbox-live-rest/uri/storage/uri-jsonusersbatchscidssciddatapathandfilenametype.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/storage/uri-jsonusersbatchscidssciddatapathandfilenametype", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/configure-xbl/dev-center/access-policies-udc.md", - "redirect_url": "/gaming/xbox-live/configure-xbl/dev-center/access-policies-udc", + "source_path": "uwp/xbox-live/xbox-live-rest/uri/storage/uri-jsonusersxuidscidsscid-get.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/storage/uri-jsonusersxuidscidsscid-get", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/configure-xbl/dev-center/achievements-in-udc.md", - "redirect_url": "/gaming/xbox-live/configure-xbl/dev-center/achievements-in-udc", + "source_path": "uwp/xbox-live/xbox-live-rest/uri/storage/uri-jsonusersxuidscidsscid.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/storage/uri-jsonusersxuidscidsscid", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/configure-xbl/dev-center/featured-stats-and-leaderboards.md", - "redirect_url": "/gaming/xbox-live/configure-xbl/dev-center/featured-stats-and-leaderboards", + "source_path": "uwp/xbox-live/xbox-live-rest/uri/storage/uri-jsonusersxuidscidssciddatapath-get.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/storage/uri-jsonusersxuidscidssciddatapath-get", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/configure-xbl/dev-center/game-dvr.md", - "redirect_url": "/gaming/xbox-live/configure-xbl/dev-center/game-dvr", + "source_path": "uwp/xbox-live/xbox-live-rest/uri/storage/uri-jsonusersxuidscidssciddatapath.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/storage/uri-jsonusersxuidscidssciddatapath", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/configure-xbl/dev-center/localized-strings.md", - "redirect_url": "/gaming/xbox-live/configure-xbl/dev-center/localized-strings", + "source_path": "uwp/xbox-live/xbox-live-rest/uri/storage/uri-jsonusersxuidscidssciddatapathandfilenametype-delete.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/storage/uri-jsonusersxuidscidssciddatapathandfilenametype-delete", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/configure-xbl/dev-center/privileges.md", - "redirect_url": "/gaming/xbox-live/configure-xbl/dev-center/privileges", + "source_path": "uwp/xbox-live/xbox-live-rest/uri/storage/uri-jsonusersxuidscidssciddatapathandfilenametype-get.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/storage/uri-jsonusersxuidscidssciddatapathandfilenametype-get", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/configure-xbl/dev-center/rich-presence-configuration.md", - "redirect_url": "/gaming/xbox-live/configure-xbl/dev-center/rich-presence-configuration", + "source_path": "uwp/xbox-live/xbox-live-rest/uri/storage/uri-jsonusersxuidscidssciddatapathandfilenametype-put.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/storage/uri-jsonusersxuidscidssciddatapathandfilenametype-put", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/configure-xbl/dev-center/single-sign-on.md", - "redirect_url": "/gaming/xbox-live/configure-xbl/dev-center/single-sign-on", + "source_path": "uwp/xbox-live/xbox-live-rest/uri/storage/uri-jsonusersxuidscidssciddatapathandfilenametype.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/storage/uri-jsonusersxuidscidssciddatapathandfilenametype", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/configure-xbl/dev-center/summary.md", - "redirect_url": "/gaming/xbox-live/configure-xbl/dev-center/summary", + "source_path": "uwp/xbox-live/xbox-live-rest/uri/storage/uri-sessionssessionidscidsscid-get.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/storage/uri-sessionssessionidscidsscid-get", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/configure-xbl/dev-center/title-storage.md", - "redirect_url": "/gaming/xbox-live/configure-xbl/dev-center/title-storage", + "source_path": "uwp/xbox-live/xbox-live-rest/uri/storage/uri-sessionssessionidscidsscid.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/storage/uri-sessionssessionidscidsscid", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/configure-xbl/dev-center/web-services.md", - "redirect_url": "/gaming/xbox-live/configure-xbl/dev-center/web-services", + "source_path": "uwp/xbox-live/xbox-live-rest/uri/storage/uri-sessionssessionidscidssciddatapath-get.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/storage/uri-sessionssessionidscidssciddatapath-get", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/configure-xbl/dev-center/xbox-live-setup.md", - "redirect_url": "/gaming/xbox-live/configure-xbl/dev-center/xbox-live-setup", + "source_path": "uwp/xbox-live/xbox-live-rest/uri/storage/uri-sessionssessionidscidssciddatapath.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/storage/uri-sessionssessionidscidssciddatapath", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/contextual-search/configuring-contextual-search.md", - "redirect_url": "/gaming/xbox-live/contextual-search/configuring-contextual-search", + "source_path": "uwp/xbox-live/xbox-live-rest/uri/storage/uri-sessionssessionidscidssciddatapathandfilenametype-delete.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/storage/uri-sessionssessionidscidssciddatapathandfilenametype-delete", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/contextual-search/introduction-to-contextual-search.md", - "redirect_url": "/gaming/xbox-live/contextual-search/introduction-to-contextual-search", + "source_path": "uwp/xbox-live/xbox-live-rest/uri/storage/uri-sessionssessionidscidssciddatapathandfilenametype-get.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/storage/uri-sessionssessionidscidssciddatapathandfilenametype-get", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/data-platform/data-platform.md", - "redirect_url": "/gaming/xbox-live/data-platform/player-data_nav", + "source_path": "uwp/xbox-live/xbox-live-rest/uri/storage/uri-sessionssessionidscidssciddatapathandfilenametype-put.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/storage/uri-sessionssessionidscidssciddatapathandfilenametype-put", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/data-platform/designing-xbox-live-experiences.md", - "redirect_url": "/gaming/xbox-live/data-platform/designing-xbox-live-experiences", + "source_path": "uwp/xbox-live/xbox-live-rest/uri/storage/uri-sessionssessionidscidssciddatapathandfilenametype.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/storage/uri-sessionssessionidscidssciddatapathandfilenametype", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/get-started-with-creators/add-controller-support-to-xbox-live-prefabs.md", - "redirect_url": "/gaming/xbox-live/get-started/setup-ide/creators/unity-win10/add-controller-support-to-xbox-live-prefabs", + "source_path": "uwp/xbox-live/xbox-live-rest/uri/storage/uri-trustedplatformusersbatchscidssciddatapathandfilenametype-post.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/storage/uri-trustedplatformusersbatchscidssciddatapathandfilenametype-post", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/get-started-with-creators/add-multi-user-support.md", - "redirect_url": "/gaming/xbox-live/get-started/setup-ide/creators/unity-win10/add-multi-user-support", + "source_path": "uwp/xbox-live/xbox-live-rest/uri/storage/uri-trustedplatformusersbatchscidssciddatapathandfilenametype.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/storage/uri-trustedplatformusersbatchscidssciddatapathandfilenametype", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/get-started-with-creators/add-stats-and-leaderboards-in-unity.md", - "redirect_url": "/gaming/xbox-live/get-started-with-creators/add-stats-and-leaderboards-in-unity", + "source_path": "uwp/xbox-live/xbox-live-rest/uri/storage/uri-trustedplatformusersxuidscidsscid-get.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/storage/uri-trustedplatformusersxuidscidsscid-get", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/get-started-with-creators/authorize-xbox-live-accounts.md", - "redirect_url": "/gaming/xbox-live/get-started/setup-partner-center/legacy/authorize-xbox-live-accounts", + "source_path": "uwp/xbox-live/xbox-live-rest/uri/storage/uri-trustedplatformusersxuidscidsscid.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/storage/uri-trustedplatformusersxuidscidsscid", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/get-started-with-creators/check-user-privileges-in-unity.md", - "redirect_url": "/gaming/xbox-live/get-started/setup-ide/creators/unity-win10/check-user-privileges-in-unity", + "source_path": "uwp/xbox-live/xbox-live-rest/uri/storage/uri-trustedplatformusersxuidscidssciddatapath-get.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/storage/uri-trustedplatformusersxuidscidssciddatapath-get", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/get-started-with-creators/configure-xbox-live-in-unity.md", - "redirect_url": "/gaming/xbox-live/get-started/setup-ide/creators/unity-win10/configure-xbox-live-in-unity", + "source_path": "uwp/xbox-live/xbox-live-rest/uri/storage/uri-trustedplatformusersxuidscidssciddatapath.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/storage/uri-trustedplatformusersxuidscidssciddatapath", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/get-started-with-creators/create-and-test-a-new-creators-title.md", - "redirect_url": "/gaming/xbox-live/get-started/setup-partner-center/legacy/create-and-test-a-new-creators-title", + "source_path": "uwp/xbox-live/xbox-live-rest/uri/storage/uri-trustedplatformusersxuidscidssciddatapathandfilenametype-delete.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/storage/uri-trustedplatformusersxuidscidssciddatapathandfilenametype-delete", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/get-started-with-creators/creators-step-by-step-guide.md", - "redirect_url": "/gaming/xbox-live/get-started-with-creators/creators-step-by-step-guide", + "source_path": "uwp/xbox-live/xbox-live-rest/uri/storage/uri-trustedplatformusersxuidscidssciddatapathandfilenametype-get.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/storage/uri-trustedplatformusersxuidscidssciddatapathandfilenametype-get", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/get-started-with-creators/develop-creators-title-with-unity.md", - "redirect_url": "/gaming/xbox-live/get-started/setup-ide/creators/unity-win10/cr-unity-win10_nav", + "source_path": "uwp/xbox-live/xbox-live-rest/uri/storage/uri-trustedplatformusersxuidscidssciddatapathandfilenametype-put.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/storage/uri-trustedplatformusersxuidscidssciddatapathandfilenametype-put", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/get-started-with-creators/develop-creators-title-with-visual-studio.md", - "redirect_url": "/gaming/xbox-live/get-started/setup-ide/creators/vs-win10/develop-creators-title-with-visual-studio", + "source_path": "uwp/xbox-live/xbox-live-rest/uri/storage/uri-trustedplatformusersxuidscidssciddatapathandfilenametype.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/storage/uri-trustedplatformusersxuidscidssciddatapathandfilenametype", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/get-started-with-creators/get-started-with-xbox-live-creators.md", - "redirect_url": "/gaming/xbox-live/get-started/setup-partner-center/setup-partner-center-creators", + "source_path": "uwp/xbox-live/xbox-live-rest/uri/storage/uri-untrustedplatformusersbatchscidssciddatapathandfilenametype-post.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/storage/uri-untrustedplatformusersbatchscidssciddatapathandfilenametype-post", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/get-started-with-creators/playerauthentication-prefab-sign-in.md", - "redirect_url": "/gaming/xbox-live/get-started/setup-ide/creators/unity-win10/signin/playerauthentication-prefab-sign-in", + "source_path": "uwp/xbox-live/xbox-live-rest/uri/storage/uri-untrustedplatformusersbatchscidssciddatapathandfilenametype.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/storage/uri-untrustedplatformusersbatchscidssciddatapathandfilenametype", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/get-started-with-creators/setup-leaderboard-example-scene.md", - "redirect_url": "/gaming/xbox-live/get-started-with-creators/setup-leaderboard-example-scene", + "source_path": "uwp/xbox-live/xbox-live-rest/uri/storage/uri-untrustedplatformusersxuidscidsscid-get.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/storage/uri-untrustedplatformusersxuidscidsscid-get", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/get-started-with-creators/sign-in-manager.md", - "redirect_url": "/gaming/xbox-live/using-xbox-live/auth/authentication_nav", + "source_path": "uwp/xbox-live/xbox-live-rest/uri/storage/uri-untrustedplatformusersxuidscidsscid.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/storage/uri-untrustedplatformusersxuidscidsscid", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/get-started-with-creators/test-visual-studio-build.md", - "redirect_url": "/gaming/xbox-live/get-started/setup-ide/creators/unity-win10/test-visual-studio-build", + "source_path": "uwp/xbox-live/xbox-live-rest/uri/storage/uri-untrustedplatformusersxuidscidssciddatapath-get.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/storage/uri-untrustedplatformusersxuidscidssciddatapath-get", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/get-started-with-creators/unity-leaderboard-from-scratch-pre1804.md", - "redirect_url": "/gaming/xbox-live/get-started-with-creators/unity-leaderboard-from-scratch-pre1804", + "source_path": "uwp/xbox-live/xbox-live-rest/uri/storage/uri-untrustedplatformusersxuidscidssciddatapath.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/storage/uri-untrustedplatformusersxuidscidssciddatapath", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/get-started-with-creators/unity-leaderboard-from-scratch.md", - "redirect_url": "/gaming/xbox-live/get-started-with-creators/unity-leaderboard-from-scratch", + "source_path": "uwp/xbox-live/xbox-live-rest/uri/storage/uri-untrustedplatformusersxuidscidssciddatapathandfilenametype-delete.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/storage/uri-untrustedplatformusersxuidscidssciddatapathandfilenametype-delete", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/get-started-with-creators/unity-prefabs-and-sign-in.md", - "redirect_url": "/gaming/xbox-live/get-started/setup-ide/creators/unity-win10/signin/unity-prefabs-and-sign-in", + "source_path": "uwp/xbox-live/xbox-live-rest/uri/storage/uri-untrustedplatformusersxuidscidssciddatapathandfilenametype-get.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/storage/uri-untrustedplatformusersxuidscidssciddatapathandfilenametype-get", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/get-started-with-creators/xbox-live-sandboxes-creators.md", - "redirect_url": "/gaming/xbox-live/get-started-with-creators/xbox-live-sandboxes-creators", + "source_path": "uwp/xbox-live/xbox-live-rest/uri/storage/uri-untrustedplatformusersxuidscidssciddatapathandfilenametype-put.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/storage/uri-untrustedplatformusersxuidscidssciddatapathandfilenametype-put", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/get-started-with-creators/xbox-live-service-configuration-creators.md", - "redirect_url": "/gaming/xbox-live/get-started-with-creators/xbox-live-service-configuration-creators", + "source_path": "uwp/xbox-live/xbox-live-rest/uri/storage/uri-untrustedplatformusersxuidscidssciddatapathandfilenametype.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/storage/uri-untrustedplatformusersxuidscidssciddatapathandfilenametype", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/get-started-with-partner/add-xbox-live-apis-binary-to-a-uwp-project.md", - "redirect_url": "/gaming/xbox-live/get-started/setup-ide/managed-partners/vs-win10/add-xbox-live-apis-binary-to-a-uwp-project", + "source_path": "uwp/xbox-live/xbox-live-rest/uri/stringserver/atoc-reference-systemstringsvalidate.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/stringserver/atoc-reference-systemstringsvalidate", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/get-started-with-partner/add-xbox-live-apis-source-to-a-uwp-project.md", - "redirect_url": "/gaming/xbox-live/get-started/setup-ide/managed-partners/vs-win10/add-xbox-live-apis-source-to-a-uwp-project", + "source_path": "uwp/xbox-live/xbox-live-rest/uri/stringserver/uri-systemstringsvalidate.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/stringserver/uri-systemstringsvalidate", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/get-started-with-partner/add-xbox-live-to-an-xdk-project.md", - "redirect_url": "/gaming/xbox-live/get-started/setup-ide/managed-partners/vs-xbox/add-xbox-live-to-an-xdk-project", + "source_path": "uwp/xbox-live/xbox-live-rest/uri/stringserver/uri-systemstringsvalidatepost.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/stringserver/uri-systemstringsvalidatepost", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/get-started-with-partner/advanced-xbox-live-sandboxes.md", - "redirect_url": "/gaming/xbox-live/advanced-xbox-live-sandboxes", + "source_path": "uwp/xbox-live/xbox-live-rest/uri/titlehistory/atoc-reference-titlehistoryv2.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/titlehistory/atoc-reference-titlehistoryv2", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/get-started-with-partner/compile-the-xdk-xbox-live-api-source.md", - "redirect_url": "/gaming/xbox-live/get-started/setup-ide/managed-partners/vs-xbox/compile-the-xdk-xbox-live-api-source", + "source_path": "uwp/xbox-live/xbox-live-rest/uri/titlehistory/uri-titlehistoryusersxuidhistorytitlesgetv2.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/titlehistory/uri-titlehistoryusersxuidhistorytitlesgetv2", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/get-started-with-partner/configure-your-development-console.md", - "redirect_url": "/gaming/xbox-live/get-started/setup-ide/managed-partners/vs-xbox/configure-your-development-console", + "source_path": "uwp/xbox-live/xbox-live-rest/uri/titlehistory/uri-titlehistoryusersxuidhistorytitlesv2.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/titlehistory/uri-titlehistoryusersxuidhistorytitlesv2", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/get-started-with-partner/create-a-new-title.md", - "redirect_url": "/gaming/xbox-live/get-started/setup-partner-center/legacy/create-a-new-title", + "source_path": "uwp/xbox-live/xbox-live-rest/uri/users/atoc-reference-users.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/users/atoc-reference-users", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/get-started-with-partner/get-started-with-cross-play-games.md", - "redirect_url": "/gaming/xbox-live/get-started-with-partner/get-started-with-cross-play-games", + "source_path": "uwp/xbox-live/xbox-live-rest/uri/users/uri-usersxuidinbox.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/users/uri-usersxuidinbox", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/get-started-with-partner/get-started-with-visual-studio-and-uwp.md", - "redirect_url": "/gaming/xbox-live/get-started/setup-ide/managed-partners/vs-win10/get-started-with-visual-studio-and-uwp", + "source_path": "uwp/xbox-live/xbox-live-rest/uri/users/uri-usersxuidinboxget.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/users/uri-usersxuidinboxget", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/get-started-with-partner/get-started-with-xbox-live-partner.md", - "redirect_url": "/gaming/xbox-live/get-started/setup-partner-center/legacy/get-started-with-xbox-live-partner", + "source_path": "uwp/xbox-live/xbox-live-rest/uri/users/uri-usersxuidinboxmessageiddelete.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/users/uri-usersxuidinboxmessageiddelete", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/get-started-with-partner/partner-add-xbox-live-to-unity-uwp.md", - "redirect_url": "/gaming/xbox-live/get-started/setup-ide/managed-partners/unity-win10/partner-add-xbox-live-to-unity-uwp", + "source_path": "uwp/xbox-live/xbox-live-rest/uri/users/uri-usersxuidinboxmessageidget.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/users/uri-usersxuidinboxmessageidget", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/get-started-with-partner/partner-unity-uwp-il2cpp.md", - "redirect_url": "/gaming/xbox-live/get-started/setup-ide/managed-partners/unity-win10/partner-unity-uwp-il2cpp", + "source_path": "uwp/xbox-live/xbox-live-rest/uri/users/uri-usersxuidoutbox.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/users/uri-usersxuidoutbox", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/get-started-with-partner/partner-unity-xdk-il2cpp.md", - "redirect_url": "/gaming/xbox-live/get-started/setup-ide/managed-partners/unity-xbox/partner-unity-xdk-il2cpp", + "source_path": "uwp/xbox-live/xbox-live-rest/uri/users/uri-usersxuidoutboxpost.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/users/uri-usersxuidoutboxpost", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/get-started-with-partner/partners-step-by-step-guide.md", - "redirect_url": "/gaming/xbox-live/get-started/setup-partner-center/legacy/get-started-with-xbox-live-partner", + "source_path": "uwp/xbox-live/xbox-live-rest/uri/userstats/atoc-reference-userstats.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/userstats/atoc-reference-userstats", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/get-started-with-partner/use-xbox-live-nuget-with-xdk.md", - "redirect_url": "/gaming/xbox-live/get-started/setup-ide/managed-partners/vs-xbox/use-xbox-live-nuget-with-xdk", + "source_path": "uwp/xbox-live/xbox-live-rest/uri/userstats/uri-batch.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/userstats/uri-batch", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/get-started-with-partner/using-xbox-live-apis-built-into-the-xdk.md", - "redirect_url": "/gaming/xbox-live/get-started/setup-ide/managed-partners/vs-xbox/using-xbox-live-apis-built-into-the-xdk", + "source_path": "uwp/xbox-live/xbox-live-rest/uri/userstats/uri-batchpost.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/userstats/uri-batchpost", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/get-started-with-partner/where-to-get-xdk.md", - "redirect_url": "/gaming/xbox-live/get-started/setup-ide/managed-partners/vs-xbox/where-to-get-xdk", + "source_path": "uwp/xbox-live/xbox-live-rest/uri/userstats/uri-usersxuidscidsscidstats.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/userstats/uri-usersxuidscidsscidstats", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/get-started-with-partner/xdk-developers.md", - "redirect_url": "/gaming/xbox-live/get-started/setup-ide/managed-partners/vs-xbox/mp-vs-xbox_nav", + "source_path": "uwp/xbox-live/xbox-live-rest/uri/userstats/uri-usersxuidscidsscidstatsget.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/userstats/uri-usersxuidscidsscidstatsget", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/leaderboards-and-stats-2017/leaderboards.md", - "redirect_url": "/gaming/xbox-live/leaderboards-and-stats-2017/leaderboards", + "source_path": "uwp/xbox-live/xbox-live-rest/uri/userstats/uri-usersxuidscidsscidstatsgetvaluemetadata.md", + "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/userstats/uri-usersxuidscidsscidstatsgetvaluemetadata", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/leaderboards-and-stats-2017/player-stats-configure-2017.md", - "redirect_url": "/gaming/xbox-live/leaderboards-and-stats-2017/player-stats-configure-2017", + "source_path": "uwp/composition/visual-layer-in-desktop-apps.md", + "redirect_url": "/windows/apps/desktop/modernize/visual-layer-in-desktop-apps", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/leaderboards-and-stats-2017/player-stats-updating.md", - "redirect_url": "/gaming/xbox-live/leaderboards-and-stats-2017/player-stats-updating", + "source_path": "uwp/composition/using-the-visual-layer-with-wpf.md", + "redirect_url": "/windows/apps/desktop/modernize/using-the-visual-layer-with-wpf", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/leaderboards-and-stats-2017/player-stats.md", - "redirect_url": "/gaming/xbox-live/data-platform/player-data_nav", + "source_path": "uwp/composition/using-the-visual-layer-with-windows-forms.md", + "redirect_url": "/windows/apps/desktop/modernize/using-the-visual-layer-with-windows-forms", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/leaderboards-and-stats-2017/stats2017.md", - "redirect_url": "/gaming/xbox-live/leaderboards-and-stats-2017/stats2017", + "source_path": "uwp/composition/using-the-visual-layer-with-win32.md", + "redirect_url": "/windows/apps/desktop/modernize/using-the-visual-layer-with-win32", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/multiplayer/multiplayer-concepts.md", - "redirect_url": "/gaming/xbox-live/multiplayer/multiplayer-concepts", + "source_path": "uwp/xaml-platform/xaml-host-controls.md", + "redirect_url": "/windows/apps/desktop/modernize/xaml-islands", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/multiplayer/multiplayer-intro.md", - "redirect_url": "/gaming/xbox-live/multiplayer/multiplayer-intro", + "source_path": "uwp/xaml-platform/using-the-xaml-hosting-api.md", + "redirect_url": "/windows/apps/desktop/modernize/using-the-xaml-hosting-api", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/multiplayer/multiplayer-manager.md", - "redirect_url": "/gaming/xbox-live/multiplayer/multiplayer-platform", - "redirect_document_id": false + "source_path": "hub/apps/desktop/modernize/advanced-scenarios-xaml-islands-cpp.md", + "redirect_url": "/windows/apps/desktop/modernize/xaml-islands/advanced-scenarios-xaml-islands-cpp", + "redirect_document_id": true }, { - "source_path": "uwp/xbox-live/multiplayer/multiplayer-roles.md", - "redirect_url": "/gaming/xbox-live/multiplayer/multiplayer-roles", - "redirect_document_id": false + "source_path": "hub/apps/desktop/modernize/host-custom-control-with-xaml-islands-cpp.md", + "redirect_url": "/windows/apps/desktop/modernize/xaml-islands/host-custom-control-with-xaml-islands-cpp", + "redirect_document_id": true }, { - "source_path": "uwp/xbox-live/multiplayer/multiplayer-scenarios.md", - "redirect_url": "/gaming/xbox-live/multiplayer/multiplayer-scenarios", - "redirect_document_id": false + "source_path": "hub/apps/desktop/modernize/host-custom-control-with-xaml-islands.md", + "redirect_url": "/windows/apps/desktop/modernize/xaml-islands/host-custom-control-with-xaml-islands", + "redirect_document_id": true }, { - "source_path": "uwp/xbox-live/multiplayer/session-browse.md", - "redirect_url": "/gaming/xbox-live/multiplayer/session-browse", - "redirect_document_id": false + "source_path": "hub/apps/desktop/modernize/host-standard-control-with-xaml-islands-cpp.md", + "redirect_url": "/windows/apps/desktop/modernize/xaml-islands/host-standard-control-with-xaml-islands-cpp", + "redirect_document_id": true }, { - "source_path": "uwp/xbox-live/multiplayer/xbox-integrated-multiplayer.md", - "redirect_url": "/gaming/xbox-live/multiplayer/xbox-integrated-multiplayer/xbox-integrated-multiplayer", - "redirect_document_id": false + "source_path": "hub/apps/desktop/modernize/host-standard-control-with-xaml-islands.md", + "redirect_url": "/windows/apps/desktop/modernize/xaml-islands/host-standard-control-with-xaml-islands", + "redirect_document_id": true }, { - "source_path": "uwp/xbox-live/multiplayer/arena/arena-apis-metadata.md", - "redirect_url": "/gaming/xbox-live/multiplayer/arena/arena-apis-metadata", - "redirect_document_id": false + "source_path": "hub/apps/desktop/modernize/using-the-xaml-hosting-api.md", + "redirect_url": "/windows/apps/desktop/modernize/xaml-islands/using-the-xaml-hosting-api", + "redirect_document_id": true }, { - "source_path": "uwp/xbox-live/multiplayer/arena/arena-notifications.md", - "redirect_url": "/gaming/xbox-live/multiplayer/arena/arena-notifications", - "redirect_document_id": false + "source_path": "hub/apps/desktop/modernize/xaml-islands.md", + "redirect_url": "/windows/apps/desktop/modernize/xaml-islands/xaml-islands", + "redirect_document_id": true }, { - "source_path": "uwp/xbox-live/multiplayer/arena/arena-title-integration.md", - "redirect_url": "/gaming/xbox-live/multiplayer/arena/arena-title-integration", - "redirect_document_id": false + "source_path": "hub/apps/desktop/modernize/apply-mica-win32.md", + "redirect_url": "/windows/apps/desktop/modernize/ui/apply-mica-win32", + "redirect_document_id": true }, { - "source_path": "uwp/xbox-live/multiplayer/arena/arena-user-scenarios.md", - "redirect_url": "/gaming/xbox-live/multiplayer/arena/arena-user-scenarios", - "redirect_document_id": false + "source_path": "hub/apps/desktop/modernize/apply-rounded-corners.md", + "redirect_url": "/windows/apps/desktop/modernize/ui/apply-rounded-corners", + "redirect_document_id": true }, { - "source_path": "uwp/xbox-live/multiplayer/arena/arena-ux-join-tournament.md", - "redirect_url": "/gaming/xbox-live/multiplayer/arena/arena-ux-join-tournament", - "redirect_document_id": false + "source_path": "hub/apps/desktop/modernize/apply-snap-layout-menu.md", + "redirect_url": "/windows/apps/desktop/modernize/ui/apply-snap-layout-menu", + "redirect_document_id": true }, { - "source_path": "uwp/xbox-live/multiplayer/arena/arena-ux-match-engagement.md", - "redirect_url": "/gaming/xbox-live/multiplayer/arena/arena-ux-match-engagement", - "redirect_document_id": false + "source_path": "hub/apps/desktop/modernize/apply-windows-themes.md", + "redirect_url": "/windows/apps/desktop/modernize/ui/apply-windows-themes", + "redirect_document_id": true }, { - "source_path": "uwp/xbox-live/multiplayer/arena/discovering-xbox-tournaments.md", - "redirect_url": "/gaming/xbox-live/multiplayer/arena/discovering-xbox-tournaments", - "redirect_document_id": false + "source_path": "hub/apps/desktop/modernize/using-the-visual-layer-with-win32.md", + "redirect_url": "/windows/apps/desktop/modernize/ui/using-the-visual-layer-with-win32", + "redirect_document_id": true }, { - "source_path": "uwp/xbox-live/multiplayer/arena/operations-portal.md", - "redirect_url": "/gaming/xbox-live/multiplayer/arena/operations-portal", - "redirect_document_id": false + "source_path": "hub/apps/desktop/modernize/using-the-visual-layer-with-windows-forms.md", + "redirect_url": "/windows/apps/desktop/modernize/ui/using-the-visual-layer-with-windows-forms", + "redirect_document_id": true }, { - "source_path": "uwp/xbox-live/multiplayer/arena/xbox-arena.md", - "redirect_url": "/gaming/xbox-live/multiplayer/arena/xbox-arena", - "redirect_document_id": false + "source_path": "hub/apps/desktop/modernize/using-the-visual-layer-with-wpf.md", + "redirect_url": "/windows/apps/desktop/modernize/ui/using-the-visual-layer-with-wpf", + "redirect_document_id": true }, { - "source_path": "uwp/xbox-live/multiplayer/chat/game-chat-2-migration.md", - "redirect_url": "/gaming/xbox-live/multiplayer/chat/game-chat-2-migration", - "redirect_document_id": false + "source_path": "hub/apps/desktop/modernize/visual-layer-in-desktop-apps.md", + "redirect_url": "/windows/apps/desktop/modernize/ui/visual-layer-in-desktop-apps", + "redirect_document_id": true }, { - "source_path": "uwp/xbox-live/multiplayer/chat/game-chat-2-overview.md", - "redirect_url": "/gaming/xbox-live/multiplayer/chat/game-chat-2-overview", + "source_path": "uwp/porting/desktop-to-uwp-root.md", + "redirect_url": "/windows/msix/desktop/desktop-to-uwp-root", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/multiplayer/chat/real-time-audio-manipulation.md", - "redirect_url": "/gaming/xbox-live/multiplayer/chat/real-time-audio-manipulation", + "source_path": "uwp/porting/desktop-to-uwp-prepare.md", + "redirect_url": "/windows/msix/desktop/desktop-to-uwp-prepare", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/multiplayer/chat/using-game-chat-2-winrt.md", - "redirect_url": "/gaming/xbox-live/multiplayer/chat/using-game-chat-2-winrt", + "source_path": "uwp/porting/desktop-to-uwp-packaging-dot-net.md", + "redirect_url": "/windows/msix/desktop/desktop-to-uwp-packaging-dot-net", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/multiplayer/chat/using-game-chat-2.md", - "redirect_url": "/gaming/xbox-live/multiplayer/chat/using-game-chat-2", + "source_path": "uwp/porting/desktop-to-uwp-run-desktop-app-converter.md", + "redirect_url": "/windows/msix/desktop/desktop-to-uwp-run-desktop-app-converter", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/multiplayer/multiplayer-appendix/common-issues-when-adapting-multiplayer.md", - "redirect_url": "/gaming/xbox-live/multiplayer/multiplayer-appendix/common-issues-when-adapting-multiplayer", + "source_path": "uwp/porting/desktop-to-uwp-manual-conversion.md", + "redirect_url": "/windows/msix/desktop/desktop-to-uwp-manual-conversion", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/multiplayer/multiplayer-appendix/flows-for-multiplayer-game-invites.md", - "redirect_url": "/gaming/xbox-live/multiplayer/invite/multiplayer-invite-flows", + "source_path": "uwp/porting/desktop-to-uwp-r2r.md", + "redirect_url": "/windows/msix/desktop/desktop-to-uwp-r2r", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/multiplayer/multiplayer-appendix/game-session-and-game-party-visibility-and-joinability.md", - "redirect_url": "/gaming/xbox-live/multiplayer/multiplayer-appendix/game-session-and-game-party-visibility-and-joinability", + "source_path": "uwp/porting/desktop-to-uwp-behind-the-scenes.md", + "redirect_url": "/windows/msix/desktop/desktop-to-uwp-behind-the-scenes", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/multiplayer/multiplayer-appendix/introduction-to-the-multiplayer-system.md", - "redirect_url": "/gaming/xbox-live/multiplayer/multiplayer-appendix/introduction-to-the-multiplayer-system", + "source_path": "uwp/porting/desktop-to-uwp-known-issues.md", + "redirect_url": "/windows/msix/desktop/desktop-to-uwp-known-issues", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/multiplayer/multiplayer-appendix/migrating-an-arbiter.md", - "redirect_url": "/gaming/xbox-live/multiplayer/multiplayer-appendix/migrating-an-arbiter", + "source_path": "uwp/porting/package-support-framework.md", + "redirect_url": "/windows/msix/psf/package-support-framework", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/multiplayer/multiplayer-appendix/mpsd-session-details.md", - "redirect_url": "/gaming/xbox-live/multiplayer/multiplayer-session/mpsd-details", + "source_path": "uwp/porting/desktop-to-uwp-debug.md", + "redirect_url": "/windows/msix/desktop/desktop-to-uwp-debug", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/multiplayer/multiplayer-appendix/multiplayer-2015-faq.md", - "redirect_url": "/gaming/xbox-live/multiplayer/multiplayer-appendix/multiplayer-2015-faq", + "source_path": "uwp/porting/desktop-to-uwp-test-windows-s.md", + "redirect_url": "/windows/msix/desktop/desktop-to-uwp-test-windows-s", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/multiplayer/multiplayer-appendix/multiplayer-appendix.md", - "redirect_url": "/gaming/xbox-live/multiplayer/multiplayer-appendix/multiplayer-appendix", + "source_path": "uwp/porting/desktop-to-uwp-distribute.md", + "redirect_url": "/windows/apps/desktop/modernize/desktop-to-uwp-distribute", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/multiplayer/multiplayer-appendix/multiplayer-how-tos.md", - "redirect_url": "/gaming/xbox-live/multiplayer/multiplayer-session/mpsd-how-tos", + "source_path": "uwp/porting/desktop-to-uwp-enhance.md", + "redirect_url": "/windows/apps/desktop/modernize/desktop-to-uwp-enhance", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/multiplayer/multiplayer-appendix/multiplayer-session-directory.md", - "redirect_url": "/gaming/xbox-live/multiplayer/multiplayer-appendix/xbox-one-multiplayer-session-directory", + "source_path": "uwp/porting/desktop-to-uwp-extend.md", + "redirect_url": "/windows/apps/desktop/modernize/desktop-to-uwp-extend", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/multiplayer/multiplayer-appendix/multiplayer-session-status-codes.md", - "redirect_url": "/gaming/xbox-live/multiplayer/multiplayer-session/mpsd-status-codes", + "source_path": "uwp/porting/desktop-to-uwp-extensions.md", + "redirect_url": "/windows/apps/desktop/modernize/desktop-to-uwp-extensions", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/multiplayer/multiplayer-appendix/smartmatch-matchmaking.md", - "redirect_url": "/gaming/xbox-live/multiplayer/multiplayer-manager/mpm-flowcharts/mpm-play-with-smartmatch-matchmaking", + "source_path": "uwp/porting/desktop-to-uwp-supported-api.md", + "redirect_url": "/windows/apps/desktop/modernize/desktop-to-uwp-supported-api", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/multiplayer/multiplayer-appendix/using-smartmatch-matchmaking.md", - "redirect_url": "/gaming/xbox-live/multiplayer/matchmaking/matchmaking", + "source_path": "uwp/design/fluent-design-system/index.md", + "redirect_url": "/windows/apps/fluent-design-system", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/multiplayer/multiplayer-appendix/xbox-one-multiplayer-session-directory.md", - "redirect_url": "/gaming/xbox-live/multiplayer/multiplayer-appendix/xbox-one-multiplayer-session-directory", + "source_path": "uwp/packaging/packaging-uwp-apps.md", + "redirect_url": "/windows/msix/package/packaging-uwp-apps", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/multiplayer/multiplayer-manager/handle-protocol-activation.md", - "redirect_url": "/gaming/xbox-live/multiplayer/multiplayer-manager/handle-protocol-activation", + "source_path": "uwp/packaging/manual-packaging-root.md", + "redirect_url": "/windows/msix/package/manual-packaging-root", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/multiplayer/multiplayer-manager/mpm-flowcharts.md", - "redirect_url": "/gaming/xbox-live/multiplayer/multiplayer-manager/mpm-flowcharts", + "source_path": "uwp/packaging/create-app-package-with-makeappx-tool.md", + "redirect_url": "/windows/msix/package/create-app-package-with-makeappx-tool", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/multiplayer/multiplayer-manager/multiplayer-manager-api-overview.md", - "redirect_url": "/gaming/xbox-live/multiplayer/multiplayer-manager/multiplayer-manager-api-overview", + "source_path": "uwp/packaging/create-certificate-package-signing.md", + "redirect_url": "/windows/msix/package/create-certificate-package-signing", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/multiplayer/multiplayer-manager/play-multiplayer-with-friends.md", - "redirect_url": "/gaming/xbox-live/multiplayer/multiplayer-manager/play-multiplayer-with-friends", + "source_path": "uwp/packaging/sign-app-package-using-signtool.md", + "redirect_url": "/windows/msix/package/sign-app-package-using-signtool", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/multiplayer/multiplayer-manager/play-multiplayer-with-matchmaking.md", - "redirect_url": "/gaming/xbox-live/multiplayer/multiplayer-manager/play-multiplayer-with-matchmaking", + "source_path": "uwp/packaging/package-folding.md", + "redirect_url": "/windows/msix/package/package-folding", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/multiplayer/multiplayer-manager/send-game-invites.md", - "redirect_url": "/gaming/xbox-live/multiplayer/multiplayer-manager/send-game-invites", + "source_path": "uwp/packaging/flat-bundles.md", + "redirect_url": "/windows/msix/package/flat-bundles", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/multiplayer/multiplayer-manager/mpm-flowcharts/mpm-fill-open-slots.md", - "redirect_url": "/gaming/xbox-live/multiplayer/multiplayer-manager/mpm-flowcharts/mpm-fill-open-slots", + "source_path": "uwp/packaging/asset-packages.md", + "redirect_url": "/windows/msix/package/asset-packages", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/multiplayer/multiplayer-manager/mpm-flowcharts/mpm-host-migration.md", - "redirect_url": "/gaming/xbox-live/multiplayer/multiplayer-manager/mpm-flowcharts/mpm-host-migration", + "source_path": "uwp/packaging/packaging-layout.md", + "redirect_url": "/windows/msix/package/packaging-layout", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/multiplayer/multiplayer-manager/mpm-flowcharts/mpm-on-protocol-activation.md", - "redirect_url": "/gaming/xbox-live/multiplayer/multiplayer-manager/mpm-flowcharts/mpm-on-protocol-activation", + "source_path": "uwp/packaging/device-architecture.md", + "redirect_url": "/windows/msix/package/device-architecture", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/multiplayer/multiplayer-manager/mpm-flowcharts/mpm-play-with-friends.md", - "redirect_url": "/gaming/xbox-live/multiplayer/multiplayer-manager/mpm-flowcharts/mpm-play-with-friends", + "source_path": "uwp/packaging/streaming-install.md", + "redirect_url": "/windows/msix/package/streaming-install", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/multiplayer/multiplayer-manager/mpm-flowcharts/mpm-play-with-smartmatch-matchmaking.md", - "redirect_url": "/gaming/xbox-live/multiplayer/multiplayer-manager/mpm-flowcharts/mpm-play-with-smartmatch-matchmaking", + "source_path": "uwp/packaging/create-cgm.md", + "redirect_url": "/windows/msix/package/create-cgm", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/multiplayer/multiplayer-manager/mpm-flowcharts/mpm-send-invites.md", - "redirect_url": "/gaming/xbox-live/multiplayer/multiplayer-manager/mpm-flowcharts/mpm-send-invites", + "source_path": "uwp/packaging/optional-packages.md", + "redirect_url": "/windows/msix/package/optional-packages", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/multiplayer/multiplayer-manager/mpm-flowcharts/mpm-shut-down.md", - "redirect_url": "/gaming/xbox-live/multiplayer/multiplayer-manager/mpm-flowcharts/mpm-shut-down", + "source_path": "uwp/packaging/optional-packages-with-executable-code.md", + "redirect_url": "/windows/msix/package/optional-packages-with-executable-code", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/multiplayer/multiplayer-manager/mpm-flowcharts/mpm-use-matchmaking-and-qos.md", - "redirect_url": "/gaming/xbox-live/multiplayer/multiplayer-manager/mpm-flowcharts/mpm-use-matchmaking-and-qos", + "source_path": "hub/python/get-started/python-for-education.md", + "redirect_url": "/windows/python/beginners", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/multiplayer/service-configuration/configure-the-multiplayer-service.md", - "redirect_url": "/gaming/xbox-live/multiplayer/service-configuration/configure-the-multiplayer-service", + "source_path": "hub/python/get-started/python-for-web.md", + "redirect_url": "/windows/python/web-frameworks", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/multiplayer/service-configuration/configure-your-appxmanifest-for-multiplayer.md", - "redirect_url": "/gaming/xbox-live/multiplayer/xbox-integrated-multiplayer/xim-manifest", + "source_path": "hub/python/get-started/python-for-scripting.md", + "redirect_url": "/windows/python/scripting", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/multiplayer/service-configuration/large-sessions.md", - "redirect_url": "/gaming/xbox-live/multiplayer/service-configuration/large-sessions", + "source_path": "hub/mac-to-windows.md", + "redirect_url": "/windows/dev-environment/mac-to-windows", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/multiplayer/service-configuration/session-template-constants.md", - "redirect_url": "/gaming/xbox-live/multiplayer/service-configuration/session-template-constants", + "source_path": "uwp/design/layout/content-as-objects.md", + "redirect_url": "/windows/uwp/design", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/multiplayer/service-configuration/session-templates.md", - "redirect_url": "/gaming/xbox-live/multiplayer/service-configuration/session-templates", + "source_path": "uwp/monetize/get-xbox-one-game-acquisitions.md", + "redirect_url": "/windows/uwp/monetize", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/multiplayer/xbox-integrated-multiplayer/using-xim-cs.md", - "redirect_url": "/gaming/xbox-live/multiplayer/xbox-integrated-multiplayer/using-xim-cs", + "source_path": "uwp/monetize/get-xbox-one-add-on-acquisitions.md", + "redirect_url": "/windows/uwp/monetize", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/multiplayer/xbox-integrated-multiplayer/using-xim.md", - "redirect_url": "/gaming/xbox-live/multiplayer/xbox-integrated-multiplayer/using-xim", + "source_path": "uwp/monetize/get-error-reporting-data-for-your-xbox-one-game.md", + "redirect_url": "/windows/uwp/monetize", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/multiplayer/xbox-integrated-multiplayer/xim-manifest.md", - "redirect_url": "/gaming/xbox-live/multiplayer/xbox-integrated-multiplayer/xim-manifest", + "source_path": "uwp/monetize/get-details-for-an-error-in-your-xbox-one-game.md", + "redirect_url": "/windows/uwp/monetize", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/multiplayer/xbox-integrated-multiplayer/xim-release-notes.md", - "redirect_url": "/gaming/xbox-live/multiplayer/xbox-integrated-multiplayer/xim-release-notes", + "source_path": "uwp/monetize/get-the-stack-trace-for-an-error-in-your-xbox-one-game.md", + "redirect_url": "/windows/uwp/monetize", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/multiplayer/xbox-integrated-multiplayer/xim-reservations.md", - "redirect_url": "/gaming/xbox-live/multiplayer/xbox-integrated-multiplayer/xim-reservations", + "source_path": "uwp/monetize/download-the-cab-file-for-an-error-in-your-xbox-one-game.md", + "redirect_url": "/windows/uwp/monetize", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/multiplayer/xbox-integrated-multiplayer/xim-unity-uwp-il2cpp.md", - "redirect_url": "/gaming/xbox-live/multiplayer/xbox-integrated-multiplayer/xim-unity-uwp-il2cpp", + "source_path": "uwp/porting/apps-on-arm-limitations.md", + "redirect_url": "/windows/uwp/porting/apps-on-arm-troubleshooting-x86", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/real-time-activity-service/programming-the-real-time-activity-service.md", - "redirect_url": "/gaming/xbox-live/real-time-activity-service/programming-the-real-time-activity-service", + "source_path": "uwp/communication/ipc.md", + "redirect_url": "/windows/uwp/communication/interprocess-communication", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/real-time-activity-service/real-time-activity-service.md", - "redirect_url": "/gaming/xbox-live/real-time-activity-service/real-time-activity-service_nav", + "source_path": "hub/android/index.md", + "redirect_url": "/windows/android/overview", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/real-time-activity-service/register-for-stat-notifications.md", - "redirect_url": "/gaming/xbox-live/real-time-activity-service/register-for-stat-notifications", + "source_path": "hub/python/databases.md", + "redirect_url": "/windows/wsl/tutorials/wsl-database", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/real-time-activity-service/rta-best-practices.md", - "redirect_url": "/gaming/xbox-live/real-time-activity-service/rta-best-practices", + "source_path": "hub/nodejs/databases.md", + "redirect_url": "/windows/wsl/tutorials/wsl-database", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/social-platform/intro-to-social-manager.md", - "redirect_url": "/gaming/xbox-live/social-platform/intro-to-social-manager", + "source_path": "uwp/monetize/app-metadata-api-for-advertising-networks.md", + "redirect_url": "/windows/uwp/monetize", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/social-platform/social-manager-memory-and-performance-overview.md", - "redirect_url": "/gaming/xbox-live/social-platform/social-manager-memory-and-performance-overview", + "source_path": "hub/dev-environment/overview.md", + "redirect_url": "/windows/dev-environment/", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/social-platform/social-platform.md", - "redirect_url": "/gaming/xbox-live/social-platform/social-platform_nav", + "source_path": "uwp/monetize/payment-request.md", + "redirect_url": "/windows/uwp/monetize", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/social-platform/people-system/displaying-people-from-the-people-system.md", - "redirect_url": "/gaming/xbox-live/social-platform/people-system/displaying-people-from-the-people-system", + "source_path": "uwp/design/shell/tiles-and-notifications/toast-xml-schema.md", + "redirect_url": "/windows/uwp/design/shell/tiles-and-notifications/toast-schema", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/social-platform/people-system/programming-social-services.md", - "redirect_url": "/gaming/xbox-live/social-platform/people-system/programming-social-services", + "source_path": "uwp/publish/create-an-ad-campaign-for-your-app.md", + "redirect_url": "/windows/uwp/monetize", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/social-platform/people-system/reputation.md", - "redirect_url": "/gaming/xbox-live/social-platform/people-system/reputation_nav", + "source_path": "uwp/publish/managing-your-ad-campaign.md", + "redirect_url": "/windows/uwp/monetize", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/social-platform/people-system/sending-player-feedback-from-your-title.md", - "redirect_url": "/gaming/xbox-live/social-platform/people-system/sending-player-feedback-from-your-title", + "source_path": "uwp/publish/about-house-ads.md", + "redirect_url": "/windows/uwp/monetize", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/social-platform/people-system/xbox-live-people-system.md", - "redirect_url": "/gaming/xbox-live/social-platform/people-system/xbox-live-people-system", + "source_path": "uwp/publish/about-community-ads.md", + "redirect_url": "/windows/uwp/monetize", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/social-platform/rich-presence-strings/programming-rich-presence.md", - "redirect_url": "/gaming/xbox-live/social-platform/rich-presence-strings/programming-rich-presence", + "source_path": "uwp/publish/common-questions.md", + "redirect_url": "/windows/uwp/monetize", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/social-platform/rich-presence-strings/rich-presence-strings-appendix.md", - "redirect_url": "/gaming/xbox-live/social-platform/rich-presence-strings/rich-presence-strings-appendix", + "source_path": "uwp/publish/tax-details-for-paid-apps.md", + "redirect_url": "/partner-center/tax-details-marketplace", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/social-platform/rich-presence-strings/rich-presence-strings-best-practices.md", - "redirect_url": "/gaming/xbox-live/social-platform/rich-presence-strings/rich-presence-strings-best-practices", + "source_path": "uwp/publish/getting-paid-apps.md", + "redirect_url": "/partner-center/marketplace-get-paid", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/social-platform/rich-presence-strings/rich-presence-strings-configuration.md", - "redirect_url": "/gaming/xbox-live/social-platform/rich-presence-strings/rich-presence-strings-configuration", + "source_path": "uwp/publish/setting-up-your-payout-account-and-tax-forms.md", + "redirect_url": "/partner-center/set-up-your-payout-account ", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/social-platform/rich-presence-strings/rich-presence-strings-overview.md", - "redirect_url": "/gaming/xbox-live/social-platform/rich-presence-strings/rich-presence-strings-overview", + "source_path": "uwp/publish/payout-summary.md", + "redirect_url": "/partner-center/payout-statement", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/social-platform/rich-presence-strings/rich-presence-strings-policies-and-limitations.md", - "redirect_url": "/gaming/xbox-live/social-platform/rich-presence-strings/rich-presence-strings-policies-and-limitations", + "source_path": "uwp/publish/understand-irs-tax-forms.md", + "redirect_url": "/partner-center/understand-irs-tax-forms", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/social-platform/rich-presence-strings/rich-presence-strings-updating-strings.md", - "redirect_url": "/gaming/xbox-live/social-platform/rich-presence-strings/rich-presence-strings-updating-strings", + "source_path": "uwp/publish/payment-thresholds-methods-and-timeframes.md", + "redirect_url": "/partner-center/payment-thresholds-methods-timeframes", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/storage-platform/storage-platform.md", - "redirect_url": "/gaming/xbox-live/storage-platform/cloud-storage_nav", + "source_path": "uwp/publish/mobile-operator-billing.md", + "redirect_url": "/partner-center/mobile-operator-billing", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/storage-platform/connected-storage/connected-storage-best-practices.md", - "redirect_url": "/gaming/xbox-live/storage-platform/connected-storage/connected-storage-best-practices", + "source_path": "uwp/publish/vat-info.md", + "redirect_url": "/partner-center/vat-info", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/storage-platform/connected-storage/connected-storage-deleting.md", - "redirect_url": "/gaming/xbox-live/storage-platform/connected-storage/connected-storage-deleting", + "source_path": "hub/apps/whats-new/build2020-docs.md", + "redirect_url": "/windows/apps/whats-new/build2021-docs", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/storage-platform/connected-storage/connected-storage-loading-on-demand.md", - "redirect_url": "/gaming/xbox-live/storage-platform/connected-storage/connected-storage-loading-on-demand", + "source_path": "uwp/publish/manage-account-settings-and-profile.md", + "redirect_url": "/partner-center/partner-center-account-setup", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/storage-platform/connected-storage/connected-storage-loading.md", - "redirect_url": "/gaming/xbox-live/storage-platform/connected-storage/connected-storage-loading", - "redirect_document_id": false + "source_path": "uwp/design/controls-and-patterns/master-details.md", + "redirect_url": "/windows/uwp/design/controls-and-patterns/list-details", + "redirect_document_id": true }, { - "source_path": "uwp/xbox-live/storage-platform/connected-storage/connected-storage-overview.md", - "redirect_url": "/gaming/xbox-live/storage-platform/connected-storage/connected-storage-overview", + "source_path": "uwp/design/shell/tiles-and-notifications/send-local-toast-desktop.md", + "redirect_url": "/windows/uwp/design/shell/tiles-and-notifications/send-local-toast", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/storage-platform/connected-storage/connected-storage-saving.md", - "redirect_url": "/gaming/xbox-live/storage-platform/connected-storage/connected-storage-saving", + "source_path": "hub/nodejs/index.yml", + "redirect_url": "/windows/dev-environment/javascript", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/storage-platform/connected-storage/connected-storage-technical-overview.md", - "redirect_url": "/gaming/xbox-live/storage-platform/connected-storage/connected-storage-technical-overview", + "source_path": "hub/nodejs/beginners.md", + "redirect_url": "/windows/dev-environment/javascript/nodejs-beginners-tutorial", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/storage-platform/connected-storage/connected-storage-using-buffers.md", - "redirect_url": "/gaming/xbox-live/storage-platform/connected-storage/connected-storage-using-buffers", + "source_path": "hub/nodejs/setup-on-wsl2.md", + "redirect_url": "/windows/dev-environment/javascript/nodejs-on-wsl", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/storage-platform/connected-storage/connected-storage-xb-storage.md", - "redirect_url": "/gaming/xbox-live/storage-platform/connected-storage/connected-storage-xb-storage", + "source_path": "hub/nodejs/setup-on-windows.md", + "redirect_url": "/windows/dev-environment/javascript/nodejs-on-windows", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/storage-platform/xbox-live-title-storage/reading-binary-blobs.md", - "redirect_url": "/gaming/xbox-live/storage-platform/xbox-live-title-storage/reading-binary-blobs", + "source_path": "hub/nodejs/containers.md", + "redirect_url": "/windows/wsl/tutorials/wsl-containers", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/storage-platform/xbox-live-title-storage/reading-configuration-blobs.md", - "redirect_url": "/gaming/xbox-live/storage-platform/xbox-live-title-storage/reading-configuration-blobs", + "source_path": "hub/nodejs/web-frameworks.md", + "redirect_url": "/windows/dev-environment/javascript", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/storage-platform/xbox-live-title-storage/reading-jsonblobs.md", - "redirect_url": "/gaming/xbox-live/storage-platform/xbox-live-title-storage/reading-jsonblobs", + "source_path": "hub/android/react-native.md", + "redirect_url": "/windows/dev-environment/javascript/react-native-for-android", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/storage-platform/xbox-live-title-storage/storing-binary-blobs.md", - "redirect_url": "/gaming/xbox-live/storage-platform/xbox-live-title-storage/storing-binary-blobs", + "source_path": "hub/apps/features-and-technologies.md", + "redirect_url": "/windows/apps/develop/index", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/storage-platform/xbox-live-title-storage/storing-jsonblobs.md", - "redirect_url": "/gaming/xbox-live/storage-platform/xbox-live-title-storage/storing-jsonblobs", + "source_path": "hub/apps/develop/features-and-technologies.md", + "redirect_url": "/windows/apps/develop/index", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/storage-platform/xbox-live-title-storage/xbox-live-title-storage.md", - "redirect_url": "/gaming/xbox-live/storage-platform/xbox-live-title-storage/xbox-live-title-storage", - "redirect_document_id": false + "source_path": "hub/apps/speech.md", + "redirect_url": "/windows/apps/develop/speech", + "redirect_document_id": true }, { - "source_path": "uwp/xbox-live/tools/analyze-service-calls.md", - "redirect_url": "/gaming/xbox-live/tools/analyze-service-calls", - "redirect_document_id": false + "source_path": "hub/apps/accessibility.md", + "redirect_url": "/windows/apps/develop/accessibility", + "redirect_document_id": true }, { - "source_path": "uwp/xbox-live/tools/tools.md", - "redirect_url": "/gaming/xbox-live/tools/tools", + "source_path": "hub/apps/windows-app-sdk/older-downloads.md", + "redirect_url": "/windows/apps/windows-app-sdk/downloads-archive", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/tools/xbox-live-account-tool.md", - "redirect_url": "/gaming/xbox-live/tools/xbox-live-account-tool", + "source_path": "uwp/get-started/get-set-up.md", + "redirect_url": "/windows/uwp/get-started/winui2/getting-started", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/using-xbox-live/porting-xbox-live-code-from-xdk-to-uwp.md", - "redirect_url": "/gaming/xbox-live/using-xbox-live/porting-xbox-live-code-from-xdk-to-uwp", + "source_path": "hub/apps/get-started/get-set-up.md", + "redirect_url": "/windows/apps/get-started/start-here", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/using-xbox-live/using-xbox-live.md", - "redirect_url": "/gaming/xbox-live/using-xbox-live/using-xbox-live", + "source_path": "hub/apps/project-reunion/index.md", + "redirect_url": "/windows/apps/windows-app-sdk/index", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/using-xbox-live/auth/authentication-for-UWP-projects.md", - "redirect_url": "/gaming/xbox-live/using-xbox-live/auth/authentication-for-UWP-projects", + "source_path": "hub/apps/project-reunion/release-channels.md", + "redirect_url": "/windows/apps/windows-app-sdk/release-channels", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/using-xbox-live/auth/authentication-for-XDK-projects.md", - "redirect_url": "/gaming/xbox-live/using-xbox-live/auth/authentication-for-XDK-projects", + "source_path": "hub/apps/project-reunion/stable-channel.md", + "redirect_url": "/windows/apps/windows-app-sdk/stable-channel", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/using-xbox-live/auth/authentication.md", - "redirect_url": "/gaming/xbox-live/using-xbox-live/auth/authentication_nav", + "source_path": "hub/apps/project-reunion/preview-channel.md", + "redirect_url": "/windows/apps/windows-app-sdk/preview-channel", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/using-xbox-live/auth/retrieving-windows-system-user-on-UWP.md", - "redirect_url": "/gaming/xbox-live/using-xbox-live/auth/retrieving-windows-system-user-on-UWP", + "source_path": "hub/apps/project-reunion/set-up-your-development-environment.md", + "redirect_url": "/windows/apps/get-started/start-here", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/using-xbox-live/auth/single-point-of-presence.md", - "redirect_url": "/gaming/xbox-live/using-xbox-live/auth/single-point-of-presence", + "source_path": "hub/apps/project-reunion/get-started-with-project-reunion.md", + "redirect_url": "/windows/apps/windows-app-sdk", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/using-xbox-live/best-practices/best-practices-for-calling-xbox-live.md", - "redirect_url": "/gaming/xbox-live/using-xbox-live/best-practices/best-practices-for-calling-xbox-live", + "source_path": "hub/apps/project-reunion/get-started.md", + "redirect_url": "/windows/apps/windows-app-sdk", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/using-xbox-live/best-practices/best-practices-for-offline.md", - "redirect_url": "/gaming/xbox-live/using-xbox-live/best-practices/best-practices-for-offline", + "source_path": "hub/apps/windows-app-sdk/get-started.md", + "redirect_url": "/windows/apps/windows-app-sdk", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/using-xbox-live/best-practices/fine-grained-rate-limiting.md", - "redirect_url": "/gaming/xbox-live/using-xbox-live/best-practices/fine-grained-rate-limiting", + "source_path": "hub/apps/project-reunion/update-existing-projects-to-the-latest-release.md", + "redirect_url": "/windows/apps/windows-app-sdk/update-existing-projects-to-the-latest-release", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/using-xbox-live/error-handling/error-handling-cpp.md", - "redirect_url": "/gaming/xbox-live/using-xbox-live/error-handling/error-handling-cpp", + "source_path": "hub/apps/project-reunion/mrtcore/mrtcore-overview.md", + "redirect_url": "/windows/apps/windows-app-sdk/mrtcore/mrtcore-overview", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/using-xbox-live/error-handling/error-handling-winrt.md", - "redirect_url": "/gaming/xbox-live/using-xbox-live/error-handling/error-handling-winrt", + "source_path": "hub/apps/project-reunion/dwritecore.md", + "redirect_url": "/windows/apps/windows-app-sdk/dwritecore", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/using-xbox-live/error-handling/error-handling.md", - "redirect_url": "/gaming/xbox-live/using-xbox-live/error-handling/error-handling_nav", + "source_path": "hub/apps/project-reunion/applifecycle/applifecycle-instancing.md", + "redirect_url": "/windows/apps/windows-app-sdk/applifecycle/applifecycle-instancing", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/using-xbox-live/troubleshooting/how-to-set-up-fiddler-for-debugging.md", - "redirect_url": "/gaming/xbox-live/using-xbox-live/troubleshooting/how-to-set-up-fiddler-for-debugging", + "source_path": "hub/apps/project-reunion/applifecycle/applifecycle-rich-activation.md", + "redirect_url": "/windows/apps/windows-app-sdk/applifecycle/applifecycle-rich-activation", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/using-xbox-live/troubleshooting/troubleshooting-pc-setup.md", - "redirect_url": "/gaming/xbox-live/using-xbox-live/troubleshooting/troubleshooting-pc-setup", + "source_path": "hub/apps/project-reunion/deploy-apps-that-use-project-reunion.md", + "redirect_url": "/windows/apps/windows-app-sdk/deploy-apps-that-use-the-windows-app-sdk", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/using-xbox-live/troubleshooting/troubleshooting-sign-in.md", - "redirect_url": "/gaming/xbox-live/using-xbox-live/troubleshooting/troubleshooting-sign-in", + "source_path": "hub/apps/project-reunion/deployment-architecture.md", + "redirect_url": "/windows/apps/windows-app-sdk/deployment-architecture", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/using-xbox-live/troubleshooting/troubleshooting-the-xbox-live-services-api.md", - "redirect_url": "/gaming/xbox-live/using-xbox-live/troubleshooting/troubleshooting-the-xbox-live-services-api", + "source_path": "hub/apps/project-reunion/deploy-packaged-apps.md", + "redirect_url": "/windows/apps/windows-app-sdk/deploy-packaged-apps", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/using-xbox-live/troubleshooting/troubleshooting.md", - "redirect_url": "/gaming/xbox-live/using-xbox-live/troubleshooting/troubleshooting_nav", + "source_path": "hub/apps/project-reunion/deploy-unpackaged-apps.md", + "redirect_url": "/windows/apps/windows-app-sdk/deploy-unpackaged-apps", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/whats-new/1506-whats-new.md", - "redirect_url": "/gaming/xbox-live/whats-new/1506-whats-new", + "source_path": "hub/apps/project-reunion/tutorial-unpackaged-deployment.md", + "redirect_url": "/windows/apps/windows-app-sdk/tutorial-unpackaged-deployment", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/whats-new/1508-whats-new.md", - "redirect_url": "/gaming/xbox-live/whats-new/1508-whats-new", + "source_path": "hub/apps/project-reunion/check-project-reunion-versions.md", + "redirect_url": "/windows/apps/windows-app-sdk/check-windows-app-sdk-versions", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/whats-new/1509-whats-new.md", - "redirect_url": "/gaming/xbox-live/whats-new/1509-whats-new", + "source_path": "hub/apps/project-reunion/remove-project-reunion-versions.md", + "redirect_url": "/windows/apps/windows-app-sdk/remove-windows-app-sdk-versions", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/whats-new/1510-whats-new.md", - "redirect_url": "/gaming/xbox-live/whats-new/1510-whats-new", + "source_path": "hub/apps/winui/reference/iwindownative.md", + "redirect_url": "/windows/windows-app-sdk/api/win32/microsoft.ui.xaml.window/nn-microsoft-ui-xaml-window-iwindownative", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/whats-new/1602-whats-new.md", - "redirect_url": "/gaming/xbox-live/whats-new/1602-whats-new", + "source_path": "hub/apps/winui/reference/iwindownative-windowhandle.md", + "redirect_url": "/windows/windows-app-sdk/api/win32/microsoft.ui.xaml.window/nf-microsoft-ui-xaml-window-iwindownative-get_windowhandle", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/whats-new/1603-whats-new.md", - "redirect_url": "/gaming/xbox-live/whats-new/1603-whats-new", + "source_path": "hub/apps/windows-app-sdk/samples.md", + "redirect_url": "/windows/apps/get-started/samples", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/whats-new/1604-whats-new.md", - "redirect_url": "/gaming/xbox-live/whats-new/1604-whats-new", - "redirect_document_id": false + "source_path": "hub/apps/windows-app-sdk/preview-experimental-install.md", + "redirect_url": "/windows/apps/get-started/start-here", + "redirect_document_id": true }, { - "source_path": "uwp/xbox-live/whats-new/1606-whats-new.md", - "redirect_url": "/gaming/xbox-live/whats-new/1606-whats-new", + "source_path": "hub/apps/get-started/build-apps-for-windows.md", + "redirect_url": "/windows/apps/winui/winui3/create-your-first-winui3-app", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/whats-new/1608-whats-new.md", - "redirect_url": "/gaming/xbox-live/whats-new/1608-whats-new", + "source_path": "hub/apps/winui/winui3-winui2-comparison.md", + "redirect_url": "/windows/apps/winui/", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/whats-new/1611-whats-new.md", - "redirect_url": "/gaming/xbox-live/whats-new/1611-whats-new", + "source_path": "hub/apps/winui/winui3/desktop-build-basic-winui3-app.md", + "redirect_url": "/windows/apps/winui/winui3/desktop-winui3-app-with-basic-interop", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/whats-new/1612-whats-new.md", - "redirect_url": "/gaming/xbox-live/whats-new/1612-whats-new", + "source_path": "hub/apps/winui/winui3/release-notes/index.md", + "redirect_url": "/windows/apps/winui/winui3/release-notes/release-notes-08-preview", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/whats-new/1703-whats-new.md", - "redirect_url": "/gaming/xbox-live/whats-new/1703-whats-new", + "source_path": "hub/apps/winui/winui3/get-started-winui3-for-desktop.md", + "redirect_url": "/windows/apps/winui/winui3/create-your-first-winui3-app", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/whats-new/1704-whats-new.md", - "redirect_url": "/gaming/xbox-live/whats-new/1704-whats-new", + "source_path": "hub/apps/winui/winui3/get-started-winui3-for-uwp.md", + "redirect_url": "/windows/apps/winui/winui3/create-your-first-winui3-app", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/whats-new/1705-whats-new.md", - "redirect_url": "/gaming/xbox-live/whats-new/1705-whats-new", + "source_path": "hub/apps/winui/winui2/winui-2.6.md", + "redirect_url": "/windows/apps/winui/winui2/release-notes/winui-2.6", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/whats-new/1706-whats-new.md", - "redirect_url": "/gaming/xbox-live/whats-new/1706-whats-new", + "source_path": "hub/apps/winui/winui3/cs-interop-apis/index.md", + "redirect_url": "/windows/apps/api-reference/cs-interop-apis/", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/whats-new/1707-whats-new.md", - "redirect_url": "/gaming/xbox-live/whats-new/1707-whats-new", + "source_path": "hub/apps/winui/winui3/cs-interop-apis/microsoft.ui/microsoft.ui.md", + "redirect_url": "/windows/apps/api-reference/cs-interop-apis/microsoft.ui/microsoft.ui", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/whats-new/1708-whats-new.md", - "redirect_url": "/gaming/xbox-live/whats-new/1708-whats-new", + "source_path": "hub/apps/winui/winui3/cs-interop-apis/microsoft.ui/microsoft.ui.win32interop.getdisplayidfrommonitor.md", + "redirect_url": "/windows/apps/api-reference/cs-interop-apis/microsoft.ui/microsoft.ui.win32interop.getdisplayidfrommonitor", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/whats-new/whats-new.md", - "redirect_url": "/gaming/xbox-live/whats-new/whats-new", + "source_path": "hub/apps/winui/winui3/cs-interop-apis/microsoft.ui/microsoft.ui.win32interop.geticonfromiconid.md", + "redirect_url": "/windows/apps/api-reference/cs-interop-apis/microsoft.ui/microsoft.ui.win32interop.geticonfromiconid", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/atoc-xboxlivews-reference.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/atoc-xboxlivews-reference", + "source_path": "hub/apps/winui/winui3/cs-interop-apis/microsoft.ui/microsoft.ui.win32interop.geticonidfromicon.md", + "redirect_url": "/windows/apps/api-reference/cs-interop-apis/microsoft.ui/microsoft.ui.win32interop.geticonidfromicon", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/additional/atoc-xboxlivews-reference-additional.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/additional/atoc-xboxlivews-reference-additional", + "source_path": "hub/apps/winui/winui3/cs-interop-apis/microsoft.ui/microsoft.ui.win32interop.getmonitorfromdisplayid.md", + "redirect_url": "/windows/apps/api-reference/cs-interop-apis/microsoft.ui/microsoft.ui.win32interop.getmonitorfromdisplayid", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/additional/authorizationtypes.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/additional/authorizationtypes", + "source_path": "hub/apps/winui/winui3/cs-interop-apis/microsoft.ui/microsoft.ui.win32interop.getwindowfromwindowid.md", + "redirect_url": "/windows/apps/api-reference/cs-interop-apis/microsoft.ui/microsoft.ui.win32interop.getwindowfromwindowid", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/additional/datatypeoverview.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/additional/datatypeoverview", + "source_path": "hub/apps/winui/winui3/cs-interop-apis/microsoft.ui/microsoft.ui.win32interop.getwindowidfromwindow.md", + "redirect_url": "/windows/apps/api-reference/cs-interop-apis/microsoft.ui/microsoft.ui.win32interop.getwindowidfromwindow", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/additional/eds-apis.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/additional/eds-apis", + "source_path": "hub/apps/winui/winui3/cs-interop-apis/microsoft.ui/microsoft.ui.win32interop.md", + "redirect_url": "/windows/apps/api-reference/cs-interop-apis/microsoft.ui/microsoft.ui.win32interop", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/additional/edsauthorization.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/additional/edsauthorization", + "source_path": "hub/apps/desktop/choose-your-platform.md", + "redirect_url": "/windows/apps/desktop#choose-your-app-type", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/additional/edscommonheaders.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/additional/edscommonheaders", + "source_path": "hub/apps/10x/faq.md", + "redirect_url": "/windows/apps", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/additional/edsparameters.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/additional/edsparameters", + "source_path": "uwp/design/accessibility/accessibility-checklist.md", + "redirect_url": "/windows/apps/design/accessibility/accessibility-checklist", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/additional/edsqueryrefiners.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/additional/edsqueryrefiners", + "source_path": "uwp/design/accessibility/accessibility-in-the-store.md", + "redirect_url": "/windows/apps/design/accessibility/accessibility-in-the-store", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/additional/edsreverselookup.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/additional/edsreverselookup", + "source_path": "uwp/design/accessibility/accessibility-overview.md", + "redirect_url": "/windows/apps/design/accessibility/accessibility-overview", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/additional/edstables.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/additional/edstables", + "source_path": "uwp/design/accessibility/accessibility-testing.md", + "redirect_url": "/windows/apps/design/accessibility/accessibility-testing", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/additional/httpstandardheaders.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/additional/httpstandardheaders", + "source_path": "uwp/design/accessibility/accessibility.md", + "redirect_url": "/windows/apps/design/accessibility/accessibility", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/additional/httpstatuscodes.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/additional/httpstatuscodes", + "source_path": "uwp/design/accessibility/accessible-text-requirements.md", + "redirect_url": "/windows/apps/design/accessibility/accessible-text-requirements", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/additional/pagingparameters.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/additional/pagingparameters", + "source_path": "uwp/design/accessibility/basic-accessibility-information.md", + "redirect_url": "/windows/apps/design/accessibility/basic-accessibility-information", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/enums/atoc-xboxlivews-reference-enums.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/enums/atoc-xboxlivews-reference-enums", + "source_path": "uwp/design/accessibility/control-patterns-and-interfaces.md", + "redirect_url": "/windows/apps/design/accessibility/control-patterns-and-interfaces", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/enums/gvr-enum-gameclipsource.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/enums/gvr-enum-gameclipsource", + "source_path": "uwp/design/accessibility/custom-automation-peers.md", + "redirect_url": "/windows/apps/design/accessibility/custom-automation-peers", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/enums/gvr-enum-gameclipstate.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/enums/gvr-enum-gameclipstate", + "source_path": "uwp/design/accessibility/designing-inclusive-software.md", + "redirect_url": "/windows/apps/design/accessibility/designing-inclusive-software", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/enums/gvr-enum-gamecliptypes.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/enums/gvr-enum-gamecliptypes", + "source_path": "uwp/design/accessibility/developing-inclusive-windows-apps.md", + "redirect_url": "/windows/apps/design/accessibility/developing-inclusive-windows-apps", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/enums/gvr-enum-gameclipuritype.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/enums/gvr-enum-gameclipuritype", + "source_path": "uwp/design/accessibility/high-contrast-themes.md", + "redirect_url": "/windows/apps/design/accessibility/high-contrast-themes", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/enums/gvr-enum-gameclipvisibility.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/enums/gvr-enum-gameclipvisibility", + "source_path": "uwp/design/accessibility/keyboard-accessibility.md", + "redirect_url": "/windows/apps/design/accessibility/keyboard-accessibility", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/enums/gvr-enum-thumbnailsource.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/enums/gvr-enum-thumbnailsource", + "source_path": "uwp/design/accessibility/landmarks-and-headings.md", + "redirect_url": "/windows/apps/design/accessibility/landmarks-and-headings", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/enums/gvr-enum-thumbnailtype.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/enums/gvr-enum-thumbnailtype", + "source_path": "uwp/design/accessibility/practices-to-avoid.md", + "redirect_url": "/windows/apps/design/accessibility/practices-to-avoid", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/enums/privacy-enum-permissionid.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/enums/privacy-enum-permissionid", + "source_path": "uwp/design/accessibility/system-button-narration.md", + "redirect_url": "/windows/apps/design/accessibility/system-button-narration", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/json/atoc-xboxlivews-reference-json.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/json/atoc-xboxlivews-reference-json", + "source_path": "uwp/design/app-settings/guidelines-for-app-settings.md", + "redirect_url": "/windows/apps/design/app-settings/guidelines-for-app-settings", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/json/json-achievementv2.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/json/json-achievementv2", + "source_path": "uwp/design/app-settings/store-and-retrieve-app-data.md", + "redirect_url": "/windows/apps/design/app-settings/store-and-retrieve-app-data", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/json/json-activityrecord.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/json/json-activityrecord", + "source_path": "uwp/design/basics/commanding-basics.md", + "redirect_url": "/windows/apps/design/basics/commanding-basics", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/json/json-activityrequest.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/json/json-activityrequest", + "source_path": "uwp/design/basics/content-basics.md", + "redirect_url": "/windows/apps/design/basics/content-basics", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/json/json-aggregatesessionsresponse.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/json/json-aggregatesessionsresponse", + "source_path": "uwp/design/basics/design-and-ui-intro.md", + "redirect_url": "/windows/apps/design/basics/design-and-ui-intro", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/json/json-batchrequest.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/json/json-batchrequest", + "source_path": "uwp/design/basics/index.md", + "redirect_url": "/windows/apps/design/basics/index", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/json/json-deviceendpoint.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/json/json-deviceendpoint", + "source_path": "uwp/design/basics/navigate-between-two-pages.md", + "redirect_url": "/windows/apps/design/basics/navigate-between-two-pages", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/json/json-devicerecord.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/json/json-devicerecord", + "source_path": "uwp/design/basics/navigation-basics.md", + "redirect_url": "/windows/apps/design/basics/navigation-basics", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/json/json-feedback.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/json/json-feedback", + "source_path": "uwp/design/basics/navigation-history-and-backwards-navigation.md", + "redirect_url": "/windows/apps/design/basics/navigation-history-and-backwards-navigation", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/json/json-gameclip.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/json/json-gameclip", + "source_path": "uwp/design/basics/xaml-basics-adaptive-layout.md", + "redirect_url": "/windows/apps/design/basics/xaml-basics-adaptive-layout", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/json/json-gameclipsserviceerrorresponse.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/json/json-gameclipsserviceerrorresponse", + "source_path": "uwp/design/basics/xaml-basics-style.md", + "redirect_url": "/windows/apps/design/basics/xaml-basics-style", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/json/json-gameclipthumbnail.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/json/json-gameclipthumbnail", + "source_path": "uwp/design/basics/xaml-basics-ui.md", + "redirect_url": "/windows/apps/design/basics/xaml-basics-ui", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/json/json-gameclipuri.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/json/json-gameclipuri", + "source_path": "uwp/design/controls-and-patterns/app-bars.md", + "redirect_url": "/windows/apps/design/controls/command-bar", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/json/json-gamemessage.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/json/json-gamemessage", + "source_path": "uwp/design/controls-and-patterns/auto-suggest-box.md", + "redirect_url": "/windows/apps/design/controls/auto-suggest-box", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/json/json-gameresult.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/json/json-gameresult", + "source_path": "uwp/design/controls-and-patterns/buttons.md", + "redirect_url": "/windows/apps/design/controls/buttons", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/json/json-gamesession.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/json/json-gamesession", + "source_path": "uwp/design/controls-and-patterns/calendar-date-picker.md", + "redirect_url": "/windows/apps/design/controls/calendar-date-picker", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/json/json-gamesessionsummary.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/json/json-gamesessionsummary", + "source_path": "uwp/design/controls-and-patterns/calendar-view.md", + "redirect_url": "/windows/apps/design/controls/calendar-view", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/json/json-getclipresponse.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/json/json-getclipresponse", + "source_path": "uwp/design/controls-and-patterns/checkbox.md", + "redirect_url": "/windows/apps/design/controls/checkbox", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/json/json-hopperstatsresults.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/json/json-hopperstatsresults", + "source_path": "uwp/design/controls-and-patterns/collection-commanding.md", + "redirect_url": "/windows/apps/design/controls/collection-commanding", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/json/json-initialuploadrequest.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/json/json-initialuploadrequest", + "source_path": "uwp/design/controls-and-patterns/color-picker.md", + "redirect_url": "/windows/apps/design/controls/color-picker", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/json/json-initialuploadresponse.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/json/json-initialuploadresponse", + "source_path": "uwp/design/controls-and-patterns/combo-box.md", + "redirect_url": "/windows/apps/design/controls/combo-box", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/json/json-inventoryitem.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/json/json-inventoryitem", + "source_path": "uwp/design/controls-and-patterns/command-bar-flyout.md", + "redirect_url": "/windows/apps/design/controls/command-bar-flyout", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/json/json-lastseenrecord.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/json/json-lastseenrecord", + "source_path": "uwp/design/controls-and-patterns/commanding.md", + "redirect_url": "/windows/apps/design/controls/commanding", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/json/json-matchticket.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/json/json-matchticket", + "source_path": "uwp/design/controls-and-patterns/contact-card.md", + "redirect_url": "/windows/apps/design/controls/contact-card", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/json/json-mediaasset.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/json/json-mediaasset", + "source_path": "uwp/design/controls-and-patterns/content-links.md", + "redirect_url": "/previous-versions/windows/uwp/ui-input/content-links", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/json/json-mediarecord.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/json/json-mediarecord", + "source_path": "uwp/design/controls-and-patterns/control-templates.md", + "redirect_url": "/windows/apps/design/style/xaml-control-templates", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/json/json-mediarequest.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/json/json-mediarequest", + "source_path": "uwp/design/controls-and-patterns/controls-and-events-intro.md", + "redirect_url": "/windows/apps/design/controls/controls-and-events-intro", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/json/json-multiplayeractivitydetails.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/json/json-multiplayeractivitydetails", + "source_path": "uwp/design/controls-and-patterns/custom-transport-controls.md", + "redirect_url": "/windows/apps/design/controls/custom-transport-controls", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/json/json-multiplayersession.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/json/json-multiplayersession", + "source_path": "uwp/design/controls-and-patterns/data-template-selector.md", + "redirect_url": "/windows/apps/design/controls/data-template-selector", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/json/json-multiplayersessionreference.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/json/json-multiplayersessionreference", + "source_path": "uwp/design/controls-and-patterns/date-and-time.md", + "redirect_url": "/windows/apps/design/controls/date-and-time", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/json/json-multiplayersessionrequest.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/json/json-multiplayersessionrequest", + "source_path": "uwp/design/controls-and-patterns/date-picker.md", + "redirect_url": "/windows/apps/design/controls/date-picker", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/json/json-paginginfo.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/json/json-paginginfo", + "source_path": "uwp/design/controls-and-patterns/dialogs-and-flyouts/dialogs.md", + "redirect_url": "/windows/apps/design/controls/dialogs-and-flyouts/dialogs", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/json/json-peoplelist.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/json/json-peoplelist", + "source_path": "uwp/design/controls-and-patterns/dialogs-and-flyouts/flyouts.md", + "redirect_url": "/windows/apps/design/controls/dialogs-and-flyouts/flyouts", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/json/json-permissioncheckbatchrequest.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/json/json-permissioncheckbatchrequest", + "source_path": "uwp/design/controls-and-patterns/dialogs-and-flyouts/index.md", + "redirect_url": "/windows/apps/design/controls/dialogs-and-flyouts/index", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/json/json-permissioncheckbatchresponse.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/json/json-permissioncheckbatchresponse", + "source_path": "uwp/design/controls-and-patterns/dialogs-and-flyouts/teaching-tip.md", + "redirect_url": "/windows/apps/design/controls/dialogs-and-flyouts/teaching-tip", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/json/json-permissioncheckbatchuserresponse.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/json/json-permissioncheckbatchuserresponse", + "source_path": "uwp/design/controls-and-patterns/flipview.md", + "redirect_url": "/windows/apps/design/controls/flipview", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/json/json-permissioncheckresponse.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/json/json-permissioncheckresponse", + "source_path": "uwp/design/controls-and-patterns/forms.md", + "redirect_url": "/windows/apps/design/controls/forms", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/json/json-permissioncheckresult.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/json/json-permissioncheckresult", + "source_path": "uwp/design/controls-and-patterns/hyperlinks.md", + "redirect_url": "/windows/apps/design/controls/hyperlinks", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/json/json-person.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/json/json-person", + "source_path": "uwp/design/controls-and-patterns/images-imagebrushes.md", + "redirect_url": "/windows/apps/design/controls/images-imagebrushes", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/json/json-personsummary.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/json/json-personsummary", + "source_path": "uwp/design/controls-and-patterns/index.md", + "redirect_url": "/windows/apps/design/controls/index", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/json/json-player.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/json/json-player", + "source_path": "uwp/design/controls-and-patterns/infobar.md", + "redirect_url": "/windows/apps/design/controls/infobar", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/json/json-presencerecord.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/json/json-presencerecord", + "source_path": "uwp/design/controls-and-patterns/inking-controls.md", + "redirect_url": "/windows/apps/design/controls/inking-controls", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/json/json-profile.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/json/json-profile", + "source_path": "uwp/design/controls-and-patterns/inverted-lists.md", + "redirect_url": "/windows/apps/design/controls/inverted-lists", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/json/json-progression.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/json/json-progression", + "source_path": "uwp/design/controls-and-patterns/item-containers-templates.md", + "redirect_url": "/windows/apps/design/controls/item-containers-templates", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/json/json-property.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/json/json-property", + "source_path": "uwp/design/controls-and-patterns/item-templates-gridview.md", + "redirect_url": "/windows/apps/design/controls/item-templates-gridview", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/json/json-queryclipsresponse.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/json/json-queryclipsresponse", + "source_path": "uwp/design/controls-and-patterns/item-templates-listview.md", + "redirect_url": "/windows/apps/design/controls/item-templates-listview", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/json/json-quota.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/json/json-quota", + "source_path": "uwp/design/controls-and-patterns/items-repeater.md", + "redirect_url": "/windows/apps/design/controls/items-repeater", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/json/json-requirement.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/json/json-requirement", + "source_path": "uwp/design/controls-and-patterns/labels.md", + "redirect_url": "/windows/apps/design/controls/labels", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/json/json-resetreputation.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/json/json-resetreputation", + "source_path": "uwp/design/controls-and-patterns/list-details.md", + "redirect_url": "/windows/apps/design/controls/list-details", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/json/json-reward.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/json/json-reward", + "source_path": "uwp/design/controls-and-patterns/lists.md", + "redirect_url": "/windows/apps/design/controls/lists", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/json/json-richpresencerequest.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/json/json-richpresencerequest", + "source_path": "uwp/design/controls-and-patterns/listview-and-gridview.md", + "redirect_url": "/windows/apps/design/controls/listview-and-gridview", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/json/json-serviceerror.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/json/json-serviceerror", + "source_path": "uwp/design/controls-and-patterns/listview-filtering.md", + "redirect_url": "/windows/apps/design/controls/listview-filtering", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/json/json-serviceerrorresponse.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/json/json-serviceerrorresponse", + "source_path": "uwp/design/controls-and-patterns/media-playback.md", + "redirect_url": "/windows/apps/design/controls/media-playback", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/json/json-sessionentry.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/json/json-sessionentry", + "source_path": "uwp/design/controls-and-patterns/menus.md", + "redirect_url": "/windows/apps/design/controls/menus", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/json/json-titleassociation.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/json/json-titleassociation", + "source_path": "uwp/design/controls-and-patterns/navigationview.md", + "redirect_url": "/windows/apps/design/controls/navigationview", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/json/json-titleblob.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/json/json-titleblob", + "source_path": "uwp/design/controls-and-patterns/nested-ui.md", + "redirect_url": "/windows/apps/design/controls/nested-ui", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/json/json-titlerecord.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/json/json-titlerecord", + "source_path": "uwp/design/controls-and-patterns/number-box.md", + "redirect_url": "/windows/apps/design/controls/number-box", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/json/json-titlerequest.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/json/json-titlerequest", + "source_path": "uwp/design/controls-and-patterns/password-box.md", + "redirect_url": "/windows/apps/design/controls/password-box", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/json/json-updatemetadatarequest.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/json/json-updatemetadatarequest", + "source_path": "uwp/design/controls-and-patterns/person-picture.md", + "redirect_url": "/windows/apps/design/controls/person-picture", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/json/json-user.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/json/json-user", + "source_path": "uwp/design/controls-and-patterns/pivot.md", + "redirect_url": "/windows/apps/design/controls/pivot", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/json/json-userclaims.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/json/json-userclaims", + "source_path": "uwp/design/controls-and-patterns/progress-controls.md", + "redirect_url": "/windows/apps/design/controls/progress-controls", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/json/json-userlist.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/json/json-userlist", + "source_path": "uwp/design/controls-and-patterns/pull-to-refresh.md", + "redirect_url": "/windows/apps/design/controls/pull-to-refresh", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/json/json-usersettings.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/json/json-usersettings", + "source_path": "uwp/design/controls-and-patterns/radio-button.md", + "redirect_url": "/windows/apps/design/controls/radio-button", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/json/json-usertitlev2.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/json/json-usertitlev2", + "source_path": "uwp/design/controls-and-patterns/rating.md", + "redirect_url": "/windows/apps/design/controls/rating", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/json/json-verifystringresult.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/json/json-verifystringresult", + "source_path": "uwp/design/controls-and-patterns/resourcedictionary-and-xaml-resource-references.md", + "redirect_url": "/windows/apps/design/style/xaml-resource-dictionary", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/json/json-xuidlist.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/json/json-xuidlist", + "source_path": "uwp/design/controls-and-patterns/rich-edit-box.md", + "redirect_url": "/windows/apps/design/controls/rich-edit-box", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/atoc-xboxlivews-reference-uris.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/atoc-xboxlivews-reference-uris", + "source_path": "uwp/design/controls-and-patterns/rich-text-block.md", + "redirect_url": "/windows/apps/design/controls/rich-text-block", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/achievements/atoc-reference-achievementsv2.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/achievements/atoc-reference-achievementsv2", + "source_path": "uwp/design/controls-and-patterns/scroll-controls.md", + "redirect_url": "/windows/apps/design/controls/scroll-controls", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/achievements/uri-achievementsusersxuidachievementsgetv2.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/achievements/uri-achievementsusersxuidachievementsgetv2", + "source_path": "uwp/design/controls-and-patterns/selection-modes.md", + "redirect_url": "/windows/apps/design/controls/selection-modes", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/achievements/uri-achievementsusersxuidachievementsv2.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/achievements/uri-achievementsusersxuidachievementsv2", + "source_path": "uwp/design/controls-and-patterns/semantic-zoom.md", + "redirect_url": "/windows/apps/design/controls/semantic-zoom", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/achievements/uri-usersxuidachievementsscidachievementid.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/achievements/uri-usersxuidachievementsscidachievementid", + "source_path": "uwp/design/controls-and-patterns/shapes.md", + "redirect_url": "/windows/apps/design/controls/shapes", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/achievements/uri-usersxuidachievementsscidachievementidget.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/achievements/uri-usersxuidachievementsscidachievementidget", + "source_path": "uwp/design/controls-and-patterns/slider.md", + "redirect_url": "/windows/apps/design/controls/slider", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/dvr/atoc-reference-dvr.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/dvr/atoc-reference-dvr", + "source_path": "uwp/design/controls-and-patterns/split-view.md", + "redirect_url": "/windows/apps/design/controls/split-view", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/dvr/uri-publicscidclips.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/dvr/uri-publicscidclips", + "source_path": "uwp/design/controls-and-patterns/swipe.md", + "redirect_url": "/windows/apps/design/controls/swipe", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/dvr/uri-publicscidclipsget.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/dvr/uri-publicscidclipsget", + "source_path": "uwp/design/controls-and-patterns/tab-view.md", + "redirect_url": "/windows/apps/design/controls/tab-view", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/dvr/uri-uri.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/dvr/uri-uri", + "source_path": "uwp/design/controls-and-patterns/text-block.md", + "redirect_url": "/windows/apps/design/controls/text-block", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/dvr/uri-uriget.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/dvr/uri-uriget", + "source_path": "uwp/design/controls-and-patterns/text-box.md", + "redirect_url": "/windows/apps/design/controls/text-box", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/dvr/uri-uriput.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/dvr/uri-uriput", + "source_path": "uwp/design/controls-and-patterns/text-controls.md", + "redirect_url": "/windows/apps/design/controls/text-controls", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/dvr/uri-usersmescidclips.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/dvr/uri-usersmescidclips", + "source_path": "uwp/design/controls-and-patterns/text-handwriting-view.md", + "redirect_url": "/windows/apps/design/controls/text-handwriting-view", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/dvr/uri-usersmescidclipsgameclipid.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/dvr/uri-usersmescidclipsgameclipid", + "source_path": "uwp/design/controls-and-patterns/time-picker.md", + "redirect_url": "/windows/apps/design/controls/time-picker", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/dvr/uri-usersmescidclipsgameclipiddelete.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/dvr/uri-usersmescidclipsgameclipiddelete", + "source_path": "uwp/design/controls-and-patterns/toggles.md", + "redirect_url": "/windows/apps/design/controls/toggles", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/dvr/uri-usersmescidclipsgameclipidpost.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/dvr/uri-usersmescidclipsgameclipidpost", + "source_path": "uwp/design/controls-and-patterns/tooltips.md", + "redirect_url": "/windows/apps/design/controls/tooltips", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/dvr/uri-usersmescidclipspost.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/dvr/uri-usersmescidclipspost", + "source_path": "uwp/design/controls-and-patterns/tree-view.md", + "redirect_url": "/windows/apps/design/controls/tree-view", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/dvr/uri-usersowneridclips.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/dvr/uri-usersowneridclips", + "source_path": "uwp/design/controls-and-patterns/two-pane-view.md", + "redirect_url": "/windows/apps/design/controls/two-pane-view", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/dvr/uri-usersowneridclipsget.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/dvr/uri-usersowneridclipsget", + "source_path": "uwp/design/controls-and-patterns/web-view.md", + "redirect_url": "/windows/apps/design/controls/web-view", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/dvr/uri-usersowneridscidclipsgameclipid.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/dvr/uri-usersowneridscidclipsgameclipid", + "source_path": "uwp/design/controls-and-patterns/xaml-styles.md", + "redirect_url": "/windows/apps/develop/platform/xaml/xaml-styles", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/dvr/uri-usersowneridscidclipsgameclipidget.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/dvr/uri-usersowneridscidclipsgameclipidget", + "source_path": "uwp/design/controls-and-patterns/xaml-theme-resources.md", + "redirect_url": "/windows/apps/develop/platform/xaml/xaml-theme-resources", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/gamerpic/atoc-reference-gamerpic.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/gamerpic/atoc-reference-gamerpic", + "source_path": "uwp/design/devices/designing-for-MR.md", + "redirect_url": "/windows/apps/design/devices/designing-for-MR", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/gamerpic/uri-usersmegamerpic.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/gamerpic/uri-usersmegamerpic", + "source_path": "uwp/design/devices/designing-for-tv.md", + "redirect_url": "/windows/apps/design/devices/designing-for-tv", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/gamerpic/uri-usersmegamerpicput.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/gamerpic/uri-usersmegamerpicput", + "source_path": "uwp/design/devices/index.md", + "redirect_url": "/windows/apps/design/devices/index", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/gsdk/atoc-gsdk-uri-reference.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/gsdk/atoc-gsdk-uri-reference", + "source_path": "uwp/design/downloads/index.md", + "redirect_url": "/windows/apps/design/downloads/index", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/gsdk/uri-qosservers-get.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/gsdk/uri-qosservers-get", + "source_path": "uwp/design/globalizing/adjust-layout-and-fonts--and-support-rtl.md", + "redirect_url": "/windows/apps/design/globalizing/adjust-layout-and-fonts--and-support-rtl", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/gsdk/uri-qosservers.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/gsdk/uri-qosservers", + "source_path": "uwp/design/globalizing/design-for-bidi-text.md", + "redirect_url": "/windows/apps/design/globalizing/design-for-bidi-text", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/gsdk/uri-titlestitleidclusters-post.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/gsdk/uri-titlestitleidclusters-post", + "source_path": "uwp/design/globalizing/glob-numeralsystem-values.md", + "redirect_url": "/windows/apps/design/globalizing/glob-numeralsystem-values", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/gsdk/uri-titlestitleidclusters.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/gsdk/uri-titlestitleidclusters", + "source_path": "uwp/design/globalizing/globalizing-portal.md", + "redirect_url": "/windows/apps/design/globalizing/globalizing-portal", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/gsdk/uri-titlestitleidsessionhosts-post.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/gsdk/uri-titlestitleidsessionhosts-post", + "source_path": "uwp/design/globalizing/guidelines-and-checklist-for-globalizing-your-app.md", + "redirect_url": "/windows/apps/design/globalizing/guidelines-and-checklist-for-globalizing-your-app", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/gsdk/uri-titlestitleidsessionhosts.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/gsdk/uri-titlestitleidsessionhosts", + "source_path": "uwp/design/globalizing/japanese-era-change.md", + "redirect_url": "/windows/apps/design/globalizing/japanese-era-change", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/gsdk/uri-titlestitleidsessionssessionidallocationstatus-get.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/gsdk/uri-titlestitleidsessionssessionidallocationstatus-get", + "source_path": "uwp/design/globalizing/loc-international-fonts.md", + "redirect_url": "/windows/apps/design/globalizing/loc-international-fonts", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/gsdk/uri-titlestitleidsessionssessionidallocationstatus.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/gsdk/uri-titlestitleidsessionssessionidallocationstatus", + "source_path": "uwp/design/globalizing/manage-language-and-region.md", + "redirect_url": "/windows/apps/design/globalizing/manage-language-and-region", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/gsdk/uri-titlestitleidvariants-post.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/gsdk/uri-titlestitleidvariants-post", + "source_path": "uwp/design/globalizing/prepare-your-app-for-localization.md", + "redirect_url": "/windows/apps/design/globalizing/prepare-your-app-for-localization", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/gsdk/uri-titlestitleidvariants.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/gsdk/uri-titlestitleidvariants", + "source_path": "uwp/design/globalizing/use-global-ready-formats.md", + "redirect_url": "/windows/apps/design/globalizing/use-global-ready-formats", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/leaderboard/atoc-reference-leaderboard.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/leaderboard/atoc-reference-leaderboard", + "source_path": "uwp/design/globalizing/use-mat.md", + "redirect_url": "/windows/apps/design/globalizing/use-mat", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/leaderboard/uri-scidsscidleaderboardsleaderboardname.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/leaderboard/uri-scidsscidleaderboardsleaderboardname", + "source_path": "uwp/design/globalizing/use-patterns-to-format-dates-and-times.md", + "redirect_url": "/windows/apps/design/globalizing/use-patterns-to-format-dates-and-times", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/leaderboard/uri-scidsscidleaderboardsleaderboardnameget.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/leaderboard/uri-scidsscidleaderboardsleaderboardnameget", + "source_path": "uwp/design/globalizing/use-utf8-code-page.md", + "redirect_url": "/windows/apps/design/globalizing/use-utf8-code-page", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/leaderboard/uri-scidsscidleaderboardsleaderboardnamegetvaluemetadata.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/leaderboard/uri-scidsscidleaderboardsleaderboardnamegetvaluemetadata", + "source_path": "uwp/design/in-app-help/external-help.md", + "redirect_url": "/windows/apps/design/in-app-help/external-help", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/leaderboard/uri-usersxuidscidstatnamepeople.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/leaderboard/uri-usersxuidscidstatnamepeople", + "source_path": "uwp/design/in-app-help/guidelines-for-app-help.md", + "redirect_url": "/windows/apps/design/in-app-help/guidelines-for-app-help", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/leaderboard/uri-usersxuidscidstatnamepeopleget.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/leaderboard/uri-usersxuidscidstatnamepeopleget", + "source_path": "uwp/design/in-app-help/in-app-help.md", + "redirect_url": "/windows/apps/design/in-app-help/in-app-help", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/lists/atoc-reference-lists.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/lists/atoc-reference-lists", + "source_path": "uwp/design/in-app-help/instructional-ui.md", + "redirect_url": "/windows/apps/design/in-app-help/instructional-ui", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/lists/uri-usersxuidlistspinslistname.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/lists/uri-usersxuidlistspinslistname", + "source_path": "uwp/design/index.md", + "redirect_url": "/windows/apps/design/index", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/lists/uri-usersxuidlistspinslistnamecontainsitems.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/lists/uri-usersxuidlistspinslistnamecontainsitems", + "source_path": "uwp/design/input/access-keys.md", + "redirect_url": "/windows/apps/design/input/access-keys", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/lists/uri-usersxuidlistspinslistnamecontainsitemspost.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/lists/uri-usersxuidlistspinslistnamecontainsitemspost", + "source_path": "uwp/design/input/convert-ink-to-text.md", + "redirect_url": "/windows/apps/design/input/convert-ink-to-text", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/lists/uri-usersxuidlistspinslistnamedelete.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/lists/uri-usersxuidlistspinslistnamedelete", + "source_path": "uwp/design/input/cortana-deep-link-into-your-app.md", + "redirect_url": "/previous-versions/windows/uwp/ui-input/cortana-deep-link-into-your-app", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/lists/uri-usersxuidlistspinslistnameget.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/lists/uri-usersxuidlistspinslistnameget", + "source_path": "uwp/design/input/cortana-design-guidelines.md", + "redirect_url": "/previous-versions/windows/uwp/ui-input/cortana-design-guidelines", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/lists/uri-usersxuidlistspinslistnameindex.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/lists/uri-usersxuidlistspinslistnameindex", + "source_path": "uwp/design/input/cortana-dynamically-modify-voice-command-definition-vcd-phrase-lists.md", + "redirect_url": "/previous-versions/windows/uwp/ui-input/cortana-dynamically-modify-voice-command-definition-vcd-phrase-lists", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/lists/uri-usersxuidlistspinslistnameindexpost.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/lists/uri-usersxuidlistspinslistnameindexpost", + "source_path": "uwp/design/input/cortana-interact-with-a-background-app.md", + "redirect_url": "/previous-versions/windows/uwp/ui-input/cortana-interact-with-a-background-app", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/lists/uri-usersxuidlistspinslistnamepost.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/lists/uri-usersxuidlistspinslistnamepost", + "source_path": "uwp/design/input/cortana-interactions.md", + "redirect_url": "/previous-versions/windows/uwp/ui-input/cortana-interactions", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/lists/uri-usersxuidlistspinslistnameput.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/lists/uri-usersxuidlistspinslistnameput", + "source_path": "uwp/design/input/cortana-launch-a-background-app-with-voice-commands.md", + "redirect_url": "/previous-versions/windows/uwp/ui-input/cortana-launch-a-background-app-with-voice-commands", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/lists/uri-usersxuidlistspinslistnameremoveitems.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/lists/uri-usersxuidlistspinslistnameremoveitems", + "source_path": "uwp/design/input/cortana-launch-a-foreground-app-with-voice-commands.md", + "redirect_url": "/previous-versions/windows/uwp/ui-input/cortana-launch-a-foreground-app-with-voice-commands", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/lists/uri-usersxuidlistspinslistnameremoveitemsdelete.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/lists/uri-usersxuidlistspinslistnameremoveitemsdelete", + "source_path": "uwp/design/input/cortana-support-natural-language-voice-commands.md", + "redirect_url": "/previous-versions/windows/uwp/ui-input/cortana-support-natural-language-voice-commands", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/lists/uri-usersxuidlistspinslistnameremoveitemspost.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/lists/uri-usersxuidlistspinslistnameremoveitemspost", + "source_path": "uwp/design/input/custom-text-input.md", + "redirect_url": "/windows/apps/design/input/custom-text-input", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/marketplace/atoc-reference-marketplace.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/marketplace/atoc-reference-marketplace", + "source_path": "uwp/design/input/define-custom-recognition-constraints.md", + "redirect_url": "/windows/apps/design/input/define-custom-recognition-constraints", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/marketplace/uri-inventory.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/marketplace/uri-inventory", + "source_path": "uwp/design/input/drag-and-drop.md", + "redirect_url": "/windows/apps/develop/data/drag-and-drop", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/marketplace/uri-inventoryconsumablesitemurl.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/marketplace/uri-inventoryconsumablesitemurl", + "source_path": "uwp/design/input/enable-continuous-dictation.md", + "redirect_url": "/windows/apps/design/input/enable-continuous-dictation", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/marketplace/uri-inventoryconsumablesitemurlpost.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/marketplace/uri-inventoryconsumablesitemurlpost", + "source_path": "uwp/design/input/focus-navigation-programmatic.md", + "redirect_url": "/windows/apps/design/input/focus-navigation-programmatic", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/marketplace/uri-inventoryget.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/marketplace/uri-inventoryget", + "source_path": "uwp/design/input/focus-navigation.md", + "redirect_url": "/windows/apps/design/input/focus-navigation", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/marketplace/uri-inventoryitemurl.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/marketplace/uri-inventoryitemurl", + "source_path": "uwp/design/input/gamepad-and-remote-interactions.md", + "redirect_url": "/windows/apps/design/input/gamepad-and-remote-interactions", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/marketplace/uri-inventoryitemurlget.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/marketplace/uri-inventoryitemurlget", + "source_path": "uwp/design/input/gaze-interactions.md", + "redirect_url": "/windows/apps/design/input/gaze-interactions", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/marketplace/uri-localecrossmediagroupsearch.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/marketplace/uri-localecrossmediagroupsearch", + "source_path": "uwp/design/input/guidelines-for-cross-slide.md", + "redirect_url": "/windows/apps/design/input/guidelines-for-cross-slide", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/marketplace/uri-localecrossmediagroupsearchget.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/marketplace/uri-localecrossmediagroupsearchget", + "source_path": "uwp/design/input/guidelines-for-optical-zoom.md", + "redirect_url": "/windows/apps/design/input/guidelines-for-optical-zoom", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/marketplace/uri-medialocalebrowse.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/marketplace/uri-medialocalebrowse", + "source_path": "uwp/design/input/guidelines-for-panning.md", + "redirect_url": "/windows/apps/design/input/guidelines-for-panning", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/marketplace/uri-medialocalebrowseget.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/marketplace/uri-medialocalebrowseget", + "source_path": "uwp/design/input/guidelines-for-rotation.md", + "redirect_url": "/windows/apps/design/input/guidelines-for-rotation", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/marketplace/uri-medialocalecontentrating.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/marketplace/uri-medialocalecontentrating", + "source_path": "uwp/design/input/guidelines-for-targeting.md", + "redirect_url": "/windows/apps/design/input/guidelines-for-targeting", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/marketplace/uri-medialocalecontentratingget.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/marketplace/uri-medialocalecontentratingget", + "source_path": "uwp/design/input/guidelines-for-textselection.md", + "redirect_url": "/windows/apps/design/input/guidelines-for-textselection", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/marketplace/uri-medialocaledetails.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/marketplace/uri-medialocaledetails", + "source_path": "uwp/design/input/guidelines-for-visualfeedback.md", + "redirect_url": "/windows/apps/design/input/guidelines-for-visualfeedback", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/marketplace/uri-medialocaledetailsget.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/marketplace/uri-medialocaledetailsget", + "source_path": "uwp/design/input/handle-pointer-input.md", + "redirect_url": "/windows/apps/design/input/handle-pointer-input", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/marketplace/uri-medialocalefields.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/marketplace/uri-medialocalefields", + "source_path": "uwp/design/input/identify-input-devices.md", + "redirect_url": "/windows/apps/design/input/identify-input-devices", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/marketplace/uri-medialocalefieldsget.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/marketplace/uri-medialocalefieldsget", + "source_path": "uwp/design/input/index.md", + "redirect_url": "/windows/apps/design/input/index", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/marketplace/uri-medialocalemediaitemtypequeryrefinersubqueryrefinervalues.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/marketplace/uri-medialocalemediaitemtypequeryrefinersubqueryrefinervalues", + "source_path": "uwp/design/input/ink-toolbar.md", + "redirect_url": "/windows/apps/design/input/ink-toolbar", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/marketplace/uri-medialocalemediaitemtypequeryrefinersubqueryrefinervaluesget.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/marketplace/uri-medialocalemediaitemtypequeryrefinersubqueryrefinervaluesget", + "source_path": "uwp/design/input/ink-walkthrough.md", + "redirect_url": "/windows/apps/design/input/ink-walkthrough", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/marketplace/uri-medialocalemetadatamediagroups.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/marketplace/uri-medialocalemetadatamediagroups", + "source_path": "uwp/design/input/input-injection.md", + "redirect_url": "/windows/apps/design/input/input-injection", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/marketplace/uri-medialocalemetadatamediagroupsget.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/marketplace/uri-medialocalemetadatamediagroupsget", + "source_path": "uwp/design/input/input-method-editor-requirements.md", + "redirect_url": "/windows/apps/design/input/input-method-editor-requirements", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/marketplace/uri-medialocalemetadatamediagroupsmediaitemtypes.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/marketplace/uri-medialocalemetadatamediagroupsmediaitemtypes", + "source_path": "uwp/design/input/input-method-editors.md", + "redirect_url": "/windows/apps/design/input/input-method-editors", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/marketplace/uri-medialocalemetadatamediagroupsmediaitemtypesget.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/marketplace/uri-medialocalemetadatamediagroupsmediaitemtypesget", + "source_path": "uwp/design/input/input-primer.md", + "redirect_url": "/windows/apps/design/input/input-primer", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/marketplace/uri-medialocalemetadatamediaitemtypefields.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/marketplace/uri-medialocalemetadatamediaitemtypefields", + "source_path": "uwp/design/input/keyboard-accelerators.md", + "redirect_url": "/windows/apps/design/input/keyboard-accelerators", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/marketplace/uri-medialocalemetadatamediaitemtypefieldsget.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/marketplace/uri-medialocalemetadatamediaitemtypefieldsget", + "source_path": "uwp/design/input/keyboard-events.md", + "redirect_url": "/windows/apps/design/input/keyboard-events", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/marketplace/uri-medialocalemetadatamediaitemtypequeryrefiners.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/marketplace/uri-medialocalemetadatamediaitemtypequeryrefiners", + "source_path": "uwp/design/input/keyboard-interactions.md", + "redirect_url": "/windows/apps/design/input/keyboard-interactions", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/marketplace/uri-medialocalemetadatamediaitemtypequeryrefinersget.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/marketplace/uri-medialocalemetadatamediaitemtypequeryrefinersget", + "source_path": "uwp/design/input/manage-issues-with-audio-input.md", + "redirect_url": "/windows/apps/design/input/manage-issues-with-audio-input", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/marketplace/uri-medialocalemetadatamediaitemtypequeryrefinersqueryrefinername.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/marketplace/uri-medialocalemetadatamediaitemtypequeryrefinersqueryrefinername", + "source_path": "uwp/design/input/mouse-interactions.md", + "redirect_url": "/windows/apps/design/input/mouse-interactions", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/marketplace/uri-medialocalemetadatamediaitemtypequeryrefinersqueryrefinernameget.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/marketplace/uri-medialocalemetadatamediaitemtypequeryrefinersqueryrefinernameget", + "source_path": "uwp/design/input/multiple-input-design-guidelines.md", + "redirect_url": "/windows/apps/design/input/multiple-input-design-guidelines", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/marketplace/uri-medialocalemetadatamediaitemtypes.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/marketplace/uri-medialocalemetadatamediaitemtypes", + "source_path": "uwp/design/input/pen-and-stylus-interactions.md", + "redirect_url": "/windows/apps/design/input/pen-and-stylus-interactions", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/marketplace/uri-medialocalemetadatamediaitemtypesget.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/marketplace/uri-medialocalemetadatamediaitemtypesget", + "source_path": "uwp/design/input/radialcontroller-walkthrough.md", + "redirect_url": "/windows/apps/design/input/radialcontroller-walkthrough", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/marketplace/uri-medialocalemetadatamediaitemtypesortorders.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/marketplace/uri-medialocalemetadatamediaitemtypesortorders", + "source_path": "uwp/design/input/respond-to-the-presence-of-the-touch-keyboard.md", + "redirect_url": "/windows/apps/design/input/respond-to-the-presence-of-the-touch-keyboard", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/marketplace/uri-medialocalemetadatamediaitemtypesortordersget.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/marketplace/uri-medialocalemetadatamediaitemtypesortordersget", + "source_path": "uwp/design/input/save-and-load-ink.md", + "redirect_url": "/windows/apps/design/input/save-and-load-ink", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/marketplace/uri-medialocalesinglemediagroupsearch.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/marketplace/uri-medialocalesinglemediagroupsearch", + "source_path": "uwp/design/input/set-speech-recognition-timeouts.md", + "redirect_url": "/windows/apps/design/input/set-speech-recognition-timeouts", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/marketplace/uri-medialocalesinglemediagroupsearchget.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/marketplace/uri-medialocalesinglemediagroupsearchget", + "source_path": "uwp/design/input/specify-the-speech-recognizer-language.md", + "redirect_url": "/windows/apps/design/input/specify-the-speech-recognizer-language", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/matchtickets/atoc-reference-matchtickets.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/matchtickets/atoc-reference-matchtickets", + "source_path": "uwp/design/input/speech-interactions.md", + "redirect_url": "/windows/apps/design/input/speech-interactions", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/matchtickets/uri-scidhoppernameticketid.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/matchtickets/uri-scidhoppernameticketid", + "source_path": "uwp/design/input/speech-recognition.md", + "redirect_url": "/windows/apps/design/input/speech-recognition", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/matchtickets/uri-scidhoppernameticketiddelete.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/matchtickets/uri-scidhoppernameticketiddelete", + "source_path": "uwp/design/input/text-scaling.md", + "redirect_url": "/windows/apps/design/input/text-scaling", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/matchtickets/uri-serviceconfigsscidhoppershoppername.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/matchtickets/uri-serviceconfigsscidhoppershoppername", + "source_path": "uwp/design/input/touch-interactions.md", + "redirect_url": "/windows/apps/design/input/touch-interactions", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/matchtickets/uri-serviceconfigsscidhoppershoppernamepost.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/matchtickets/uri-serviceconfigsscidhoppershoppernamepost", + "source_path": "uwp/design/input/touchpad-interactions.md", + "redirect_url": "/windows/apps/design/input/touchpad-interactions", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/matchtickets/uri-serviceconfigsscidhoppershoppernamestats.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/matchtickets/uri-serviceconfigsscidhoppershoppernamestats", + "source_path": "uwp/design/input/use-input-scope-to-change-the-touch-keyboard.md", + "redirect_url": "/windows/apps/design/input/use-input-scope-to-change-the-touch-keyboard", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/matchtickets/uri-serviceconfigsscidhoppershoppernamestatsget.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/matchtickets/uri-serviceconfigsscidhoppershoppernamestatsget", + "source_path": "uwp/design/input/windows-wheel-interactions.md", + "redirect_url": "/windows/apps/design/input/windows-wheel-interactions", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/people/atoc-reference-people.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/people/atoc-reference-people", + "source_path": "uwp/design/layout/3-d-perspective-effects.md", + "redirect_url": "/windows/apps/develop/platform/xaml/3-d-perspective-effects", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/people/uri-usersowneridpeople.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/people/uri-usersowneridpeople", + "source_path": "uwp/design/layout/alignment-margin-padding.md", + "redirect_url": "/windows/apps/design/layout/alignment-margin-padding", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/people/uri-usersowneridpeopleget.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/people/uri-usersowneridpeopleget", + "source_path": "uwp/design/layout/app-window.md", + "redirect_url": "/windows/uwp/ui-input/app-window", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/people/uri-usersowneridpeopletargetid.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/people/uri-usersowneridpeopletargetid", + "source_path": "uwp/design/layout/application-view.md", + "redirect_url": "/windows/uwp/ui-input/application-view", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/people/uri-usersowneridpeopletargetidget.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/people/uri-usersowneridpeopletargetidget", + "source_path": "uwp/design/layout/attached-layouts.md", + "redirect_url": "/windows/apps/design/layout/attached-layouts", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/people/uri-usersowneridpeoplexuids.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/people/uri-usersowneridpeoplexuids", + "source_path": "uwp/design/layout/boxpanel-example-custom-panel.md", + "redirect_url": "/windows/apps/design/layout/boxpanel-example-custom-panel", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/people/uri-usersowneridpeoplexuidspost.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/people/uri-usersowneridpeoplexuidspost", + "source_path": "uwp/design/layout/custom-panels-overview.md", + "redirect_url": "/windows/apps/design/layout/custom-panels-overview", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/people/uri-usersowneridsummary.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/people/uri-usersowneridsummary", + "source_path": "uwp/design/layout/depth-shadow.md", + "redirect_url": "/windows/apps/design/layout/depth-shadow", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/people/uri-usersowneridsummaryget.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/people/uri-usersowneridsummaryget", + "source_path": "uwp/design/layout/grid-tutorial.md", + "redirect_url": "/windows/apps/design/layout/grid-tutorial", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/presence/atoc-reference-presence.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/presence/atoc-reference-presence", + "source_path": "uwp/design/layout/index.md", + "redirect_url": "/windows/apps/design/layout/index", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/presence/uri-usersbatch.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/presence/uri-usersbatch", + "source_path": "uwp/design/layout/layout-panels.md", + "redirect_url": "/windows/apps/design/layout/layout-panels", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/presence/uri-usersbatchpost.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/presence/uri-usersbatchpost", + "source_path": "uwp/design/layout/layouts-with-xaml.md", + "redirect_url": "/windows/apps/design/layout/layouts-with-xaml", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/presence/uri-usersme.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/presence/uri-usersme", + "source_path": "uwp/design/layout/page-layout.md", + "redirect_url": "/windows/apps/design/layout/page-layout", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/presence/uri-usersmeget.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/presence/uri-usersmeget", + "source_path": "uwp/design/layout/responsive-design.md", + "redirect_url": "/windows/apps/design/layout/responsive-design", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/presence/uri-usersmegroupsmoniker.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/presence/uri-usersmegroupsmoniker", + "source_path": "uwp/design/layout/screen-sizes-and-breakpoints-for-responsive-design.md", + "redirect_url": "/windows/apps/design/layout/screen-sizes-and-breakpoints-for-responsive-design", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/presence/uri-usersmegroupsmonikerget.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/presence/uri-usersmegroupsmonikerget", + "source_path": "uwp/design/layout/show-multiple-views.md", + "redirect_url": "/windows/uwp/ui-input/show-multiple-views", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/presence/uri-usersxuid.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/presence/uri-usersxuid", + "source_path": "uwp/design/layout/transforms.md", + "redirect_url": "/windows/apps/develop/platform/xaml/transforms", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/presence/uri-usersxuiddevicescurrenttitlescurrent.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/presence/uri-usersxuiddevicescurrenttitlescurrent", + "source_path": "uwp/design/motion/connected-animation.md", + "redirect_url": "/windows/apps/design/motion/connected-animation", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/presence/uri-usersxuiddevicescurrenttitlescurrentdelete.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/presence/uri-usersxuiddevicescurrenttitlescurrentdelete", + "source_path": "uwp/design/motion/content-transition-animations.md", + "redirect_url": "/windows/apps/design/motion/content-transition-animations", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/presence/uri-usersxuiddevicescurrenttitlescurrentpost.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/presence/uri-usersxuiddevicescurrenttitlescurrentpost", + "source_path": "uwp/design/motion/directionality-and-gravity.md", + "redirect_url": "/windows/apps/design/motion/directionality-and-gravity", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/presence/uri-usersxuidget.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/presence/uri-usersxuidget", + "source_path": "uwp/design/motion/index.md", + "redirect_url": "/windows/apps/design/motion/index", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/presence/uri-usersxuidgroupsmoniker.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/presence/uri-usersxuidgroupsmoniker", + "source_path": "uwp/design/motion/key-frame-and-easing-function-animations.md", + "redirect_url": "/windows/apps/design/motion/key-frame-and-easing-function-animations", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/presence/uri-usersxuidgroupsmonikerbroadcasting.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/presence/uri-usersxuidgroupsmonikerbroadcasting", + "source_path": "uwp/design/motion/motion-dragdrop.md", + "redirect_url": "/previous-versions/windows/uwp/ui-input/motion-dragdrop", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/presence/uri-usersxuidgroupsmonikerbroadcastingcount.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/presence/uri-usersxuidgroupsmonikerbroadcastingcount", + "source_path": "uwp/design/motion/motion-edgebased.md", + "redirect_url": "/previous-versions/windows/uwp/ui-input/motion-edgebased", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/presence/uri-usersxuidgroupsmonikerbroadcastingcountget.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/presence/uri-usersxuidgroupsmonikerbroadcastingcountget", + "source_path": "uwp/design/motion/motion-fade.md", + "redirect_url": "/previous-versions/windows/uwp/ui-input/motion-fade", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/presence/uri-usersxuidgroupsmonikerbroadcastingget.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/presence/uri-usersxuidgroupsmonikerbroadcastingget", + "source_path": "uwp/design/motion/motion-in-practice.md", + "redirect_url": "/windows/apps/design/motion/motion-in-practice", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/presence/uri-usersxuidgroupsmonikerget.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/presence/uri-usersxuidgroupsmonikerget", + "source_path": "uwp/design/motion/motion-list.md", + "redirect_url": "/previous-versions/windows/uwp/ui-input/motion-list", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/privacy/atoc-reference-privacyv2.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/privacy/atoc-reference-privacyv2", + "source_path": "uwp/design/motion/motion-pointer.md", + "redirect_url": "/previous-versions/windows/uwp/ui-input/motion-pointer", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/privacy/uri-privacyusersowneridpeoplemute.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/privacy/uri-privacyusersowneridpeoplemute", + "source_path": "uwp/design/motion/motion-popup-animations.md", + "redirect_url": "/previous-versions/windows/uwp/ui-input/motion-popup-animations", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/privacy/uri-privacyusersowneridpeoplemuteget.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/privacy/uri-privacyusersowneridpeoplemuteget", + "source_path": "uwp/design/motion/motion-reposition.md", + "redirect_url": "/previous-versions/windows/uwp/ui-input/motion-reposition", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/privacy/uri-privacyusersrequestoridpermissionvalidate.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/privacy/uri-privacyusersrequestoridpermissionvalidate", + "source_path": "uwp/design/motion/page-transitions.md", + "redirect_url": "/windows/apps/design/motion/page-transitions", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/privacy/uri-privacyusersrequestoridpermissionvalidateget.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/privacy/uri-privacyusersrequestoridpermissionvalidateget", + "source_path": "uwp/design/motion/parallax.md", + "redirect_url": "/windows/apps/design/motion/parallax", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/privacy/uri-privacyusersrequestoridpermissionvalidatepost.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/privacy/uri-privacyusersrequestoridpermissionvalidatepost", + "source_path": "uwp/design/motion/storyboarded-animations.md", + "redirect_url": "/windows/apps/design/motion/storyboarded-animations", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/privacy/uri-privacyusersxuidpeopleavoid.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/privacy/uri-privacyusersxuidpeopleavoid", + "source_path": "uwp/design/motion/timing-and-easing.md", + "redirect_url": "/windows/apps/design/motion/timing-and-easing", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/privacy/uri-privacyusersxuidpeopleavoidget.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/privacy/uri-privacyusersxuidpeopleavoidget", + "source_path": "uwp/design/motion/xaml-animation.md", + "redirect_url": "/windows/apps/design/motion/xaml-animation", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/profileV2/atoc-reference-profiles.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/profileV2/atoc-reference-profiles", + "source_path": "uwp/design/motion/xaml-property-animations.md", + "redirect_url": "/windows/apps/design/motion/xaml-property-animations", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/profileV2/uri-usersbatchprofilesettings.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/profileV2/uri-usersbatchprofilesettings", + "source_path": "uwp/design/shell/pin-to-taskbar.md", + "redirect_url": "/windows/apps/design/shell/pin-to-taskbar", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/profileV2/uri-usersbatchprofilesettingspost.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/profileV2/uri-usersbatchprofilesettingspost", + "source_path": "uwp/design/shell/tiles-and-notifications/WNS-Notification-Priorities.md", + "redirect_url": "/windows/apps/design/shell/tiles-and-notifications/WNS-Notification-Priorities", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/profileV2/uri-usersuseridprofilesettingspeopleuserlist.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/profileV2/uri-usersuseridprofilesettingspeopleuserlist", + "source_path": "uwp/design/shell/tiles-and-notifications/adaptive-interactive-toasts.md", + "redirect_url": "/windows/apps/design/shell/tiles-and-notifications/adaptive-interactive-toasts", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/profileV2/uri-usersuseridprofilesettingspeopleuserlistget.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/profileV2/uri-usersuseridprofilesettingspeopleuserlistget", + "source_path": "uwp/design/shell/tiles-and-notifications/adaptive-tiles-schema.md", + "redirect_url": "/windows/apps/design/shell/tiles-and-notifications/adaptive-tiles-schema", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/reputation/atoc-reference-reputation.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/reputation/atoc-reference-reputation", + "source_path": "uwp/design/shell/tiles-and-notifications/alternate-channel-VAPID-webpush.md", + "redirect_url": "/windows/apps/design/shell/tiles-and-notifications/alternate-channel-VAPID-webpush", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/reputation/uri-reputationusersbatchfeedback.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/reputation/uri-reputationusersbatchfeedback", + "source_path": "uwp/design/shell/tiles-and-notifications/badges.md", + "redirect_url": "/windows/apps/design/shell/tiles-and-notifications/badges", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/reputation/uri-reputationusersbatchfeedbackpost.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/reputation/uri-reputationusersbatchfeedbackpost", + "source_path": "uwp/design/shell/tiles-and-notifications/channel-types.md", + "redirect_url": "/windows/apps/design/shell/tiles-and-notifications/channel-types", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/reputation/uri-reputationusersxuidfeedback.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/reputation/uri-reputationusersxuidfeedback", + "source_path": "uwp/design/shell/tiles-and-notifications/chaseable-tile-notifications.md", + "redirect_url": "/windows/apps/design/shell/tiles-and-notifications/chaseable-tile-notifications", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/reputation/uri-reputationusersxuidfeedbackpost.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/reputation/uri-reputationusersxuidfeedbackpost", + "source_path": "uwp/design/shell/tiles-and-notifications/choosing-a-notification-delivery-method.md", + "redirect_url": "/windows/apps/design/shell/tiles-and-notifications/choosing-a-notification-delivery-method", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/reputation/uri-usersmeresetreputation.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/reputation/uri-usersmeresetreputation", + "source_path": "uwp/design/shell/tiles-and-notifications/create-adaptive-tiles.md", + "redirect_url": "/windows/apps/design/shell/tiles-and-notifications/create-adaptive-tiles", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/reputation/uri-usersmeresetreputationpost.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/reputation/uri-usersmeresetreputationpost", + "source_path": "uwp/design/shell/tiles-and-notifications/creating-tiles.md", + "redirect_url": "/windows/apps/design/shell/tiles-and-notifications/creating-tiles", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/reputation/uri-usersxuiddeleteuserdata.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/reputation/uri-usersxuiddeleteuserdata", + "source_path": "uwp/design/shell/tiles-and-notifications/custom-audio-on-toasts.md", + "redirect_url": "/windows/apps/design/shell/tiles-and-notifications/custom-audio-on-toasts", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/reputation/uri-usersxuiddeleteuserdatapost.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/reputation/uri-usersxuiddeleteuserdatapost", + "source_path": "uwp/design/shell/tiles-and-notifications/custom-timestamps-on-toasts.md", + "redirect_url": "/windows/apps/design/shell/tiles-and-notifications/custom-timestamps-on-toasts", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/reputation/uri-usersxuidresetreputation.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/reputation/uri-usersxuidresetreputation", + "source_path": "uwp/design/shell/tiles-and-notifications/firewall-allowlist-config.md", + "redirect_url": "/windows/apps/design/shell/tiles-and-notifications/firewall-allowlist-config", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/reputation/uri-usersxuidresetreputationpost.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/reputation/uri-usersxuidresetreputationpost", + "source_path": "uwp/design/shell/tiles-and-notifications/includes/desktop-toast-activation-code.md", + "redirect_url": "/windows/apps/design/shell/tiles-and-notifications/includes/desktop-toast-activation-code", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/sessiondirectory/atoc-reference-sessiondirectory.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/sessiondirectory/atoc-reference-sessiondirectory", + "source_path": "uwp/design/shell/tiles-and-notifications/includes/desktop-toast-activation-sequence.md", + "redirect_url": "/windows/apps/design/shell/tiles-and-notifications/includes/desktop-toast-activation-sequence", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/sessiondirectory/uri-handles.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/sessiondirectory/uri-handles", + "source_path": "uwp/design/shell/tiles-and-notifications/includes/images-note.md", + "redirect_url": "/windows/apps/design/shell/tiles-and-notifications/includes/images-note", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/sessiondirectory/uri-handleshandleid.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/sessiondirectory/uri-handleshandleid", + "source_path": "uwp/design/shell/tiles-and-notifications/includes/nuget-package-dotnet-warnings.md", + "redirect_url": "/windows/apps/design/shell/tiles-and-notifications/includes/nuget-package-dotnet-warnings", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/sessiondirectory/uri-handleshandleiddelete.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/sessiondirectory/uri-handleshandleiddelete", + "source_path": "uwp/design/shell/tiles-and-notifications/includes/nuget-package.md", + "redirect_url": "/windows/apps/design/shell/tiles-and-notifications/includes/nuget-package", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/sessiondirectory/uri-handleshandleidget.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/sessiondirectory/uri-handleshandleidget", + "source_path": "uwp/design/shell/tiles-and-notifications/includes/onlaunched-warning.md", + "redirect_url": "/windows/apps/design/shell/tiles-and-notifications/includes/onlaunched-warning", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/sessiondirectory/uri-handleshandleidsession.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/sessiondirectory/uri-handleshandleidsession", + "source_path": "uwp/design/shell/tiles-and-notifications/includes/send-toast-basic-toast-intro.md", + "redirect_url": "/windows/apps/design/shell/tiles-and-notifications/includes/send-toast-basic-toast-intro", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/sessiondirectory/uri-handleshandleidsessionget.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/sessiondirectory/uri-handleshandleidsessionget", + "source_path": "uwp/design/shell/tiles-and-notifications/includes/send-toast-intro.md", + "redirect_url": "/windows/apps/design/shell/tiles-and-notifications/includes/send-toast-intro", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/sessiondirectory/uri-handleshandleidsessionput.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/sessiondirectory/uri-handleshandleidsessionput", + "source_path": "uwp/design/shell/tiles-and-notifications/index.md", + "redirect_url": "/windows/apps/design/shell/tiles-and-notifications/index", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/sessiondirectory/uri-handlespost.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/sessiondirectory/uri-handlespost", + "source_path": "uwp/design/shell/tiles-and-notifications/notification-listener.md", + "redirect_url": "/windows/apps/design/shell/tiles-and-notifications/notification-listener", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/sessiondirectory/uri-handlesquery.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/sessiondirectory/uri-handlesquery", + "source_path": "uwp/design/shell/tiles-and-notifications/notification-mirroring.md", + "redirect_url": "/windows/apps/design/shell/tiles-and-notifications/notification-mirroring", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/sessiondirectory/uri-handlesqueryincludepost.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/sessiondirectory/uri-handlesqueryincludepost", + "source_path": "uwp/design/shell/tiles-and-notifications/notifications-visualizer.md", + "redirect_url": "/windows/apps/design/shell/tiles-and-notifications/notifications-visualizer", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/sessiondirectory/uri-handlesquerypost.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/sessiondirectory/uri-handlesquerypost", + "source_path": "uwp/design/shell/tiles-and-notifications/periodic-notification-overview.md", + "redirect_url": "/windows/apps/design/shell/tiles-and-notifications/periodic-notification-overview", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/sessiondirectory/uri-serviceconfigscidsessiontemplatessessiontemplatenamebatch.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/sessiondirectory/uri-serviceconfigscidsessiontemplatessessiontemplatenamebatch", + "source_path": "uwp/design/shell/tiles-and-notifications/primary-tile-apis.md", + "redirect_url": "/windows/apps/design/shell/tiles-and-notifications/primary-tile-apis", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/sessiondirectory/uri-serviceconfigscidsessiontemplatessessiontemplatenamebatchpost.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/sessiondirectory/uri-serviceconfigscidsessiontemplatessessiontemplatenamebatchpost", + "source_path": "uwp/design/shell/tiles-and-notifications/raw-notification-overview.md", + "redirect_url": "/windows/apps/design/shell/tiles-and-notifications/raw-notification-overview", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/sessiondirectory/uri-serviceconfigsscidbatch.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/sessiondirectory/uri-serviceconfigsscidbatch", + "source_path": "uwp/design/shell/tiles-and-notifications/scheduled-toast.md", + "redirect_url": "/windows/apps/design/shell/tiles-and-notifications/scheduled-toast", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/sessiondirectory/uri-serviceconfigsscidbatchpost.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/sessiondirectory/uri-serviceconfigsscidbatchpost", + "source_path": "uwp/design/shell/tiles-and-notifications/secondary-tiles-desktop-pinning.md", + "redirect_url": "/windows/apps/design/shell/tiles-and-notifications/secondary-tiles-desktop-pinning", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/sessiondirectory/uri-serviceconfigsscidsessions.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/sessiondirectory/uri-serviceconfigsscidsessions", + "source_path": "uwp/design/shell/tiles-and-notifications/secondary-tiles-guidance.md", + "redirect_url": "/windows/apps/design/shell/tiles-and-notifications/secondary-tiles-guidance", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/sessiondirectory/uri-serviceconfigsscidsessionsget.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/sessiondirectory/uri-serviceconfigsscidsessionsget", + "source_path": "uwp/design/shell/tiles-and-notifications/secondary-tiles-pin-to-taskbar.md", + "redirect_url": "/windows/apps/design/shell/tiles-and-notifications/secondary-tiles-pin-to-taskbar", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/sessiondirectory/uri-serviceconfigsscidsessiontemplates.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/sessiondirectory/uri-serviceconfigsscidsessiontemplates", + "source_path": "uwp/design/shell/tiles-and-notifications/secondary-tiles-pinning.md", + "redirect_url": "/windows/apps/design/shell/tiles-and-notifications/secondary-tiles-pinning", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/sessiondirectory/uri-serviceconfigsscidsessiontemplatesget.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/sessiondirectory/uri-serviceconfigsscidsessiontemplatesget", + "source_path": "uwp/design/shell/tiles-and-notifications/secondary-tiles.md", + "redirect_url": "/windows/apps/design/shell/tiles-and-notifications/secondary-tiles", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/sessiondirectory/uri-serviceconfigsscidsessiontemplatessessiontemplatename.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/sessiondirectory/uri-serviceconfigsscidsessiontemplatessessiontemplatename", + "source_path": "uwp/design/shell/tiles-and-notifications/send-local-toast-cpp-uwp.md", + "redirect_url": "/windows/apps/design/shell/tiles-and-notifications/send-local-toast-cpp-uwp", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/sessiondirectory/uri-serviceconfigsscidsessiontemplatessessiontemplatenameget.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/sessiondirectory/uri-serviceconfigsscidsessiontemplatessessiontemplatenameget", + "source_path": "uwp/design/shell/tiles-and-notifications/send-local-toast-desktop-cpp-wrl.md", + "redirect_url": "/windows/apps/design/shell/tiles-and-notifications/send-local-toast-desktop-cpp-wrl", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/sessiondirectory/uri-serviceconfigsscidsessiontemplatessessiontemplatenamesessionnamemembersindex.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/sessiondirectory/uri-serviceconfigsscidsessiontemplatessessiontemplatenamesessionnamemembersindex", + "source_path": "uwp/design/shell/tiles-and-notifications/send-local-toast-other-apps.md", + "redirect_url": "/windows/apps/design/shell/tiles-and-notifications/send-local-toast-other-apps", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/sessiondirectory/uri-serviceconfigsscidsessiontemplatessessiontemplatenamesessionnamemembersindexdelete.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/sessiondirectory/uri-serviceconfigsscidsessiontemplatessessiontemplatenamesessionnamemembersindexdelete", + "source_path": "uwp/design/shell/tiles-and-notifications/send-local-toast.md", + "redirect_url": "/windows/apps/design/shell/tiles-and-notifications/send-local-toast", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/sessiondirectory/uri-serviceconfigsscidsessiontemplatessessiontemplatenamesessionnamemembersservername.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/sessiondirectory/uri-serviceconfigsscidsessiontemplatessessiontemplatenamesessionnamemembersservername", + "source_path": "uwp/design/shell/tiles-and-notifications/sending-a-local-tile-notification.md", + "redirect_url": "/windows/apps/design/shell/tiles-and-notifications/sending-a-local-tile-notification", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/sessiondirectory/uri-serviceconfigsscidsessiontemplatessessiontemplatenamesessionnamemembersservernamedelete.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/sessiondirectory/uri-serviceconfigsscidsessiontemplatessessiontemplatenamesessionnamemembersservernamedelete", + "source_path": "uwp/design/shell/tiles-and-notifications/special-tile-templates-catalog.md", + "redirect_url": "/windows/apps/design/shell/tiles-and-notifications/special-tile-templates-catalog", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/sessiondirectory/uri-serviceconfigsscidsessiontemplatessessiontemplatenamesessions.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/sessiondirectory/uri-serviceconfigsscidsessiontemplatessessiontemplatenamesessions", + "source_path": "uwp/design/shell/tiles-and-notifications/the-code-generated-by-the-push-notification-wizard.md", + "redirect_url": "/windows/apps/design/shell/tiles-and-notifications/the-code-generated-by-the-push-notification-wizard", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/sessiondirectory/uri-serviceconfigsscidsessiontemplatessessiontemplatenamesessionsget.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/sessiondirectory/uri-serviceconfigsscidsessiontemplatessessiontemplatenamesessionsget", + "source_path": "uwp/design/shell/tiles-and-notifications/tile-schema.md", + "redirect_url": "/windows/apps/design/shell/tiles-and-notifications/tile-schema", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/sessiondirectory/uri-serviceconfigsscidsessiontemplatessessiontemplatenamesessionssessionname.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/sessiondirectory/uri-serviceconfigsscidsessiontemplatessessiontemplatenamesessionssessionname", + "source_path": "uwp/design/shell/tiles-and-notifications/tile-toast-language-scale-contrast.md", + "redirect_url": "/windows/apps/design/shell/tiles-and-notifications/tile-toast-language-scale-contrast", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/sessiondirectory/uri-serviceconfigsscidsessiontemplatessessiontemplatenamesessionssessionnameget.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/sessiondirectory/uri-serviceconfigsscidsessiontemplatessessiontemplatenamesessionssessionnameget", + "source_path": "uwp/design/shell/tiles-and-notifications/toast-collections.md", + "redirect_url": "/windows/apps/design/shell/tiles-and-notifications/toast-collections", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/sessiondirectory/uri-serviceconfigsscidsessiontemplatessessiontemplatenamesessionssessionnamemembersme.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/sessiondirectory/uri-serviceconfigsscidsessiontemplatessessiontemplatenamesessionssessionnamemembersme", + "source_path": "uwp/design/shell/tiles-and-notifications/toast-desktop-apps.md", + "redirect_url": "/windows/apps/design/shell/tiles-and-notifications/toast-desktop-apps", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/sessiondirectory/uri-serviceconfigsscidsessiontemplatessessiontemplatenamesessionssessionnamemembersmedelete.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/sessiondirectory/uri-serviceconfigsscidsessiontemplatessessiontemplatenamesessionssessionnamemembersmedelete", + "source_path": "uwp/design/shell/tiles-and-notifications/toast-headers.md", + "redirect_url": "/windows/apps/design/shell/tiles-and-notifications/toast-headers", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/sessiondirectory/uri-serviceconfigsscidsessiontemplatessessiontemplatenamesessionssessionnameput.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/sessiondirectory/uri-serviceconfigsscidsessiontemplatessessiontemplatenamesessionssessionnameput", + "source_path": "uwp/design/shell/tiles-and-notifications/toast-pending-update.md", + "redirect_url": "/windows/apps/design/shell/tiles-and-notifications/toast-pending-update", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/storage/atoc-reference-storagev2.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/storage/atoc-reference-storagev2", + "source_path": "uwp/design/shell/tiles-and-notifications/toast-progress-bar.md", + "redirect_url": "/windows/apps/design/shell/tiles-and-notifications/toast-progress-bar", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/storage/uri-globalscidsscid-get.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/storage/uri-globalscidsscid-get", + "source_path": "uwp/design/shell/tiles-and-notifications/toast-schema.md", + "redirect_url": "/windows/apps/design/shell/tiles-and-notifications/toast-schema", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/storage/uri-globalscidsscid.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/storage/uri-globalscidsscid", + "source_path": "uwp/design/shell/tiles-and-notifications/toast-ux-guidance.md", + "redirect_url": "/windows/apps/design/shell/tiles-and-notifications/toast-ux-guidance", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/storage/uri-globalscidssciddatapath-get.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/storage/uri-globalscidssciddatapath-get", + "source_path": "uwp/design/shell/tiles-and-notifications/universal-dismiss.md", + "redirect_url": "/windows/apps/design/shell/tiles-and-notifications/universal-dismiss", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/storage/uri-globalscidssciddatapath.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/storage/uri-globalscidssciddatapath", + "source_path": "uwp/design/shell/tiles-and-notifications/windows-push-notification-services--wns--overview.md", + "redirect_url": "/windows/apps/design/shell/tiles-and-notifications/windows-push-notification-services--wns--overview", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/storage/uri-globalscidssciddatapathandfilenametype-get.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/storage/uri-globalscidssciddatapathandfilenametype-get", + "source_path": "uwp/design/shell/title-bar.md", + "redirect_url": "/windows/apps/design/shell/title-bar", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/storage/uri-globalscidssciddatapathandfilenametype.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/storage/uri-globalscidssciddatapathandfilenametype", + "source_path": "uwp/design/style/acrylic.md", + "redirect_url": "/windows/apps/design/style/acrylic", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/storage/uri-jsonusersbatchscidssciddatapathandfilenametype-post.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/storage/uri-jsonusersbatchscidssciddatapathandfilenametype-post", + "source_path": "uwp/design/style/balancing-style-and-consistency.md", + "redirect_url": "/windows/apps/design/style/balancing-style-and-consistency", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/storage/uri-jsonusersbatchscidssciddatapathandfilenametype.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/storage/uri-jsonusersbatchscidssciddatapathandfilenametype", + "source_path": "uwp/design/style/brushes.md", + "redirect_url": "/windows/apps/develop/platform/xaml/brushes", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/storage/uri-jsonusersxuidscidsscid-get.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/storage/uri-jsonusersxuidscidsscid-get", + "source_path": "uwp/design/style/color.md", + "redirect_url": "/windows/apps/design/style/color", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/storage/uri-jsonusersxuidscidsscid.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/storage/uri-jsonusersxuidscidsscid", + "source_path": "uwp/design/style/icons.md", + "redirect_url": "/windows/apps/design/style/icons", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/storage/uri-jsonusersxuidscidssciddatapath-get.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/storage/uri-jsonusersxuidscidssciddatapath-get", + "source_path": "uwp/design/style/index.md", + "redirect_url": "/windows/apps/design/style/index", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/storage/uri-jsonusersxuidscidssciddatapath.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/storage/uri-jsonusersxuidscidssciddatapath", + "source_path": "uwp/design/style/reveal-focus.md", + "redirect_url": "/windows/uwp/ui-input/reveal-focus", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/storage/uri-jsonusersxuidscidssciddatapathandfilenametype-delete.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/storage/uri-jsonusersxuidscidssciddatapathandfilenametype-delete", + "source_path": "uwp/design/style/rounded-corner.md", + "redirect_url": "/windows/apps/design/style/rounded-corner", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/storage/uri-jsonusersxuidscidssciddatapathandfilenametype-get.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/storage/uri-jsonusersxuidscidssciddatapathandfilenametype-get", + "source_path": "uwp/design/style/segoe-ui-symbol-font.md", + "redirect_url": "/windows/apps/design/style/segoe-ui-symbol-font", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/storage/uri-jsonusersxuidscidssciddatapathandfilenametype-put.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/storage/uri-jsonusersxuidscidssciddatapathandfilenametype-put", + "source_path": "uwp/design/style/sound.md", + "redirect_url": "/windows/apps/design/style/sound", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/storage/uri-jsonusersxuidscidssciddatapathandfilenametype.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/storage/uri-jsonusersxuidscidssciddatapathandfilenametype", + "source_path": "uwp/design/style/spacing.md", + "redirect_url": "/windows/apps/design/style/spacing", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/storage/uri-sessionssessionidscidsscid-get.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/storage/uri-sessionssessionidscidsscid-get", + "source_path": "uwp/design/style/typography.md", + "redirect_url": "/windows/apps/design/style/typography", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/storage/uri-sessionssessionidscidsscid.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/storage/uri-sessionssessionidscidsscid", + "source_path": "uwp/design/style/writing-style.md", + "redirect_url": "/windows/apps/design/style/writing-style", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/storage/uri-sessionssessionidscidssciddatapath-get.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/storage/uri-sessionssessionidscidssciddatapath-get", + "source_path": "uwp/design/usability/index.md", + "redirect_url": "/windows/apps/design/usability/index", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/storage/uri-sessionssessionidscidssciddatapath.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/storage/uri-sessionssessionidscidssciddatapath", + "source_path": "uwp/design/windows-template-studio/index.md", + "redirect_url": "/windows/apps/design/windows-template-studio/index", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/storage/uri-sessionssessionidscidssciddatapathandfilenametype-delete.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/storage/uri-sessionssessionidscidssciddatapathandfilenametype-delete", + "source_path": "uwp/design/controls-and-patterns/menus-and-context-menus.md", + "redirect_url": "/windows/apps/design/controls/menus-and-context-menus", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/storage/uri-sessionssessionidscidssciddatapathandfilenametype-get.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/storage/uri-sessionssessionidscidssciddatapathandfilenametype-get", + "source_path": "hub/apps/fluent-design-system.md", + "redirect_url": "/windows/apps/design/index", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/storage/uri-sessionssessionidscidssciddatapathandfilenametype-put.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/storage/uri-sessionssessionidscidssciddatapathandfilenametype-put", + "source_path": "hub/apps/design/windows-template-studio/index.md", + "redirect_url": "/windows/apps/design/downloads/", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/storage/uri-sessionssessionidscidssciddatapathandfilenametype.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/storage/uri-sessionssessionidscidssciddatapathandfilenametype", + "source_path": "hub/apps/package-and-deploy/deploy-apps-that-use-the-windows-app-sdk.md", + "redirect_url": "/windows/apps/package-and-deploy/index", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/storage/uri-trustedplatformusersbatchscidssciddatapathandfilenametype-post.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/storage/uri-trustedplatformusersbatchscidssciddatapathandfilenametype-post", + "source_path": "hub/apps/design/layout/page-layout.md", + "redirect_url": "/windows/apps/design/basics/app-silhouette", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/storage/uri-trustedplatformusersbatchscidssciddatapathandfilenametype.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/storage/uri-trustedplatformusersbatchscidssciddatapathandfilenametype", + "source_path": "uwp/get-started/get-app-samples.md", + "redirect_url": "/windows/apps/get-started/samples", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/storage/uri-trustedplatformusersxuidscidsscid-get.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/storage/uri-trustedplatformusersxuidscidsscid-get", + "source_path": "hub/apps/whats-new/build2021-docs.md", + "redirect_url": "/windows/apps", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/storage/uri-trustedplatformusersxuidscidsscid.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/storage/uri-trustedplatformusersxuidscidsscid", + "source_path": "hub/apps/design/shell/title-bar.md", + "redirect_url": "/windows/apps/develop/title-bar", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/storage/uri-trustedplatformusersxuidscidssciddatapath-get.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/storage/uri-trustedplatformusersxuidscidssciddatapath-get", + "source_path": "uwp/csharp-winrt/index.md", + "redirect_url": "/windows/apps/develop/platform/csharp-winrt/index", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/storage/uri-trustedplatformusersxuidscidssciddatapath.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/storage/uri-trustedplatformusersxuidscidssciddatapath", + "source_path": "uwp/uwp/csharp-winrt/net-mappings-of-winrt-types.md", + "redirect_url": "/windows/apps/develop/platform/csharp-winrt/net-mappings-of-winrt-types", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/storage/uri-trustedplatformusersxuidscidssciddatapathandfilenametype-delete.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/storage/uri-trustedplatformusersxuidscidssciddatapathandfilenametype-delete", + "source_path": "uwp/csharp-winrt/net-projection-from-cppwinrt-component.md", + "redirect_url": "/windows/apps/develop/platform/csharp-winrt/net-projection-from-cppwinrt-component", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/storage/uri-trustedplatformusersxuidscidssciddatapathandfilenametype-get.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/storage/uri-trustedplatformusersxuidscidssciddatapathandfilenametype-get", + "source_path": "uwp/csharp-winrt/create-windows-runtime-component-cswinrt.md", + "redirect_url": "/windows/apps/develop/platform/csharp-winrt/create-windows-runtime-component-cswinrt", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/storage/uri-trustedplatformusersxuidscidssciddatapathandfilenametype-put.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/storage/uri-trustedplatformusersxuidscidssciddatapathandfilenametype-put", + "source_path": "uwp/csharp-winrt/authoring-diagnostics.md", + "redirect_url": "/windows/apps/develop/platform/csharp-winrt/authoring-diagnostics", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/storage/uri-trustedplatformusersxuidscidssciddatapathandfilenametype.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/storage/uri-trustedplatformusersxuidscidssciddatapathandfilenametype", + "source_path": "uwp/csharp-winrt/agile-objects.md", + "redirect_url": "/windows/apps/develop/platform/csharp-winrt/agile-objects", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/storage/uri-untrustedplatformusersbatchscidssciddatapathandfilenametype-post.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/storage/uri-untrustedplatformusersbatchscidssciddatapathandfilenametype-post", - "redirect_document_id": false + "source_path": "hub/apps/reference/index.md", + "redirect_url": "/windows/apps/api-reference/index", + "redirect_document_id": true }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/storage/uri-untrustedplatformusersbatchscidssciddatapathandfilenametype.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/storage/uri-untrustedplatformusersbatchscidssciddatapathandfilenametype", - "redirect_document_id": false + "source_path": "landing/arm-docs/index.yml", + "redirect_url": "/windows/arm/overview", + "redirect_document_id": true }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/storage/uri-untrustedplatformusersxuidscidsscid-get.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/storage/uri-untrustedplatformusersxuidscidsscid-get", + "source_path": "hub/apps/design/shell/tiles-and-notifications/alternate-channel-vapid-webpush.md", + "redirect_url": "/windows/apps/design/shell/tiles-and-notifications/windows-push-notification-services--wns--overview", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/storage/uri-untrustedplatformusersxuidscidsscid.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/storage/uri-untrustedplatformusersxuidscidsscid", + "source_path": "hub/apps/get-started/simple-photo-viewer-winiu3.md", + "redirect_url": "/windows/apps/get-started/simple-photo-viewer-winui3", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/storage/uri-untrustedplatformusersxuidscidssciddatapath-get.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/storage/uri-untrustedplatformusersxuidscidssciddatapath-get", + "source_path": "hub/apps/get-started/migrate-from-uwp-to-winappsdk.md", + "redirect_url": "/windows/apps/windows-app-sdk/migrate-to-windows-app-sdk/migrate-to-windows-app-sdk-ovw", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/storage/uri-untrustedplatformusersxuidscidssciddatapath.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/storage/uri-untrustedplatformusersxuidscidssciddatapath", - "redirect_document_id": false + "source_path": "hub/apps/windows-app-sdk/winforms-plus-winappsdk.md", + "redirect_url": "/windows/apps/windows-app-sdk/migrate-to-windows-app-sdk/winforms-plus-winappsdk", + "redirect_document_id": true }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/storage/uri-untrustedplatformusersxuidscidssciddatapathandfilenametype-delete.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/storage/uri-untrustedplatformusersxuidscidssciddatapathandfilenametype-delete", - "redirect_document_id": false + "source_path": "hub/apps/windows-app-sdk/wpf-plus-winappsdk.md", + "redirect_url": "/windows/apps/windows-app-sdk/migrate-to-windows-app-sdk/wpf-plus-winappsdk", + "redirect_document_id": true }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/storage/uri-untrustedplatformusersxuidscidssciddatapathandfilenametype-get.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/storage/uri-untrustedplatformusersxuidscidssciddatapathandfilenametype-get", + "source_path": "hub/package-manager/package/windows-package-manager-policies-change-history.md", + "redirect_url": "/windows/package-manager/package/windows-package-manager-policies", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/storage/uri-untrustedplatformusersxuidscidssciddatapathandfilenametype-put.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/storage/uri-untrustedplatformusersxuidscidssciddatapathandfilenametype-put", + "source_path": "uwp/porting/arm64ec.md", + "redirect_url": "/windows/arm/arm64ec", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/storage/uri-untrustedplatformusersxuidscidssciddatapathandfilenametype.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/storage/uri-untrustedplatformusersxuidscidssciddatapathandfilenametype", + "source_path": "uwp/porting/apps-on-arm.md", + "redirect_url": "/windows/arm/overview", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/stringserver/atoc-reference-systemstringsvalidate.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/stringserver/atoc-reference-systemstringsvalidate", + "source_path": "uwp/porting/arm64ec-abi.md", + "redirect_url": "/windows/arm/arm64ec-abi", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/stringserver/uri-systemstringsvalidate.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/stringserver/uri-systemstringsvalidate", + "source_path": "uwp/porting/ios-to-uwp-root.md", + "redirect_url": "/windows/apps/get-started", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/stringserver/uri-systemstringsvalidatepost.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/stringserver/uri-systemstringsvalidatepost", + "source_path": "uwp/porting/selecting-an-approach-to-ios-and-uwp-app-development.md", + "redirect_url": "/windows/apps/get-started", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/titlehistory/atoc-reference-titlehistoryv2.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/titlehistory/atoc-reference-titlehistoryv2", + "source_path": "uwp/porting/android-ios-uwp-map.md", + "redirect_url": "/windows/apps/get-started", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/titlehistory/uri-titlehistoryusersxuidhistorytitlesgetv2.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/titlehistory/uri-titlehistoryusersxuidhistorytitlesgetv2", + "source_path": "uwp/porting/getting-started-animation.md", + "redirect_url": "/windows/apps/get-started", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/titlehistory/uri-titlehistoryusersxuidhistorytitlesv2.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/titlehistory/uri-titlehistoryusersxuidhistorytitlesv2", + "source_path": "uwp/porting/getting-started-choosing-a-programming-language.md", + "redirect_url": "/windows/apps/get-started", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/users/atoc-reference-users.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/users/atoc-reference-users", + "source_path": "uwp/porting/getting-started-common-controls.md", + "redirect_url": "/windows/apps/get-started", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/users/uri-usersxuidinbox.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/users/uri-usersxuidinbox", + "source_path": "uwp/porting/getting-started-creating-a-project.md", + "redirect_url": "/windows/apps/get-started", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/users/uri-usersxuidinboxget.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/users/uri-usersxuidinboxget", + "source_path": "uwp/porting/getting-started-getting-around-in-visual-studio.md", + "redirect_url": "/windows/apps/get-started", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/users/uri-usersxuidinboxmessageiddelete.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/users/uri-usersxuidinboxmessageiddelete", + "source_path": "uwp/porting/getting-started-navigation.md", + "redirect_url": "/windows/apps/get-started", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/users/uri-usersxuidinboxmessageidget.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/users/uri-usersxuidinboxmessageidget", + "source_path": "uwp/porting/getting-started-what-next.md", + "redirect_url": "/windows/apps/get-started", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/users/uri-usersxuidoutbox.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/users/uri-usersxuidoutbox", + "source_path": "uwp/porting/getting-started-with-uwp-for-ios-developers.md", + "redirect_url": "/windows/apps/get-started", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/users/uri-usersxuidoutboxpost.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/users/uri-usersxuidoutboxpost", + "source_path": "uwp/porting/setting-up-your-mac-with-windows-10.md", + "redirect_url": "/windows/apps/get-started", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/userstats/atoc-reference-userstats.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/userstats/atoc-reference-userstats", - "redirect_document_id": false + "source_path": "hub/apps/windows-app-sdk/notifications/push/push-quickstart.md", + "redirect_url": "/windows/apps/windows-app-sdk/notifications/push-notifications/push-quickstart", + "redirect_document_id": true }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/userstats/uri-batch.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/userstats/uri-batch", + "source_path": "uwp/publish/account-types-locations-and-fees.md", + "redirect_url": "/windows/apps/publish/partner-center/account-types-locations-and-fees", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/userstats/uri-batchpost.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/userstats/uri-batchpost", + "source_path": "uwp/publish/add-on-submissions.md", + "redirect_url": "/windows/apps/publish/publish-your-app/add-on/create-app-submission", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/userstats/uri-usersxuidscidsscidstats.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/userstats/uri-usersxuidscidsscidstats", + "source_path": "uwp/publish/add-users-groups-and-azure-ad-applications.md", + "redirect_url": "/windows/apps/publish/partner-center/add-users-groups-and-azure-ad-applications", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/userstats/uri-usersxuidscidsscidstatsget.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/userstats/uri-usersxuidscidsscidstatsget", + "source_path": "uwp/publish/age-ratings.md", + "redirect_url": "/windows/apps/publish/publish-your-app/msix/age-ratings", "redirect_document_id": false }, { - "source_path": "uwp/xbox-live/xbox-live-rest/uri/userstats/uri-usersxuidscidsscidstatsgetvaluemetadata.md", - "redirect_url": "/gaming/xbox-live/xbox-live-rest/uri/userstats/uri-usersxuidscidsscidstatsgetvaluemetadata", + "source_path": "uwp/publish/app-package-requirements.md", + "redirect_url": "/windows/apps/publish/publish-your-app/msix/app-package-requirements", "redirect_document_id": false }, { - "source_path": "uwp/composition/visual-layer-in-desktop-apps.md", - "redirect_url": "/windows/apps/desktop/modernize/visual-layer-in-desktop-apps", + "source_path": "uwp/publish/app-screenshots-and-images.md", + "redirect_url": "/windows/apps/publish/publish-your-app/msix/screenshots-and-images", "redirect_document_id": false }, { - "source_path": "uwp/composition/using-the-visual-layer-with-wpf.md", - "redirect_url": "/windows/apps/desktop/modernize/using-the-visual-layer-with-wpf", + "source_path": "uwp/publish/app-submissions.md", + "redirect_url": "/windows/apps/publish/publish-your-app/msix/create-app-submission", "redirect_document_id": false }, { - "source_path": "uwp/composition/using-the-visual-layer-with-windows-forms.md", - "redirect_url": "/windows/apps/desktop/modernize/using-the-visual-layer-with-windows-forms", + "source_path": "uwp/publish/associate-azure-ad-with-partner-center.md", + "redirect_url": "/windows/apps/publish/partner-center/associate-azure-ad-with-partner-center", "redirect_document_id": false }, { - "source_path": "uwp/composition/using-the-visual-layer-with-win32.md", - "redirect_url": "/windows/apps/desktop/modernize/using-the-visual-layer-with-win32", + "source_path": "uwp/publish/avoid-common-certification-failures.md", + "redirect_url": "/windows/apps/publish/publish-your-app/msix/resolve-submission-errors#avoid-common-certification-failures", "redirect_document_id": false }, { - "source_path": "uwp/xaml-platform/xaml-host-controls.md", - "redirect_url": "/windows/apps/desktop/modernize/xaml-islands", + "source_path": "uwp/publish/category-and-subcategory-table.md", + "redirect_url": "/windows/apps/publish/publish-your-app/msix/categories-and-subcategories", "redirect_document_id": false }, { - "source_path": "uwp/xaml-platform/using-the-xaml-hosting-api.md", - "redirect_url": "/windows/apps/desktop/modernize/using-the-xaml-hosting-api", + "source_path": "uwp/publish/choose-visibility-options.md", + "redirect_url": "/windows/apps/publish/publish-your-app/msix/visibility-options", "redirect_document_id": false }, { - "source_path": "uwp/porting/desktop-to-uwp-root.md", - "redirect_url": "/windows/msix/desktop/desktop-to-uwp-root", + "source_path": "uwp/publish/configure-precise-release-scheduling.md", + "redirect_url": "/windows/apps/publish/publish-your-app/msix/schedule-pricing-changes#configure-precise-release-scheduling", "redirect_document_id": false }, { - "source_path": "uwp/porting/desktop-to-uwp-prepare.md", - "redirect_url": "/windows/msix/desktop/desktop-to-uwp-prepare", + "source_path": "uwp/publish/create-add-on-store-listings.md", + "redirect_url": "/windows/apps/publish/publish-your-app/add-on/create-app-store-listing", "redirect_document_id": false }, { - "source_path": "uwp/porting/desktop-to-uwp-packaging-dot-net.md", - "redirect_url": "/windows/msix/desktop/desktop-to-uwp-packaging-dot-net", + "source_path": "uwp/publish/create-app-store-listings.md", + "redirect_url": "/windows/apps/publish/publish-your-app/msix/create-app-store-listing", "redirect_document_id": false }, { - "source_path": "uwp/porting/desktop-to-uwp-run-desktop-app-converter.md", - "redirect_url": "/windows/msix/desktop/desktop-to-uwp-run-desktop-app-converter", + "source_path": "uwp/publish/create-platform-specific-store-listings.md", + "redirect_url": "/windows/apps/publish/publish-your-app/create-platform-specific-store-listings?pivots=store-installer-msix", "redirect_document_id": false }, { - "source_path": "uwp/porting/desktop-to-uwp-manual-conversion.md", - "redirect_url": "/windows/msix/desktop/desktop-to-uwp-manual-conversion", + "source_path": "uwp/publish/create-your-app-by-reserving-a-name.md", + "redirect_url": "/windows/apps/publish/publish-your-app/msix/reserve-your-apps-name", "redirect_document_id": false }, { - "source_path": "uwp/porting/desktop-to-uwp-r2r.md", - "redirect_url": "/windows/msix/desktop/desktop-to-uwp-r2r", + "source_path": "uwp/publish/define-market-selection.md", + "redirect_url": "/windows/apps/publish/publish-your-app/msix/market-selection", "redirect_document_id": false }, { - "source_path": "uwp/porting/desktop-to-uwp-behind-the-scenes.md", - "redirect_url": "/windows/msix/desktop/desktop-to-uwp-behind-the-scenes", + "source_path": "uwp/publish/device-family-availability.md", + "redirect_url": "/windows/apps/publish/publish-your-app/msix/upload-app-packages#device-family-availability", "redirect_document_id": false }, { - "source_path": "uwp/porting/desktop-to-uwp-known-issues.md", - "redirect_url": "/windows/msix/desktop/desktop-to-uwp-known-issues", + "source_path": "uwp/publish/enter-add-on-properties.md", + "redirect_url": "/windows/apps/publish/publish-your-app/add-on/enter-app-properties", "redirect_document_id": false }, { - "source_path": "uwp/porting/package-support-framework.md", - "redirect_url": "/windows/msix/psf/package-support-framework", + "source_path": "uwp/publish/enter-app-properties.md", + "redirect_url": "/windows/apps/publish/publish-your-app/msix/enter-app-properties", "redirect_document_id": false }, { - "source_path": "uwp/porting/desktop-to-uwp-debug.md", - "redirect_url": "/windows/msix/desktop/desktop-to-uwp-debug", + "source_path": "uwp/publish/guidance-for-app-package-management.md", + "redirect_url": "/windows/apps/publish/publish-your-app/msix/app-package-management", "redirect_document_id": false }, { - "source_path": "uwp/porting/desktop-to-uwp-test-windows-s.md", - "redirect_url": "/windows/msix/desktop/desktop-to-uwp-test-windows-s", + "source_path": "uwp/publish/import-and-export-store-listings.md", + "redirect_url": "/windows/apps/publish/publish-your-app/msix/import-and-export-store-listings", "redirect_document_id": false }, { - "source_path": "uwp/porting/desktop-to-uwp-distribute.md", - "redirect_url": "/windows/apps/desktop/modernize/desktop-to-uwp-distribute", + "source_path": "uwp/publish/manage-account-users.md", + "redirect_url": "/windows/apps/publish/partner-center/manage-account-users", "redirect_document_id": false }, { - "source_path": "uwp/porting/desktop-to-uwp-enhance.md", - "redirect_url": "/windows/apps/desktop/modernize/desktop-to-uwp-enhance", + "source_path": "uwp/publish/manage-app-names.md", + "redirect_url": "/windows/apps/publish/partner-center/manage-app-name-reservations", "redirect_document_id": false }, { - "source_path": "uwp/porting/desktop-to-uwp-extend.md", - "redirect_url": "/windows/apps/desktop/modernize/desktop-to-uwp-extend", + "source_path": "uwp/publish/manage-submission-options.md", + "redirect_url": "/windows/apps/publish/publish-your-app/msix/manage-submission-options", "redirect_document_id": false }, { - "source_path": "uwp/porting/desktop-to-uwp-extensions.md", - "redirect_url": "/windows/apps/desktop/modernize/desktop-to-uwp-extensions", + "source_path": "uwp/publish/msiexe/age-ratings.md", + "redirect_url": "/windows/apps/publish/publish-your-app/msi/age-ratings", "redirect_document_id": false }, { - "source_path": "uwp/porting/desktop-to-uwp-supported-api.md", - "redirect_url": "/windows/apps/desktop/modernize/desktop-to-uwp-supported-api", + "source_path": "uwp/publish/msiexe/app-submissions.md", + "redirect_url": "/windows/apps/publish/publish-your-app/msi/create-app-submission", "redirect_document_id": false }, { - "source_path": "uwp/design/fluent-design-system/index.md", - "redirect_url": "/windows/apps/fluent-design-system", + "source_path": "uwp/publish/msiexe/create-app-store-listings.md", + "redirect_url": "/windows/apps/publish/publish-your-app/msi/create-app-store-listing", "redirect_document_id": false }, { - "source_path": "uwp/packaging/packaging-uwp-apps.md", - "redirect_url": "/windows/msix/package/packaging-uwp-apps", + "source_path": "uwp/publish/msiexe/create-your-app-by-reserving-a-name.md", + "redirect_url": "/windows/apps/publish/publish-your-app/msi/reserve-your-apps-name", "redirect_document_id": false }, { - "source_path": "uwp/packaging/manual-packaging-root.md", - "redirect_url": "/windows/msix/package/manual-packaging-root", + "source_path": "uwp/publish/msiexe/enter-app-properties.md", + "redirect_url": "/windows/apps/publish/publish-your-app/msi/enter-app-properties", "redirect_document_id": false }, { - "source_path": "uwp/packaging/create-app-package-with-makeappx-tool.md", - "redirect_url": "/windows/msix/package/create-app-package-with-makeappx-tool", + "source_path": "uwp/publish/msiexe/manage-submission-options.md", + "redirect_url": "/windows/apps/publish/publish-your-app/manage-submission-options?pivots=store-installer-msi-exe", "redirect_document_id": false }, { - "source_path": "uwp/packaging/create-certificate-package-signing.md", - "redirect_url": "/windows/msix/package/create-certificate-package-signing", + "source_path": "uwp/publish/msiexe/overview.md", + "redirect_url": "/windows/apps/publish/publish-your-app/msi/reserve-your-apps-name", "redirect_document_id": false }, { - "source_path": "uwp/packaging/sign-app-package-using-signtool.md", - "redirect_url": "/windows/msix/package/sign-app-package-using-signtool", + "source_path": "uwp/publish/msiexe/provide-package-details.md", + "redirect_url": "/windows/apps/publish/publish-your-app/msi/upload-app-packages", "redirect_document_id": false }, { - "source_path": "uwp/packaging/package-folding.md", - "redirect_url": "/windows/msix/package/package-folding", + "source_path": "uwp/publish/msiexe/set-app-pricing-and-availability.md", + "redirect_url": "/windows/apps/publish/publish-your-app/msi/price-and-availability", "redirect_document_id": false }, { - "source_path": "uwp/packaging/flat-bundles.md", - "redirect_url": "/windows/msix/package/flat-bundles", + "source_path": "uwp/publish/msiexe/the-app-certification-process.md", + "redirect_url": "/windows/apps/publish/publish-your-app/msi/app-certification-process", "redirect_document_id": false }, { - "source_path": "uwp/packaging/asset-packages.md", - "redirect_url": "/windows/msix/package/asset-packages", + "source_path": "uwp/publish/notes-for-certification.md", + "redirect_url": "/windows/apps/publish/publish-your-app/manage-submission-options#notes-for-certification", "redirect_document_id": false }, { - "source_path": "uwp/packaging/packaging-layout.md", - "redirect_url": "/windows/msix/package/packaging-layout", + "source_path": "uwp/publish/opening-a-developer-account.md", + "redirect_url": "/windows/apps/publish/partner-center/open-a-developer-account", "redirect_document_id": false }, { - "source_path": "uwp/packaging/device-architecture.md", - "redirect_url": "/windows/msix/package/device-architecture", + "source_path": "uwp/publish/package-version-numbering.md", + "redirect_url": "/windows/apps/publish/publish-your-app/msix/app-package-requirements#package-version-numbering", "redirect_document_id": false }, { - "source_path": "uwp/packaging/streaming-install.md", - "redirect_url": "/windows/msix/package/streaming-install", + "source_path": "uwp/publish/partner-center-workspaces.md", + "redirect_url": "/windows/apps/publish/partner-center/partner-center-workspaces", "redirect_document_id": false }, { - "source_path": "uwp/packaging/create-cgm.md", - "redirect_url": "/windows/msix/package/create-cgm", + "source_path": "uwp/publish/product-declarations.md", + "redirect_url": "/windows/apps/publish/publish-your-app/msix/product-declarations", "redirect_document_id": false }, { - "source_path": "uwp/packaging/optional-packages.md", - "redirect_url": "/windows/msix/package/optional-packages", + "source_path": "uwp/publish/pwa/create-your-app-by-reserving-a-name.md", + "redirect_url": "/windows/apps/publish/publish-your-app/pwa/reserve-your-apps-name", "redirect_document_id": false }, { - "source_path": "uwp/packaging/optional-packages-with-executable-code.md", - "redirect_url": "/windows/msix/package/optional-packages-with-executable-code", + "source_path": "uwp/publish/pwa/overview.md", + "redirect_url": "/windows/apps/publish/publish-your-app/pwa/reserve-your-apps-name", "redirect_document_id": false }, { - "source_path": "hub/python/get-started/python-for-education.md", - "redirect_url": "/windows/python/beginners", + "source_path": "uwp/publish/pwa/turn-your-website-pwa.md", + "redirect_url": "/windows/apps/publish/publish-your-app/pwa/turn-your-website-pwa", "redirect_document_id": false }, { - "source_path": "hub/python/get-started/python-for-web.md", - "redirect_url": "/windows/python/web-frameworks", + "source_path": "uwp/publish/resolve-submission-errors.md", + "redirect_url": "/windows/apps/publish/publish-your-app/msix/resolve-submission-errors", "redirect_document_id": false }, { - "source_path": "hub/python/get-started/python-for-scripting.md", - "redirect_url": "/windows/python/scripting", + "source_path": "uwp/publish/set-add-on-pricing-and-availability.md", + "redirect_url": "/windows/apps/publish/publish-your-app/add-on/price-and-availability", "redirect_document_id": false }, { - "source_path": "hub/mac-to-windows.md", - "redirect_url": "/windows/dev-environment/mac-to-windows", + "source_path": "uwp/publish/set-and-schedule-app-pricing.md", + "redirect_url": "/windows/apps/publish/publish-your-app/msix/schedule-pricing-changes", "redirect_document_id": false }, { - "source_path": "uwp/design/layout/content-as-objects.md", - "redirect_url": "/windows/uwp/design", + "source_path": "uwp/publish/set-app-pricing-and-availability.md", + "redirect_url": "/windows/apps/publish/publish-your-app/msix/price-and-availability", "redirect_document_id": false }, { - "source_path": "uwp/monetize/get-xbox-one-game-acquisitions.md", - "redirect_url": "/windows/uwp/monetize", + "source_path": "uwp/publish/set-custom-permissions-for-account-users.md", + "redirect_url": "/windows/apps/publish/partner-center/set-custom-permissions-for-account-users", "redirect_document_id": false }, { - "source_path": "uwp/monetize/get-xbox-one-add-on-acquisitions.md", - "redirect_url": "/windows/uwp/monetize", + "source_path": "uwp/publish/set-your-add-on-product-id.md", + "redirect_url": "/windows/apps/publish/publish-your-app/add-on/create-app-submission#set-your-add-on-product-type-and-product-id", "redirect_document_id": false }, { - "source_path": "uwp/monetize/get-error-reporting-data-for-your-xbox-one-game.md", - "redirect_url": "/windows/uwp/monetize", + "source_path": "uwp/publish/supported-languages.md", + "redirect_url": "/windows/apps/publish/publish-your-app/msix/app-package-requirements#supported-languages", "redirect_document_id": false }, { - "source_path": "uwp/monetize/get-details-for-an-error-in-your-xbox-one-game.md", - "redirect_url": "/windows/uwp/monetize", + "source_path": "uwp/publish/the-app-certification-process.md", + "redirect_url": "/windows/apps/publish/publish-your-app/msix/app-certification-process", "redirect_document_id": false }, { - "source_path": "uwp/monetize/get-the-stack-trace-for-an-error-in-your-xbox-one-game.md", - "redirect_url": "/windows/uwp/monetize", + "source_path": "uwp/publish/trademark-and-copyright-protection.md", + "redirect_url": "/windows/apps/publish/partner-center/trademark-and-copyright-protection", "redirect_document_id": false }, { - "source_path": "uwp/monetize/download-the-cab-file-for-an-error-in-your-xbox-one-game.md", - "redirect_url": "/windows/uwp/monetize", + "source_path": "uwp/publish/upload-app-packages.md", + "redirect_url": "/windows/apps/publish/publish-your-app/msix/upload-app-packages", "redirect_document_id": false }, { - "source_path": "uwp/porting/apps-on-arm-limitations.md", - "redirect_url": "/windows/uwp/porting/apps-on-arm-troubleshooting-x86", + "source_path": "uwp/publish/write-a-great-app-description.md", + "redirect_url": "/windows/apps/publish/publish-your-app/msix/write-great-app-description", "redirect_document_id": false }, { - "source_path": "uwp/communication/ipc.md", - "redirect_url": "/windows/uwp/communication/interprocess-communication", - "redirect_document_id": false + "source_path": "hub/apps/develop/widgets/widget-service-providers.md", + "redirect_url": "/windows/apps/develop/widgets/widget-providers", + "redirect_document_id": true }, { - "source_path": "hub/android/index.md", - "redirect_url": "/windows/android/overview", - "redirect_document_id": false + "source_path": "landing/arm-docs/dev-kit.md", + "redirect_url": "/windows/arm/dev-kit/index", + "redirect_document_id": true }, { - "source_path": "hub/python/databases.md", - "redirect_url": "/windows/wsl/tutorials/wsl-database", + "source_path": "uwp/publish/msiexe/store-submission-api.md", + "redirect_url": "/windows/apps/publish/store-submission-api", "redirect_document_id": false }, { - "source_path": "hub/nodejs/databases.md", - "redirect_url": "/windows/wsl/tutorials/wsl-database", + "source_path": "uwp/publish/msiexe/update-your-app.md", + "redirect_url": "/windows/apps/publish/publish-your-app/msi/publish-update-to-your-app-on-store", "redirect_document_id": false }, { - "source_path": "uwp/monetize/app-metadata-api-for-advertising-networks.md", - "redirect_url": "/windows/uwp/monetize", + "source_path": "uwp/publish/acquisitions-report.md", + "redirect_url": "/windows/apps/publish/acquisitions-report", "redirect_document_id": false }, { - "source_path": "hub/dev-environment/overview.md", - "redirect_url": "/windows/dev-environment/", + "source_path": "uwp/publish/add-on-acquisitions-report.md", + "redirect_url": "/windows/apps/publish/add-on-acquisitions-report", "redirect_document_id": false }, { - "source_path": "uwp/monetize/payment-request.md", - "redirect_url": "/windows/uwp/monetize", + "source_path": "uwp/publish/advertising-performance-report.md", + "redirect_url": "/windows/apps/publish/advertising-performance-report", "redirect_document_id": false }, { - "source_path": "uwp/design/shell/tiles-and-notifications/toast-xml-schema.md", - "redirect_url": "/windows/uwp/design/shell/tiles-and-notifications/toast-schema", + "source_path": "uwp/publish/analytics.md", + "redirect_url": "/windows/apps/publish/analytics", "redirect_document_id": false }, { - "source_path": "uwp/publish/create-an-ad-campaign-for-your-app.md", - "redirect_url": "/windows/uwp/monetize", + "source_path": "uwp/publish/msiexe/analyze-app-performance.md", + "redirect_url": "/windows/apps/publish/analyze-msi-exe/analyze-app-performance", "redirect_document_id": false }, { - "source_path": "uwp/publish/managing-your-ad-campaign.md", - "redirect_url": "/windows/uwp/monetize", + "source_path": "uwp/publish/msiexe/ratings-reviews-performance.md", + "redirect_url": "/windows/apps/publish/analyze-msi-exe/ratings-reviews-performance", "redirect_document_id": false }, { - "source_path": "uwp/publish/about-house-ads.md", - "redirect_url": "/windows/uwp/monetize", + "source_path": "uwp/publish/product-management.md", + "redirect_url": "/windows/apps/publish/product-management", "redirect_document_id": false }, { - "source_path": "uwp/publish/about-community-ads.md", - "redirect_url": "/windows/uwp/monetize", + "source_path": "uwp/publish/app-marketing-guidelines.md", + "redirect_url": "/windows/apps/publish/app-marketing-guidelines", "redirect_document_id": false }, { - "source_path": "uwp/publish/common-questions.md", - "redirect_url": "/windows/uwp/monetize", + "source_path": "uwp/publish/attract-customers-and-promote-your-apps.md", + "redirect_url": "/windows/apps/publish/attract-customers-and-promote-your-apps", "redirect_document_id": false }, { - "source_path": "uwp/publish/tax-details-for-paid-apps.md", - "redirect_url": "/partner-center/tax-details-marketplace", + "source_path": "uwp/publish/beta-testing-and-targeted-distribution.md", + "redirect_url": "/windows/apps/publish/beta-testing-and-targeted-distribution", "redirect_document_id": false }, { - "source_path": "uwp/publish/getting-paid-apps.md", - "redirect_url": "/partner-center/marketplace-get-paid", + "source_path": "uwp/publish/create-a-custom-app-promotion-campaign.md", + "redirect_url": "/windows/apps/publish/create-a-custom-app-promotion-campaign", "redirect_document_id": false }, { - "source_path": "uwp/publish/setting-up-your-payout-account-and-tax-forms.md", - "redirect_url": "/partner-center/set-up-your-payout-account ", + "source_path": "uwp/publish/create-customer-groups.md", + "redirect_url": "/windows/apps/publish/create-customer-groups", "redirect_document_id": false }, { - "source_path": "uwp/publish/payout-summary.md", - "redirect_url": "/partner-center/payout-statement", + "source_path": "uwp/publish/create-customer-segments.md", + "redirect_url": "/windows/apps/publish/create-customer-segments", "redirect_document_id": false }, { - "source_path": "uwp/publish/understand-irs-tax-forms.md", - "redirect_url": "/partner-center/understand-irs-tax-forms", + "source_path": "uwp/publish/create-known-user-groups.md", + "redirect_url": "/windows/apps/publish/create-known-user-groups", "redirect_document_id": false }, { - "source_path": "uwp/publish/payment-thresholds-methods-and-timeframes.md", - "redirect_url": "/partner-center/payment-thresholds-methods-timeframes", + "source_path": "uwp/publish/distribute-lob-apps-to-enterprises.md", + "redirect_url": "/windows/apps/publish/distribute-lob-apps-to-enterprises", "redirect_document_id": false }, { - "source_path": "uwp/publish/mobile-operator-billing.md", - "redirect_url": "/partner-center/mobile-operator-billing", + "source_path": "uwp/publish/download-analytic-reports.md", + "redirect_url": "/windows/apps/publish/download-analytic-reports", "redirect_document_id": false }, { - "source_path": "uwp/publish/vat-info.md", - "redirect_url": "/partner-center/vat-info", + "source_path": "uwp/publish/engage-with-your-customers.md", + "redirect_url": "/windows/apps/publish/engage-with-your-customers", "redirect_document_id": false }, { - "source_path": "hub/apps/whats-new/build2020-docs.md", - "redirect_url": "/windows/apps/whats-new/build2021-docs", + "source_path": "uwp/publish/feedback-report.md", + "redirect_url": "/windows/apps/publish/feedback-report", "redirect_document_id": false }, { - "source_path": "uwp/publish/manage-account-settings-and-profile.md", - "redirect_url": "/partner-center/partner-center-account-setup", + "source_path": "uwp/publish/generate-preinstall-packages-for-oems.md", + "redirect_url": "/windows/apps/publish/generate-preinstall-packages-for-oems", "redirect_document_id": false }, { - "source_path": "uwp/design/controls-and-patterns/master-details.md", - "redirect_url": "/windows/uwp/design/controls-and-patterns/list-details", - "redirect_document_id": true + "source_path": "uwp/publish/generate-promotional-codes.md", + "redirect_url": "/windows/apps/publish/generate-promotional-codes", + "redirect_document_id": false }, { - "source_path": "uwp/design/shell/tiles-and-notifications/send-local-toast-desktop.md", - "redirect_url": "/windows/uwp/design/shell/tiles-and-notifications/send-local-toast", + "source_path": "uwp/publish/gradual-package-rollout.md", + "redirect_url": "/windows/apps/publish/gradual-package-rollout", "redirect_document_id": false }, { - "source_path": "hub/nodejs/index.yml", - "redirect_url": "/windows/dev-environment/javascript", + "source_path": "uwp/publish/health-report.md", + "redirect_url": "/windows/apps/publish/health-report", "redirect_document_id": false }, { - "source_path": "hub/nodejs/beginners.md", - "redirect_url": "/windows/dev-environment/javascript/nodejs-beginners-tutorial", + "source_path": "uwp/publish/in-app-ads.md", + "redirect_url": "/windows/apps/publish/in-app-ads", "redirect_document_id": false }, { - "source_path": "hub/nodejs/setup-on-wsl2.md", - "redirect_url": "/windows/dev-environment/javascript/nodejs-on-wsl", + "source_path": "uwp/publish/insights-report.md", + "redirect_url": "/windows/apps/publish/insights-report", "redirect_document_id": false }, { - "source_path": "hub/nodejs/setup-on-windows.md", - "redirect_url": "/windows/dev-environment/javascript/nodejs-on-windows", + "source_path": "uwp/publish/link-to-your-app.md", + "redirect_url": "/windows/apps/publish/link-to-your-app", "redirect_document_id": false }, { - "source_path": "hub/nodejs/containers.md", - "redirect_url": "/windows/wsl/tutorials/wsl-containers", + "source_path": "uwp/publish/make-your-app-easier-to-promote.md", + "redirect_url": "/windows/apps/publish/make-your-app-easier-to-promote", "redirect_document_id": false }, { - "source_path": "hub/nodejs/web-frameworks.md", - "redirect_url": "/windows/dev-environment/javascript", + "source_path": "uwp/publish/package-flights.md", + "redirect_url": "/windows/apps/publish/package-flights", "redirect_document_id": false }, { - "source_path": "hub/android/react-native.md", - "redirect_url": "/windows/dev-environment/javascript/react-native-for-android", + "source_path": "uwp/publish/put-apps-and-add-ons-on-sale.md", + "redirect_url": "/windows/apps/publish/put-apps-and-add-ons-on-sale", "redirect_document_id": false }, { - "source_path": "hub/apps/features-and-technologies.md", - "redirect_url": "/windows/apps/develop/index", + "source_path": "uwp/publish/ratings-and-reviews.md", + "redirect_url": "/windows/apps/publish/ratings-and-reviews", "redirect_document_id": false }, { - "source_path": "hub/apps/develop/features-and-technologies.md", - "redirect_url": "/windows/apps/develop/index", + "source_path": "uwp/publish/ratings-report.md", + "redirect_url": "/windows/apps/publish/ratings-report", "redirect_document_id": false }, { - "source_path": "hub/apps/speech.md", - "redirect_url": "/windows/apps/develop/speech", - "redirect_document_id": true + "source_path": "uwp/publish/respond-to-customer-feedback.md", + "redirect_url": "/windows/apps/publish/respond-to-customer-feedback", + "redirect_document_id": false }, { - "source_path": "hub/apps/accessibility.md", - "redirect_url": "/windows/apps/develop/accessibility", - "redirect_document_id": true + "source_path": "uwp/publish/respond-to-customer-reviews.md", + "redirect_url": "/windows/apps/publish/respond-to-customer-reviews", + "redirect_document_id": false }, { - "source_path": "hub/apps/project-reunion/index.md", - "redirect_url": "/windows/apps/windows-app-sdk/index", + "source_path": "uwp/publish/reviews-report.md", + "redirect_url": "/windows/apps/publish/reviews-report", "redirect_document_id": false }, { - "source_path": "hub/apps/project-reunion/release-channels.md", - "redirect_url": "/windows/apps/windows-app-sdk/release-channels", + "source_path": "uwp/publish/send-push-notifications-to-your-apps-customers.md", + "redirect_url": "/windows/apps/publish/send-push-notifications-to-your-apps-customers", "redirect_document_id": false }, { - "source_path": "hub/apps/project-reunion/stable-channel.md", - "redirect_url": "/windows/apps/windows-app-sdk/stable-channel", + "source_path": "uwp/publish/usage-report.md", + "redirect_url": "/windows/apps/publish/usage-report", "redirect_document_id": false }, { - "source_path": "hub/apps/project-reunion/preview-channel.md", - "redirect_url": "/windows/apps/windows-app-sdk/preview-channel", + "source_path": "uwp/publish/use-targeted-offers-to-maximize-engagement-and-conversions.md", + "redirect_url": "/windows/apps/publish/use-targeted-offers-to-maximize-engagement-and-conversions", "redirect_document_id": false }, { - "source_path": "hub/apps/project-reunion/set-up-your-development-environment.md", - "redirect_url": "/windows/apps/windows-app-sdk/set-up-your-development-environment", + "source_path": "uwp/publish/view-app-identity-details.md", + "redirect_url": "/windows/apps/publish/view-app-identity-details", "redirect_document_id": false }, { - "source_path": "hub/apps/project-reunion/get-started-with-project-reunion.md", - "redirect_url": "/windows/apps/windows-app-sdk", + "source_path": "uwp/publish/xbox-analytics-report.md", + "redirect_url": "/windows/apps/publish/xbox-analytics-report", "redirect_document_id": false }, { - "source_path": "hub/apps/project-reunion/get-started.md", - "redirect_url": "/windows/apps/windows-app-sdk", + "source_path": "hub/apps/publish/partner-center/associate-azure-ad-with-partner-center.md", + "redirect_url": "/windows/apps/publish/partner-center/associate-existing-azure-ad-tenant-with-partner-center-account", "redirect_document_id": false }, { - "source_path": "hub/apps/windows-app-sdk/get-started.md", - "redirect_url": "/windows/apps/windows-app-sdk", + "source_path": "hub/apps/publish/partner-center/add-users-groups-and-azure-ad-applications.md", + "redirect_url": "/windows/apps/publish/partner-center/overview-users-groups-azure-ad-applications", "redirect_document_id": false }, { - "source_path": "hub/apps/project-reunion/update-existing-projects-to-the-latest-release.md", - "redirect_url": "/windows/apps/windows-app-sdk/update-existing-projects-to-the-latest-release", + "source_path": "hub/apps/publish/partner-center/opening-a-developer-account.md", + "redirect_url": "/windows/apps/publish/partner-center/open-a-developer-account", "redirect_document_id": false }, { - "source_path": "hub/apps/project-reunion/mrtcore/mrtcore-overview.md", - "redirect_url": "/windows/apps/windows-app-sdk/mrtcore/mrtcore-overview", + "source_path": "hub/apps/publish/partner-center/set-custom-permissions-for-account-users.md", + "redirect_url": "/windows/apps/publish/partner-center/overview-of-roles-and-permissions-for-account-users", "redirect_document_id": false }, { - "source_path": "hub/apps/project-reunion/dwritecore.md", - "redirect_url": "/windows/apps/windows-app-sdk/dwritecore", + "source_path": "hub/package-manager/package/winget-validation.md", + "redirect_url": "/windows/package-manager/package/repository#validation-process", "redirect_document_id": false }, { - "source_path": "hub/apps/project-reunion/applifecycle/applifecycle-instancing.md", - "redirect_url": "/windows/apps/windows-app-sdk/applifecycle/applifecycle-instancing", + "source_path": "hub/package-manager/package/winget-validation-troubleshooter.md", + "redirect_url": "/windows/package-manager/package/repository#submission-troubleshooting", "redirect_document_id": false }, { - "source_path": "hub/apps/project-reunion/applifecycle/applifecycle-rich-activation.md", - "redirect_url": "/windows/apps/windows-app-sdk/applifecycle/applifecycle-rich-activation", + "source_path": "hub/package-manager/package/binary-validation-errors.md", + "redirect_url": "/windows/package-manager/package/repository#binary-validation-error", "redirect_document_id": false }, { - "source_path": "hub/apps/project-reunion/deploy-apps-that-use-project-reunion.md", - "redirect_url": "/windows/apps/windows-app-sdk/deploy-apps-that-use-the-windows-app-sdk", + "source_path": "hub/dev-environment/tutorials.md", + "redirect_url": "/windows/dev-environment", "redirect_document_id": false }, { - "source_path": "hub/apps/project-reunion/deployment-architecture.md", - "redirect_url": "/windows/apps/windows-app-sdk/deployment-architecture", + "source_path": "hub/dev-environment/dev-stories.md", + "redirect_url": "/windows/dev-environment", "redirect_document_id": false }, { - "source_path": "hub/apps/project-reunion/deploy-packaged-apps.md", - "redirect_url": "/windows/apps/windows-app-sdk/deploy-packaged-apps", + "source_path": "hub/dev-environment/tips.md", + "redirect_url": "/windows/dev-environment", "redirect_document_id": false }, { - "source_path": "hub/apps/project-reunion/deploy-unpackaged-apps.md", - "redirect_url": "/windows/apps/windows-app-sdk/deploy-unpackaged-apps", + "source_path": "hub/python/resources.md", + "redirect_url": "/windows/python/web-frameworks", "redirect_document_id": false }, { - "source_path": "hub/apps/project-reunion/tutorial-unpackaged-deployment.md", - "redirect_url": "/windows/apps/windows-app-sdk/tutorial-unpackaged-deployment", + "source_path": "hub/powertoys/reportbug.md", + "redirect_url": "https://github.com/microsoft/PowerToys/issues/new/choose", "redirect_document_id": false }, { - "source_path": "hub/apps/project-reunion/check-project-reunion-versions.md", - "redirect_url": "/windows/apps/windows-app-sdk/check-windows-app-sdk-versions", + "source_path": "hub/android/xamarin-forms.md", + "redirect_url": "/dotnet/maui/what-is-maui", "redirect_document_id": false }, { - "source_path": "hub/apps/project-reunion/remove-project-reunion-versions.md", - "redirect_url": "/windows/apps/windows-app-sdk/remove-windows-app-sdk-versions", + "source_path": "uwp/publish/store-app-quality.md", + "redirect_url": "/windows/apps/publish/store-app-quality", "redirect_document_id": false }, { - "source_path": "hub/apps/get-started/build-apps-for-windows.md", - "redirect_url": "/windows/apps/winui/winui3/create-your-first-winui3-app", + "source_path": "uwp/publish/store-developer-code-of-conduct.md", + "redirect_url": "/windows/apps/publish/store-developer-code-of-conduct", "redirect_document_id": false }, { - "source_path": "hub/apps/winui/winui3-winui2-comparison.md", - "redirect_url": "/windows/apps/winui/", + "source_path": "uwp/publish/store-policies-and-code-of-conduct.md", + "redirect_url": "/windows/apps/publish/store-policies-and-code-of-conduct", "redirect_document_id": false }, { - "source_path": "hub/apps/winui/winui3/desktop-build-basic-winui3-app.md", - "redirect_url": "/windows/apps/winui/winui3/desktop-winui3-app-with-basic-interop", + "source_path": "uwp/publish/store-policies-change-history.md", + "redirect_url": "/windows/apps/publish/store-policies-change-history", "redirect_document_id": false }, { - "source_path": "hub/apps/winui/reference/iwindownative.md", - "redirect_url": "/windows/windows-app-sdk/api/win32/microsoft.ui.xaml.window/nn-microsoft-ui-xaml-window-iwindownative", + "source_path": "uwp/publish/store-policies.md", + "redirect_url": "/windows/apps/publish/store-policies", "redirect_document_id": false }, { - "source_path": "hub/apps/winui/reference/iwindownative-windowhandle.md", - "redirect_url": "/windows/windows-app-sdk/api/win32/microsoft.ui.xaml.window/nf-microsoft-ui-xaml-window-iwindownative-get_windowhandle", + "source_path": "uwp/publish/store-policy-archive/store-policy-7-11.md", + "redirect_url": "/windows/apps/publish/store-policy-archive/store-policy-7-11", "redirect_document_id": false }, { - "source_path": "hub/apps/winui/winui3/release-notes/index.md", - "redirect_url": "/windows/apps/winui/winui3/release-notes/release-notes-08-preview", + "source_path": "uwp/publish/store-policy-archive/store-policy-7-12.md", + "redirect_url": "/windows/apps/publish/store-policy-archive/store-policy-7-12", "redirect_document_id": false }, { - "source_path": "hub/apps/winui/winui3/get-started-winui3-for-desktop.md", - "redirect_url": "/windows/apps/winui/winui3/create-your-first-winui3-app", + "source_path": "uwp/publish/store-policy-archive/store-policy-7-13.md", + "redirect_url": "/windows/apps/publish/store-policy-archive/store-policy-7-13", "redirect_document_id": false }, { - "source_path": "hub/apps/winui/winui3/get-started-winui3-for-uwp.md", - "redirect_url": "/windows/apps/winui/winui3/create-your-first-winui3-app", + "source_path": "uwp/publish/store-policy-archive/store-policy-7-14.md", + "redirect_url": "/windows/apps/publish/store-policy-archive/store-policy-7-14", "redirect_document_id": false }, { - "source_path": "hub/apps/winui/winui2/winui-2.6.md", - "redirect_url": "/windows/apps/winui/winui2/release-notes/winui-2.6", + "source_path": "uwp/publish/store-policy-archive/store-policy-7-15.md", + "redirect_url": "/windows/apps/publish/store-policy-archive/store-policy-7-15", "redirect_document_id": false }, { - "source_path": "hub/apps/winui/winui3/cs-interop-apis/index.md", - "redirect_url": "/windows/apps/api-reference/cs-interop-apis/", + "source_path": "uwp/publish/store-policy-archive/store-policy-7-16.md", + "redirect_url": "/windows/apps/publish/store-policy-archive/store-policy-7-16", "redirect_document_id": false }, { - "source_path": "hub/apps/winui/winui3/cs-interop-apis/microsoft.ui/microsoft.ui.md", - "redirect_url": "/windows/apps/api-reference/cs-interop-apis/microsoft.ui/microsoft.ui", + "source_path": "uwp/publish/store-policy-archive/store-policy-7-6.md", + "redirect_url": "/windows/apps/publish/store-policy-archive/store-policy-7-6", "redirect_document_id": false }, { - "source_path": "hub/apps/winui/winui3/cs-interop-apis/microsoft.ui/microsoft.ui.win32interop.getdisplayidfrommonitor.md", - "redirect_url": "/windows/apps/api-reference/cs-interop-apis/microsoft.ui/microsoft.ui.win32interop.getdisplayidfrommonitor", + "source_path": "uwp/publish/store-policy-archive/store-policy-7-7.md", + "redirect_url": "/windows/apps/publish/store-policy-archive/store-policy-7-7", "redirect_document_id": false }, { - "source_path": "hub/apps/winui/winui3/cs-interop-apis/microsoft.ui/microsoft.ui.win32interop.geticonfromiconid.md", - "redirect_url": "/windows/apps/api-reference/cs-interop-apis/microsoft.ui/microsoft.ui.win32interop.geticonfromiconid", + "source_path": "uwp/publish/index.md", + "redirect_url": "/windows/apps/publish/", "redirect_document_id": false }, { - "source_path": "hub/apps/winui/winui3/cs-interop-apis/microsoft.ui/microsoft.ui.win32interop.geticonidfromicon.md", - "redirect_url": "/windows/apps/api-reference/cs-interop-apis/microsoft.ui/microsoft.ui.win32interop.geticonidfromicon", + "source_path": "hub/apps/publish/update-your-app.md", + "redirect_url": "/windows/apps/publish/publish-your-app/msi/publish-update-to-your-app-on-store", "redirect_document_id": false }, { - "source_path": "hub/apps/winui/winui3/cs-interop-apis/microsoft.ui/microsoft.ui.win32interop.getmonitorfromdisplayid.md", - "redirect_url": "/windows/apps/api-reference/cs-interop-apis/microsoft.ui/microsoft.ui.win32interop.getmonitorfromdisplayid", + "source_path": "uwp/data-access/mysql-databases.md", + "redirect_url": "/windows/apps/develop/data-access/mysql-database", "redirect_document_id": false }, { - "source_path": "hub/apps/winui/winui3/cs-interop-apis/microsoft.ui/microsoft.ui.win32interop.getwindowfromwindowid.md", - "redirect_url": "/windows/apps/api-reference/cs-interop-apis/microsoft.ui/microsoft.ui.win32interop.getwindowfromwindowid", + "source_path": "uwp/data-access/mongo-db-databases.md", + "redirect_url": "/windows/apps/develop/data-access/mongodb-database", "redirect_document_id": false }, { - "source_path": "hub/apps/winui/winui3/cs-interop-apis/microsoft.ui/microsoft.ui.win32interop.getwindowidfromwindow.md", - "redirect_url": "/windows/apps/api-reference/cs-interop-apis/microsoft.ui/microsoft.ui.win32interop.getwindowidfromwindow", + "source_path": "hub/android/xamarin-android.md", + "redirect_url": "/dotnet/maui/migration/", "redirect_document_id": false }, { - "source_path": "hub/apps/winui/winui3/cs-interop-apis/microsoft.ui/microsoft.ui.win32interop.md", - "redirect_url": "/windows/apps/api-reference/cs-interop-apis/microsoft.ui/microsoft.ui.win32interop", + "source_path": "hub/apps/publish/analytics.md", + "redirect_url": "/partner-center/analyze-app-performance", "redirect_document_id": false }, { - "source_path": "hub/apps/desktop/choose-your-platform.md", - "redirect_url": "/windows/apps/desktop#choose-your-app-type", + "source_path": "hub/apps/publish/acquisitions-report.md", + "redirect_url": "/partner-center/acquisitions-report", "redirect_document_id": false }, { - "source_path": "hub/apps/10x/faq.md", - "redirect_url": "/windows/apps", + "source_path": "hub/apps/publish/add-on-acquisitions-report.md", + "redirect_url": "/partner-center/add-on-acquisitions-report", "redirect_document_id": false }, { - "source_path": "uwp/design/accessibility/accessibility-checklist.md", - "redirect_url": "/windows/apps/design/accessibility/accessibility-checklist", + "source_path": "hub/apps/publish/usage-report.md", + "redirect_url": "/partner-center/usage-report", "redirect_document_id": false }, { - "source_path": "uwp/design/accessibility/accessibility-in-the-store.md", - "redirect_url": "/windows/apps/design/accessibility/accessibility-in-the-store", + "source_path": "hub/apps/publish/health-report.md", + "redirect_url": "/partner-center/health-report", "redirect_document_id": false }, { - "source_path": "uwp/design/accessibility/accessibility-overview.md", - "redirect_url": "/windows/apps/design/accessibility/accessibility-overview", + "source_path": "hub/apps/publish/ratings-and-reviews.md", + "redirect_url": "/partner-center/ratings-and-reviews", "redirect_document_id": false }, { - "source_path": "uwp/design/accessibility/accessibility-testing.md", - "redirect_url": "/windows/apps/design/accessibility/accessibility-testing", + "source_path": "hub/apps/publish/ratings-report.md", + "redirect_url": "/partner-center/ratings-report", "redirect_document_id": false }, { - "source_path": "uwp/design/accessibility/accessibility.md", - "redirect_url": "/windows/apps/design/accessibility/accessibility", + "source_path": "hub/apps/publish/reviews-report.md", + "redirect_url": "/partner-center/reviews-report", "redirect_document_id": false }, { - "source_path": "uwp/design/accessibility/accessible-text-requirements.md", - "redirect_url": "/windows/apps/design/accessibility/accessible-text-requirements", + "source_path": "hub/apps/publish/feedback-report.md", + "redirect_url": "/partner-center/feedback-report", "redirect_document_id": false }, { - "source_path": "uwp/design/accessibility/basic-accessibility-information.md", - "redirect_url": "/windows/apps/design/accessibility/basic-accessibility-information", + "source_path": "hub/apps/publish/xbox-analytics-report.md", + "redirect_url": "/partner-center/xbox-analytics-report", "redirect_document_id": false }, { - "source_path": "uwp/design/accessibility/control-patterns-and-interfaces.md", - "redirect_url": "/windows/apps/design/accessibility/control-patterns-and-interfaces", + "source_path": "hub/apps/publish/insights-report.md", + "redirect_url": "/partner-center/insights-report", "redirect_document_id": false }, { - "source_path": "uwp/design/accessibility/custom-automation-peers.md", - "redirect_url": "/windows/apps/design/accessibility/custom-automation-peers", + "source_path": "hub/apps/publish/advertising-performance-report.md", + "redirect_url": "/partner-center/advertising-performance-report", "redirect_document_id": false }, { - "source_path": "uwp/design/accessibility/designing-inclusive-software.md", - "redirect_url": "/windows/apps/design/accessibility/designing-inclusive-software", + "source_path": "hub/apps/publish/download-analytic-reports.md", + "redirect_url": "/partner-center/download-analytic-reports", "redirect_document_id": false }, { - "source_path": "uwp/design/accessibility/developing-inclusive-windows-apps.md", - "redirect_url": "/windows/apps/design/accessibility/developing-inclusive-windows-apps", + "source_path": "hub/apps/distribute-through-store/best-practices-for-win32-app-distribution.md", + "redirect_url": "/windows/apps/distribute-through-store/how-to-distribute-your-win32-app-through-microsoft-store", "redirect_document_id": false }, { - "source_path": "uwp/design/accessibility/high-contrast-themes.md", - "redirect_url": "/windows/apps/design/accessibility/high-contrast-themes", + "source_path": "hub/apps/develop/settings/index.md", + "redirect_url": "/windows/apps/develop/settings/settings-windows-11", "redirect_document_id": false }, { - "source_path": "uwp/design/accessibility/keyboard-accessibility.md", - "redirect_url": "/windows/apps/design/accessibility/keyboard-accessibility", + "source_path": "hub/dev-environment/javascript/windows-or-wsl.md", + "redirect_url": "hub/dev-environment/javascript/nodejs-overview.md", "redirect_document_id": false }, { - "source_path": "uwp/design/accessibility/landmarks-and-headings.md", - "redirect_url": "/windows/apps/design/accessibility/landmarks-and-headings", + "source_path": "hub/apps/windows-dotnet-maui/dall-e-maui-windows.md", + "redirect_url": "/windows/ai/samples/dall-e-maui-windows", "redirect_document_id": false }, { - "source_path": "uwp/design/accessibility/practices-to-avoid.md", - "redirect_url": "/windows/apps/design/accessibility/practices-to-avoid", + "source_path": "hub/apps/windows-dotnet-maui/tutorial-maui-ai.md", + "redirect_url": "/windows/ai/samples/tutorial-maui-ai", "redirect_document_id": false }, { - "source_path": "uwp/design/accessibility/system-button-narration.md", - "redirect_url": "/windows/apps/design/accessibility/system-button-narration", + "source_path": "hub/powertoys/paste-as-plain-text.md", + "redirect_url": "/windows/powertoys/advanced-paste", "redirect_document_id": false }, { - "source_path": "uwp/design/app-settings/guidelines-for-app-settings.md", - "redirect_url": "/windows/apps/design/app-settings/guidelines-for-app-settings", + "source_path": "hub/apps/get-started/dev-options.md", + "redirect_url": "/windows/apps/get-started/", "redirect_document_id": false }, { - "source_path": "uwp/design/app-settings/store-and-retrieve-app-data.md", - "redirect_url": "/windows/apps/design/app-settings/store-and-retrieve-app-data", + "source_path": "uwp/security/microsoft-passport.md", + "redirect_url": "/windows/apps/develop/security/windows-hello", "redirect_document_id": false }, { - "source_path": "uwp/design/basics/commanding-basics.md", - "redirect_url": "/windows/apps/design/basics/commanding-basics", + "source_path": "uwp/security/microsoft-passport-login.md", + "redirect_url": "/windows/apps/develop/security/windows-hello-login", "redirect_document_id": false }, { - "source_path": "uwp/design/basics/content-basics.md", - "redirect_url": "/windows/apps/design/basics/content-basics", + "source_path": "uwp/security/microsoft-passport-login-auth-service.md", + "redirect_url": "/windows/apps/develop/security/windows-hello-auth-service", "redirect_document_id": false }, { - "source_path": "uwp/design/basics/design-and-ui-intro.md", - "redirect_url": "/windows/apps/design/basics/design-and-ui-intro", + "source_path": "hub/apps/develop/security-and-identity.md", + "redirect_url": "/windows/apps/develop/security/", "redirect_document_id": false }, { - "source_path": "uwp/design/basics/index.md", - "redirect_url": "/windows/apps/design/basics/index", + "source_path": "hub/apps/publish/msstore-dev-cli/apps-command.md", + "redirect_url": "/windows/apps/publish/msstore-dev-cli/commands", "redirect_document_id": false }, { - "source_path": "uwp/design/basics/navigate-between-two-pages.md", - "redirect_url": "/windows/apps/design/basics/navigate-between-two-pages", + "source_path": "hub/apps/publish/msstore-dev-cli/apps-get-command.md", + "redirect_url": "/windows/apps/publish/msstore-dev-cli/commands", "redirect_document_id": false }, { - "source_path": "uwp/design/basics/navigation-basics.md", - "redirect_url": "/windows/apps/design/basics/navigation-basics", + "source_path": "hub/apps/publish/msstore-dev-cli/apps-list-command.md", + "redirect_url": "/windows/apps/publish/msstore-dev-cli/commands", "redirect_document_id": false }, { - "source_path": "uwp/design/basics/navigation-history-and-backwards-navigation.md", - "redirect_url": "/windows/apps/design/basics/navigation-history-and-backwards-navigation", + "source_path": "hub/apps/publish/msstore-dev-cli/ci-cd-environments.md", + "redirect_url": "/windows/apps/publish/msstore-dev-cli/commands", "redirect_document_id": false }, { - "source_path": "uwp/design/basics/xaml-basics-adaptive-layout.md", - "redirect_url": "/windows/apps/design/basics/xaml-basics-adaptive-layout", + "source_path": "hub/apps/publish/msstore-dev-cli/info-command.md", + "redirect_url": "/windows/apps/publish/msstore-dev-cli/commands", "redirect_document_id": false }, { - "source_path": "uwp/design/basics/xaml-basics-style.md", - "redirect_url": "/windows/apps/design/basics/xaml-basics-style", + "source_path": "hub/apps/publish/msstore-dev-cli/init-command.md", + "redirect_url": "/windows/apps/publish/msstore-dev-cli/commands", "redirect_document_id": false }, { - "source_path": "uwp/design/basics/xaml-basics-ui.md", - "redirect_url": "/windows/apps/design/basics/xaml-basics-ui", + "source_path": "hub/apps/publish/msstore-dev-cli/install.md", + "redirect_url": "/windows/apps/publish/msstore-dev-cli/commands", "redirect_document_id": false }, { - "source_path": "uwp/design/controls-and-patterns/app-bars.md", - "redirect_url": "/windows/apps/design/controls/command-bar", + "source_path": "hub/apps/publish/msstore-dev-cli/package-command.md", + "redirect_url": "/windows/apps/publish/msstore-dev-cli/commands", "redirect_document_id": false }, { - "source_path": "uwp/design/controls-and-patterns/auto-suggest-box.md", - "redirect_url": "/windows/apps/design/controls/auto-suggest-box", + "source_path": "hub/apps/publish/msstore-dev-cli/publish-command.md", + "redirect_url": "/windows/apps/publish/msstore-dev-cli/commands", "redirect_document_id": false }, { - "source_path": "uwp/design/controls-and-patterns/buttons.md", - "redirect_url": "/windows/apps/design/controls/buttons", + "source_path": "hub/apps/publish/msstore-dev-cli/reconfigure-command.md", + "redirect_url": "/windows/apps/publish/msstore-dev-cli/commands", "redirect_document_id": false }, { - "source_path": "uwp/design/controls-and-patterns/calendar-date-picker.md", - "redirect_url": "/windows/apps/design/controls/calendar-date-picker", + "source_path": "hub/apps/publish/msstore-dev-cli/settings-command.md", + "redirect_url": "/windows/apps/publish/msstore-dev-cli/commands", "redirect_document_id": false }, { - "source_path": "uwp/design/controls-and-patterns/calendar-view.md", - "redirect_url": "/windows/apps/design/controls/calendar-view", + "source_path": "hub/apps/publish/msstore-dev-cli/settings-setpdn-command.md", + "redirect_url": "/windows/apps/publish/msstore-dev-cli/commands", "redirect_document_id": false }, { - "source_path": "uwp/design/controls-and-patterns/checkbox.md", - "redirect_url": "/windows/apps/design/controls/checkbox", + "source_path": "hub/apps/publish/msstore-dev-cli/submission-command.md", + "redirect_url": "/windows/apps/publish/msstore-dev-cli/commands", "redirect_document_id": false }, { - "source_path": "uwp/design/controls-and-patterns/collection-commanding.md", - "redirect_url": "/windows/apps/design/controls/collection-commanding", + "source_path": "hub/apps/publish/msstore-dev-cli/submission-delete-command.md", + "redirect_url": "/windows/apps/publish/msstore-dev-cli/commands", "redirect_document_id": false }, { - "source_path": "uwp/design/controls-and-patterns/color-picker.md", - "redirect_url": "/windows/apps/design/controls/color-picker", + "source_path": "hub/apps/publish/msstore-dev-cli/submission-get-command.md", + "redirect_url": "/windows/apps/publish/msstore-dev-cli/commands", "redirect_document_id": false }, { - "source_path": "uwp/design/controls-and-patterns/combo-box.md", - "redirect_url": "/windows/apps/design/controls/combo-box", + "source_path": "hub/apps/publish/msstore-dev-cli/submission-getListingAssets-command.md", + "redirect_url": "/windows/apps/publish/msstore-dev-cli/commands", "redirect_document_id": false }, { - "source_path": "uwp/design/controls-and-patterns/command-bar-flyout.md", - "redirect_url": "/windows/apps/design/controls/command-bar-flyout", + "source_path": "hub/apps/publish/msstore-dev-cli/submission-poll-command.md", + "redirect_url": "/windows/apps/publish/msstore-dev-cli/commands", "redirect_document_id": false }, { - "source_path": "uwp/design/controls-and-patterns/commanding.md", - "redirect_url": "/windows/apps/design/controls/commanding", + "source_path": "hub/apps/publish/msstore-dev-cli/submission-publish-command.md", + "redirect_url": "/windows/apps/publish/msstore-dev-cli/commands", "redirect_document_id": false }, { - "source_path": "uwp/design/controls-and-patterns/contact-card.md", - "redirect_url": "/windows/apps/design/controls/contact-card", + "source_path": "hub/apps/publish/msstore-dev-cli/submission-status-command.md", + "redirect_url": "/windows/apps/publish/msstore-dev-cli/commands", "redirect_document_id": false }, { - "source_path": "uwp/design/controls-and-patterns/content-links.md", - "redirect_url": "/windows/apps/design/controls/content-links", + "source_path": "hub/apps/publish/msstore-dev-cli/submission-update-command.md", + "redirect_url": "/windows/apps/publish/msstore-dev-cli/commands", "redirect_document_id": false }, { - "source_path": "uwp/design/controls-and-patterns/control-templates.md", - "redirect_url": "/windows/apps/design/style/xaml-control-templates", + "source_path": "hub/apps/publish/msstore-dev-cli/submission-updateMetadata-command.md", + "redirect_url": "/windows/apps/publish/msstore-dev-cli/commands", "redirect_document_id": false }, { - "source_path": "uwp/design/controls-and-patterns/controls-and-events-intro.md", - "redirect_url": "/windows/apps/design/controls/controls-and-events-intro", + "source_path": "hub/apps/publish/publish-your-app/add-additional-information.md", + "redirect_url": "/windows/apps/publish/publish-your-app/msix/add-additional-information", "redirect_document_id": false }, { - "source_path": "uwp/design/controls-and-patterns/custom-transport-controls.md", - "redirect_url": "/windows/apps/design/controls/custom-transport-controls", + "source_path": "hub/apps/publish/publish-your-app/add-and-edit-store-listing-info.md", + "redirect_url": "/windows/apps/publish/publish-your-app/msix/add-and-edit-store-listing-info", "redirect_document_id": false }, { - "source_path": "uwp/design/controls-and-patterns/data-template-selector.md", - "redirect_url": "/windows/apps/design/controls/data-template-selector", + "source_path": "hub/apps/publish/publish-your-app/age-ratings.md", + "redirect_url": "/windows/apps/publish/publish-your-app/msix/age-ratings", "redirect_document_id": false }, { - "source_path": "uwp/design/controls-and-patterns/date-and-time.md", - "redirect_url": "/windows/apps/design/controls/date-and-time", + "source_path": "hub/apps/publish/publish-your-app/app-certification-process.md", + "redirect_url": "/windows/apps/publish/publish-your-app/msix/app-certification-process", "redirect_document_id": false }, { - "source_path": "uwp/design/controls-and-patterns/date-picker.md", - "redirect_url": "/windows/apps/design/controls/date-picker", + "source_path": "hub/apps/publish/publish-your-app/app-package-management.md", + "redirect_url": "/windows/apps/publish/publish-your-app/msix/app-package-management", "redirect_document_id": false }, { - "source_path": "uwp/design/controls-and-patterns/dialogs-and-flyouts/dialogs.md", - "redirect_url": "/windows/apps/design/controls/dialogs-and-flyouts/dialogs", + "source_path": "hub/apps/publish/publish-your-app/app-package-requirements.md", + "redirect_url": "/windows/apps/publish/publish-your-app/msix/app-package-requirements", "redirect_document_id": false }, { - "source_path": "uwp/design/controls-and-patterns/dialogs-and-flyouts/flyouts.md", - "redirect_url": "/windows/apps/design/controls/dialogs-and-flyouts/flyouts", + "source_path": "hub/apps/publish/publish-your-app/app-submission-control.md", + "redirect_url": "/windows/apps/publish/publish-your-app/msix/manage-submission-options#app-submission-controls", "redirect_document_id": false }, { - "source_path": "uwp/design/controls-and-patterns/dialogs-and-flyouts/index.md", - "redirect_url": "/windows/apps/design/controls/dialogs-and-flyouts/index", + "source_path": "hub/apps/publish/publish-your-app/avoid-common-certification-failures.md", + "redirect_url": "/windows/apps/publish/publish-your-app/msix/resolve-submission-errors#avoid-common-certification-failures", "redirect_document_id": false }, { - "source_path": "uwp/design/controls-and-patterns/dialogs-and-flyouts/teaching-tip.md", - "redirect_url": "/windows/apps/design/controls/dialogs-and-flyouts/teaching-tip", + "source_path": "hub/apps/publish/publish-your-app/categories-and-subcategories.md", + "redirect_url": "/windows/apps/publish/publish-your-app/msix/categories-and-subcategories", "redirect_document_id": false }, { - "source_path": "uwp/design/controls-and-patterns/flipview.md", - "redirect_url": "/windows/apps/design/controls/flipview", + "source_path": "hub/apps/publish/publish-your-app/create-app-store-listing.md", + "redirect_url": "/windows/apps/publish/publish-your-app/msix/create-app-store-listing", "redirect_document_id": false }, { - "source_path": "uwp/design/controls-and-patterns/forms.md", - "redirect_url": "/windows/apps/design/controls/forms", + "source_path": "hub/apps/publish/publish-your-app/create-app-submission.md", + "redirect_url": "/windows/apps/publish/publish-your-app/msix/create-app-submission", "redirect_document_id": false }, { - "source_path": "uwp/design/controls-and-patterns/hyperlinks.md", - "redirect_url": "/windows/apps/design/controls/hyperlinks", + "source_path": "hub/apps/publish/publish-your-app/create-platform-specific-store-listings.md", + "redirect_url": "/windows/apps/publish/publish-your-app/msix/create-app-store-listing", "redirect_document_id": false }, { - "source_path": "uwp/design/controls-and-patterns/images-imagebrushes.md", - "redirect_url": "/windows/apps/design/controls/images-imagebrushes", + "source_path": "hub/apps/publish/publish-your-app/device-families.md", + "redirect_url": "/windows/apps/publish/publish-your-app/msix/upload-app-packages#device-family-availability", "redirect_document_id": false }, { - "source_path": "uwp/design/controls-and-patterns/index.md", - "redirect_url": "/windows/apps/design/controls/index", + "source_path": "hub/apps/publish/publish-your-app/enter-app-properties.md", + "redirect_url": "/windows/apps/publish/publish-your-app/msix/enter-app-properties", "redirect_document_id": false }, { - "source_path": "uwp/design/controls-and-patterns/infobar.md", - "redirect_url": "/windows/apps/design/controls/infobar", + "source_path": "hub/apps/publish/publish-your-app/import-and-export-store-listings.md", + "redirect_url": "/windows/apps/publish/publish-your-app/msix/import-and-export-store-listings", "redirect_document_id": false }, { - "source_path": "uwp/design/controls-and-patterns/inking-controls.md", - "redirect_url": "/windows/apps/design/controls/inking-controls", + "source_path": "hub/apps/publish/publish-your-app/manage-submission-options.md", + "redirect_url": "/windows/apps/publish/publish-your-app/msix/manage-submission-options", "redirect_document_id": false }, { - "source_path": "uwp/design/controls-and-patterns/inverted-lists.md", - "redirect_url": "/windows/apps/design/controls/inverted-lists", + "source_path": "hub/apps/publish/publish-your-app/manual-package-validation.md", + "redirect_url": "/windows/apps/publish/publish-your-app/msi/manual-package-validation", "redirect_document_id": false }, { - "source_path": "uwp/design/controls-and-patterns/item-containers-templates.md", - "redirect_url": "/windows/apps/design/controls/item-containers-templates", + "source_path": "hub/apps/publish/publish-your-app/market-selection.md", + "redirect_url": "/windows/apps/publish/publish-your-app/msix/market-selection", "redirect_document_id": false }, { - "source_path": "uwp/design/controls-and-patterns/item-templates-gridview.md", - "redirect_url": "/windows/apps/design/controls/item-templates-gridview", + "source_path": "hub/apps/publish/publish-your-app/notes-for-certification.md", + "redirect_url": "/windows/apps/publish/publish-your-app/msix/manage-submission-options#notes-for-certification", "redirect_document_id": false }, { - "source_path": "uwp/design/controls-and-patterns/item-templates-listview.md", - "redirect_url": "/windows/apps/design/controls/item-templates-listview", + "source_path": "hub/apps/publish/publish-your-app/overview.md", + "redirect_url": "/windows/apps/publish/publish-your-app/msix/overview", "redirect_document_id": false }, { - "source_path": "uwp/design/controls-and-patterns/items-repeater.md", - "redirect_url": "/windows/apps/design/controls/items-repeater", + "source_path": "hub/apps/publish/publish-your-app/package-validation-pre-check.md", + "redirect_url": "/windows/apps/publish/publish-your-app/msi/package-validation-pre-check", "redirect_document_id": false }, { - "source_path": "uwp/design/controls-and-patterns/labels.md", - "redirect_url": "/windows/apps/design/controls/labels", + "source_path": "hub/apps/publish/publish-your-app/package-version-numbering.md", + "redirect_url": "/windows/apps/publish/publish-your-app/msix/app-package-requirements#package-version-numbering", "redirect_document_id": false }, { - "source_path": "uwp/design/controls-and-patterns/list-details.md", - "redirect_url": "/windows/apps/design/controls/list-details", + "source_path": "hub/apps/publish/publish-your-app/price-and-availability.md", + "redirect_url": "/windows/apps/publish/publish-your-app/msix/price-and-availability", "redirect_document_id": false }, { - "source_path": "uwp/design/controls-and-patterns/lists.md", - "redirect_url": "/windows/apps/design/controls/lists", + "source_path": "hub/apps/publish/publish-your-app/product-declarations.md", + "redirect_url": "/windows/apps/publish/publish-your-app/msix/product-declarations", "redirect_document_id": false }, { - "source_path": "uwp/design/controls-and-patterns/listview-and-gridview.md", - "redirect_url": "/windows/apps/design/controls/listview-and-gridview", + "source_path": "hub/apps/publish/publish-your-app/publish-update-to-your-app-on-store.md", + "redirect_url": "/windows/apps/publish/publish-your-app/msix/publish-update-to-your-app-on-store", "redirect_document_id": false }, { - "source_path": "uwp/design/controls-and-patterns/listview-filtering.md", - "redirect_url": "/windows/apps/design/controls/listview-filtering", + "source_path": "hub/apps/publish/publish-your-app/release-schedule.md", + "redirect_url": "/windows/apps/publish/publish-your-app/msix/schedule-pricing-changes#configure-precise-release-scheduling", "redirect_document_id": false }, { - "source_path": "uwp/design/controls-and-patterns/media-playback.md", - "redirect_url": "/windows/apps/design/controls/media-playback", + "source_path": "hub/apps/publish/publish-your-app/resolve-submission-errors.md", + "redirect_url": "/windows/apps/publish/publish-your-app/msix/resolve-submission-errors", "redirect_document_id": false }, { - "source_path": "uwp/design/controls-and-patterns/menus.md", - "redirect_url": "/windows/apps/design/controls/menus", + "source_path": "hub/apps/publish/publish-your-app/schedule-pricing-changes.md", + "redirect_url": "/windows/apps/publish/publish-your-app/msix/schedule-pricing-changes", "redirect_document_id": false }, { - "source_path": "uwp/design/controls-and-patterns/navigationview.md", - "redirect_url": "/windows/apps/design/controls/navigationview", + "source_path": "hub/apps/publish/publish-your-app/screenshots-and-images.md", + "redirect_url": "/windows/apps/publish/publish-your-app/msix/screenshots-and-images", "redirect_document_id": false }, { - "source_path": "uwp/design/controls-and-patterns/nested-ui.md", - "redirect_url": "/windows/apps/design/controls/nested-ui", + "source_path": "hub/apps/publish/publish-your-app/support-info.md", + "redirect_url": "/windows/apps/publish/publish-your-app/msix/support-info", "redirect_document_id": false }, { - "source_path": "uwp/design/controls-and-patterns/number-box.md", - "redirect_url": "/windows/apps/design/controls/number-box", + "source_path": "hub/apps/publish/publish-your-app/supported-languages.md", + "redirect_url": "/windows/apps/publish/publish-your-app/msix/app-package-requirements#supported-languages", "redirect_document_id": false }, { - "source_path": "uwp/design/controls-and-patterns/password-box.md", - "redirect_url": "/windows/apps/design/controls/password-box", + "source_path": "hub/apps/publish/publish-your-app/system-requirements.md", + "redirect_url": "/windows/apps/publish/publish-your-app/msix/system-requirements", "redirect_document_id": false }, { - "source_path": "uwp/design/controls-and-patterns/person-picture.md", - "redirect_url": "/windows/apps/design/controls/person-picture", + "source_path": "hub/apps/publish/publish-your-app/upload-app-packages.md", + "redirect_url": "/windows/apps/publish/publish-your-app/msix/upload-app-packages", "redirect_document_id": false }, { - "source_path": "uwp/design/controls-and-patterns/pivot.md", - "redirect_url": "/windows/apps/design/controls/pivot", + "source_path": "hub/apps/publish/publish-your-app/visibility-options.md", + "redirect_url": "/windows/apps/publish/publish-your-app/msix/visibility-options", "redirect_document_id": false }, { - "source_path": "uwp/design/controls-and-patterns/progress-controls.md", - "redirect_url": "/windows/apps/design/controls/progress-controls", + "source_path": "hub/apps/publish/publish-your-app/reserve-your-apps-name.md", + "redirect_url": "/windows/apps/publish/publish-your-app/msix/reserve-your-apps-name", "redirect_document_id": false }, { - "source_path": "uwp/design/controls-and-patterns/pull-to-refresh.md", - "redirect_url": "/windows/apps/design/controls/pull-to-refresh", + "source_path": "hub/apps/publish/publish-your-app/turn-your-website-pwa.md", + "redirect_url": "/windows/apps/publish/publish-your-app/pwa/turn-your-website-pwa", "redirect_document_id": false }, { - "source_path": "uwp/design/controls-and-patterns/radio-button.md", - "redirect_url": "/windows/apps/design/controls/radio-button", + "source_path": "hub/apps/publish/publish-your-app/write-great-app-description.md", + "redirect_url": "/windows/apps/publish/publish-your-app/msix/write-great-app-description", "redirect_document_id": false }, { - "source_path": "uwp/design/controls-and-patterns/rating.md", - "redirect_url": "/windows/apps/design/controls/rating", + "source_path": "hub/apps/publish/partner-center/manage-app-name-reservations.md", + "redirect_url": "/windows/apps/publish/partner-center/msix/manage-app-name-reservations", "redirect_document_id": false }, { - "source_path": "uwp/design/controls-and-patterns/resourcedictionary-and-xaml-resource-references.md", - "redirect_url": "/windows/apps/design/style/xaml-resource-dictionary", + "source_path": "hub/apps/publish/publish-your-app/msix/overview.md", + "redirect_url": "/windows/apps/publish/", "redirect_document_id": false }, { - "source_path": "uwp/design/controls-and-patterns/rich-edit-box.md", - "redirect_url": "/windows/apps/design/controls/rich-edit-box", + "source_path": "hub/apps/publish/publish-your-app/msi/overview.md", + "redirect_url": "/windows/apps/publish/", "redirect_document_id": false }, { - "source_path": "uwp/design/controls-and-patterns/rich-text-block.md", - "redirect_url": "/windows/apps/design/controls/rich-text-block", + "source_path": "hub/apps/publish/publish-your-app/pwa/overview.md", + "redirect_url": "/windows/apps/publish/", "redirect_document_id": false }, { - "source_path": "uwp/design/controls-and-patterns/scroll-controls.md", - "redirect_url": "/windows/apps/design/controls/scroll-controls", + "source_path": "hub/apps/design/shell/tiles-and-notifications/adaptive-tiles-schema.md", + "redirect_url": "/windows/uwp/launch-resume/adaptive-tiles-schema", "redirect_document_id": false }, { - "source_path": "uwp/design/controls-and-patterns/selection-modes.md", - "redirect_url": "/windows/apps/design/controls/selection-modes", + "source_path": "hub/apps/design/shell/tiles-and-notifications/chaseable-tile-notifications.md", + "redirect_url": "/windows/uwp/launch-resume/chaseable-tile-notifications", "redirect_document_id": false }, { - "source_path": "uwp/design/controls-and-patterns/semantic-zoom.md", - "redirect_url": "/windows/apps/design/controls/semantic-zoom", + "source_path": "hub/apps/design/shell/tiles-and-notifications/create-adaptive-tiles.md", + "redirect_url": "/windows/uwp/launch-resume/create-adaptive-tiles", "redirect_document_id": false }, { - "source_path": "uwp/design/controls-and-patterns/shapes.md", - "redirect_url": "/windows/apps/design/controls/shapes", + "source_path": "hub/apps/design/shell/tiles-and-notifications/creating-tiles.md", + "redirect_url": "/windows/uwp/launch-resume/creating-tiles", "redirect_document_id": false }, { - "source_path": "uwp/design/controls-and-patterns/slider.md", - "redirect_url": "/windows/apps/design/controls/slider", + "source_path": "hub/apps/design/shell/tiles-and-notifications/primary-tile-apis.md", + "redirect_url": "/windows/uwp/launch-resume/primary-tile-apis", "redirect_document_id": false }, { - "source_path": "uwp/design/controls-and-patterns/split-view.md", - "redirect_url": "/windows/apps/design/controls/split-view", + "source_path": "hub/apps/design/shell/tiles-and-notifications/secondary-tiles-guidance.md", + "redirect_url": "/windows/uwp/launch-resume/secondary-tiles-guidance", "redirect_document_id": false }, { - "source_path": "uwp/design/controls-and-patterns/swipe.md", - "redirect_url": "/windows/apps/design/controls/swipe", + "source_path": "hub/apps/design/shell/tiles-and-notifications/secondary-tiles-pin-to-taskbar.md", + "redirect_url": "/windows/uwp/launch-resume/secondary-tiles-pin-to-taskbar", "redirect_document_id": false }, { - "source_path": "uwp/design/controls-and-patterns/tab-view.md", - "redirect_url": "/windows/apps/design/controls/tab-view", + "source_path": "hub/apps/design/shell/tiles-and-notifications/secondary-tiles-pinning.md", + "redirect_url": "/windows/uwp/launch-resume/secondary-tiles-pinning", "redirect_document_id": false }, { - "source_path": "uwp/design/controls-and-patterns/text-block.md", - "redirect_url": "/windows/apps/design/controls/text-block", + "source_path": "hub/apps/design/shell/tiles-and-notifications/secondary-tiles.md", + "redirect_url": "/windows/uwp/launch-resume/secondary-tiles", "redirect_document_id": false }, { - "source_path": "uwp/design/controls-and-patterns/text-box.md", - "redirect_url": "/windows/apps/design/controls/text-box", + "source_path": "hub/apps/design/shell/tiles-and-notifications/sending-a-local-tile-notification.md", + "redirect_url": "/windows/uwp/launch-resume/sending-a-local-tile-notification", "redirect_document_id": false }, { - "source_path": "uwp/design/controls-and-patterns/text-controls.md", - "redirect_url": "/windows/apps/design/controls/text-controls", + "source_path": "hub/apps/design/shell/tiles-and-notifications/special-tile-templates-catalog.md", + "redirect_url": "/windows/uwp/launch-resume/special-tile-templates-catalog", "redirect_document_id": false }, { - "source_path": "uwp/design/controls-and-patterns/text-handwriting-view.md", - "redirect_url": "/windows/apps/design/controls/text-handwriting-view", + "source_path": "hub/apps/design/shell/tiles-and-notifications/tile-schema.md", + "redirect_url": "/windows/uwp/launch-resume/tile-schema", "redirect_document_id": false }, { - "source_path": "uwp/design/controls-and-patterns/time-picker.md", - "redirect_url": "/windows/apps/design/controls/time-picker", + "source_path": "hub/apps/design/shell/tiles-and-notifications/tile-toast-language-scale-contrast.md", + "redirect_url": "/windows/uwp/launch-resume/tile-toast-language-scale-contrast", "redirect_document_id": false }, { - "source_path": "uwp/design/controls-and-patterns/toggles.md", - "redirect_url": "/windows/apps/design/controls/toggles", + "source_path": "hub/apps/design/shell/tiles-and-notifications/index.md", + "redirect_url": "/windows/uwp/launch-resume/creating-tiles", "redirect_document_id": false }, { - "source_path": "uwp/design/controls-and-patterns/tooltips.md", - "redirect_url": "/windows/apps/design/controls/tooltips", + "source_path": "uwp/security/fingerprint-biometrics.md", + "redirect_url": "/windows/apps/develop/security/fingerprint-biometrics", "redirect_document_id": false }, { - "source_path": "uwp/design/controls-and-patterns/tree-view.md", - "redirect_url": "/windows/apps/design/controls/tree-view", + "source_path": "uwp/security/smart-cards.md", + "redirect_url": "/windows/apps/develop/security/smart-cards", "redirect_document_id": false }, { - "source_path": "uwp/design/controls-and-patterns/two-pane-view.md", - "redirect_url": "/windows/apps/design/controls/two-pane-view", + "source_path": "uwp/security/credential-locker.md", + "redirect_url": "/windows/apps/develop/security/credential-locker", "redirect_document_id": false }, { - "source_path": "uwp/design/controls-and-patterns/web-view.md", - "redirect_url": "/windows/apps/design/controls/web-view", + "source_path": "uwp/devices-sensors/printing-and-scanning.md", + "redirect_url": "/windows/apps/develop/devices-sensors/printing-and-scanning", "redirect_document_id": false }, { - "source_path": "uwp/design/controls-and-patterns/xaml-styles.md", - "redirect_url": "/windows/apps/design/style/xaml-styles", + "source_path": "uwp/devices-sensors/print-from-your-app.md", + "redirect_url": "/windows/apps/develop/devices-sensors/print-from-your-app", "redirect_document_id": false }, { - "source_path": "uwp/design/controls-and-patterns/xaml-theme-resources.md", - "redirect_url": "/windows/apps/design/style/xaml-theme-resources", + "source_path": "uwp/devices-sensors/customize-the-print-preview-ui.md", + "redirect_url": "/windows/apps/develop/devices-sensors/customize-the-print-preview-ui", "redirect_document_id": false }, { - "source_path": "uwp/design/devices/designing-for-MR.md", - "redirect_url": "/windows/apps/design/devices/designing-for-MR", + "source_path": "uwp/devices-sensors/scan-from-your-app.md", + "redirect_url": "/windows/apps/develop/devices-sensors/scan-from-your-app", "redirect_document_id": false }, { - "source_path": "uwp/design/devices/designing-for-tv.md", - "redirect_url": "/windows/apps/design/devices/designing-for-tv", + "source_path": "hub/apps/design/style/index.md", + "redirect_url": "/windows/apps/design", "redirect_document_id": false }, { - "source_path": "uwp/design/devices/index.md", - "redirect_url": "/windows/apps/design/devices/index", + "source_path": "hub/apps/design/signature-experiences/design-principles.md", + "redirect_url": "/windows/apps/design", "redirect_document_id": false }, { - "source_path": "uwp/design/downloads/index.md", - "redirect_url": "/windows/apps/design/downloads/index", + "source_path": "hub/apps/design/signature-experiences/signature-experiences.md", + "redirect_url": "/windows/apps/design", "redirect_document_id": false }, { - "source_path": "uwp/design/globalizing/adjust-layout-and-fonts--and-support-rtl.md", - "redirect_url": "/windows/apps/design/globalizing/adjust-layout-and-fonts--and-support-rtl", + "source_path": "hub/apps/design/style/color.md", + "redirect_url": "/windows/apps/design/signature-experiences/color", "redirect_document_id": false }, { - "source_path": "uwp/design/globalizing/design-for-bidi-text.md", - "redirect_url": "/windows/apps/design/globalizing/design-for-bidi-text", + "source_path": "hub/apps/design/style/typography.md", + "redirect_url": "/windows/apps/design/signature-experiences/typography", "redirect_document_id": false }, { - "source_path": "uwp/design/globalizing/glob-numeralsystem-values.md", - "redirect_url": "/windows/apps/design/globalizing/glob-numeralsystem-values", + "source_path": "hub/apps/design/motion/index.md", + "redirect_url": "/windows/apps/design/signature-experiences/motion", "redirect_document_id": false }, { - "source_path": "uwp/design/globalizing/globalizing-portal.md", - "redirect_url": "/windows/apps/design/globalizing/globalizing-portal", + "source_path": "hub/dev-home/project-ironsides.md", + "redirect_url": "/windows/dev-home/#experimental-features", "redirect_document_id": false }, { - "source_path": "uwp/design/globalizing/guidelines-and-checklist-for-globalizing-your-app.md", - "redirect_url": "/windows/apps/design/globalizing/guidelines-and-checklist-for-globalizing-your-app", + "source_path": "hub/dev-home/dev-diagnostics.md", + "redirect_url": "/windows/dev-home/#experimental-features", "redirect_document_id": false }, { - "source_path": "uwp/design/globalizing/japanese-era-change.md", - "redirect_url": "/windows/apps/design/globalizing/japanese-era-change", + "source_path": "hub/dev-home/quickstart-playground.md", + "redirect_url": "/windows/dev-home/#experimental-features", "redirect_document_id": false }, { - "source_path": "uwp/design/globalizing/loc-international-fonts.md", - "redirect_url": "/windows/apps/design/globalizing/loc-international-fonts", + "source_path": "hub/apps/design/style/xaml-control-templates.md", + "redirect_url": "/windows/apps/develop/platform/xaml/xaml-control-templates", "redirect_document_id": false }, { - "source_path": "uwp/design/globalizing/manage-language-and-region.md", - "redirect_url": "/windows/apps/design/globalizing/manage-language-and-region", + "source_path": "hub/apps/design/style/xaml-resource-dictionary.md", + "redirect_url": "/windows/apps/develop/platform/xaml/xaml-resource-dictionary", "redirect_document_id": false }, { - "source_path": "uwp/design/globalizing/prepare-your-app-for-localization.md", - "redirect_url": "/windows/apps/design/globalizing/prepare-your-app-for-localization", + "source_path": "hub/apps/design/style/xaml-styles.md", + "redirect_url": "/windows/apps/develop/platform/xaml/xaml-styles", "redirect_document_id": false }, { - "source_path": "uwp/design/globalizing/use-global-ready-formats.md", - "redirect_url": "/windows/apps/design/globalizing/use-global-ready-formats", + "source_path": "hub/apps/design/style/xaml-theme-resources.md", + "redirect_url": "/windows/apps/develop/platform/xaml/xaml-theme-resources", "redirect_document_id": false }, { - "source_path": "uwp/design/globalizing/use-mat.md", - "redirect_url": "/windows/apps/design/globalizing/use-mat", + "source_path": "hub/apps/design/layout/transforms.md", + "redirect_url": "/windows/apps/develop/platform/xaml/transforms", "redirect_document_id": false }, { - "source_path": "uwp/design/globalizing/use-patterns-to-format-dates-and-times.md", - "redirect_url": "/windows/apps/design/globalizing/use-patterns-to-format-dates-and-times", + "source_path": "hub/apps/design/layout/3-d-perspective-effects.md", + "redirect_url": "/windows/apps/develop/platform/xaml/3-d-perspective-effects", "redirect_document_id": false }, { - "source_path": "uwp/design/globalizing/use-utf8-code-page.md", - "redirect_url": "/windows/apps/design/globalizing/use-utf8-code-page", + "source_path": "hub/apps/design/style/brushes.md", + "redirect_url": "/windows/apps/develop/platform/xaml/brushes", "redirect_document_id": false }, { - "source_path": "uwp/design/in-app-help/external-help.md", - "redirect_url": "/windows/apps/design/in-app-help/external-help", + "source_path": "hub/apps/design/style/reveal-focus.md", + "redirect_url": "/windows/uwp/ui-input/reveal-focus", "redirect_document_id": false }, { - "source_path": "uwp/design/in-app-help/guidelines-for-app-help.md", - "redirect_url": "/windows/apps/design/in-app-help/guidelines-for-app-help", + "source_path": "hub/apps/design/layout/app-window.md", + "redirect_url": "/windows/uwp/ui-input/app-window", "redirect_document_id": false }, { - "source_path": "uwp/design/in-app-help/in-app-help.md", - "redirect_url": "/windows/apps/design/in-app-help/in-app-help", + "source_path": "hub/apps/design/layout/application-view.md", + "redirect_url": "/windows/uwp/ui-input/application-view", "redirect_document_id": false }, { - "source_path": "uwp/design/in-app-help/instructional-ui.md", - "redirect_url": "/windows/apps/design/in-app-help/instructional-ui", + "source_path": "hub/apps/design/layout/show-multiple-views.md", + "redirect_url": "/windows/uwp/ui-input/show-multiple-views", "redirect_document_id": false }, { - "source_path": "uwp/design/index.md", - "redirect_url": "/windows/apps/design/index", + "source_path": "hub/android/defender-settings.md", + "redirect_url": "/defender-endpoint/microsoft-defender-security-center-antivirus", "redirect_document_id": false }, { - "source_path": "uwp/design/input/access-keys.md", - "redirect_url": "/windows/apps/design/input/access-keys", + "source_path": "hub/apps/get-started/client-frameworks-faq.yml", + "redirect_url": "/windows/apps/get-started/windows-developer-faq", "redirect_document_id": false }, { - "source_path": "uwp/design/input/convert-ink-to-text.md", - "redirect_url": "/windows/apps/design/input/convert-ink-to-text", + "source_path": "hub/apps/publish/in-app-ads.md", + "redirect_url": "/windows/apps/publish/attract-customers-and-promote-your-apps", "redirect_document_id": false }, { - "source_path": "uwp/design/input/cortana-deep-link-into-your-app.md", - "redirect_url": "/windows/apps/design/input/cortana-deep-link-into-your-app", + "source_path": "uwp/audio-video-camera/basic-photo-video-and-audio-capture-with-MediaCapture.md", + "redirect_url": "/windows/apps/develop/camera/basic-photo-capture", "redirect_document_id": false }, { - "source_path": "uwp/design/input/cortana-design-guidelines.md", - "redirect_url": "/windows/apps/design/input/cortana-design-guidelines", + "source_path": "uwp/audio-video-camera/camera-profiles.md", + "redirect_url": "/windows/apps/develop/camera/camera-profiles", "redirect_document_id": false }, { - "source_path": "uwp/design/input/cortana-dynamically-modify-voice-command-definition-vcd-phrase-lists.md", - "redirect_url": "/windows/apps/design/input/cortana-dynamically-modify-voice-command-definition-vcd-phrase-lists", + "source_path": "uwp/audio-video-camera/set-media-encoding-properties.md", + "redirect_url": "/windows/apps/develop/camera/set-media-encoding-properties", "redirect_document_id": false }, { - "source_path": "uwp/design/input/cortana-interact-with-a-background-app.md", - "redirect_url": "/windows/apps/design/input/cortana-interact-with-a-background-app", + "source_path": "uwp/audio-video-camera/high-dynamic-range-hdr-photo-capture.md", + "redirect_url": "/windows/apps/develop/camera/high-dynamic-range-hdr-photo-capture", "redirect_document_id": false }, { - "source_path": "uwp/design/input/cortana-interactions.md", - "redirect_url": "/windows/apps/design/input/cortana-interactions", + "source_path": "uwp/audio-video-camera/capture-device-controls-for-photo-and-video-capture.md", + "redirect_url": "/windows/apps/develop/camera/capture-device-controls-for-photo-and-video-capture", "redirect_document_id": false }, { - "source_path": "uwp/design/input/cortana-launch-a-background-app-with-voice-commands.md", - "redirect_url": "/windows/apps/design/input/cortana-launch-a-background-app-with-voice-commands", + "source_path": "uwp/audio-video-camera/capture-device-controls-for-video-capture.md", + "redirect_url": "/windows/apps/develop/camera/capture-device-controls-for-video-capture", "redirect_document_id": false }, { - "source_path": "uwp/design/input/cortana-launch-a-foreground-app-with-voice-commands.md", - "redirect_url": "/windows/apps/design/input/cortana-launch-a-foreground-app-with-voice-commands", + "source_path": "uwp/audio-video-camera/effects-for-video-capture.md", + "redirect_url": "/windows/apps/develop/camera/effects-for-video-capture", "redirect_document_id": false }, { - "source_path": "uwp/design/input/cortana-support-natural-language-voice-commands.md", - "redirect_url": "/windows/apps/design/input/cortana-support-natural-language-voice-commands", + "source_path": "uwp/audio-video-camera/scene-analysis-for-media-capture.md", + "redirect_url": "/windows/apps/develop/camera/scene-analysis-for-media-capture", "redirect_document_id": false }, { - "source_path": "uwp/design/input/custom-text-input.md", - "redirect_url": "/windows/apps/design/input/custom-text-input", + "source_path": "uwp/audio-video-camera/variable-photo-sequence.md", + "redirect_url": "/windows/apps/develop/camera/variable-photo-sequence", "redirect_document_id": false }, { - "source_path": "uwp/design/input/define-custom-recognition-constraints.md", - "redirect_url": "/windows/apps/design/input/define-custom-recognition-constraints", + "source_path": "uwp/audio-video-camera/process-media-frames-with-mediaframereader.md", + "redirect_url": "/windows/apps/develop/camera/process-media-frames-with-mediaframereader", "redirect_document_id": false }, { - "source_path": "uwp/design/input/drag-and-drop.md", - "redirect_url": "/windows/apps/design/input/drag-and-drop", + "source_path": "uwp/audio-video-camera/process-audio-frames-with-mediaframereader.md", + "redirect_url": "/windows/apps/develop/camera/process-audio-frames-with-mediaframereader", "redirect_document_id": false }, { - "source_path": "uwp/design/input/enable-continuous-dictation.md", - "redirect_url": "/windows/apps/design/input/enable-continuous-dictation", + "source_path": "uwp/audio-video-camera/capture-from-multiple-sources-simultaneously.md", + "redirect_url": "/windows/apps/develop/camera/capture-from-multiple-sources-simultaneously", "redirect_document_id": false }, { - "source_path": "uwp/design/input/focus-navigation-programmatic.md", - "redirect_url": "/windows/apps/design/input/focus-navigation-programmatic", + "source_path": "uwp/audio-video-camera/connect-to-remote-cameras.md", + "redirect_url": "/windows/apps/develop/camera/connect-to-remote-cameras", "redirect_document_id": false }, { - "source_path": "uwp/design/input/focus-navigation.md", - "redirect_url": "/windows/apps/design/input/focus-navigation", + "source_path": "uwp/audio-video-camera/launch-camera-settings.md", + "redirect_url": "/windows/apps/develop/camera/launch-camera-settings", "redirect_document_id": false }, { - "source_path": "uwp/design/input/gamepad-and-remote-interactions.md", - "redirect_url": "/windows/apps/design/input/gamepad-and-remote-interactions", + "source_path": "hub/apps/develop/camera/index.md", + "redirect_url": "/windows/apps/develop/camera/camera", "redirect_document_id": false }, { - "source_path": "uwp/design/input/gaze-interactions.md", - "redirect_url": "/windows/apps/design/input/gaze-interactions", + "source_path": "uwp/launch-resume/handle-uri-activation.md", + "redirect_url": "/windows/apps/develop/launch/handle-uri-activation", "redirect_document_id": false }, { - "source_path": "uwp/design/input/guidelines-for-cross-slide.md", - "redirect_url": "/windows/apps/design/input/guidelines-for-cross-slide", + "source_path": "uwp/launch-resume/launch-app-from-file.md", + "redirect_url": "/windows/apps/develop/launch/", "redirect_document_id": false }, { - "source_path": "uwp/design/input/guidelines-for-optical-zoom.md", - "redirect_url": "/windows/apps/design/input/guidelines-for-optical-zoom", + "source_path": "uwp/launch-resume/launch-app-with-uri.md", + "redirect_url": "/windows/apps/develop/launch/", "redirect_document_id": false }, { - "source_path": "uwp/design/input/guidelines-for-panning.md", - "redirect_url": "/windows/apps/design/input/guidelines-for-panning", + "source_path": "uwp/launch-resume/launch-default-app.md", + "redirect_url": "/windows/apps/develop/launch/launch-default-app", "redirect_document_id": false }, { - "source_path": "uwp/design/input/guidelines-for-rotation.md", - "redirect_url": "/windows/apps/design/input/guidelines-for-rotation", + "source_path": "uwp/launch-resume/launch-default-apps-settings.md", + "redirect_url": "/windows/apps/develop/launch/launch-default-apps-settings", "redirect_document_id": false }, { - "source_path": "uwp/design/input/guidelines-for-targeting.md", - "redirect_url": "/windows/apps/design/input/guidelines-for-targeting", + "source_path": "uwp/launch-resume/launch-maps-app.md", + "redirect_url": "/windows/apps/develop/launch/launch-default-app", "redirect_document_id": false }, { - "source_path": "uwp/design/input/guidelines-for-textselection.md", - "redirect_url": "/windows/apps/design/input/guidelines-for-textselection", + "source_path": "uwp/launch-resume/launch-people-apps.md", + "redirect_url": "/windows/apps/develop/launch/launch-people-app", "redirect_document_id": false }, { - "source_path": "uwp/design/input/guidelines-for-visualfeedback.md", - "redirect_url": "/windows/apps/design/input/guidelines-for-visualfeedback", + "source_path": "uwp/launch-resume/launch-screen-snipping.md", + "redirect_url": "/windows/apps/develop/launch/launch-screen-snipping", "redirect_document_id": false }, { - "source_path": "uwp/design/input/handle-pointer-input.md", - "redirect_url": "/windows/apps/design/input/handle-pointer-input", + "source_path": "uwp/launch-resume/launch-settings-app.md", + "redirect_url": "/windows/apps/develop/launch/launch-settings", "redirect_document_id": false }, { - "source_path": "uwp/design/input/identify-input-devices.md", - "redirect_url": "/windows/apps/design/input/identify-input-devices", + "source_path": "uwp/launch-resume/launch-store-app.md", + "redirect_url": "/windows/apps/develop/launch/launch-store-app", "redirect_document_id": false }, { - "source_path": "uwp/design/input/index.md", - "redirect_url": "/windows/apps/design/input/index", + "source_path": "uwp/launch-resume/launch-the-default-app-for-a-file.md", + "redirect_url": "/windows/apps/develop/launch/launch-the-default-app-for-a-file", "redirect_document_id": false }, { - "source_path": "uwp/design/input/ink-toolbar.md", - "redirect_url": "/windows/apps/design/input/ink-toolbar", + "source_path": "uwp/launch-resume/reserved-uri-scheme-names.md", + "redirect_url": "/windows/apps/develop/launch/reserved-uri-scheme-names", "redirect_document_id": false }, { - "source_path": "uwp/design/input/ink-walkthrough.md", - "redirect_url": "/windows/apps/design/input/ink-walkthrough", + "source_path": "uwp/launch-resume/web-to-app-linking.md", + "redirect_url": "/windows/apps/develop/launch/web-to-app-linking", "redirect_document_id": false }, { - "source_path": "uwp/design/input/input-injection.md", - "redirect_url": "/windows/apps/design/input/input-injection", + "source_path": "uwp/launch-resume/handle-file-activation.md", + "redirect_url": "/windows/apps/develop/launch/handle-file-activation", "redirect_document_id": false }, { - "source_path": "uwp/design/input/input-method-editor-requirements.md", - "redirect_url": "/windows/apps/design/input/input-method-editor-requirements", + "source_path": "hub/apps/winui/winui2/index.md", + "redirect_url": "/windows/uwp/get-started/winui2/", "redirect_document_id": false }, { - "source_path": "uwp/design/input/input-method-editors.md", - "redirect_url": "/windows/apps/design/input/input-method-editors", + "source_path": "hub/apps/winui/winui2/getting-started.md", + "redirect_url": "/windows/uwp/get-started/winui2/getting-started", "redirect_document_id": false }, { - "source_path": "uwp/design/input/input-primer.md", - "redirect_url": "/windows/apps/design/input/input-primer", + "source_path": "hub/apps/winui/winui2/nuget-packages.md", + "redirect_url": "/windows/uwp/get-started/winui2/nuget-packages", "redirect_document_id": false }, { - "source_path": "uwp/design/input/keyboard-accelerators.md", - "redirect_url": "/windows/apps/design/input/keyboard-accelerators", + "source_path": "hub/apps/winui/winui2/release-notes/index.md", + "redirect_url": "/windows/uwp/get-started/winui2/release-notes/", "redirect_document_id": false }, { - "source_path": "uwp/design/input/keyboard-events.md", - "redirect_url": "/windows/apps/design/input/keyboard-events", + "source_path": "hub/apps/winui/winui2/release-notes/winui-2.0.md", + "redirect_url": "/windows/uwp/get-started/winui2/release-notes/winui-2.0", "redirect_document_id": false }, { - "source_path": "uwp/design/input/keyboard-interactions.md", - "redirect_url": "/windows/apps/design/input/keyboard-interactions", + "source_path": "hub/apps/winui/winui2/release-notes/winui-2.1.md", + "redirect_url": "/windows/uwp/get-started/winui2/release-notes/winui-2.1", "redirect_document_id": false }, { - "source_path": "uwp/design/input/manage-issues-with-audio-input.md", - "redirect_url": "/windows/apps/design/input/manage-issues-with-audio-input", + "source_path": "hub/apps/winui/winui2/release-notes/winui-2.2.md", + "redirect_url": "/windows/uwp/get-started/winui2/release-notes/winui-2.2", "redirect_document_id": false }, { - "source_path": "uwp/design/input/mouse-interactions.md", - "redirect_url": "/windows/apps/design/input/mouse-interactions", + "source_path": "hub/apps/winui/winui2/release-notes/winui-2.3.md", + "redirect_url": "/windows/uwp/get-started/winui2/release-notes/winui-2.3", "redirect_document_id": false }, { - "source_path": "uwp/design/input/multiple-input-design-guidelines.md", - "redirect_url": "/windows/apps/design/input/multiple-input-design-guidelines", + "source_path": "hub/apps/winui/winui2/release-notes/winui-2.4.md", + "redirect_url": "/windows/uwp/get-started/winui2/release-notes/winui-2.4", "redirect_document_id": false }, { - "source_path": "uwp/design/input/pen-and-stylus-interactions.md", - "redirect_url": "/windows/apps/design/input/pen-and-stylus-interactions", + "source_path": "hub/apps/winui/winui2/release-notes/winui-2.5.md", + "redirect_url": "/windows/uwp/get-started/winui2/release-notes/winui-2.5", "redirect_document_id": false }, { - "source_path": "uwp/design/input/radialcontroller-walkthrough.md", - "redirect_url": "/windows/apps/design/input/radialcontroller-walkthrough", + "source_path": "hub/apps/winui/winui2/release-notes/winui-2.6.md", + "redirect_url": "/windows/uwp/get-started/winui2/release-notes/winui-2.6", "redirect_document_id": false }, { - "source_path": "uwp/design/input/respond-to-the-presence-of-the-touch-keyboard.md", - "redirect_url": "/windows/apps/design/input/respond-to-the-presence-of-the-touch-keyboard", + "source_path": "hub/apps/winui/winui2/release-notes/winui-2.7.md", + "redirect_url": "/windows/uwp/get-started/winui2/release-notes/winui-2.7", "redirect_document_id": false }, { - "source_path": "uwp/design/input/save-and-load-ink.md", - "redirect_url": "/windows/apps/design/input/save-and-load-ink", + "source_path": "hub/apps/winui/winui2/release-notes/winui-2.8.md", + "redirect_url": "/windows/uwp/get-started/winui2/release-notes/winui-2.8", "redirect_document_id": false }, { - "source_path": "uwp/design/input/set-speech-recognition-timeouts.md", - "redirect_url": "/windows/apps/design/input/set-speech-recognition-timeouts", + "source_path": "hub/apps/windows-app-sdk/windowing/windowing-overview.md", + "redirect_url": "/windows/apps/develop/ui-input/manage-app-windows", "redirect_document_id": false }, { - "source_path": "uwp/design/input/specify-the-speech-recognizer-language.md", - "redirect_url": "/windows/apps/design/input/specify-the-speech-recognizer-language", + "source_path": "hub/sudo/index.md", + "redirect_url": "/windows/advanced-settings/sudo/", "redirect_document_id": false }, { - "source_path": "uwp/design/input/speech-interactions.md", - "redirect_url": "/windows/apps/design/input/speech-interactions", + "source_path": "hub/apps/develop/actions/action-json.md", + "redirect_url": "/windows/ai/app-actions/actions-json", "redirect_document_id": false }, { - "source_path": "uwp/design/input/speech-recognition.md", - "redirect_url": "/windows/apps/design/input/speech-recognition", + "source_path": "hub/apps/develop/actions/action-provider-manifest.md", + "redirect_url": "/windows/ai/app-actions/actions-provider-manifest", "redirect_document_id": false }, { - "source_path": "uwp/design/input/text-scaling.md", - "redirect_url": "/windows/apps/design/input/text-scaling", + "source_path": "hub/apps/develop/actions/index.md", + "redirect_url": "/windows/ai/app-actions/", "redirect_document_id": false }, { - "source_path": "uwp/design/input/touch-interactions.md", - "redirect_url": "/windows/apps/design/input/touch-interactions", + "source_path": "hub/apps/develop/launch/launch-maps-app.md", + "redirect_url": "/windows/apps/develop/launch/launch-default-app", "redirect_document_id": false }, { - "source_path": "uwp/design/input/touchpad-interactions.md", - "redirect_url": "/windows/apps/design/input/touchpad-interactions", + "source_path": "hub/apps/windows-app-sdk/notifications/push-notifications/index.md", + "redirect_url": "../../../develop/notifications/push-notifications/index", "redirect_document_id": false }, { - "source_path": "uwp/design/input/use-input-scope-to-change-the-touch-keyboard.md", - "redirect_url": "/windows/apps/design/input/use-input-scope-to-change-the-touch-keyboard", + "source_path": "hub/apps/windows-app-sdk/notifications/push-notifications/push-quickstart.md", + "redirect_url": "../../../develop/notifications/push-notifications/push-quickstart", "redirect_document_id": false }, { - "source_path": "uwp/design/input/windows-wheel-interactions.md", - "redirect_url": "/windows/apps/design/input/windows-wheel-interactions", + "source_path": "hub/apps/windows-app-sdk/notifications/push-notifications/troubleshooting.md", + "redirect_url": "../../../develop/notifications/push-notifications/troubleshooting", "redirect_document_id": false }, { - "source_path": "uwp/design/layout/3-d-perspective-effects.md", - "redirect_url": "/windows/apps/design/layout/3-d-perspective-effects", + "source_path": "hub/apps/windows-app-sdk/notifications/app-notifications/app-notifications-quickstart.md", + "redirect_url": "../../../develop/notifications/app-notifications/app-notifications-quickstart", "redirect_document_id": false }, { - "source_path": "uwp/design/layout/alignment-margin-padding.md", - "redirect_url": "/windows/apps/design/layout/alignment-margin-padding", + "source_path": "hub/apps/windows-app-sdk/notifications/app-notifications/index.md", + "redirect_url": "../../../develop/notifications/app-notifications/index", "redirect_document_id": false }, { - "source_path": "uwp/design/layout/app-window.md", - "redirect_url": "/windows/apps/design/layout/app-window", + "source_path": "hub/apps/design/shell/tiles-and-notifications/badges.md", + "redirect_url": "../../../develop/notifications/badges", "redirect_document_id": false }, { - "source_path": "uwp/design/layout/application-view.md", - "redirect_url": "/windows/apps/design/layout/application-view", + "source_path": "hub/apps/design/shell/tiles-and-notifications/firewall-allowlist-config.md", + "redirect_url": "../../../develop/notifications/push-notifications/firewall-allowlist-config", "redirect_document_id": false }, { - "source_path": "uwp/design/layout/attached-layouts.md", - "redirect_url": "/windows/apps/design/layout/attached-layouts", + "source_path": "hub/apps/design/shell/tiles-and-notifications/push-request-response-headers.md", + "redirect_url": "../../../develop/notifications/push-notifications/push-request-response-headers", "redirect_document_id": false }, { - "source_path": "uwp/design/layout/boxpanel-example-custom-panel.md", - "redirect_url": "/windows/apps/design/layout/boxpanel-example-custom-panel", + "source_path": "hub/apps/design/shell/tiles-and-notifications/quickstart-send-push-notification.md", + "redirect_url": "../../../develop/notifications/push-notifications/quickstart-send-push-notification", "redirect_document_id": false }, { - "source_path": "uwp/design/layout/custom-panels-overview.md", - "redirect_url": "/windows/apps/design/layout/custom-panels-overview", + "source_path": "hub/apps/design/shell/tiles-and-notifications/raw-notification-overview.md", + "redirect_url": "../../../develop/notifications/push-notifications/raw-notification-overview", "redirect_document_id": false }, { - "source_path": "uwp/design/layout/depth-shadow.md", - "redirect_url": "/windows/apps/design/layout/depth-shadow", + "source_path": "hub/apps/design/shell/tiles-and-notifications/request-create-save-notification-channel.md", + "redirect_url": "../../../develop/notifications/push-notifications/request-create-save-notification-channel", "redirect_document_id": false }, { - "source_path": "uwp/design/layout/grid-tutorial.md", - "redirect_url": "/windows/apps/design/layout/grid-tutorial", + "source_path": "hub/apps/design/shell/tiles-and-notifications/troubleshoot-notifications.md", + "redirect_url": "../../../develop/notifications/push-notifications/troubleshoot-notifications", "redirect_document_id": false }, { - "source_path": "uwp/design/layout/index.md", - "redirect_url": "/windows/apps/design/layout/index", + "source_path": "hub/apps/design/shell/tiles-and-notifications/the-code-generated-by-the-push-notification-wizard.md", + "redirect_url": "../../../develop/notifications/push-notifications/code-generated-by-wizard", "redirect_document_id": false }, { - "source_path": "uwp/design/layout/layout-panels.md", - "redirect_url": "/windows/apps/design/layout/layout-panels", + "source_path": "hub/apps/design/shell/tiles-and-notifications/WNS-Notification-Priorities.md", + "redirect_url": "../../../develop/notifications/push-notifications/wns-notification-priorities", "redirect_document_id": false }, { - "source_path": "uwp/design/layout/layouts-with-xaml.md", - "redirect_url": "/windows/apps/design/layout/layouts-with-xaml", + "source_path": "hub/apps/design/shell/tiles-and-notifications/windows-push-notification-services--wns--overview.md", + "redirect_url": "../../../develop/notifications/push-notifications/wns-overview", "redirect_document_id": false }, { - "source_path": "uwp/design/layout/page-layout.md", - "redirect_url": "/windows/apps/design/layout/page-layout", + "source_path": "hub/apps/design/shell/pin-to-taskbar.md", + "redirect_url": "../../develop/windows-integration/pin-to-taskbar", "redirect_document_id": false }, { - "source_path": "uwp/design/layout/responsive-design.md", - "redirect_url": "/windows/apps/design/layout/responsive-design", + "source_path": "hub/apps/design/shell/tiles-and-notifications/adaptive-interactive-toasts.md", + "redirect_url": "../../../develop/notifications/app-notifications/adaptive-interactive-toasts", "redirect_document_id": false }, { - "source_path": "uwp/design/layout/screen-sizes-and-breakpoints-for-responsive-design.md", - "redirect_url": "/windows/apps/design/layout/screen-sizes-and-breakpoints-for-responsive-design", + "source_path": "hub/apps/design/shell/tiles-and-notifications/channel-types.md", + "redirect_url": "../../../develop/notifications/channel-types", "redirect_document_id": false }, { - "source_path": "uwp/design/layout/show-multiple-views.md", - "redirect_url": "/windows/apps/design/layout/show-multiple-views", + "source_path": "hub/apps/design/shell/tiles-and-notifications/choosing-a-notification-delivery-method.md", + "redirect_url": "../../../develop/notifications/choosing-a-notification-delivery-method", "redirect_document_id": false }, { - "source_path": "uwp/design/layout/transforms.md", - "redirect_url": "/windows/apps/design/layout/transforms", + "source_path": "hub/apps/design/shell/tiles-and-notifications/custom-audio-on-toasts.md", + "redirect_url": "../../../develop/notifications/app-notifications/custom-audio-on-toasts", "redirect_document_id": false }, { - "source_path": "uwp/design/motion/connected-animation.md", - "redirect_url": "/windows/apps/design/motion/connected-animation", + "source_path": "hub/apps/design/shell/tiles-and-notifications/custom-timestamps-on-toasts.md", + "redirect_url": "../../../develop/notifications/app-notifications/custom-timestamps-on-toasts", "redirect_document_id": false }, { - "source_path": "uwp/design/motion/content-transition-animations.md", - "redirect_url": "/windows/apps/design/motion/content-transition-animations", + "source_path": "hub/apps/design/shell/tiles-and-notifications/notification-listener.md", + "redirect_url": "../../../develop/notifications/app-notifications/notification-listener", "redirect_document_id": false }, { - "source_path": "uwp/design/motion/directionality-and-gravity.md", - "redirect_url": "/windows/apps/design/motion/directionality-and-gravity", + "source_path": "hub/apps/design/shell/tiles-and-notifications/notifications-visualizer.md", + "redirect_url": "../../../develop/notifications/notifications-visualizer", "redirect_document_id": false }, { - "source_path": "uwp/design/motion/index.md", - "redirect_url": "/windows/apps/design/motion/index", + "source_path": "hub/apps/design/shell/tiles-and-notifications/periodic-notification-overview.md", + "redirect_url": "../../../develop/notifications/periodic-notification-overview", "redirect_document_id": false }, { - "source_path": "uwp/design/motion/key-frame-and-easing-function-animations.md", - "redirect_url": "/windows/apps/design/motion/key-frame-and-easing-function-animations", + "source_path": "hub/apps/design/shell/tiles-and-notifications/scheduled-toast.md", + "redirect_url": "../../../develop/notifications/app-notifications/scheduled-toast", "redirect_document_id": false }, { - "source_path": "uwp/design/motion/motion-dragdrop.md", - "redirect_url": "/windows/apps/design/motion/motion-dragdrop", + "source_path": "hub/apps/design/shell/tiles-and-notifications/send-local-toast.md", + "redirect_url": "../../../develop/notifications/app-notifications/send-local-toast", "redirect_document_id": false }, { - "source_path": "uwp/design/motion/motion-edgebased.md", - "redirect_url": "/windows/apps/design/motion/motion-edgebased", + "source_path": "hub/apps/design/shell/tiles-and-notifications/send-local-toast-cpp-uwp.md", + "redirect_url": "../../../develop/notifications/app-notifications/send-local-toast-cpp-uwp", "redirect_document_id": false }, { - "source_path": "uwp/design/motion/motion-fade.md", - "redirect_url": "/windows/apps/design/motion/motion-fade", + "source_path": "hub/apps/design/shell/tiles-and-notifications/send-local-toast-desktop-cpp-wrl.md", + "redirect_url": "../../../develop/notifications/app-notifications/send-local-toast-desktop-cpp-wrl", "redirect_document_id": false }, { - "source_path": "uwp/design/motion/motion-in-practice.md", - "redirect_url": "/windows/apps/design/motion/motion-in-practice", + "source_path": "hub/apps/design/shell/tiles-and-notifications/send-local-toast-other-apps.md", + "redirect_url": "../../../develop/notifications/app-notifications/send-local-toast-other-apps", "redirect_document_id": false }, { - "source_path": "uwp/design/motion/motion-list.md", - "redirect_url": "/windows/apps/design/motion/motion-list", + "source_path": "hub/apps/design/shell/tiles-and-notifications/toast-collections.md", + "redirect_url": "../../../develop/notifications/app-notifications/toast-collections", "redirect_document_id": false }, { - "source_path": "uwp/design/motion/motion-pointer.md", - "redirect_url": "/windows/apps/design/motion/motion-pointer", + "source_path": "hub/apps/design/shell/tiles-and-notifications/toast-desktop-apps.md", + "redirect_url": "../../../develop/notifications/app-notifications/toast-desktop-apps", "redirect_document_id": false }, { - "source_path": "uwp/design/motion/motion-popup-animations.md", - "redirect_url": "/windows/apps/design/motion/motion-popup-animations", + "source_path": "hub/apps/design/shell/tiles-and-notifications/toast-headers.md", + "redirect_url": "../../../develop/notifications/app-notifications/toast-headers", "redirect_document_id": false }, { - "source_path": "uwp/design/motion/motion-reposition.md", - "redirect_url": "/windows/apps/design/motion/motion-reposition", + "source_path": "hub/apps/design/shell/tiles-and-notifications/toast-notifications-overview.md", + "redirect_url": "../../../develop/notifications/app-notifications/toast-notifications-overview", "redirect_document_id": false }, { - "source_path": "uwp/design/motion/page-transitions.md", - "redirect_url": "/windows/apps/design/motion/page-transitions", + "source_path": "hub/apps/design/shell/tiles-and-notifications/toast-pending-update.md", + "redirect_url": "../../../develop/notifications/app-notifications/toast-pending-update", "redirect_document_id": false }, { - "source_path": "uwp/design/motion/parallax.md", - "redirect_url": "/windows/apps/design/motion/parallax", + "source_path": "hub/apps/design/shell/tiles-and-notifications/toast-progress-bar.md", + "redirect_url": "../../../develop/notifications/app-notifications/toast-progress-bar", "redirect_document_id": false }, { - "source_path": "uwp/design/motion/storyboarded-animations.md", - "redirect_url": "/windows/apps/design/motion/storyboarded-animations", + "source_path": "hub/apps/design/shell/tiles-and-notifications/toast-schema.md", + "redirect_url": "../../../develop/notifications/app-notifications/toast-schema", "redirect_document_id": false }, { - "source_path": "uwp/design/motion/timing-and-easing.md", - "redirect_url": "/windows/apps/design/motion/timing-and-easing", + "source_path": "hub/apps/design/shell/tiles-and-notifications/toast-ux-guidance.md", + "redirect_url": "../../../develop/notifications/app-notifications/toast-ux-guidance", "redirect_document_id": false }, { - "source_path": "uwp/design/motion/xaml-animation.md", - "redirect_url": "/windows/apps/design/motion/xaml-animation", + "source_path": "hub/apps/develop/windows-integration/microsoft-copliot-key-provider.md", + "redirect_url": "/windows/apps/develop/windows-integration/microsoft-copilot-key-provider", "redirect_document_id": false }, { - "source_path": "uwp/design/motion/xaml-property-animations.md", - "redirect_url": "/windows/apps/design/motion/xaml-property-animations", + "source_path": "hub/powertoys/command-palette/microsoft-commandpalette-extensions/ifilters_filters.md", + "redirect_url": "/windows/powertoys/command-palette/microsoft-commandpalette-extensions/ifilters_getfilters", "redirect_document_id": false }, { - "source_path": "uwp/design/shell/pin-to-taskbar.md", - "redirect_url": "/windows/apps/design/shell/pin-to-taskbar", + "source_path": "hub/apps/tutorials/winui-notes/index.yml", + "redirect_url": "/windows/apps/tutorials/winui-notes/intro", "redirect_document_id": false }, { - "source_path": "uwp/design/shell/tiles-and-notifications/WNS-Notification-Priorities.md", - "redirect_url": "/windows/apps/design/shell/tiles-and-notifications/WNS-Notification-Priorities", + "source_path": "uwp/xaml-platform/attached-properties-overview.md", + "redirect_url": "/windows/apps/develop/platform/xaml/attached-properties-overview", "redirect_document_id": false }, { - "source_path": "uwp/design/shell/tiles-and-notifications/adaptive-interactive-toasts.md", - "redirect_url": "/windows/apps/design/shell/tiles-and-notifications/adaptive-interactive-toasts", + "source_path": "uwp/xaml-platform/binding-markup-extension.md", + "redirect_url": "/windows/apps/develop/platform/xaml/binding-markup-extension", "redirect_document_id": false }, { - "source_path": "uwp/design/shell/tiles-and-notifications/adaptive-tiles-schema.md", - "redirect_url": "/windows/apps/design/shell/tiles-and-notifications/adaptive-tiles-schema", + "source_path": "uwp/xaml-platform/custom-attached-properties.md", + "redirect_url": "/windows/apps/develop/platform/xaml/custom-attached-properties", "redirect_document_id": false }, { - "source_path": "uwp/design/shell/tiles-and-notifications/alternate-channel-VAPID-webpush.md", - "redirect_url": "/windows/apps/design/shell/tiles-and-notifications/alternate-channel-VAPID-webpush", + "source_path": "uwp/xaml-platform/custom-dependency-properties.md", + "redirect_url": "/windows/apps/develop/platform/xaml/custom-dependency-properties", "redirect_document_id": false }, { - "source_path": "uwp/design/shell/tiles-and-notifications/badges.md", - "redirect_url": "/windows/apps/design/shell/tiles-and-notifications/badges", + "source_path": "uwp/xaml-platform/customresource-markup-extension.md", + "redirect_url": "/windows/apps/develop/platform/xaml/customresource-markup-extension", "redirect_document_id": false }, { - "source_path": "uwp/design/shell/tiles-and-notifications/channel-types.md", - "redirect_url": "/windows/apps/design/shell/tiles-and-notifications/channel-types", + "source_path": "uwp/xaml-platform/dependency-properties-overview.md", + "redirect_url": "/windows/apps/develop/platform/xaml/dependency-properties-overview", "redirect_document_id": false }, { - "source_path": "uwp/design/shell/tiles-and-notifications/chaseable-tile-notifications.md", - "redirect_url": "/windows/apps/design/shell/tiles-and-notifications/chaseable-tile-notifications", + "source_path": "uwp/xaml-platform/events-and-routed-events-overview.md", + "redirect_url": "/windows/apps/develop/platform/xaml/events-and-routed-events-overview", "redirect_document_id": false }, { - "source_path": "uwp/design/shell/tiles-and-notifications/choosing-a-notification-delivery-method.md", - "redirect_url": "/windows/apps/design/shell/tiles-and-notifications/choosing-a-notification-delivery-method", + "source_path": "uwp/xaml-platform/index.md", + "redirect_url": "/windows/apps/develop/platform/xaml/index", "redirect_document_id": false }, { - "source_path": "uwp/design/shell/tiles-and-notifications/create-adaptive-tiles.md", - "redirect_url": "/windows/apps/design/shell/tiles-and-notifications/create-adaptive-tiles", + "source_path": "uwp/xaml-platform/move-draw-commands-syntax.md", + "redirect_url": "/windows/apps/develop/platform/xaml/move-draw-commands-syntax", "redirect_document_id": false }, { - "source_path": "uwp/design/shell/tiles-and-notifications/creating-tiles.md", - "redirect_url": "/windows/apps/design/shell/tiles-and-notifications/creating-tiles", + "source_path": "uwp/xaml-platform/property-path-syntax.md", + "redirect_url": "/windows/apps/develop/platform/xaml/property-path-syntax", "redirect_document_id": false }, { - "source_path": "uwp/design/shell/tiles-and-notifications/custom-audio-on-toasts.md", - "redirect_url": "/windows/apps/design/shell/tiles-and-notifications/custom-audio-on-toasts", + "source_path": "uwp/xaml-platform/relativesource-markup-extension.md", + "redirect_url": "/windows/apps/develop/platform/xaml/relativesource-markup-extension", "redirect_document_id": false }, { - "source_path": "uwp/design/shell/tiles-and-notifications/custom-timestamps-on-toasts.md", - "redirect_url": "/windows/apps/design/shell/tiles-and-notifications/custom-timestamps-on-toasts", + "source_path": "uwp/xaml-platform/staticresource-markup-extension.md", + "redirect_url": "/windows/apps/develop/platform/xaml/staticresource-markup-extension", "redirect_document_id": false }, { - "source_path": "uwp/design/shell/tiles-and-notifications/firewall-allowlist-config.md", - "redirect_url": "/windows/apps/design/shell/tiles-and-notifications/firewall-allowlist-config", + "source_path": "uwp/xaml-platform/templatebinding-markup-extension.md", + "redirect_url": "/windows/apps/develop/platform/xaml/templatebinding-markup-extension", "redirect_document_id": false }, { - "source_path": "uwp/design/shell/tiles-and-notifications/includes/desktop-toast-activation-code.md", - "redirect_url": "/windows/apps/design/shell/tiles-and-notifications/includes/desktop-toast-activation-code", + "source_path": "uwp/xaml-platform/template-settings-classes.md", + "redirect_url": "/windows/apps/develop/platform/xaml/template-settings-classes", "redirect_document_id": false }, { - "source_path": "uwp/design/shell/tiles-and-notifications/includes/desktop-toast-activation-sequence.md", - "redirect_url": "/windows/apps/design/shell/tiles-and-notifications/includes/desktop-toast-activation-sequence", + "source_path": "uwp/xaml-platform/themeresource-markup-extension.md", + "redirect_url": "/windows/apps/develop/platform/xaml/themeresource-markup-extension", "redirect_document_id": false }, { - "source_path": "uwp/design/shell/tiles-and-notifications/includes/images-note.md", - "redirect_url": "/windows/apps/design/shell/tiles-and-notifications/includes/images-note", + "source_path": "uwp/xaml-platform/xaml-and-whitespace.md", + "redirect_url": "/windows/apps/develop/platform/xaml/xaml-and-whitespace", "redirect_document_id": false }, { - "source_path": "uwp/design/shell/tiles-and-notifications/includes/nuget-package-dotnet-warnings.md", - "redirect_url": "/windows/apps/design/shell/tiles-and-notifications/includes/nuget-package-dotnet-warnings", + "source_path": "uwp/xaml-platform/xaml-intrinsic-data-types.md", + "redirect_url": "/windows/apps/develop/platform/xaml/xaml-intrinsic-data-types", "redirect_document_id": false }, { - "source_path": "uwp/design/shell/tiles-and-notifications/includes/nuget-package.md", - "redirect_url": "/windows/apps/design/shell/tiles-and-notifications/includes/nuget-package", + "source_path": "uwp/xaml-platform/xaml-namescopes.md", + "redirect_url": "/windows/apps/develop/platform/xaml/xaml-namescopes", "redirect_document_id": false }, { - "source_path": "uwp/design/shell/tiles-and-notifications/includes/onlaunched-warning.md", - "redirect_url": "/windows/apps/design/shell/tiles-and-notifications/includes/onlaunched-warning", + "source_path": "uwp/xaml-platform/xaml-namespaces-and-namespace-mapping.md", + "redirect_url": "/windows/apps/develop/platform/xaml/xaml-namespaces-and-namespace-mapping", "redirect_document_id": false }, { - "source_path": "uwp/design/shell/tiles-and-notifications/includes/send-toast-basic-toast-intro.md", - "redirect_url": "/windows/apps/design/shell/tiles-and-notifications/includes/send-toast-basic-toast-intro", + "source_path": "uwp/xaml-platform/xaml-overview.md", + "redirect_url": "/windows/apps/develop/platform/xaml/xaml-overview", "redirect_document_id": false }, { - "source_path": "uwp/design/shell/tiles-and-notifications/includes/send-toast-intro.md", - "redirect_url": "/windows/apps/design/shell/tiles-and-notifications/includes/send-toast-intro", + "source_path": "uwp/xaml-platform/xaml-syntax-guide.md", + "redirect_url": "/windows/apps/develop/platform/xaml/xaml-syntax-guide", "redirect_document_id": false }, { - "source_path": "uwp/design/shell/tiles-and-notifications/index.md", - "redirect_url": "/windows/apps/design/shell/tiles-and-notifications/index", + "source_path": "uwp/xaml-platform/x-bind-markup-extension.md", + "redirect_url": "/windows/apps/develop/platform/xaml/x-bind-markup-extension", "redirect_document_id": false }, { - "source_path": "uwp/design/shell/tiles-and-notifications/notification-listener.md", - "redirect_url": "/windows/apps/design/shell/tiles-and-notifications/notification-listener", + "source_path": "uwp/xaml-platform/x-class-attribute.md", + "redirect_url": "/windows/apps/develop/platform/xaml/x-class-attribute", "redirect_document_id": false }, { - "source_path": "uwp/design/shell/tiles-and-notifications/notification-mirroring.md", - "redirect_url": "/windows/apps/design/shell/tiles-and-notifications/notification-mirroring", + "source_path": "uwp/xaml-platform/x-defaultbindmode-attribute.md", + "redirect_url": "/windows/apps/develop/platform/xaml/x-defaultbindmode-attribute", "redirect_document_id": false }, { - "source_path": "uwp/design/shell/tiles-and-notifications/notifications-visualizer.md", - "redirect_url": "/windows/apps/design/shell/tiles-and-notifications/notifications-visualizer", + "source_path": "uwp/xaml-platform/x-deferloadstrategy-attribute.md", + "redirect_url": "/windows/apps/develop/platform/xaml/x-deferloadstrategy-attribute", "redirect_document_id": false }, { - "source_path": "uwp/design/shell/tiles-and-notifications/periodic-notification-overview.md", - "redirect_url": "/windows/apps/design/shell/tiles-and-notifications/periodic-notification-overview", + "source_path": "uwp/xaml-platform/x-fieldmodifier-attribute.md", + "redirect_url": "/windows/apps/develop/platform/xaml/x-fieldmodifier-attribute", "redirect_document_id": false }, { - "source_path": "uwp/design/shell/tiles-and-notifications/primary-tile-apis.md", - "redirect_url": "/windows/apps/design/shell/tiles-and-notifications/primary-tile-apis", + "source_path": "uwp/xaml-platform/x-key-attribute.md", + "redirect_url": "/windows/apps/develop/platform/xaml/x-key-attribute", "redirect_document_id": false }, { - "source_path": "uwp/design/shell/tiles-and-notifications/raw-notification-overview.md", - "redirect_url": "/windows/apps/design/shell/tiles-and-notifications/raw-notification-overview", + "source_path": "uwp/xaml-platform/x-load-attribute.md", + "redirect_url": "/windows/apps/develop/platform/xaml/x-load-attribute", "redirect_document_id": false }, { - "source_path": "uwp/design/shell/tiles-and-notifications/scheduled-toast.md", - "redirect_url": "/windows/apps/design/shell/tiles-and-notifications/scheduled-toast", + "source_path": "uwp/xaml-platform/x-name-attribute.md", + "redirect_url": "/windows/apps/develop/platform/xaml/x-name-attribute", "redirect_document_id": false }, { - "source_path": "uwp/design/shell/tiles-and-notifications/secondary-tiles-desktop-pinning.md", - "redirect_url": "/windows/apps/design/shell/tiles-and-notifications/secondary-tiles-desktop-pinning", + "source_path": "uwp/xaml-platform/x-null-markup-extension.md", + "redirect_url": "/windows/apps/develop/platform/xaml/x-null-markup-extension", "redirect_document_id": false }, { - "source_path": "uwp/design/shell/tiles-and-notifications/secondary-tiles-guidance.md", - "redirect_url": "/windows/apps/design/shell/tiles-and-notifications/secondary-tiles-guidance", + "source_path": "uwp/xaml-platform/x-phase-attribute.md", + "redirect_url": "/windows/apps/develop/platform/xaml/x-phase-attribute", "redirect_document_id": false }, { - "source_path": "uwp/design/shell/tiles-and-notifications/secondary-tiles-pin-to-taskbar.md", - "redirect_url": "/windows/apps/design/shell/tiles-and-notifications/secondary-tiles-pin-to-taskbar", + "source_path": "uwp/xaml-platform/x-uid-directive.md", + "redirect_url": "/windows/apps/develop/platform/xaml/x-uid-directive", "redirect_document_id": false }, { - "source_path": "uwp/design/shell/tiles-and-notifications/secondary-tiles-pinning.md", - "redirect_url": "/windows/apps/design/shell/tiles-and-notifications/secondary-tiles-pinning", + "source_path": "hub/apps/develop/launch/launch-settings-app.md", + "redirect_url": "/windows/apps/develop/launch/launch-settings", "redirect_document_id": false }, { - "source_path": "uwp/design/shell/tiles-and-notifications/secondary-tiles.md", - "redirect_url": "/windows/apps/design/shell/tiles-and-notifications/secondary-tiles", + "source_path": "uwp/app-to-app/copy-and-paste.md", + "redirect_url": "/windows/apps/develop/communication/copy-and-paste", "redirect_document_id": false }, { - "source_path": "uwp/design/shell/tiles-and-notifications/send-local-toast-cpp-uwp.md", - "redirect_url": "/windows/apps/design/shell/tiles-and-notifications/send-local-toast-cpp-uwp", + "source_path": "hub/apps/develop/communication.md", + "redirect_url": "/windows/apps/develop/communication/", "redirect_document_id": false }, { - "source_path": "uwp/design/shell/tiles-and-notifications/send-local-toast-desktop-cpp-wrl.md", - "redirect_url": "/windows/apps/design/shell/tiles-and-notifications/send-local-toast-desktop-cpp-wrl", + "source_path": "hub/apps/design/globalizing/mat-faq-troubleshooting.yml", + "redirect_url": "/windows/apps/design/globalizing/mat-announcements", "redirect_document_id": false }, { - "source_path": "uwp/design/shell/tiles-and-notifications/send-local-toast-other-apps.md", - "redirect_url": "/windows/apps/design/shell/tiles-and-notifications/send-local-toast-other-apps", + "source_path": "hub/apps/design/globalizing/multilingual-app-toolkit-editor-downloads.md", + "redirect_url": "/windows/apps/design/globalizing/mat-announcements", "redirect_document_id": false }, { - "source_path": "uwp/design/shell/tiles-and-notifications/send-local-toast.md", - "redirect_url": "/windows/apps/design/shell/tiles-and-notifications/send-local-toast", + "source_path": "hub/apps/design/globalizing/use-mat.md", + "redirect_url": "/windows/apps/design/globalizing/mat-announcements", "redirect_document_id": false }, { - "source_path": "uwp/design/shell/tiles-and-notifications/sending-a-local-tile-notification.md", - "redirect_url": "/windows/apps/design/shell/tiles-and-notifications/sending-a-local-tile-notification", + "source_path": "hub/powertoys/dsc-configure.md", + "redirect_url": "/windows/powertoys/dsc-configure/overview", "redirect_document_id": false }, { - "source_path": "uwp/design/shell/tiles-and-notifications/special-tile-templates-catalog.md", - "redirect_url": "/windows/apps/design/shell/tiles-and-notifications/special-tile-templates-catalog", + "source_path": "hub/apps/get-started/enable-your-device-for-development.md", + "redirect_url": "/windows/advanced-settings/developer-mode", "redirect_document_id": false }, { - "source_path": "uwp/design/shell/tiles-and-notifications/the-code-generated-by-the-push-notification-wizard.md", - "redirect_url": "/windows/apps/design/shell/tiles-and-notifications/the-code-generated-by-the-push-notification-wizard", + "source_path": "hub/apps/design/style/icons.md", + "redirect_url": "/windows/apps/develop/ui/controls/icons", "redirect_document_id": false }, { - "source_path": "uwp/design/shell/tiles-and-notifications/tile-schema.md", - "redirect_url": "/windows/apps/design/shell/tiles-and-notifications/tile-schema", + "source_path": "hub/apps/design/controls/animated-icon.md", + "redirect_url": "/windows/apps/develop/ui/controls/animated-icon", "redirect_document_id": false }, { - "source_path": "uwp/design/shell/tiles-and-notifications/tile-toast-language-scale-contrast.md", - "redirect_url": "/windows/apps/design/shell/tiles-and-notifications/tile-toast-language-scale-contrast", + "source_path": "hub/apps/design/controls/annotated-scrollbar.md", + "redirect_url": "/windows/apps/develop/ui/controls/annotated-scrollbar", "redirect_document_id": false }, { - "source_path": "uwp/design/shell/tiles-and-notifications/toast-collections.md", - "redirect_url": "/windows/apps/design/shell/tiles-and-notifications/toast-collections", + "source_path": "hub/apps/design/controls/auto-suggest-box.md", + "redirect_url": "/windows/apps/develop/ui/controls/auto-suggest-box", "redirect_document_id": false }, { - "source_path": "uwp/design/shell/tiles-and-notifications/toast-desktop-apps.md", - "redirect_url": "/windows/apps/design/shell/tiles-and-notifications/toast-desktop-apps", + "source_path": "hub/apps/design/controls/breadcrumbbar.md", + "redirect_url": "/windows/apps/develop/ui/controls/breadcrumbbar", "redirect_document_id": false }, { - "source_path": "uwp/design/shell/tiles-and-notifications/toast-headers.md", - "redirect_url": "/windows/apps/design/shell/tiles-and-notifications/toast-headers", + "source_path": "hub/apps/design/controls/buttons.md", + "redirect_url": "/windows/apps/develop/ui/controls/buttons", "redirect_document_id": false }, { - "source_path": "uwp/design/shell/tiles-and-notifications/toast-pending-update.md", - "redirect_url": "/windows/apps/design/shell/tiles-and-notifications/toast-pending-update", + "source_path": "hub/apps/design/controls/calendar-date-picker.md", + "redirect_url": "/windows/apps/develop/ui/controls/calendar-date-picker", "redirect_document_id": false }, { - "source_path": "uwp/design/shell/tiles-and-notifications/toast-progress-bar.md", - "redirect_url": "/windows/apps/design/shell/tiles-and-notifications/toast-progress-bar", + "source_path": "hub/apps/design/controls/calendar-view.md", + "redirect_url": "/windows/apps/develop/ui/controls/calendar-view", "redirect_document_id": false }, { - "source_path": "uwp/design/shell/tiles-and-notifications/toast-schema.md", - "redirect_url": "/windows/apps/design/shell/tiles-and-notifications/toast-schema", + "source_path": "hub/apps/design/controls/checkbox.md", + "redirect_url": "/windows/apps/develop/ui/controls/checkbox", "redirect_document_id": false }, { - "source_path": "uwp/design/shell/tiles-and-notifications/toast-ux-guidance.md", - "redirect_url": "/windows/apps/design/shell/tiles-and-notifications/toast-ux-guidance", + "source_path": "hub/apps/design/controls/collection-commanding.md", + "redirect_url": "/windows/apps/develop/ui/controls/collection-commanding", "redirect_document_id": false }, { - "source_path": "uwp/design/shell/tiles-and-notifications/universal-dismiss.md", - "redirect_url": "/windows/apps/design/shell/tiles-and-notifications/universal-dismiss", + "source_path": "hub/apps/design/controls/color-picker.md", + "redirect_url": "/windows/apps/develop/ui/controls/color-picker", "redirect_document_id": false }, { - "source_path": "uwp/design/shell/tiles-and-notifications/windows-push-notification-services--wns--overview.md", - "redirect_url": "/windows/apps/design/shell/tiles-and-notifications/windows-push-notification-services--wns--overview", + "source_path": "hub/apps/design/controls/combo-box.md", + "redirect_url": "/windows/apps/develop/ui/controls/combo-box", "redirect_document_id": false }, { - "source_path": "uwp/design/shell/title-bar.md", - "redirect_url": "/windows/apps/design/shell/title-bar", + "source_path": "hub/apps/design/controls/command-bar.md", + "redirect_url": "/windows/apps/develop/ui/controls/command-bar", "redirect_document_id": false }, { - "source_path": "uwp/design/style/acrylic.md", - "redirect_url": "/windows/apps/design/style/acrylic", + "source_path": "hub/apps/design/controls/command-bar-flyout.md", + "redirect_url": "/windows/apps/develop/ui/controls/command-bar-flyout", "redirect_document_id": false }, { - "source_path": "uwp/design/style/balancing-style-and-consistency.md", - "redirect_url": "/windows/apps/design/style/balancing-style-and-consistency", + "source_path": "hub/apps/design/controls/commanding.md", + "redirect_url": "/windows/apps/develop/ui/controls/commanding", "redirect_document_id": false }, { - "source_path": "uwp/design/style/brushes.md", - "redirect_url": "/windows/apps/design/style/brushes", + "source_path": "hub/apps/design/controls/contact-card.md", + "redirect_url": "/windows/apps/develop/ui/controls/contact-card", "redirect_document_id": false }, { - "source_path": "uwp/design/style/color.md", - "redirect_url": "/windows/apps/design/style/color", + "source_path": "hub/apps/design/controls/content-links.md", + "redirect_url": "/previous-versions/windows/uwp/ui-input/content-links", "redirect_document_id": false }, { - "source_path": "uwp/design/style/icons.md", - "redirect_url": "/windows/apps/design/style/icons", + "source_path": "hub/apps/design/controls/controls-and-events-intro.md", + "redirect_url": "/windows/apps/develop/ui/controls/controls-and-events-intro", "redirect_document_id": false }, { - "source_path": "uwp/design/style/index.md", - "redirect_url": "/windows/apps/design/style/index", + "source_path": "hub/apps/design/controls/custom-transport-controls.md", + "redirect_url": "/windows/apps/develop/ui/controls/custom-transport-controls", "redirect_document_id": false }, { - "source_path": "uwp/design/style/reveal-focus.md", - "redirect_url": "/windows/apps/design/style/reveal-focus", + "source_path": "hub/apps/design/controls/data-template-selector.md", + "redirect_url": "/windows/apps/develop/ui/controls/data-template-selector", "redirect_document_id": false }, { - "source_path": "uwp/design/style/rounded-corner.md", - "redirect_url": "/windows/apps/design/style/rounded-corner", + "source_path": "hub/apps/design/controls/date-and-time.md", + "redirect_url": "/windows/apps/develop/ui/controls/date-and-time", "redirect_document_id": false }, { - "source_path": "uwp/design/style/segoe-ui-symbol-font.md", - "redirect_url": "/windows/apps/design/style/segoe-ui-symbol-font", + "source_path": "hub/apps/design/controls/date-picker.md", + "redirect_url": "/windows/apps/develop/ui/controls/date-picker", "redirect_document_id": false }, { - "source_path": "uwp/design/style/sound.md", - "redirect_url": "/windows/apps/design/style/sound", + "source_path": "hub/apps/design/controls/expander.md", + "redirect_url": "/windows/apps/develop/ui/controls/expander", "redirect_document_id": false }, { - "source_path": "uwp/design/style/spacing.md", - "redirect_url": "/windows/apps/design/style/spacing", + "source_path": "hub/apps/design/controls/flipview.md", + "redirect_url": "/windows/apps/develop/ui/controls/flipview", "redirect_document_id": false }, { - "source_path": "uwp/design/style/typography.md", - "redirect_url": "/windows/apps/design/style/typography", + "source_path": "hub/apps/design/controls/forms.md", + "redirect_url": "/windows/apps/develop/ui/controls/forms", "redirect_document_id": false }, { - "source_path": "uwp/design/style/writing-style.md", - "redirect_url": "/windows/apps/design/style/writing-style", + "source_path": "hub/apps/design/controls/hyperlinks.md", + "redirect_url": "/windows/apps/develop/ui/controls/hyperlinks", "redirect_document_id": false }, { - "source_path": "uwp/design/usability/index.md", - "redirect_url": "/windows/apps/design/usability/index", + "source_path": "hub/apps/design/controls/images-imagebrushes.md", + "redirect_url": "/windows/apps/develop/ui/controls/images-imagebrushes", "redirect_document_id": false }, { - "source_path": "uwp/design/windows-template-studio/index.md", - "redirect_url": "/windows/apps/design/windows-template-studio/index", + "source_path": "hub/apps/design/controls/index.md", + "redirect_url": "/windows/apps/develop/ui/controls/index", "redirect_document_id": false }, { - "source_path": "uwp/design/controls-and-patterns/menus-and-context-menus.md", - "redirect_url": "/windows/apps/design/controls/menus-and-context-menus", + "source_path": "hub/apps/design/controls/info-badge.md", + "redirect_url": "/windows/apps/develop/ui/controls/info-badge", "redirect_document_id": false }, { - "source_path": "hub/apps/fluent-design-system.md", - "redirect_url": "/windows/apps/design/index", + "source_path": "hub/apps/design/controls/infobar.md", + "redirect_url": "/windows/apps/develop/ui/controls/infobar", "redirect_document_id": false }, { - "source_path": "hub/apps/design/windows-template-studio/index.md", - "redirect_url": "/windows/apps/design/downloads/", + "source_path": "hub/apps/design/controls/inking-controls.md", + "redirect_url": "/windows/apps/develop/ui/controls/inking-controls", "redirect_document_id": false }, { - "source_path": "hub/apps/package-and-deploy/deploy-apps-that-use-the-windows-app-sdk.md", - "redirect_url": "/windows/apps/package-and-deploy/index", + "source_path": "hub/apps/design/controls/inverted-lists.md", + "redirect_url": "/windows/apps/develop/ui/controls/inverted-lists", "redirect_document_id": false }, { - "source_path": "hub/apps/design/layout/page-layout.md", - "redirect_url": "/windows/apps/design/basics/app-silhouette", + "source_path": "hub/apps/design/controls/item-containers-templates.md", + "redirect_url": "/windows/apps/develop/ui/controls/item-containers-templates", "redirect_document_id": false }, { - "source_path": "uwp/get-started/get-app-samples.md", - "redirect_url": "/windows/apps/get-started/samples", + "source_path": "hub/apps/design/controls/items-repeater.md", + "redirect_url": "/windows/apps/develop/ui/controls/items-repeater", "redirect_document_id": false }, { - "source_path": "hub/apps/windows-app-sdk/samples.md", - "redirect_url": "/windows/apps/get-started/samples", + "source_path": "hub/apps/design/controls/itemsview.md", + "redirect_url": "/windows/apps/develop/ui/controls/itemsview", "redirect_document_id": false }, { - "source_path": "hub/apps/whats-new/build2021-docs.md", - "redirect_url": "/windows/apps", + "source_path": "hub/apps/design/controls/item-templates-gridview.md", + "redirect_url": "/windows/apps/develop/ui/controls/item-templates-gridview", "redirect_document_id": false }, { - "source_path": "hub/apps/design/shell/title-bar.md", - "redirect_url": "/windows/apps/develop/title-bar", + "source_path": "hub/apps/design/controls/item-templates-listview.md", + "redirect_url": "/windows/apps/develop/ui/controls/item-templates-listview", "redirect_document_id": false }, { - "source_path": "uwp/csharp-winrt/index.md", - "redirect_url": "/windows/apps/develop/platform/csharp-winrt/index", + "source_path": "hub/apps/design/controls/labels.md", + "redirect_url": "/windows/apps/develop/ui/controls/labels", "redirect_document_id": false }, { - "source_path": "uwp/uwp/csharp-winrt/net-mappings-of-winrt-types.md", - "redirect_url": "/windows/apps/develop/platform/csharp-winrt/net-mappings-of-winrt-types", + "source_path": "hub/apps/design/controls/list-details.md", + "redirect_url": "/windows/apps/develop/ui/controls/list-details", "redirect_document_id": false }, { - "source_path": "uwp/csharp-winrt/net-projection-from-cppwinrt-component.md", - "redirect_url": "/windows/apps/develop/platform/csharp-winrt/net-projection-from-cppwinrt-component", + "source_path": "hub/apps/design/controls/lists.md", + "redirect_url": "/windows/apps/develop/ui/controls/lists", "redirect_document_id": false }, { - "source_path": "uwp/csharp-winrt/create-windows-runtime-component-cswinrt.md", - "redirect_url": "/windows/apps/develop/platform/csharp-winrt/create-windows-runtime-component-cswinrt", + "source_path": "hub/apps/design/controls/listview-and-gridview.md", + "redirect_url": "/windows/apps/develop/ui/controls/listview-and-gridview", "redirect_document_id": false }, { - "source_path": "uwp/csharp-winrt/authoring-diagnostics.md", - "redirect_url": "/windows/apps/develop/platform/csharp-winrt/authoring-diagnostics", + "source_path": "hub/apps/design/controls/listview-filtering.md", + "redirect_url": "/windows/apps/develop/ui/controls/listview-filtering", "redirect_document_id": false }, { - "source_path": "uwp/csharp-winrt/agile-objects.md", - "redirect_url": "/windows/apps/develop/platform/csharp-winrt/agile-objects", + "source_path": "hub/apps/design/controls/media-playback.md", + "redirect_url": "/windows/apps/develop/ui/controls/media-playback", "redirect_document_id": false }, { - "source_path": "hub/apps/reference/index.md", - "redirect_url": "/windows/apps/api-reference/index", - "redirect_document_id": true + "source_path": "hub/apps/design/controls/menus.md", + "redirect_url": "/windows/apps/develop/ui/controls/menus", + "redirect_document_id": false }, { - "source_path": "landing/arm-docs/index.yml", - "redirect_url": "/windows/arm/overview", - "redirect_document_id": true + "source_path": "hub/apps/design/controls/menus-and-context-menus.md", + "redirect_url": "/windows/apps/develop/ui/controls/menus-and-context-menus", + "redirect_document_id": false }, { - "source_path": "hub/apps/design/shell/tiles-and-notifications/alternate-channel-vapid-webpush.md", - "redirect_url": "/windows/apps/design/shell/tiles-and-notifications/windows-push-notification-services--wns--overview", + "source_path": "hub/apps/design/controls/navigationview.md", + "redirect_url": "/windows/apps/develop/ui/controls/navigationview", "redirect_document_id": false }, { - "source_path": "hub/apps/get-started/simple-photo-viewer-winiu3.md", - "redirect_url": "/windows/apps/get-started/simple-photo-viewer-winui3", + "source_path": "hub/apps/design/controls/nested-ui.md", + "redirect_url": "/windows/apps/develop/ui/controls/nested-ui", "redirect_document_id": false }, { - "source_path": "hub/package-manager/package/windows-package-manager-policies-change-history.md", - "redirect_url": "/windows/package-manager/package/windows-package-manager-policies", + "source_path": "hub/apps/design/controls/number-box.md", + "redirect_url": "/windows/apps/develop/ui/controls/number-box", "redirect_document_id": false }, { - "source_path": "uwp/porting/arm64ec.md", - "redirect_url": "/windows/arm/arm64ec", + "source_path": "hub/apps/design/controls/password-box.md", + "redirect_url": "/windows/apps/develop/ui/controls/password-box", "redirect_document_id": false }, { - "source_path": "uwp/porting/apps-on-arm.md", - "redirect_url": "/windows/arm/overview", + "source_path": "hub/apps/design/controls/person-picture.md", + "redirect_url": "/windows/apps/develop/ui/controls/person-picture", "redirect_document_id": false }, { - "source_path": "uwp/porting/arm64ec-abi.md", - "redirect_url": "/windows/arm/arm64ec-abi", + "source_path": "hub/apps/design/controls/pipspager.md", + "redirect_url": "/windows/apps/develop/ui/controls/pipspager", "redirect_document_id": false }, { - "source_path": "uwp/porting/ios-to-uwp-root.md", - "redirect_url": "/windows/apps/get-started", + "source_path": "hub/apps/design/controls/pivot.md", + "redirect_url": "/windows/apps/develop/ui/controls/pivot", "redirect_document_id": false }, { - "source_path": "uwp/porting/selecting-an-approach-to-ios-and-uwp-app-development.md", - "redirect_url": "/windows/apps/get-started", + "source_path": "hub/apps/design/controls/progress-controls.md", + "redirect_url": "/windows/apps/develop/ui/controls/progress-controls", "redirect_document_id": false }, { - "source_path": "uwp/porting/android-ios-uwp-map.md", - "redirect_url": "/windows/apps/get-started", + "source_path": "hub/apps/design/controls/pull-to-refresh.md", + "redirect_url": "/windows/apps/develop/ui/controls/pull-to-refresh", "redirect_document_id": false }, { - "source_path": "uwp/porting/getting-started-animation.md", - "redirect_url": "/windows/apps/get-started", + "source_path": "hub/apps/design/controls/radio-button.md", + "redirect_url": "/windows/apps/develop/ui/controls/radio-button", "redirect_document_id": false }, { - "source_path": "uwp/porting/getting-started-choosing-a-programming-language.md", - "redirect_url": "/windows/apps/get-started", + "source_path": "hub/apps/design/controls/rating.md", + "redirect_url": "/windows/apps/develop/ui/controls/rating", "redirect_document_id": false }, { - "source_path": "uwp/porting/getting-started-common-controls.md", - "redirect_url": "/windows/apps/get-started", + "source_path": "hub/apps/design/controls/rich-edit-box.md", + "redirect_url": "/windows/apps/develop/ui/controls/rich-edit-box", "redirect_document_id": false }, { - "source_path": "uwp/porting/getting-started-creating-a-project.md", - "redirect_url": "/windows/apps/get-started", + "source_path": "hub/apps/design/controls/rich-text-block.md", + "redirect_url": "/windows/apps/develop/ui/controls/rich-text-block", "redirect_document_id": false }, { - "source_path": "uwp/porting/getting-started-getting-around-in-visual-studio.md", - "redirect_url": "/windows/apps/get-started", + "source_path": "hub/apps/design/controls/scroll-controls.md", + "redirect_url": "/windows/apps/develop/ui/controls/scroll-controls", "redirect_document_id": false }, { - "source_path": "uwp/porting/getting-started-navigation.md", - "redirect_url": "/windows/apps/get-started", + "source_path": "hub/apps/design/controls/selection-modes.md", + "redirect_url": "/windows/apps/develop/ui/controls/selection-modes", "redirect_document_id": false }, { - "source_path": "uwp/porting/getting-started-what-next.md", - "redirect_url": "/windows/apps/get-started", + "source_path": "hub/apps/design/controls/selector-bar.md", + "redirect_url": "/windows/apps/develop/ui/controls/selector-bar", "redirect_document_id": false }, { - "source_path": "uwp/porting/getting-started-with-uwp-for-ios-developers.md", - "redirect_url": "/windows/apps/get-started", + "source_path": "hub/apps/design/controls/semantic-zoom.md", + "redirect_url": "/windows/apps/develop/ui/controls/semantic-zoom", "redirect_document_id": false }, { - "source_path": "uwp/porting/setting-up-your-mac-with-windows-10.md", - "redirect_url": "/windows/apps/get-started", + "source_path": "hub/apps/design/controls/shapes.md", + "redirect_url": "/windows/apps/develop/ui/controls/shapes", "redirect_document_id": false }, { - "source_path": "hub/apps/windows-app-sdk/notifications/push/push-quickstart.md", - "redirect_url": "/windows/apps/windows-app-sdk/notifications/push-notifications/push-quickstart", - "redirect_document_id": true + "source_path": "hub/apps/design/controls/slider.md", + "redirect_url": "/windows/apps/develop/ui/controls/slider", + "redirect_document_id": false }, { - "source_path": "uwp/publish/account-types-locations-and-fees.md", - "redirect_url": "/windows/apps/publish/partner-center/account-types-locations-and-fees", + "source_path": "hub/apps/design/controls/split-view.md", + "redirect_url": "/windows/apps/develop/ui/controls/split-view", "redirect_document_id": false }, { - "source_path": "uwp/publish/add-on-submissions.md", - "redirect_url": "/windows/apps/publish/publish-your-app/create-app-submission?pivots=store-installer-add-on", + "source_path": "hub/apps/design/controls/swipe.md", + "redirect_url": "/windows/apps/develop/ui/controls/swipe", "redirect_document_id": false }, { - "source_path": "uwp/publish/add-users-groups-and-azure-ad-applications.md", - "redirect_url": "/windows/apps/publish/partner-center/add-users-groups-and-azure-ad-applications", + "source_path": "hub/apps/design/controls/tab-view.md", + "redirect_url": "/windows/apps/develop/ui/controls/tab-view", "redirect_document_id": false }, { - "source_path": "uwp/publish/age-ratings.md", - "redirect_url": "/windows/apps/publish/publish-your-app/age-ratings?pivots=store-installer-msix", + "source_path": "hub/apps/design/controls/text-block.md", + "redirect_url": "/windows/apps/develop/ui/controls/text-block", "redirect_document_id": false }, { - "source_path": "uwp/publish/app-package-requirements.md", - "redirect_url": "/windows/apps/publish/publish-your-app/app-package-requirements?pivots=store-installer-msix", + "source_path": "hub/apps/design/controls/text-box.md", + "redirect_url": "/windows/apps/develop/ui/controls/text-box", "redirect_document_id": false }, { - "source_path": "uwp/publish/app-screenshots-and-images.md", - "redirect_url": "/windows/apps/publish/publish-your-app/screenshots-and-images?pivots=store-installer-msix", + "source_path": "hub/apps/design/controls/text-controls.md", + "redirect_url": "/windows/apps/develop/ui/controls/text-controls", "redirect_document_id": false }, { - "source_path": "uwp/publish/app-submissions.md", - "redirect_url": "/windows/apps/publish/publish-your-app/create-app-submission?pivots=store-installer-msix", + "source_path": "hub/apps/design/controls/text-handwriting-view.md", + "redirect_url": "/windows/apps/design/input/text-handwriting-view", "redirect_document_id": false }, { - "source_path": "uwp/publish/associate-azure-ad-with-partner-center.md", - "redirect_url": "/windows/apps/publish/partner-center/associate-azure-ad-with-partner-center", + "source_path": "hub/apps/design/controls/time-picker.md", + "redirect_url": "/windows/apps/develop/ui/controls/time-picker", "redirect_document_id": false }, { - "source_path": "uwp/publish/avoid-common-certification-failures.md", - "redirect_url": "/windows/apps/publish/publish-your-app/avoid-common-certification-failures?pivots=store-installer-msix", + "source_path": "hub/apps/design/controls/title-bar.md", + "redirect_url": "/windows/apps/develop/ui/controls/title-bar", "redirect_document_id": false }, { - "source_path": "uwp/publish/category-and-subcategory-table.md", - "redirect_url": "/windows/apps/publish/publish-your-app/categories-and-subcategories?pivots=store-installer-msix", + "source_path": "hub/apps/design/controls/toggles.md", + "redirect_url": "/windows/apps/develop/ui/controls/toggles", "redirect_document_id": false }, { - "source_path": "uwp/publish/choose-visibility-options.md", - "redirect_url": "/windows/apps/publish/publish-your-app/visibility-options?pivots=store-installer-msix", + "source_path": "hub/apps/design/controls/tooltips.md", + "redirect_url": "/windows/apps/develop/ui/controls/tooltips", "redirect_document_id": false }, { - "source_path": "uwp/publish/configure-precise-release-scheduling.md", - "redirect_url": "/windows/apps/publish/publish-your-app/release-schedule?pivots=store-installer-msix", + "source_path": "hub/apps/design/controls/tree-view.md", + "redirect_url": "/windows/apps/develop/ui/controls/tree-view", "redirect_document_id": false }, { - "source_path": "uwp/publish/create-add-on-store-listings.md", - "redirect_url": "/windows/apps/publish/publish-your-app/create-app-store-listing?pivots=store-installer-add-on", + "source_path": "hub/apps/design/controls/two-pane-view.md", + "redirect_url": "/windows/apps/develop/ui/controls/two-pane-view", "redirect_document_id": false }, { - "source_path": "uwp/publish/create-app-store-listings.md", - "redirect_url": "/windows/apps/publish/publish-your-app/create-app-store-listing?pivots=store-installer-msix", + "source_path": "hub/apps/design/controls/web-view.md", + "redirect_url": "/windows/uwp/ui-input/web-view", "redirect_document_id": false }, { - "source_path": "uwp/publish/create-platform-specific-store-listings.md", - "redirect_url": "/windows/apps/publish/publish-your-app/create-platform-specific-store-listings?pivots=store-installer-msix", + "source_path": "hub/apps/design/controls/dialogs-and-flyouts/dialogs.md", + "redirect_url": "/windows/apps/develop/ui/controls/dialogs-and-flyouts/dialogs", "redirect_document_id": false }, { - "source_path": "uwp/publish/create-your-app-by-reserving-a-name.md", - "redirect_url": "/windows/apps/publish/publish-your-app/reserve-your-apps-name?pivots=store-installer-msix", + "source_path": "hub/apps/design/controls/dialogs-and-flyouts/flyouts.md", + "redirect_url": "/windows/apps/develop/ui/controls/dialogs-and-flyouts/flyouts", "redirect_document_id": false }, { - "source_path": "uwp/publish/define-market-selection.md", - "redirect_url": "/windows/apps/publish/publish-your-app/market-selection?pivots=store-installer-msix", + "source_path": "hub/apps/design/controls/dialogs-and-flyouts/index.md", + "redirect_url": "/windows/apps/develop/ui/controls/dialogs-and-flyouts/index", "redirect_document_id": false }, { - "source_path": "uwp/publish/device-family-availability.md", - "redirect_url": "/windows/apps/publish/publish-your-app/device-families?pivots=store-installer-msix", + "source_path": "hub/apps/design/controls/dialogs-and-flyouts/teaching-tip.md", + "redirect_url": "/windows/apps/develop/ui/controls/dialogs-and-flyouts/teaching-tip", "redirect_document_id": false }, { - "source_path": "uwp/publish/enter-add-on-properties.md", - "redirect_url": "/windows/apps/publish/publish-your-app/enter-app-properties?pivots=store-installer-add-on", + "source_path": "hub/apps/develop/ui-input/display-ui-objects.md", + "redirect_url": "/windows/apps/develop/ui/display-ui-objects", "redirect_document_id": false }, { - "source_path": "uwp/publish/enter-app-properties.md", - "redirect_url": "/windows/apps/publish/publish-your-app/enter-app-properties?pivots=store-installer-msix", + "source_path": "hub/apps/develop/ui-input/manage-app-windows.md", + "redirect_url": "/windows/apps/develop/ui/manage-app-windows", "redirect_document_id": false }, { - "source_path": "uwp/publish/guidance-for-app-package-management.md", - "redirect_url": "/windows/apps/publish/publish-your-app/app-package-management?pivots=store-installer-msix", + "source_path": "hub/apps/develop/ui-input/multiple-windows.md", + "redirect_url": "/windows/apps/develop/ui/multiple-windows", "redirect_document_id": false }, { - "source_path": "uwp/publish/import-and-export-store-listings.md", - "redirect_url": "/windows/apps/publish/publish-your-app/import-and-export-store-listings?pivots=store-installer-msix", + "source_path": "hub/apps/develop/ui-input/retrieve-hwnd.md", + "redirect_url": "/windows/apps/develop/ui/retrieve-hwnd", "redirect_document_id": false }, { - "source_path": "uwp/publish/manage-account-users.md", - "redirect_url": "/windows/apps/publish/partner-center/manage-account-users", + "source_path": "hub/apps/develop/ui-input/visual-tree.md", + "redirect_url": "/windows/apps/develop/ui/visual-tree", "redirect_document_id": false }, { - "source_path": "uwp/publish/manage-app-names.md", - "redirect_url": "/windows/apps/publish/partner-center/manage-app-name-reservations", + "source_path": "hub/apps/develop/ui-input/windowing-overview.md", + "redirect_url": "/windows/apps/develop/ui/windowing-overview", "redirect_document_id": false }, { - "source_path": "uwp/publish/manage-submission-options.md", - "redirect_url": "/windows/apps/publish/publish-your-app/manage-submission-options?pivots=store-installer-msix", + "source_path": "hub/apps/design/input/access-keys.md", + "redirect_url": "/windows/apps/develop/input/access-keys", "redirect_document_id": false }, { - "source_path": "uwp/publish/msiexe/age-ratings.md", - "redirect_url": "/windows/apps/publish/publish-your-app/age-ratings?pivots=store-installer-msi-exe", + "source_path": "hub/apps/design/input/convert-ink-to-text.md", + "redirect_url": "/windows/apps/develop/input/convert-ink-to-text", "redirect_document_id": false }, { - "source_path": "uwp/publish/msiexe/app-submissions.md", - "redirect_url": "/windows/apps/publish/publish-your-app/create-app-submission?pivots=store-installer-msi-exe", + "source_path": "hub/apps/design/input/custom-text-input.md", + "redirect_url": "/windows/apps/develop/input/custom-text-input", "redirect_document_id": false }, { - "source_path": "uwp/publish/msiexe/create-app-store-listings.md", - "redirect_url": "/windows/apps/publish/publish-your-app/create-app-store-listing?pivots=store-installer-msi-exe", + "source_path": "hub/apps/design/input/define-custom-recognition-constraints.md", + "redirect_url": "/windows/apps/develop/input/define-custom-recognition-constraints", "redirect_document_id": false }, { - "source_path": "uwp/publish/msiexe/create-your-app-by-reserving-a-name.md", - "redirect_url": "/windows/apps/publish/publish-your-app/reserve-your-apps-name?pivots=store-installer-msi-exe", + "source_path": "hub/apps/design/input/enable-continuous-dictation.md", + "redirect_url": "/windows/apps/develop/input/enable-continuous-dictation", "redirect_document_id": false }, { - "source_path": "uwp/publish/msiexe/enter-app-properties.md", - "redirect_url": "/windows/apps/publish/publish-your-app/enter-app-properties?pivots=store-installer-msi-exe", + "source_path": "hub/apps/design/input/focus-navigation.md", + "redirect_url": "/windows/apps/develop/input/focus-navigation", "redirect_document_id": false }, { - "source_path": "uwp/publish/msiexe/manage-submission-options.md", - "redirect_url": "/windows/apps/publish/publish-your-app/manage-submission-options?pivots=store-installer-msi-exe", + "source_path": "hub/apps/design/input/focus-navigation-programmatic.md", + "redirect_url": "/windows/apps/develop/input/focus-navigation-programmatic", "redirect_document_id": false }, { - "source_path": "uwp/publish/msiexe/overview.md", - "redirect_url": "/windows/apps/publish/publish-your-app/overview?pivots=store-installer-msi-exe", + "source_path": "hub/apps/design/input/gamepad-and-remote-interactions.md", + "redirect_url": "/windows/apps/develop/input/gamepad-and-remote-interactions", "redirect_document_id": false }, { - "source_path": "uwp/publish/msiexe/provide-package-details.md", - "redirect_url": "/windows/apps/publish/publish-your-app/upload-app-packages?pivots=store-installer-msi-exe", + "source_path": "hub/apps/design/input/gaze-interactions.md", + "redirect_url": "/windows/apps/develop/input/gaze-interactions", "redirect_document_id": false }, { - "source_path": "uwp/publish/msiexe/set-app-pricing-and-availability.md", - "redirect_url": "/windows/apps/publish/publish-your-app/price-and-availability?pivots=store-installer-msi-exe", + "source_path": "hub/apps/design/input/guidelines-for-cross-slide.md", + "redirect_url": "/windows/apps/develop/input/guidelines-for-cross-slide", "redirect_document_id": false }, { - "source_path": "uwp/publish/msiexe/the-app-certification-process.md", - "redirect_url": "/windows/apps/publish/publish-your-app/app-certification-process?pivots=store-installer-msi-exe", + "source_path": "hub/apps/design/input/guidelines-for-optical-zoom.md", + "redirect_url": "/windows/apps/develop/input/guidelines-for-optical-zoom", "redirect_document_id": false }, { - "source_path": "uwp/publish/notes-for-certification.md", - "redirect_url": "/windows/apps/publish/publish-your-app/notes-for-certification?pivots=store-installer-msix", + "source_path": "hub/apps/design/input/guidelines-for-panning.md", + "redirect_url": "/windows/apps/develop/input/guidelines-for-panning", "redirect_document_id": false }, { - "source_path": "uwp/publish/opening-a-developer-account.md", - "redirect_url": "/windows/apps/publish/partner-center/opening-a-developer-account?pivots=store-installer-msix", + "source_path": "hub/apps/design/input/guidelines-for-rotation.md", + "redirect_url": "/windows/apps/develop/input/guidelines-for-rotation", "redirect_document_id": false }, { - "source_path": "uwp/publish/package-version-numbering.md", - "redirect_url": "/windows/apps/publish/publish-your-app/package-version-numbering?pivots=store-installer-msix", + "source_path": "hub/apps/design/input/guidelines-for-targeting.md", + "redirect_url": "/windows/apps/develop/input/guidelines-for-targeting", "redirect_document_id": false }, { - "source_path": "uwp/publish/partner-center-workspaces.md", - "redirect_url": "/windows/apps/publish/partner-center/partner-center-workspaces?pivots=store-installer-msix", + "source_path": "hub/apps/design/input/guidelines-for-textselection.md", + "redirect_url": "/windows/apps/develop/input/guidelines-for-textselection", "redirect_document_id": false }, { - "source_path": "uwp/publish/product-declarations.md", - "redirect_url": "/windows/apps/publish/publish-your-app/product-declarations?pivots=store-installer-msix", + "source_path": "hub/apps/design/input/guidelines-for-visualfeedback.md", + "redirect_url": "/windows/apps/develop/input/guidelines-for-visualfeedback", "redirect_document_id": false }, { - "source_path": "uwp/publish/pwa/create-your-app-by-reserving-a-name.md", - "redirect_url": "/windows/apps/publish/publish-your-app/reseerve-your-apps-name", + "source_path": "hub/apps/design/input/handle-pointer-input.md", + "redirect_url": "/windows/apps/develop/input/handle-pointer-input", "redirect_document_id": false }, { - "source_path": "uwp/publish/pwa/overview.md", - "redirect_url": "/windows/apps/publish/publish-your-app/overview?pivots=store-installer-pwa", + "source_path": "hub/apps/design/input/identify-input-devices.md", + "redirect_url": "/windows/apps/develop/input/identify-input-devices", "redirect_document_id": false }, { - "source_path": "uwp/publish/pwa/turn-your-website-pwa.md", - "redirect_url": "/windows/apps/publish/publish-your-app/turn-your-website-pwa?pivots=store-installer-pwa", + "source_path": "hub/apps/design/input/index.md", + "redirect_url": "/windows/apps/develop/input/index", "redirect_document_id": false }, { - "source_path": "uwp/publish/resolve-submission-errors.md", - "redirect_url": "/windows/apps/publish/publish-your-app/resolve-submission-errors?pivots=store-installer-msix", + "source_path": "hub/apps/design/input/ink-toolbar.md", + "redirect_url": "/windows/apps/develop/input/ink-toolbar", "redirect_document_id": false }, { - "source_path": "uwp/publish/set-add-on-pricing-and-availability.md", - "redirect_url": "/windows/apps/publish/publish-your-app/price-and-availability?pivots=store-installer-add-on", + "source_path": "hub/apps/design/input/ink-walkthrough.md", + "redirect_url": "/windows/apps/develop/input/ink-walkthrough", "redirect_document_id": false }, { - "source_path": "uwp/publish/set-and-schedule-app-pricing.md", - "redirect_url": "/windows/apps/publish/publish-your-app/schedule-pricing-changes?pivots=store-installer-msix", + "source_path": "hub/apps/design/input/input-injection.md", + "redirect_url": "/windows/apps/develop/input/input-injection", "redirect_document_id": false }, { - "source_path": "uwp/publish/set-app-pricing-and-availability.md", - "redirect_url": "/windows/apps/publish/publish-your-app/price-and-availability?pivots=store-installer-msix", + "source_path": "hub/apps/design/input/input-method-editor-requirements.md", + "redirect_url": "/windows/apps/develop/input/input-method-editor-requirements", "redirect_document_id": false }, { - "source_path": "uwp/publish/set-custom-permissions-for-account-users.md", - "redirect_url": "/windows/apps/publish/partner-center/set-custom-permissions-for-account-users", + "source_path": "hub/apps/design/input/input-method-editors.md", + "redirect_url": "/windows/apps/develop/input/input-method-editors", "redirect_document_id": false }, { - "source_path": "uwp/publish/set-your-add-on-product-id.md", - "redirect_url": "/windows/apps/publish/publish-your-app/create-app-store-listing?pivots=store-installer-add-on", + "source_path": "hub/apps/design/input/input-primer.md", + "redirect_url": "/windows/apps/develop/input/input-primer", "redirect_document_id": false }, { - "source_path": "uwp/publish/supported-languages.md", - "redirect_url": "/windows/apps/publish/publish-your-app/supported-languages?pivots=store-installer-msix", + "source_path": "hub/apps/design/input/keyboard-accelerators.md", + "redirect_url": "/windows/apps/develop/input/keyboard-accelerators", "redirect_document_id": false }, { - "source_path": "uwp/publish/the-app-certification-process.md", - "redirect_url": "/windows/apps/publish/publish-your-app/app-certification-process?pivots=store-installer-msix", + "source_path": "hub/apps/design/input/keyboard-events.md", + "redirect_url": "/windows/apps/develop/input/keyboard-events", "redirect_document_id": false }, { - "source_path": "uwp/publish/trademark-and-copyright-protection.md", - "redirect_url": "/windows/apps/publish/partner-center/trademark-and-copyright-protection", + "source_path": "hub/apps/design/input/keyboard-interactions.md", + "redirect_url": "/windows/apps/develop/input/keyboard-interactions", "redirect_document_id": false }, { - "source_path": "uwp/publish/upload-app-packages.md", - "redirect_url": "/windows/apps/publish/publish-your-app/upload-app-packages?pivots=store-installer-msix", + "source_path": "hub/apps/design/input/manage-issues-with-audio-input.md", + "redirect_url": "/windows/apps/develop/input/manage-issues-with-audio-input", "redirect_document_id": false }, { - "source_path": "uwp/publish/write-a-great-app-description.md", - "redirect_url": "/windows/apps/publish/publish-your-app/write-great-app-description?pivots=store-installer-msix", + "source_path": "hub/apps/design/input/mouse-interactions.md", + "redirect_url": "/windows/apps/develop/input/mouse-interactions", "redirect_document_id": false }, { - "source_path": "hub/apps/develop/widgets/widget-service-providers.md", - "redirect_url": "/windows/apps/develop/widgets/widget-providers", - "redirect_document_id": true + "source_path": "hub/apps/design/input/multiple-input-design-guidelines.md", + "redirect_url": "/windows/apps/develop/input/multiple-input-design-guidelines", + "redirect_document_id": false }, { - "source_path": "landing/arm-docs/dev-kit.md", - "redirect_url": "/windows/arm/dev-kit/index", - "redirect_document_id": true + "source_path": "hub/apps/design/input/pen-and-stylus-interactions.md", + "redirect_url": "/windows/apps/develop/input/pen-and-stylus-interactions", + "redirect_document_id": false }, { - "source_path": "uwp/publish/msiexe/store-submission-api.md", - "redirect_url": "/windows/apps/publish/store-submission-api", + "source_path": "hub/apps/design/input/pen-haptics.md", + "redirect_url": "/windows/apps/develop/input/pen-haptics", "redirect_document_id": false }, { - "source_path": "uwp/publish/msiexe/update-your-app.md", - "redirect_url": "/windows/apps/publish/update-your-app", + "source_path": "hub/apps/design/input/radialcontroller-walkthrough.md", + "redirect_url": "/windows/apps/develop/input/radialcontroller-walkthrough", "redirect_document_id": false }, { - "source_path": "uwp/publish/acquisitions-report.md", - "redirect_url": "/windows/apps/publish/acquisitions-report", + "source_path": "hub/apps/design/input/respond-to-the-presence-of-the-touch-keyboard.md", + "redirect_url": "/windows/apps/develop/input/respond-to-the-presence-of-the-touch-keyboard", "redirect_document_id": false }, { - "source_path": "uwp/publish/add-on-acquisitions-report.md", - "redirect_url": "/windows/apps/publish/add-on-acquisitions-report", + "source_path": "hub/apps/design/input/save-and-load-ink.md", + "redirect_url": "/windows/apps/develop/input/save-and-load-ink", "redirect_document_id": false }, { - "source_path": "uwp/publish/advertising-performance-report.md", - "redirect_url": "/windows/apps/publish/advertising-performance-report", + "source_path": "hub/apps/design/input/set-speech-recognition-timeouts.md", + "redirect_url": "/windows/apps/develop/input/set-speech-recognition-timeouts", "redirect_document_id": false }, { - "source_path": "uwp/publish/analytics.md", - "redirect_url": "/windows/apps/publish/analytics", + "source_path": "hub/apps/design/input/specify-the-speech-recognizer-language.md", + "redirect_url": "/windows/apps/develop/input/specify-the-speech-recognizer-language", "redirect_document_id": false }, { - "source_path": "uwp/publish/msiexe/analyze-app-performance.md", - "redirect_url": "/windows/apps/publish/analyze-msi-exe/analyze-app-performance", + "source_path": "hub/apps/design/input/speech-interactions.md", + "redirect_url": "/windows/apps/develop/input/speech-interactions", "redirect_document_id": false }, { - "source_path": "uwp/publish/msiexe/ratings-reviews-performance.md", - "redirect_url": "/windows/apps/publish/analyze-msi-exe/ratings-reviews-performance", + "source_path": "hub/apps/design/input/speech-recognition.md", + "redirect_url": "/windows/apps/develop/input/speech-recognition", "redirect_document_id": false }, { - "source_path": "uwp/publish/app-management-and-services.md", - "redirect_url": "/windows/apps/publish/app-management-and-services", + "source_path": "hub/apps/design/input/text-handwriting-view.md", + "redirect_url": "/windows/apps/develop/input/text-handwriting-view", "redirect_document_id": false }, { - "source_path": "uwp/publish/app-marketing-guidelines.md", - "redirect_url": "/windows/apps/publish/app-marketing-guidelines", + "source_path": "hub/apps/design/input/text-scaling.md", + "redirect_url": "/windows/apps/develop/input/text-scaling", "redirect_document_id": false }, { - "source_path": "uwp/publish/attract-customers-and-promote-your-apps.md", - "redirect_url": "/windows/apps/publish/attract-customers-and-promote-your-apps", + "source_path": "hub/apps/design/input/touch-developer-guide.md", + "redirect_url": "/windows/apps/develop/input/touch-developer-guide", "redirect_document_id": false }, { - "source_path": "uwp/publish/beta-testing-and-targeted-distribution.md", - "redirect_url": "/windows/apps/publish/beta-testing-and-targeted-distribution", + "source_path": "hub/apps/design/input/touch-interactions.md", + "redirect_url": "/windows/apps/develop/input/touch-interactions", "redirect_document_id": false }, { - "source_path": "uwp/publish/create-a-custom-app-promotion-campaign.md", - "redirect_url": "/windows/apps/publish/create-a-custom-app-promotion-campaign", + "source_path": "hub/apps/design/input/touchpad-interactions.md", + "redirect_url": "/windows/apps/develop/input/touchpad-interactions", "redirect_document_id": false }, { - "source_path": "uwp/publish/create-customer-groups.md", - "redirect_url": "/windows/apps/publish/create-customer-groups", + "source_path": "hub/apps/design/input/use-input-scope-to-change-the-touch-keyboard.md", + "redirect_url": "/windows/apps/develop/input/use-input-scope-to-change-the-touch-keyboard", "redirect_document_id": false }, { - "source_path": "uwp/publish/create-customer-segments.md", - "redirect_url": "/windows/apps/publish/create-customer-segments", + "source_path": "hub/apps/design/input/windows-wheel-interactions.md", + "redirect_url": "/windows/apps/develop/input/windows-wheel-interactions", "redirect_document_id": false }, { - "source_path": "uwp/publish/create-known-user-groups.md", - "redirect_url": "/windows/apps/publish/create-known-user-groups", + "source_path": "hub/apps/design/input/drag-and-drop.md", + "redirect_url": "/windows/apps/develop/data/drag-and-drop", "redirect_document_id": false }, { - "source_path": "uwp/publish/distribute-lob-apps-to-enterprises.md", - "redirect_url": "/windows/apps/publish/distribute-lob-apps-to-enterprises", + "source_path": "hub/apps/design/input/cortana-deep-link-into-your-app.md", + "redirect_url": "/previous-versions/windows/uwp/ui-input/cortana-deep-link-into-your-app", "redirect_document_id": false }, { - "source_path": "uwp/publish/download-analytic-reports.md", - "redirect_url": "/windows/apps/publish/download-analytic-reports", + "source_path": "hub/apps/design/input/cortana-design-guidelines.md", + "redirect_url": "/previous-versions/windows/uwp/ui-input/cortana-design-guidelines", "redirect_document_id": false }, { - "source_path": "uwp/publish/engage-with-your-customers.md", - "redirect_url": "/windows/apps/publish/engage-with-your-customers", + "source_path": "hub/apps/design/input/cortana-dynamically-modify-voice-command-definition-vcd-phrase-lists.md", + "redirect_url": "/previous-versions/windows/uwp/ui-input/cortana-dynamically-modify-voice-command-definition-vcd-phrase-lists", "redirect_document_id": false }, { - "source_path": "uwp/publish/feedback-report.md", - "redirect_url": "/windows/apps/publish/feedback-report", + "source_path": "hub/apps/design/input/cortana-interactions.md", + "redirect_url": "/previous-versions/windows/uwp/ui-input/cortana-interactions", "redirect_document_id": false }, { - "source_path": "uwp/publish/generate-preinstall-packages-for-oems.md", - "redirect_url": "/windows/apps/publish/generate-preinstall-packages-for-oems", + "source_path": "hub/apps/design/input/cortana-interact-with-a-background-app.md", + "redirect_url": "/previous-versions/windows/uwp/ui-input/cortana-interact-with-a-background-app", "redirect_document_id": false }, { - "source_path": "uwp/publish/generate-promotional-codes.md", - "redirect_url": "/windows/apps/publish/generate-promotional-codes", + "source_path": "hub/apps/design/input/cortana-launch-a-background-app-with-voice-commands.md", + "redirect_url": "/previous-versions/windows/uwp/ui-input/cortana-launch-a-background-app-with-voice-commands", "redirect_document_id": false }, { - "source_path": "uwp/publish/gradual-package-rollout.md", - "redirect_url": "/windows/apps/publish/gradual-package-rollout", + "source_path": "hub/apps/design/input/cortana-launch-a-foreground-app-with-voice-commands.md", + "redirect_url": "/previous-versions/windows/uwp/ui-input/cortana-launch-a-foreground-app-with-voice-commands", "redirect_document_id": false }, { - "source_path": "uwp/publish/health-report.md", - "redirect_url": "/windows/apps/publish/health-report", + "source_path": "hub/apps/design/input/cortana-support-natural-language-voice-commands.md", + "redirect_url": "/previous-versions/windows/uwp/ui-input/cortana-support-natural-language-voice-commands", "redirect_document_id": false }, { - "source_path": "uwp/publish/in-app-ads.md", - "redirect_url": "/windows/apps/publish/in-app-ads", + "source_path": "hub/apps/design/motion/motion-dragdrop.md", + "redirect_url": "/previous-versions/windows/uwp/ui-input/motion-dragdrop", "redirect_document_id": false }, { - "source_path": "uwp/publish/insights-report.md", - "redirect_url": "/windows/apps/publish/insights-report", + "source_path": "hub/apps/design/motion/motion-edgebased.md", + "redirect_url": "/previous-versions/windows/uwp/ui-input/motion-edgebased", "redirect_document_id": false }, { - "source_path": "uwp/publish/link-to-your-app.md", - "redirect_url": "/windows/apps/publish/link-to-your-app", + "source_path": "hub/apps/design/motion/motion-fade.md", + "redirect_url": "/previous-versions/windows/uwp/ui-input/motion-fade", "redirect_document_id": false }, { - "source_path": "uwp/publish/make-your-app-easier-to-promote.md", - "redirect_url": "/windows/apps/publish/make-your-app-easier-to-promote", + "source_path": "hub/apps/design/motion/motion-list.md", + "redirect_url": "/previous-versions/windows/uwp/ui-input/motion-list", "redirect_document_id": false }, { - "source_path": "uwp/publish/organizational-licensing.md", - "redirect_url": "/windows/apps/publish/organizational-licensing", + "source_path": "hub/apps/design/motion/motion-pointer.md", + "redirect_url": "/previous-versions/windows/uwp/ui-input/", "redirect_document_id": false }, { - "source_path": "uwp/publish/package-flights.md", - "redirect_url": "/windows/apps/publish/package-flights", + "source_path": "hub/apps/design/motion/motion-popup-animations.md", + "redirect_url": "/previous-versions/windows/uwp/ui-input/motion-popup-animations", "redirect_document_id": false }, { - "source_path": "uwp/publish/put-apps-and-add-ons-on-sale.md", - "redirect_url": "/windows/apps/publish/put-apps-and-add-ons-on-sale", + "source_path": "hub/apps/design/motion/motion-reposition.md", + "redirect_url": "/previous-versions/windows/uwp/ui-input/motion-reposition", "redirect_document_id": false }, { - "source_path": "uwp/publish/ratings-and-reviews.md", - "redirect_url": "/windows/apps/publish/ratings-and-reviews", + "source_path": "hub/apps/winui/winui3/create-your-first-winui3-app.md", + "redirect_url": "/windows/apps/get-started/start-here", "redirect_document_id": false }, { - "source_path": "uwp/publish/ratings-report.md", - "redirect_url": "/windows/apps/publish/ratings-report", + "source_path": "hub/apps/windows-app-sdk/set-up-your-development-environment.md", + "redirect_url": "/windows/apps/get-started/start-here", "redirect_document_id": false }, { - "source_path": "uwp/publish/respond-to-customer-feedback.md", - "redirect_url": "/windows/apps/publish/respond-to-customer-feedback", + "source_path": "hub/apps/how-tos/hello-world-winui3.md", + "redirect_url": "/windows/apps/get-started/start-here", + "redirect_document_id": false + }, + { + "source_path": "hub/apps/winui/index.md", + "redirect_url": "/windows/apps/winui/winui3/", "redirect_document_id": false }, { - "source_path": "uwp/publish/respond-to-customer-reviews.md", - "redirect_url": "/windows/apps/publish/respond-to-customer-reviews", + "source_path": "hub/apps/winui/winui3/release-notes/release-notes-08-preview.md", + "redirect_url": "/windows/windows-app-sdk/release-notes/project-reunion-0-8-preview", "redirect_document_id": false }, { - "source_path": "uwp/publish/reviews-report.md", - "redirect_url": "/windows/apps/publish/reviews-report", + "source_path": "hub/apps/winui/winui3/release-notes/winui3-project-reunion-0.5.md", + "redirect_url": "/windows/windows-app-sdk/release-notes/project-reunion-0-5", "redirect_document_id": false }, { - "source_path": "uwp/publish/send-push-notifications-to-your-apps-customers.md", - "redirect_url": "/windows/apps/publish/send-push-notifications-to-your-apps-customers", + "source_path": "hub/apps/winui/winui3/release-notes/winui3-project-reunion-0.5-preview.md", + "redirect_url": "/windows/windows-app-sdk/release-notes/project-reunion-0-5-preview", "redirect_document_id": false }, { - "source_path": "uwp/publish/usage-report.md", - "redirect_url": "/windows/apps/publish/usage-report", + "source_path": "hub/apps/windows-app-sdk/release-notes-archive/experimental-channel-0.8.md", + "redirect_url": "/windows/windows-app-sdk/release-notes/windows-app-sdk-0-8&pivots=experimental", "redirect_document_id": false }, { - "source_path": "uwp/publish/use-targeted-offers-to-maximize-engagement-and-conversions.md", - "redirect_url": "/windows/apps/publish/use-targeted-offers-to-maximize-engagement-and-conversions", + "source_path": "hub/apps/windows-app-sdk/release-notes-archive/experimental-channel-1-8.md", + "redirect_url": "/windows/windows-app-sdk/release-notes/windows-app-sdk-1-8&pivots=experimental", "redirect_document_id": false }, { - "source_path": "uwp/publish/view-app-identity-details.md", - "redirect_url": "/windows/apps/publish/view-app-identity-details", + "source_path": "hub/apps/windows-app-sdk/release-notes-archive/experimental-channel-1.0.md", + "redirect_url": "/windows/windows-app-sdk/release-notes/windows-app-sdk-1-8&pivots=experimental", "redirect_document_id": false }, { - "source_path": "uwp/publish/xbox-analytics-report.md", - "redirect_url": "/windows/apps/publish/xbox-analytics-report", + "source_path": "hub/apps/windows-app-sdk/release-notes-archive/experimental-channel-1.2.md", + "redirect_url": "/windows/windows-app-sdk/release-notes/windows-app-sdk-1-2&pivots=experimental", "redirect_document_id": false }, { - "source_path": "hub/apps/publish/partner-center/associate-azure-ad-with-partner-center.md", - "redirect_url": "/windows/apps/publish/partner-center/associate-existing-azure-ad-tenant-with-partner-center-account", + "source_path": "hub/apps/windows-app-sdk/release-notes-archive/experimental-channel-1.3.md", + "redirect_url": "/windows/windows-app-sdk/release-notes/windows-app-sdk-1-3&pivots=experimental", "redirect_document_id": false }, - { - "source_path": "hub/apps/publish/partner-center/add-users-groups-and-azure-ad-applications.md", - "redirect_url": "/windows/apps/publish/partner-center/overview-users-groups-azure-ad-applications", + { + "source_path": "hub/apps/windows-app-sdk/release-notes-archive/experimental-channel-1.4.md", + "redirect_url": "/windows/windows-app-sdk/release-notes/windows-app-sdk-1-4&pivots=experimental", "redirect_document_id": false }, { - "source_path": "hub/apps/publish/partner-center/opening-a-developer-account.md", - "redirect_url": "/windows/apps/publish/partner-center/partner-center-developer-account", + "source_path": "hub/apps/windows-app-sdk/release-notes-archive/experimental-channel-1.5.md", + "redirect_url": "/windows/windows-app-sdk/release-notes/windows-app-sdk-1-5&pivots=experimental", "redirect_document_id": false }, { - "source_path": "hub/apps/publish/partner-center/set-custom-permissions-for-account-users.md", - "redirect_url": "/windows/apps/publish/partner-center/overview-of-roles-and-permissions-for-account-users", + "source_path": "hub/apps/windows-app-sdk/release-notes-archive/experimental-channel-1.6.md", + "redirect_url": "/windows/windows-app-sdk/release-notes/windows-app-sdk-1-6&pivots=experimental", "redirect_document_id": false }, { - "source_path": "hub/package-manager/package/winget-validation.md", - "redirect_url": "/windows/package-manager/package/repository#validation-process", + "source_path": "hub/apps/windows-app-sdk/release-notes-archive/experimental-channel-1.7.md", + "redirect_url": "/windows/windows-app-sdk/release-notes/windows-app-sdk-1-7&pivots=experimental", "redirect_document_id": false }, { - "source_path": "hub/package-manager/package/winget-validation-troubleshooter.md", - "redirect_url": "/windows/package-manager/package/repository#submission-troubleshooting", + "source_path": "hub/apps/windows-app-sdk/release-notes-archive/preview-channel-1.7.md", + "redirect_url": "/windows/windows-app-sdk/release-notes/windows-app-sdk-1-7&pivots=preview", "redirect_document_id": false }, { - "source_path": "hub/package-manager/package/binary-validation-errors.md", - "redirect_url": "/windows/package-manager/package/repository#binary-validation-error", + "source_path": "hub/apps/windows-app-sdk/release-notes-archive/preview-channel-1-7.md", + "redirect_url": "/windows/windows-app-sdk/release-notes/windows-app-sdk-1-7&pivots=preview", "redirect_document_id": false }, { - "source_path": "hub/dev-environment/tutorials.md", - "redirect_url": "/windows/dev-environment", + "source_path": "hub/apps/windows-app-sdk/release-notes-archive/preview-channel-1.0.md", + "redirect_url": "/windows/windows-app-sdk/release-notes/windows-app-sdk-1-0&pivots=preview", "redirect_document_id": false }, { - "source_path": "hub/dev-environment/dev-stories.md", - "redirect_url": "/windows/dev-environment", + "source_path": "hub/apps/windows-app-sdk/release-notes-archive/preview-channel-1.1.md", + "redirect_url": "/windows/windows-app-sdk/release-notes/windows-app-sdk-1-1&pivots=preview", "redirect_document_id": false }, { - "source_path": "hub/dev-environment/tips.md", - "redirect_url": "/windows/dev-environment", + "source_path": "hub/apps/windows-app-sdk/release-notes-archive/preview-channel-1.2.md", + "redirect_url": "/windows/windows-app-sdk/release-notes/windows-app-sdk-1-2&pivots=preview", "redirect_document_id": false }, { - "source_path": "hub/python/resources.md", - "redirect_url": "/windows/python/web-frameworks", + "source_path": "hub/apps/windows-app-sdk/release-notes-archive/preview-channel-1.3.md", + "redirect_url": "/windows/windows-app-sdk/release-notes/windows-app-sdk-1-3&pivots=preview", "redirect_document_id": false }, { - "source_path": "hub/powertoys/reportbug.md", - "redirect_url": "https://github.com/microsoft/PowerToys/issues/new/choose", + "source_path": "hub/apps/windows-app-sdk/release-notes-archive/preview-channel-1.4.md", + "redirect_url": "/windows/windows-app-sdk/release-notes/windows-app-sdk-1-4&pivots=preview", "redirect_document_id": false }, { - "source_path": "hub/android/xamarin-forms.md", - "redirect_url": "/dotnet/maui/what-is-maui", + "source_path": "hub/apps/windows-app-sdk/release-notes-archive/preview-channel-1.5.md", + "redirect_url": "/windows/windows-app-sdk/release-notes/windows-app-sdk-1-5&pivots=preview", "redirect_document_id": false }, { - "source_path": "uwp/publish/store-app-quality.md", - "redirect_url": "/windows/apps/publish/store-app-quality", + "source_path": "hub/apps/windows-app-sdk/release-notes-archive/preview-channel-1.6.md", + "redirect_url": "/windows/windows-app-sdk/release-notes/windows-app-sdk-1-6&pivots=preview", "redirect_document_id": false - }, + }, { - "source_path": "uwp/publish/store-developer-code-of-conduct.md", - "redirect_url": "/windows/apps/publish/store-developer-code-of-conduct", + "source_path": "hub/apps/windows-app-sdk/release-notes-archive/stable-channel-0.5.md", + "redirect_url": "/windows/windows-app-sdk/release-notes/windows-app-sdk-0-5&pivots=stable", "redirect_document_id": false - }, + }, { - "source_path": "uwp/publish/store-policies-and-code-of-conduct.md", - "redirect_url": "/windows/apps/publish/store-policies-and-code-of-conduct", + "source_path": "hub/apps/windows-app-sdk/release-notes-archive/stable-channel-0.8.md", + "redirect_url": "/windows/windows-app-sdk/release-notes/windows-app-sdk-0-8&pivots=stable", "redirect_document_id": false - }, + }, { - "source_path": "uwp/publish/store-policies-change-history.md", - "redirect_url": "/windows/apps/publish/store-policies-change-history", + "source_path": "hub/apps/windows-app-sdk/release-notes-archive/stable-channel-1-7.md", + "redirect_url": "/windows/windows-app-sdk/release-notes/windows-app-sdk-1-7&pivots=stable", "redirect_document_id": false - }, + }, { - "source_path": "uwp/publish/store-policies.md", - "redirect_url": "/windows/apps/publish/store-policies", + "source_path": "hub/apps/windows-app-sdk/release-notes-archive/stable-channel-1.0.md", + "redirect_url": "/windows/windows-app-sdk/release-notes/windows-app-sdk-1-0&pivots=stable", "redirect_document_id": false - }, + }, { - "source_path": "uwp/publish/store-policy-archive/store-policy-7-11.md", - "redirect_url": "/windows/apps/publish/store-policy-archive/store-policy-7-11", + "source_path": "hub/apps/windows-app-sdk/release-notes-archive/stable-channel-1.1.md", + "redirect_url": "/windows/windows-app-sdk/release-notes/windows-app-sdk-1-1&pivots=stable", "redirect_document_id": false - }, + }, { - "source_path": "uwp/publish/store-policy-archive/store-policy-7-12.md", - "redirect_url": "/windows/apps/publish/store-policy-archive/store-policy-7-12", + "source_path": "hub/apps/windows-app-sdk/release-notes-archive/stable-channel-1.2.md", + "redirect_url": "/windows/windows-app-sdk/release-notes/windows-app-sdk-1-2&pivots=stable", "redirect_document_id": false - }, + }, { - "source_path": "uwp/publish/store-policy-archive/store-policy-7-13.md", - "redirect_url": "/windows/apps/publish/store-policy-archive/store-policy-7-13", + "source_path": "hub/apps/windows-app-sdk/release-notes-archive/stable-channel-1.3.md", + "redirect_url": "/windows/windows-app-sdk/release-notes/windows-app-sdk-1-3&pivots=stable", "redirect_document_id": false - }, + }, { - "source_path": "uwp/publish/store-policy-archive/store-policy-7-14.md", - "redirect_url": "/windows/apps/publish/store-policy-archive/store-policy-7-14", + "source_path": "hub/apps/windows-app-sdk/release-notes-archive/stable-channel-1.4.md", + "redirect_url": "/windows/windows-app-sdk/release-notes/windows-app-sdk-1-4&pivots=stable", "redirect_document_id": false - }, + }, { - "source_path": "uwp/publish/store-policy-archive/store-policy-7-15.md", - "redirect_url": "/windows/apps/publish/store-policy-archive/store-policy-7-15", + "source_path": "hub/apps/windows-app-sdk/release-notes-archive/stable-channel-1.5.md", + "redirect_url": "/windows/windows-app-sdk/release-notes/windows-app-sdk-1-5&pivots=stable", "redirect_document_id": false - }, + }, { - "source_path": "uwp/publish/store-policy-archive/store-policy-7-16.md", - "redirect_url": "/windows/apps/publish/store-policy-archive/store-policy-7-16", + "source_path": "hub/apps/windows-app-sdk/release-notes-archive/stable-channel-1.6.md", + "redirect_url": "/windows/windows-app-sdk/release-notes/windows-app-sdk-1-6&pivots=stable", "redirect_document_id": false - }, + }, { - "source_path": "uwp/publish/store-policy-archive/store-policy-7-6.md", - "redirect_url": "/windows/apps/publish/store-policy-archive/store-policy-7-6", + "source_path": "hub/apps/windows-app-sdk/experimental-channel.md", + "redirect_url": "/windows/apps/windows-app-sdk/release-channels", "redirect_document_id": false - }, + }, { - "source_path": "uwp/publish/store-policy-archive/store-policy-7-7.md", - "redirect_url": "/windows/apps/publish/store-policy-archive/store-policy-7-7", + "source_path": "hub/apps/windows-app-sdk/preview-channel.md", + "redirect_url": "/windows/apps/windows-app-sdk/release-channels", "redirect_document_id": false - }, + }, { - "source_path": "uwp/publish/index.md", - "redirect_url": "/windows/apps/publish/", + "source_path": "hub/apps/windows-app-sdk/stable-channel.md", + "redirect_url": "/windows/apps/windows-app-sdk/release-channels", "redirect_document_id": false - }, + }, { - "source_path": "hub/apps/publish/update-your-app.md", - "redirect_url": "/windows/apps/publish/publish-your-app/publish-update-to-your-app-on-store?pivots=store-installer-msi-exe", + "source_path": "hub/apps/get-started/make-apps-great-for-windows.md", + "redirect_url": "/windows/apps/get-started/best-practices", "redirect_document_id": false } ] -} - - - +} \ No newline at end of file diff --git a/.vscode/launch.json b/.vscode/launch.json deleted file mode 100644 index a3d5a26060..0000000000 --- a/.vscode/launch.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "version": "0.2.0", - "configurations": [ - { - "name": "Launch Extension", - "type": "extensionHost", - "request": "launch", - "runtimeExecutable": "${execPath}", - "args": [ - "--extensionDevelopmentPath=${workspaceRoot}" - ], - "stopOnEntry": false, - "sourceMaps": true, - "outDir": "out", - "preLaunchTask": "npm" - } - ] -} \ No newline at end of file diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 0000000000..e138ec5d6a --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,41 @@ + + +## Security + +Microsoft takes the security of our software products and services seriously, which includes all source code repositories managed through our GitHub organizations, which include [Microsoft](https://github.com/microsoft), [Azure](https://github.com/Azure), [DotNet](https://github.com/dotnet), [AspNet](https://github.com/aspnet), [Xamarin](https://github.com/xamarin), and [our GitHub organizations](https://opensource.microsoft.com/). + +If you believe you have found a security vulnerability in any Microsoft-owned repository that meets [Microsoft's definition of a security vulnerability](https://aka.ms/opensource/security/definition), please report it to us as described below. + +## Reporting Security Issues + +**Please do not report security vulnerabilities through public GitHub issues.** + +Instead, please report them to the Microsoft Security Response Center (MSRC) at [https://msrc.microsoft.com/create-report](https://aka.ms/opensource/security/create-report). + +If you prefer to submit without logging in, send email to [secure@microsoft.com](mailto:secure@microsoft.com). If possible, encrypt your message with our PGP key; please download it from the [Microsoft Security Response Center PGP Key page](https://aka.ms/opensource/security/pgpkey). + +You should receive a response within 24 hours. If for some reason you do not, please follow up via email to ensure we received your original message. Additional information can be found at [microsoft.com/msrc](https://aka.ms/opensource/security/msrc). + +Please include the requested information listed below (as much as you can provide) to help us better understand the nature and scope of the possible issue: + + * Type of issue (e.g. buffer overflow, SQL injection, cross-site scripting, etc.) + * Full paths of source file(s) related to the manifestation of the issue + * The location of the affected source code (tag/branch/commit or direct URL) + * Any special configuration required to reproduce the issue + * Step-by-step instructions to reproduce the issue + * Proof-of-concept or exploit code (if possible) + * Impact of the issue, including how an attacker might exploit the issue + +This information will help us triage your report more quickly. + +If you are reporting for a bug bounty, more complete reports can contribute to a higher bounty award. Please visit our [Microsoft Bug Bounty Program](https://aka.ms/opensource/security/bounty) page for more details about our active programs. + +## Preferred Languages + +We prefer all communications to be in English. + +## Policy + +Microsoft follows the principle of [Coordinated Vulnerability Disclosure](https://aka.ms/opensource/security/cvd). + + diff --git a/auto-publish.yml b/auto-publish.yml new file mode 100644 index 0000000000..4ec385b335 --- /dev/null +++ b/auto-publish.yml @@ -0,0 +1,26 @@ + + +trigger: +- main + +jobs: +- job: MergeMainToLive + pool: + vmImage: 'ubuntu-latest' + steps: + - checkout: self + persistCredentials: true + - script: | + git config --global user.name "Quinn Radich" + git config --global user.email "quinnradich@users.noreply.github.com" + git checkout main + git checkout live + git merge main --no-ff --no-commit + if [ $? -eq 0 ]; then + git commit -m "Merged main into live" + git push origin live + else + echo "Error merging main to live" + exit 1 + fi + displayName: 'Merge main to live if main has changed' diff --git a/hub/advanced-settings/developer-mode.md b/hub/advanced-settings/developer-mode.md new file mode 100644 index 0000000000..460736cd2a --- /dev/null +++ b/hub/advanced-settings/developer-mode.md @@ -0,0 +1,84 @@ +--- +ms.assetid: 54973C62-9669-4988-934E-9273FB0425FD +title: Settings for developers +description: Activate Developer Mode on your PC to develop apps. +keywords: Developer mode, Visual Studio, enable device +ms.date: 11/12/2025 +ms.topic: how-to +--- + +# Settings for developers + +The **System > Advanced** page in Windows settings includes Developer Mode and additional features that you can use when Developer Mode is enabled. Developer Mode unlocks tools, settings, and features designed for building, deploying, and testing apps on Windows. + +:::image type="content" source="images/for-developers.png" alt-text="A screenshot of Windows Advanced settings for developers, showing Developer Mode, Device Portal, and Device discovery."::: + +> [!NOTE] +> Prior to Windows 11 25H2, these settings appear on the **For developers** page in Windows settings. In Windows 11 25H2 and later, they appear in the **For developers** section of the [Advanced settings](index.md) page. + +## Enable Developer Mode + +If you're writing software with Visual Studio, you *will* need to enable Developer Mode on both the development PC and on any devices you'll use to test your code. + +> [!IMPORTANT] +> If you're using your computer for ordinary day-to-day activities (such as gaming, web browsing, email, or Office apps), there is no need to activate Developer Mode. If you're trying to fix an issue with your computer, check out [Windows help](/windows). + +To enable Developer Mode, or access other settings: + +1. Open Windows Settings. +2. Search for **Advanced** or go to **System > Advanced**, then scroll to the **For developers** section. +3. Toggle the Developer Mode setting, at the top of the **For developers** section. +4. Read the disclaimer. Click **Yes** to accept the change. + + :::image type="content" source="images/use-developer-features.png" alt-text="Developer Mode dialog in Visual Studio"::: + +> [!NOTE] +> Enabling Developer mode requires administrator access. If your device is owned by an organization, this option may be disabled. + +If you try to build a Windows project in Visual Studio when Developer Mode *isn't* enabled, the following dialog appears in Visual Studio: + +:::image type="content" source="images/enable-developer-mode-dialog.jpg" alt-text="Developer Mode dialog in Visual Studio that says Developer Mode needs to be enabled, with a link to settings for developers."::: + +If you see this dialog, select **settings for developers** to open the **System > Advanced** settings page. + +> [!NOTE] +> You can go to the **Advanced** settings page at any time to *enable* or *disable* Developer Mode. + +## Developer Mode features + +Developer Mode replaces the requirements for a developer license. In addition to sideloading, the Developer Mode setting enables debugging and additional deployment options. This includes starting an SSH service to allow deployment to this device. In order to stop this service, you need to disable Developer Mode. + +When you enable Developer Mode on desktop, a package of features is installed, including: + +- **Windows Device Portal**: Device Portal is only enabled (and firewall rules are only configured for it) when the **Enable Device Portal** option is turned on. +- Installs and configures firewall rules for SSH services that allow remote installation of apps. Enabling **Device Discovery** will turn on the SSH server. + +> [!NOTE] +> _Device Portal_ and _Device discovery_ are useful when you need to develop on one machine, but deploy your app to another machine for testing. For example, if you need to deploy your app to a tablet to test a touch-optimized tablet user interface. + +### Device Portal + +To learn more about Device Portal, see [Windows Device Portal overview](/windows/uwp/debug-test-perf/device-portal) and [Device Portal for desktop](/windows/uwp/debug-test-perf/device-portal-desktop). + +### Device Discovery + +When you enable Device Discovery, you're allowing your device to be visible to other devices on the network through mDNS. This feature also allows you to get the SSH PIN for pairing to the device by pressing the **Pair** button exposed immediately after Device Discovery is enabled. This PIN prompt must be displayed on the screen in order to complete your first Visual Studio deployment targeting the device. + +:::image type="content" source="images/pair-device-with-device-discovery.png" alt-text="A screenshot of the Pair device dialog that displays the SSH Pin for device pairing."::: + +You should enable Device Discovery only if you intend to make the device a deployment target. For example, if you use Device Portal to deploy an app to a tablet for testing, you need to enable Device Discovery on the tablet, but not on your development PC. + +#### SSH + +SSH services are enabled when you enable Device Discovery on your device. This is used when your device is a remote deployment target for MSIX packaged applications. The names of the services are *SSH Server Broker* and *SSH Server Proxy*. + +> [!NOTE] +> This is not Microsoft's OpenSSH implementation, which you can find on [GitHub](https://github.com/PowerShell/Win32-OpenSSH). + +In order to take advantage of the SSH services, you can enable Device Discovery to allow pin pairing. If you intend to run another SSH service, you can set this up on a different port or turn off the Developer Mode SSH services. To turn off the SSH services, turn off Device Discovery. + +SSH login is done via the *DevToolsUser* account, which accepts a password for authentication. This password is the PIN displayed on the device after pressing the Device Discovery **Pair** button, and it's only valid while the PIN is displayed. A SFTP subsystem is also enabled for manual management of the `DevelopmentFiles` folder where loose file deployments are installed from Visual Studio. + +##### Caveats for SSH usage + +The existing SSH server used in Windows is not yet protocol compliant. Using an SFTP or SSH client may require special configuration. In particular, the SFTP subsystem runs at version 3 or less, so any connecting client should be configured to expect an old server. The SSH server on older devices uses `ssh-dss` for public key authentication (which OpenSSH has deprecated). To connect to such devices, the SSH client must be manually configured to accept `ssh-dss`. diff --git a/hub/advanced-settings/fe-version-control.md b/hub/advanced-settings/fe-version-control.md new file mode 100644 index 0000000000..777c72a05e --- /dev/null +++ b/hub/advanced-settings/fe-version-control.md @@ -0,0 +1,68 @@ +--- +title: File Explorer Version Control Integration +description: Learn how to use File Explorer and version control integration inside Windows Advanced settings. +ms.reviewer: cinnamon +ms.topic: article +ms.date: 01/22/2026 +--- + +# File Explorer version control integration + +**File Explorer version control integration** provides version control information directly in File Explorer. This includes information such as the branch name, last commit author, last commit message, and more. + +> [!NOTE] +> As of right now, File Explorer version control integration only supports Git. The Advanced Settings system component is extensible to allow for additional version control types. + +![File Explorer version control integration](../images/fe-source.png) + +> [!IMPORTANT] +> Organizational policies can disable or hide Advanced settings controls. If a toggle is unavailable, contact your administrator. See related guidance in [Group Policy](../dev-drive/group-policy.md). + +## Enable version control indicators + +1. Open Settings and go to **System > Advanced**. +2. Under **File Explorer + version control**, select **Add folders** and choose the repositories you want File Explorer to recognize. +3. Return to File Explorer and open one of the selected folders to see repository details. + +> [!TIP] +> If indicators do not appear immediately, close and reopen File Explorer. + +## How to identify repositories + +Windows has to know which folders are source code repositories so File Explorer can display the version control information. You can select your repository folders in Windows Advanced Settings > File Explorer settings under the File Explorer + version control header. + +![File Explorer version control Settings](../images/fe-source-settings.png) + +## What appears in File Explorer + +When you open a selected repository folder in File Explorer, version control details are surfaced in the Explorer UI, including: + +- Branch name +- Last commit author +- Last commit message +- Commit timestamp + +## Limitations + +- Git repositories are supported; other systems may require future extensions. +- Very large repositories or folders with extensive generated content can delay indicators. +- Nested repositories and submodules may not display details consistently. +- Network shares, symlinked paths, or WSL-mounted locations may not surface metadata. +- Case-sensitive filesystems and uncommon file attributes can affect detection. + +> [!NOTE] +> To improve performance, consider excluding large generated folders (for example, `node_modules`, build outputs) when selecting repositories. + +## Troubleshooting + +- Indicators not showing: Confirm the folder contains a `.git` directory and is selected under **File Explorer + version control** in Advanced settings; restart File Explorer. +- Toggles disabled: Device may be managed by policy. See [Group Policy](../dev-drive/group-policy.md) and contact your administrator. +- Slow or inconsistent updates: Reduce very large folders from selection or move the repository to a local disk path. +- Conflicts with alternative SSH services: If using Developer Mode SSH features, ensure ports and services do not interfere with repository access. + +## Extensibility and feedback + +The Windows Advanced Settings system component is open source and designed to support additional version control providers. + +- Learn more or request features on [GitHub](https://github.com/microsoft/windowsAdvancedSettings). +- For broader context on Advanced settings, see the [Advanced Windows Settings](index.md) landing page. diff --git a/hub/advanced-settings/images/enable-developer-mode-dialog.jpg b/hub/advanced-settings/images/enable-developer-mode-dialog.jpg new file mode 100644 index 0000000000..f8fd8304bb Binary files /dev/null and b/hub/advanced-settings/images/enable-developer-mode-dialog.jpg differ diff --git a/hub/advanced-settings/images/for-developers.png b/hub/advanced-settings/images/for-developers.png new file mode 100644 index 0000000000..a3d99a2b9c Binary files /dev/null and b/hub/advanced-settings/images/for-developers.png differ diff --git a/hub/advanced-settings/images/pair-device-with-device-discovery.png b/hub/advanced-settings/images/pair-device-with-device-discovery.png new file mode 100644 index 0000000000..bbb348f7e8 Binary files /dev/null and b/hub/advanced-settings/images/pair-device-with-device-discovery.png differ diff --git a/hub/advanced-settings/images/use-developer-features.png b/hub/advanced-settings/images/use-developer-features.png new file mode 100644 index 0000000000..0c723c299b Binary files /dev/null and b/hub/advanced-settings/images/use-developer-features.png differ diff --git a/hub/advanced-settings/index.md b/hub/advanced-settings/index.md new file mode 100644 index 0000000000..5499434c9c --- /dev/null +++ b/hub/advanced-settings/index.md @@ -0,0 +1,49 @@ +--- +title: Advanced Windows Settings +description: Learn about the settings provided in the Advanced page of Windows settings. +ms.reviewer: cinnamon +ms.topic: article +ms.date: 01/22/2026 +--- + +# Advanced Windows Settings + +**Advanced Windows settings** is a redesign of the original **For Developers** page in Windows settings with additional settings to help you be more productive. + +## What's included + +- **Developer Mode**: Unlock tools and features for building, deploying, and testing apps on Windows. See [Settings for developers](developer-mode.md). +- **Sudo for Windows**: Run elevated commands from an unelevated console session. Available on Windows 11, version 24H2 and later. See [Sudo for Windows](sudo/index.md). +- **File Explorer version control integration (PREVIEW)**: View branch, commit, and author details directly in File Explorer. See [File Explorer version control integration](fe-version-control.md). + +## Find Advanced settings + +- Open Settings and navigate to **System > Advanced**. + +## Availability notes + +- In Windows 11, version 25H2 and later, the former **For developers** settings are now surfaced under the **Advanced** page. +- Sudo for Windows is available in Windows 11, version 24H2 and later. See [Sudo for Windows](sudo/index.md). +- File Explorer version control integration is currently available via the Windows Insider Beta Channel. See [File Explorer version control integration (PREVIEW)](fe-version-control.md) for enrollment and setup details. + +## Troubleshooting + +- **Options missing or disabled**: Devices managed by an organization may apply policies that disable Advanced settings toggles. See related [Group Policy guidance](../dev-drive/group-policy.md). +- **Administrator required**: Enabling Developer Mode requires local administrator privileges. +- **Feature not found**: Ensure your device is updated to a supported Windows version. Preview features may require joining a Windows Insider channel. + +## Feedback and contributions + +- The Windows Advanced Settings system component is open source. Share feedback or feature requests by opening an issue on [GitHub Issues](https://github.com/microsoft/windowsAdvancedSettings/issues). + + + +## FAQ + +### Why was For Developers renamed to Advanced? + +Most of the settings available within the For Developers page are useful for other advanced Windows users as well. In order to help all users discover these settings, the page was redesigned and renamed to Advanced. + +## Windows Advanced Settings system component open source repository + +To provide enhanced functionality to the Advanced settings page, there is an open-source system component that enables features like [File Explorer version control integration](fe-version-control.md). We welcome your contributions and feedback, and the source code for the Windows Advanced Settings system component is available on [GitHub](https://github.com/microsoft/windowsAdvancedSettings). diff --git a/hub/advanced-settings/sudo/index.md b/hub/advanced-settings/sudo/index.md new file mode 100644 index 0000000000..7b5c3f0813 --- /dev/null +++ b/hub/advanced-settings/sudo/index.md @@ -0,0 +1,97 @@ +--- +title: Sudo for Windows +description: Learn how to use sudo in your command line to run elevated commands (as an administrator) directly from an unelevated console session on Windows. +ms.reviewer: jordiadoumie +ms.topic: article +ms.date: 11/21/2024 +no-loc: [Gerardo Grignoli] +--- + +# Sudo for Windows + +**Sudo for Windows** is a new way for users to run elevated commands (as an administrator) directly from an unelevated console session on Windows. + +[Read the announcement](https://devblogs.microsoft.com/commandline/introducing-sudo-for-windows/), which includes a demo video and deep-dive into how Sudo for Windows works. + +## Prerequisites + +The Sudo for Windows command is available in [Windows 11, version 24H2](https://support.microsoft.com/topic/windows-11-version-24h2-update-history-0929c747-1815-4543-8461-0160d16f15e5) or higher. ([Check for Windows updates](ms-settings:windowsupdate)). + +> [!NOTE] +> Sudo for Windows is not yet available for Windows 10, but may be in the future. + +## How to enable Sudo for Windows + +To enable Sudo for Windows, open `Settings > System > For Developers` and set **Enable sudo** to **On**. + +![Enable Sudo](../../images/sudo-enable.png) + +>[!WARNING] +> Sudo for Windows can be used as a potential escalation of privilege vector when enabled in certain configurations. You should make sure to be aware of the [security considerations](#security-considerations) when enabling the sudo command on your machine. + +## How to configure Sudo for Windows + +Sudo for Windows currently supports three different configuration options. The configuration can be set from the `Settings > For Developers` menu or programmatically, using the command line. The configuration options include: + +- **In a new window** (`forceNewWindow`): The `forceNewWindow` configuration option is the default configuration option for Sudo for Windows. Use `sudo` in this configuration to run the command in a new window. This is similar to the behavior of the `runas /user:admin` command. + +- **Input closed** (`disableInput`): The `disableInput` configuration option will run the elevated process in the current window, but with the input handle closed. This means that the elevated process will not be able to receive input from the current console window. This is useful for scenarios where you want to run a command as an administrator, but do not want to allow the command to receive input from the current console window. This configuration option provides some of the convenience of the `inline` configuration option while mitigating some of the associated [security risks](#security-considerations). + +- **Inline** (`normal`): The `normal` configuration option is most similar to how sudo behaves on other operating systems. This configuration will run the elevated process in the current window and the process will be able to receive input from the current console session. This is useful for scenarios where you want to run a command as an administrator and want to allow the command to receive input from the current console window. This configuration option provides the most convenience, but you should only choose this option if you are familiar with the associated [security risks](#security-considerations). + +You can select among these configurations from the `Settings > For Developers` menu or change the configuration programmatically, in an elevated command line (admin console), using: + +- `sudo config --enable ` + +Update `` to either `forceNewWindow`, `disableInput`, or `normal`. + +## How to use Sudo for Windows + +To use Sudo for Windows, simply prepend `sudo` to the command you want to run as an administrator. For example, to run `netstat -ab` as an administrator, you would run `sudo netstat -ab` in your console window. + +### Common developer scenarios + +Here are some common scenarios where developers might use sudo: + +- **Editing system files**: `sudo notepad C:\Windows\System32\drivers\etc\hosts` +- **Installing packages globally**: `sudo npm install -g package-name` +- **Running administrative tools**: `sudo diskpart` + +> [!NOTE] +> For development work involving system directories like `C:\Windows\`, consider using development environments or alternative approaches when possible. Sudo should be used judiciously and only when elevated permissions are truly necessary. + +Because `sudo` elevates the targeted process to run with administrator-level permission, a prompt will open asking you to verify that you want to continue. + +## Security Considerations + +There are risks associated with running sudo in the **Input closed** (`disableInput`) or **Inline** (`normal`) configurations. It is possible for malicious processes to attempt to drive the elevated process using the connection established by the unelevated sudo.exe and the elevated sudo.exe process. + +The `disableInput` configuration option mitigates risk by closing the input handle. Disconnecting the input handle from the current console window means that unelevated processes cannot send input to the elevated process. + +The `inline` configuration option runs the elevated process in the current window and the process is able to receive input from the current console session. An unelevated process can send input to the elevated process within the same console window or get information from the output in the current window in this configuration. + +## FAQ + +### How is Sudo for Windows different from the existing `runas` command? + + The `sudo` command offers a way to quickly elevate a command as administrator from your current unelevated command line context and is familiar to some users coming from other operating systems. The `runas` command offers a way to run programs as any user, including administrator if you so choose. At this point in time, the `sudo` command on Windows does not support running programs as other users. Other key differences between `sudo` and `runas` include: + +- `runas` allows you to run programs as other users, including but not limited to as administrator. This functionality is on the roadmap for the sudo command, but does not yet exist. + +- `sudo` allows you to quickly elevate a process (as administrator): + - You can choose to do so in a new window, which resembles the `runas` administrator flow. + - You can choose to connect the elevated process to the current console window with the `disableInput` and `normal` configuration options. This is not supported with `runas`. + +- `runas` can prompt users for a password in the command-line. + +- `sudo` can only be elevated via the User Account Control (UAC) security feature designed to protect the operating system from unauthorized changes using verification prompt. + +You should consider your particular use-case and plan to use the command that best meets your needs. You should also consider the security implications of running sudo in the `disableInput` and `normal` modes. The default `forceNewWindow` configuration option is recommended unless you are familiar and comfortable with the risks associated with the other `sudo` configurations. + +## Sudo for Windows open source repository + +Sudo for Windows is open source and welcomes your contributions and feedback. You can find the source code for Sudo for Windows on [GitHub](https://github.com/microsoft/sudo). + +## Additional functionality + +If you’re looking for additional functionality that Sudo for Windows does not provide, check out [gsudo by Gerardo Grignoli](https://github.com/gerardog/gsudo) which has a number of additional features and configuration options or check out other solutions from the community. diff --git a/hub/android/defender-settings.md b/hub/android/defender-settings.md deleted file mode 100644 index 525ca89677..0000000000 --- a/hub/android/defender-settings.md +++ /dev/null @@ -1,73 +0,0 @@ ---- -title: Add Windows Defender exceptions for Android -description: Learn how to improve performance speed and build times by updating Windows Defender settings to exclude checking specified file types. -author: mattwojo -ms.author: mattwoj -manager: jken -ms.topic: article -keywords: android, windows defender, exceptions, configuration, exclusions, %USERPROFILE%, devenv.exe, performance, speed, build, gradle -ms.date: 04/28/2020 ---- - -# Add Windows Defender exceptions to speed up Android build performance - -This guide covers how to set up exclusions in your Windows Defender security settings in order to improve your build times when developing Android apps using a Windows machine. - -## Windows Defender Overview - -In Windows 10, version 1703 and later, the [Windows Defender Antivirus](/windows/security/threat-protection/windows-defender-antivirus/windows-defender-security-center-antivirus) app is part of Windows Security. Windows Defender aims to keep your PC safe with built-in, real-time protection against viruses, ransomware, spyware, and other security threats. - -**However**, Windows Defender's real-time protection will also dramatically slow file system access and build speed when developing Android apps. - -During the Android build process, many files are created on your computer. With antivirus real-time scanning enabled, the build process will halt each time a new file is created while the antivirus scans that file. - -Fortunately, Windows Defender has the capability to exclude files, project directories, or file types that you know to be secure from it's antivirus scanning process. - -> [!WARNING] -> To ensure that your computer is safe from malicious software, you should not completely disable real-time scanning or your Windows Defender antivirus software. -> Defining exclusions lowers the protection offered by Defender. You should always evaluate the risks that are associated with implementing exclusions, and only exclude files that you are confident are not malicious. - -## How to add exclusions to Windows Defender - -To add exclusions in the [Windows Defender Security Center](windowsdefender://): - -1. Select the Windows menu **Start** button -2. Enter **Windows Security** -3. Select **Virus and threat protection** -4. Select **Manage settings** under **Virus & threat protection settings** -5. Scroll to the **Exclusions** heading and select **Add or remove exclusions** -6. Select **+ Add an exclusion**. You will then need to choose whether the exclusion you wish to add is a **File**, **Folder**, **File type**, or **Process**. - -![Windows Defender Add Exclusion screenshot](../images/windows-defender-exclusions.png) - -## Exclusions to consider for Android development - -The following list shows the default location of each Android Studio directory that could be added as an exclusion from Windows Defender real-time scanning: - -- Gradle cache: `%USERPROFILE%\.gradle` -- Android Studio projects: `%USERPROFILE%\AndroidStudioProjects` -- Android SDK: `%USERPROFILE%\AppData\Local\Android\SDK` -- Android Studio system files: `%USERPROFILE%\.AndroidStudio\system` - -These directory locations may not apply to your project if you have not used the default locations set by Android Studio or if you have downloaded a project from GitHub (for example). Consider adding an exclusion to the directory of your current Android development project, wherever that may be located. - -Additional exclusions you may want to consider include: - -- Visual Studio dev environment process: `devenv.exe` -- Visual Studio build process: `msbuild.exe` -- JetBrains directory: `%LOCALAPPDATA%\JetBrains\` - -For more information on adding antivirus scanning exclusions, including how to customize directory locations for Group Policy controlled environments, see the Antivirus Impact section of the [Android Studio documentation](https://developer.android.com/studio/intro/studio-config#antivirus-impact). - -Please remember that adding exclusions lowers the protection offered by Defender. You should always evaluate the risks that are associated with implementing exclusions, and only exclude files that you are confident are not malicious. - -> [!Note] -> Daniel Knoodle has set up a GitHub repo with recommended scripts to add [Windows Defender exclusions for Visual Studio 2017](https://gist.github.com/dknoodle/5a66b8b8a3f2243f4ca5c855b323cb7b#file-windows-defender-exclusions-vs-2017-ps1-L10). - -## Additional resources - -- [Develop Dual-screen apps for Android and get the Surface Duo device SDK](/dual-screen/android/) - -- [Add Windows Defender exclusions to improve performance](./defender-settings.md) - -- [Enable Virtualization support to improve emulator performance](./emulator.md#enable-virtualization-support) diff --git a/hub/android/emulator.md b/hub/android/emulator.md deleted file mode 100644 index 5daef664ff..0000000000 --- a/hub/android/emulator.md +++ /dev/null @@ -1,112 +0,0 @@ ---- -title: Test on an Android device or emulator -description: Test your app on an Android device or emulator from Windows and enable virtualization with hyper-v and Windows Hypervisor Platform (WHPX). -author: mattwojo -ms.author: mattwoj -manager: jken -ms.topic: article -keywords: android, windows, emulator, virtual device, device setup, enable device, developer, configuration, virtualization, visual studio, hyper-v, intel, haxm, amd, Windows Hypervisor Platform, WHPX -ms.date: 04/28/2020 ---- - -# Test on an Android device or emulator - -There are several ways to test and debug your Android application using a real device or emulator on your Windows machine. We have outlined a few recommendations in this guide. - -## Run on a real Android device - -To run your app on a real Android device, you will first need to enable your Android device for development. Developer options on Android have been hidden by default since version 4.2 and enabling them can vary based on the Android version. - -### Enable your device for development - -For a device running a recent version of Android 9.0+: - -1. Connect your device to your Windows development machine with a USB cable. You may receive a notification to install a USB driver. -2. Open the **Settings** screen on your Android device. -3. Select **About phone**. -4. Scroll to the bottom and tap **Build number** seven times, until **You are now a developer!** is visible. -5. Return to the previous screen, select **System**. -6. Select **Advanced**, scroll to the bottom, and tap **Developer options**. -7. In the **Developer options** window, scroll down to find and enable **USB debugging**. - -For a device running an older version of Android, see [Set Up Device for Development](/xamarin/android/get-started/installation/set-up-device-for-development). - -### Run your app on the device - -1. In the Android Studio toolbar, select your app from the **run configurations** drop-down menu. - - ![Android Studio Run Configuration menu](../images/android-run-config-menu.png) - -2. From the **target device** drop-down menu, select the device that you want to run your app on. - - ![Android Studio Target Device menu](../images/android-target-device-menu.png) - -3. Select Run ▷. This will launch the app on your connected device. - -## Run your app on a virtual Android device using an emulator - -The first thing to know about running an Android emulator on your Windows machine is that regardless of your IDE (Android Studio, Visual Studio, etc), emulator performance is vastly improved by enabling virtualization support. - -### Enable virtualization support - -Before creating a virtual device with the Android emulator, it is recommended that you enable virtualization by turning on the Hyper-V and Windows Hypervisor Platform (WHPX) features. This will allow your computer's processor to significantly improve the execution speed of the emulator. - -> To run Hyper-V and Windows Hypervisor Platform, your computer must: -> -> * Have 4GB of memory available -> * Have a 64-bit Intel processor or AMD Ryzen CPU with Second Level Address Translation (SLAT) -> * Be running Windows 10 build 1803+ ([Check your build #](ms-settings:about)) -> * Have updated graphics drivers (Device Manager > Display adapters > Update driver) -> -> If your machine doesn't fit this criteria, you may be able to run [Intel HAXM](https://github.com/intel/haxm/wiki/Installation-Instructions-on-Windows) or [AMD Hypervisor](https://github.com/google/android-emulator-hypervisor-driver-for-amd-processors). For more info, see the article: [Hardware acceleration for emulator performance](/xamarin/android/get-started/installation/android-emulator/hardware-acceleration) or the [Android Studio Emulator documentation](https://developer.android.com/studio/run/emulator). - -1. Verify that your computer hardware and software is compatible with Hyper-V by opening a command prompt and entering the command: `systeminfo` - - ![Hyper-V requirements from systeminfo in command prompt](../images/systeminfo.png) - -2. In the Windows search box (lower left), enter "windows features". Select **Turn Windows features on or off** from the search results. - -3. Once the **Windows Features** list appears, scroll to find **Hyper-V** (includes both Management Tools and Platform) and **Windows Hypervisor Platform**, ensure that the box is checked to enable both, then select **OK**. - -4. Restart your computer when prompted. - -### Emulator for native development with Android Studio - -When building and testing a native Android app, we recommend [using Android Studio](./native-android.md). Once your app is ready for testing, you can build and run your app by: - -1. In the Android Studio toolbar, select your app from the **run configurations** drop-down menu. - - ![Android Studio Run Configuration menu](../images/android-run-config-menu.png) - -2. From the **target device** drop-down menu, select the device that you want to run your app on. - - ![Android Studio Target Device menu](../images/android-target-device-menu.png) - -3. Select Run ▷. This will launch the [Android Emulator](https://developer.android.com/studio/run/emulator). - -> [!TIP] -> Once your app is installed on the emulator device, you can use `Apply Changes` to deploy certain code and resource changes without building a new APK. See the [Android developer guide](https://developer.android.com/studio/run#apply-changes) for more information. - -### Emulator for cross-platform development with Visual Studio - -There are many [Android emulator options](https://www.androidauthority.com/best-android-emulators-for-pc-655308/) available for Windows PCs. We recommend using the Google [Android emulator](https://developer.android.com/studio/run/emulator), as it offers access to the latest Android OS images and Google Play services. - -### Install Android emulator with Visual Studio - -1. If you don't already have it installed, download [Visual Studio 2019](https://visualstudio.microsoft.com/downloads/). Use the Visual Studio Installer to [Modify your workloads](/visualstudio/install/modify-visual-studio#modify-workloads) and ensure that you have the **Mobile development with .NET workload**. - -2. Create a new project. Once you've [set up the Android Emulator](/xamarin/android/get-started/installation/android-emulator/), you can use the [Android Device Manager](/xamarin/android/get-started/installation/android-emulator/device-manager?pivots=windows&tabs=windows#requirements) to create, duplicate, customize, and launch a variety of Android virtual devices. Launch the Android Device Manager from the Tools menu with: **Tools** > **Android** > **Android Device Manager**. - -3. Once the Android Device Manager opens, select **+ New** to create a new device. - -4. You will need to give the device a name, choose the base device type from a drop-down menu, choose a processor, and OS version, along with several other variables for the virtual device. For more information, [Android Device Manager Main Screen](/xamarin/android/get-started/installation/android-emulator/device-manager?pivots=windows&tabs=windows#main-screen). - -5. In the Visual Studio toolbar, choose between **Debug** (attaches to the application process running inside the emulator after your app starts) or **Release** mode (disables the debugger). Then choose a virtual device from the device drop-down menu and select the **Play** button ▷ to run your application in the emulator. - - ![Visual Studio launch Android Emulator](../images/vs-target-device-menu.png) - -## Additional resources - -* [Develop Dual-screen apps for Android and get the Surface Duo device SDK](/dual-screen/android/) - -* [Add Windows Defender exclusions to improve performance](defender-settings.md) diff --git a/hub/android/native-android.md b/hub/android/native-android.md deleted file mode 100644 index f4d422e8ac..0000000000 --- a/hub/android/native-android.md +++ /dev/null @@ -1,134 +0,0 @@ ---- -title: Native Android development on Windows -description: A step-by-step guide on how to get started developing Android native apps on Windows. -author: mattwojo -ms.author: mattwoj -manager: jken -ms.topic: article -keywords: android, windows, android studio, visual studio, c++ android game, windows defender, emulator, virtual device, install, java, kotlin -ms.date: 04/28/2020 ---- - -# Get started with native Android development on Windows - -This guide will get you started using Windows to create native Android applications. If you would prefer a cross-platform solution, see [Overview of Android development on Windows](./overview.md) for a brief summary of some options. - -The most straight-forward way to create a native Android app is using Android Studio with either [Java or Kotlin](#java-or-kotlin), though it is also possible to [use C or C++ for Android development](#use-c-or-c-for-android-game-development) if you have a specific purpose. The Android Studio SDK tools compile your code, data, and resource files into an archive Android package, .apk file. One APK file contains all the contents of an Android app and is the file that Android-powered devices use to install the app. - -## Install Android Studio - -Android Studio is the official integrated development environment for Google's Android operating system. [Download the latest version of Android Studio for Windows](https://developer.android.com/studio). - -- If you downloaded an .exe file (recommended), double-click to launch it. -- If you downloaded a .zip file, unpack the ZIP, copy the android-studio folder into your Program Files folder, and then open the android-studio > bin folder and launch studio64.exe (for 64-bit machines) or studio.exe (for 32-bit machines). - -Follow the setup wizard in Android Studio and install any SDK packages that it recommends. As new tools and other APIs become available, Android Studio will notify you with a pop-up, or check for updates by selecting **Help** > **Check for Update**. - -## Create a new project - -Select **File** > **New** > **New Project**. - -In the **Choose your project** window, you will be able to choose between these templates: - -- **Basic Activity**: Creates a simple app with an app bar, a floating action button and two layout files: one for the activity and one to separate out text content. - -- **Empty Activity**: Creates an empty activity and a single layout file with sample text content. - -- **Bottom Navigation Activity**: Creates a standard bottom navigation bar for an activity. For more information on this, see the Bottom Navigation Component section of the [Material Design guidelines](https://material.io/guidelines/components/bottom-navigation.html) by Google. - -- Templates are commonly used to add activities to new and existing app modules. For example, to create a login screen for your app's users, add an activity with the Login Activity template. To learn more about selecting an activity and how to add code from a template, see [Android Developer guide](https://developer.android.com/studio/projects/templates#SelectTemplate) by Google. - -> [!NOTE] -> The Android operating system is based on the idea of **components** and uses the terms **activity** and **intent** to define interactions. An **activity** represents a single, focused task that a user can do. An **activity** provides a window for building the user interface using classes based on the **View** class. There is a lifecycle for **activities** in the Android operating system, defined by six callbacks: `onCreate()`, `onStart()`, `onResume()`, `onPause()`, `onStop()`, and `onDestroy()`. The activity components interact with one another using **intent** objects. Intent either defines the activity to start or describes the type of action to perform (and the system selects the appropriate activity for you, which can even be from a different application). Learn more about Activities, the Activity Lifecycle, and Intents in the [Android Developer guide](https://developer.android.com/reference/android/app/Activity) by Google. - -### Java or Kotlin - -**Java** became a language in 1991, developed by what was then Sun Microsystems, but which is now owned by Oracle. It has become one of the most popular and powerful programming languages with one of the largest support communities in the world. Java is class-based and object-oriented, designed to have as few implementation dependencies as possible. The syntax is similar to C and C++, but it has fewer low-level facilities than either of them. - -**Kotlin** was first announced as a new open-source language by JetBrains in 2011 and has been included as an alternative to Java in Android Studio since 2017. In May 2019, Google announced Kotlin as it's preferred language for Android app developers, so despite being a newer language, it also has a strong support community and has been identified as one of the fastest growing programming languages. Kotlin is cross-platform, statically typed, and designed to interoperate fully with Java. - -Java is more widely used for a broader range of applications and offers some features that Kotlin does not, such as checked exceptions, primitive types that are not classes, static members, non-private fields, wildcard-types, and ternary-operators. Kotlin is specifically designed for and recommended by Android. It also offers some features that Java does not, such as null references controlled by the type system, no raw types, invariant arrays, proper function types (as opposed to Java's SAM-conversions), use-site variance without wildcards, smart casts, and more. Find a more in-depth look at the comparison to Java in the [Kotlin documentation](https://kotlinlang.org/docs/reference/comparison-to-java.html). - -### Minimum API Level - -You will need to decide the minimum API level for your application. This determines which version of Android your application will support. Lower API levels are older and therefore generally support more devices, but higher API levels are newer and therefor provide more features. - -![Android Studio Minimum API selection screen](../images/android-minimum-api-selection.png) - -Select the **Help me choose** link to open a comparison chart showing the device support distribution and key features associated with the platform version release. - -![Android Studio Minimum API comparison screen](../images/android-minimum-api-selection-2.png) - -### Instant app support and Androidx artifacts - -You may notice a checkbox to **Support instant apps** and another to **Use androidx artifacts** in your project creation options. The *instant apps support* is not checked and the *androidx* is checked as the recommended default. - -Google Play **Instant apps** provide a way for people to try an app or game without installing it first. These instant apps can be surfaced across the Play Store, Google Search, social networks, and anywhere you share a link. By checking the **Support instant apps** box, you are asking Android Studio to include the Google Play Instant Development SDK with your project. Learn more about Google Play Instant apps in the [Android developer guide](https://developer.android.com/topic/google-play-instant). - -**AndroidX artifacts** represents the new version of the Android support library and provides backwards-compatibility across Android releases. AndroidX provides a consistent namespace starting with the string androidx for all available packages. - -> [!NOTE] -> AndroidX is now the default library. To uncheck this box and use the previous support library requires removing the lastest Android Q SDK. See [Uncheck use Androidx artifacts](https://stackoverflow.com/questions/56580980/uncheck-use-androidx-artifacts) on StackOverflow for instructions, but first note that the former Support Library packages have been mapped into corresponding androidx.* packages. For a full mapping of all the old classes and build artifacts to the new ones, see [Migrating to AndroidX](https://developer.android.com/jetpack/androidx/migrate). - -## Project files - -The Android Studio **Project** window, contains the following files (be sure that the Android view is selected from the drop-down menu): - -**app > java > com.example.myfirstapp > MainActivity** - -The main activity and entry point for your app. When you build and run your app, the system launches an instance of this Activity and loads its layout. - -**app > res > layout > activity_main.xml** - -The XML file defining the layout for the activity's user interface (UI). It contains a TextView element with the text "Hello World" - -**app > manifests > AndroidManifest.xml** - -The manifest file describing the fundamental characteristics of the app and each of its components. - -**Gradle Scripts > build.gradle** - -There are two files with this name: "Project: My First App", for the entire project, and "Module: app", for each app module. A new project will initially only have one module. Use the module's build.file to control how the Gradle plugin builds your app. Learn more about how to configure your build in the [Android developer guide](https://developer.android.com/studio/build/index). - -## Use C or C++ for Android game development - -The Android operating system is designed to support applications written in Java or Kotlin, benefiting from tooling embedded in the system's architecture. Many system features, like Android UI and Intent handling, are only exposed through Java interfaces. There are a few instances where you may want to **use C or C++ code via the Android Native Development Kit (NDK)** despite some of the associated challenges. Game development is an example, since games typically use custom rendering logic written in OpenGL or Vulkan and benefit from a wealth of C libraries focused on game development. Using C or C++ *might* also help you squeeze extra performance out of a device to achieve low latency or run computationally intensive applications, such as physics simulations. The NDK **is not appropriate for most novice Android programmers** however. Unless you have a specific purpose for using the NDK, we recommend sticking with Java, Kotlin, or one of the [cross-platform frameworks](./overview.md). - -To create a new project with C/C++ support: - -- In the **Choose your project** section of the Android Studio wizard, select the *Native C++** project type. Select **Next**, complete the remaining fields, then select **Next** again. - -- In the **Customize C++ Support** section of the wizard, you can customize your project with the **C++ Standard** field. Use the drop-down list to select which standardization of C++ you want to use. Selecting **Toolchain Default** uses the default CMake setting. Select **Finish**. - -- Once Android Studio creates your new project, you can find a **cpp** folder in the **Project** pane that contains the native source files, headers, build scripts for CMake or ndk-build, and prebuilt libraries that are a part of your project. You can also find a sample C++ source file, `native-lib.cpp`, in the `src/main/cpp/` folder which provides a simple `stringFromJNI()` function returning the string "Hello from C++". Additionally, you should see a CMake build script, `CMakeLists.txt`, in your module's root directory required for building your native library. - -To learn more, about adding C and C++ code to your project, see the [Android developer guide](https://developer.android.com/studio/projects/add-native-code). To find Android NDK samples with C++ integration, see the [Android NDK samples repo](https://github.com/android/ndk-samples) on GitHub. To compile and run a C++ game on Android, use the [Google Play Game services API](https://developers.google.com/games/services/cpp/gettingStartedAndroid). - -## Design guidelines - -Device users expect applications to look and behave a certain way... whether swiping or tapping or using voice-controls, users will hold specific expectations for what your application should look like and how to use it. These expectations should remain consistent in order to reduce confusion and frustration. Android offers a guide to these platform and device expectations that combines the Google Material Design foundation for visual and navigational patterns, along with quality guidelines for compatibility, performance, and security. - -Learn more in the [Android design documentation](https://developer.android.com/design). - -### Fluent Design System for Android - -Microsoft also offers design guidance with the goal of providing a seamless experience across the entire portfolio of Microsoft's mobile apps. - -[Fluent Design System for Android](https://www.microsoft.com/design/fluent/#/android) -design and build custom apps that are natively Android while still uniquely Fluent. - -- [Sketch toolkit](https://aka.ms/fluenttoolkits/android/sketch) -- [Figma toolkit](https://aka.ms/fluenttoolkits/android/figma) -- [Android font](https://fonts.google.com/specimen/Roboto) -- [Android User Interface Guidelines](https://developer.android.com/design/) -- [Guidelines for Android app icons](https://developer.android.com/guide/practices/ui_guidelines/icon_design) - -## Additional resources - -- [Android Application Fundamentals](https://developer.android.com/guide/components/fundamentals) - -- [Develop Dual-screen apps for Android and get the Surface Duo device SDK](/dual-screen/android/) - -- [Add Windows Defender exclusions to improve performance](defender-settings.md) - -- [Enable Virtualization support to improve emulator performance](emulator.md#enable-virtualization-support) \ No newline at end of file diff --git a/hub/android/overview.md b/hub/android/overview.md deleted file mode 100644 index b4c12d1564..0000000000 --- a/hub/android/overview.md +++ /dev/null @@ -1,88 +0,0 @@ ---- -title: Android development on Windows -description: A guide to help you get started developing for Android on Windows. -author: mattwojo -ms.author: mattwoj -manager: jken -ms.topic: article -ms.date: 10/19/2021 ---- - -# Overview of Android development on Windows - -A guide to help you set up your development environment on a Windows 10 or Windows 11 machine for developing Android apps. Android is a trademark of Google LLC. If you're a developer interested in using Windows operating system to build apps that work on Android devices and across other device platforms, this guide is for you. - -You can also learn about using Windows Subsystem for Android™️ to update and test your Android application so that it will run on a Windows 11 device using the Amazon Appstore. [Learn more](./wsa/index.md). - -## Windows as your development environment - -There are multiple paths for developing an Android device app using the Windows operating system. These paths fall into three main types: **[Native Android development](#native-android)**, **[Cross-platform development](#cross-platform)**, and **[Android game development](#game-development)**. This overview will help you decide which development path to follow for developing an Android app and then provide [next steps](#next-steps) to help you get started using Windows to develop with: - -- [Native Android](native-android.md) -- [.NET MAUI](/dotnet/maui/what-is-maui) -- [Xamarin.Android](xamarin-android.md) -- [React Native](../dev-environment/javascript/react-native-for-android.md) -- [PWA with Cordova or Ionic](pwa.md) -- [C/C++ for game development](native-android.md#use-c-or-c-for-android-game-development) - -In addition, this guide will provide tips on using Windows to: - -- [Test on an Android device or emulator](emulator.md) -- [Update Windows Defender settings to improve performance](defender-settings.md) -- [Develop dual-screen apps for Android and get the Surface Duo device SDK](/dual-screen/android/) - -### Native Android - -[Native Android development on Windows](./native-android.md) means that your app is targeting only Android (not iOS or Windows devices). You can use [Android Studio](https://developer.android.com/studio/install#windows) or [Visual Studio](https://visualstudio.microsoft.com/vs/android/) to develop within the ecosystem designed specifically for the Android operating system. Performance will be optimized for Android devices, the user-interface look and feel will be consistent with other native apps on the device, and any features or capabilities of the user's device will be straight-forward to access and utilize. Developing your app in a native format will help it to just 'feel right' because it follows all of the interaction patterns and user experience standards established specifically for Android devices. - -### Cross-platform - -Cross-platform frameworks provide a single codebase that can (mostly) be shared between Android, iOS, and Windows devices. Using a cross-platform framework can help your app to maintain the same look, feel, and experience across device platforms, as well as benefiting from the automatic rollout of updates and fixes. Instead of needing to understand a variety of device-specific code languages, the app is developed in a shared codebase, typically in one language. - -While cross-platform frameworks aim to look and feel as close to native apps as possible, they will never be as seamlessly integrated as a natively developed app and may suffer from reduced speed and degraded performance. Additionally, the tools used to build cross-platform apps may not have all of the features offered by each different device platform, potentially requiring workarounds. - -A codebase is typically made up of **UI code**, for creating the user interface like pages, buttons controls, labels, lists, etc., and **logic code**, for calling web services, accessing a database, invoking hardware capabilities and managing state. On average, 90% of this can be reused, though there is typically some need to customize code for each device platform. This generalization largely depends on the type of app you're building, but provides a bit of context that hopefully will help with your decision-making. - -### Choosing a cross-platform framework - -[Xamarin Native (Xamarin.Android)](xamarin-android.md) - -- UI code: XML with Android Designer, and Material Theme -- Logic code: C# or F# -- Still able to tap into some native Android elements, but good for reuse of the code base for other platforms (iOS, Windows). -- Only logic code is shared across platforms, not UI code. -- Great for more complex apps with a device-specific user interface. - -[React Native](../dev-environment/javascript/react-native-for-android.md) - -- UI code: JavaScript -- Logic code: JavaScript -- The goal of React Native isn't to write the code once and run it on any platform, rather to learn-once (the React way) and write-anywhere. -- The community has added tools such as Expo and Create React Native App to help those wanting to build apps without using Xcode or Android Studio. -- Similar to Xamarin (C#), React Native (JavaScript) calls native UI elements (without the need for writing Java/Kotlin or Swift). - -[Progressive Web Apps (PWAs)](pwa.md) - -- UI code: HTML, CSS, JavaScript -- Logic code: JavaScript -- PWAs are web apps built with standard patterns to allow them to take advantage of both web and native app features. They can be built without a framework, but a couple of popular frameworks to consider are [Ionic](https://ionicframework.com/docs/intro) and [Apache Cordova](https://cordova.apache.org). -- PWAs can be installed on a device (Android, iOS, or Windows) and can work offline thanks to the incorporation of a service-worker. -- PWAs can be distributed and installed without an app store using only a web URL. The Microsoft Store and Google Play Store allow PWAs to be listed, the Apple Store currently does not, though they can still be installed on any iOS device running 12.2 or later. -- To learn more, check out this [introduction to PWAs](https://developer.mozilla.org/en-US/docs/Web/Progressive_web_apps/Introduction) on MDN. - -### Game development - -Game development for Android is often unique from developing a standard Android app since games typically use custom rendering logic, often written in OpenGL or Vulkan. For this reason, and because of the many C libraries available that support game development, it's common for developers to use [C/C++ with Visual Studio](/cpp/cross-platform/), along with the Android [Native Development Kit (NDK)](/cpp/cross-platform/create-an-android-native-activity-app), to create games for Android. [Get started with C/C++ for game development](native-android.md#use-c-or-c-for-android-game-development). - -Another common path for developing games for Android is to use a game engine. There are many free and open-source engines available, such as [Unity with Visual Studio](/visualstudio/cross-platform/visual-studio-tools-for-unity), [Unreal Engine](https://docs.unrealengine.com/en-US/Platforms/Mobile/Android/GettingStarted/index.html), [MonoGame with Xamarin](/xamarin/graphics-games/monogame/introduction/), [UrhoSharp with Xamarin](/xamarin/graphics-games/urhosharp/introduction), [SkiaSharp with Xamarin.Forms](/xamarin/xamarin-forms/user-interface/graphics/skiasharp/) CocoonJS, App Game Kit, Fusion, Corona SDK, Cocos 2d, and more. - -## Next steps - -- [Get started with native Android development on Windows](native-android.md) -- [Get started with Windows Subsystem for Android](./wsa/index.md) -- [Get started developing for Android using Xamarin.Android](xamarin-android.md) -- [Get started developing for Android using React Native](../dev-environment/javascript/react-native-for-android.md) -- [Get started developing a PWA for Android](pwa.md) -- [Develop Dual-screen apps for Android and get the Surface Duo device SDK](/dual-screen/android/) -- [Add Windows Defender exclusions to improve performance](defender-settings.md) -- [Enable Virtualization support to improve emulator performance](emulator.md#enable-virtualization-support) diff --git a/hub/android/pwa.md b/hub/android/pwa.md deleted file mode 100644 index df1cd512b8..0000000000 --- a/hub/android/pwa.md +++ /dev/null @@ -1,197 +0,0 @@ ---- -title: Create a PWA or Hybrid web app for Android -description: Get started developing Android apps using the PWA approach on Windows. -author: mattwojo -ms.author: mattwoj -manager: jken -ms.topic: article -keywords: android on windows, pwa, android, cordova, ionic, phonegap, hybrid web app -ms.date: 04/28/2020 ---- - -# Get started developing a PWA or Hybrid web app for Android - -This guide will help you to get started creating a hybrid web app or Progressive Web App (PWA) on Windows using a single HTML/CSS/JavaScript codebase that can be used on the web and across device platforms (Android, iOS, Windows). - -By using the right frameworks and components, web-based applications can work on an Android device in a way that looks to users very similar to a native app. - -## Features of a PWA or Hybrid web app - -There are two main types of web apps that can be installed on Android devices. The main difference being whether your application code is embedded in an app package (hybrid) or hosted on a web server (pwa). - -- **Hybrid web apps**: Code (HTML, JS, CSS) is packaged in an APK and can be distributed via the Google Play Store. The viewing engine is isolated from the users' internet browser, no session or cache sharing. - -- **Progressive Web Apps (PWAs)**: Code (HTML, JS, CSS) lives on the web and doesn't need to be packaged as an APK. Resources are downloaded and updated as needed using a Service Worker. The Chrome browser will render and display your app, but will look native and not include the normal browser address bar, etc. You can share storage, cache, and sessions with the browser. This is basically like installing a shortcut to the Chrome browser in a special mode. PWAs can also be listed in the Google Play Store using Trusted Web Activity. - -PWAs and hybrid web apps are very similar to a native Android app in that they: - -- Can be installed via the App Store (Google Play Store and/or Microsoft Store) -- Have access to native device features like camera, GPS, Bluetooth, notifications, and list of contacts -- Work Offline (no internet connection) - -PWAs also have a few unique features: - -- Can be installed on the Android home screen directly from the web (without an App Store) -- Can additionally be installed via the Google Play Store [using a Trusted Web Activity](https://css-tricks.com/how-to-get-a-progressive-web-app-into-the-google-play-store/) -- Can be discovered via web search or shared via a URL link -- Rely on a [Service Worker](https://developers.google.com/web/fundamentals/primers/service-workers) to avoid the need to package native code - -You don't need a framework to create a Hybrid app or PWA, but there are a few popular frameworks that will be covered in this guide, including PhoneGap (with Cordova) and Ionic (with Cordova or Capacitor using Angular or React). - -## Apache Cordova - -[Apache Cordova](https://cordova.apache.org/) is an open-source framework that can simplify the communication between your JavaScript code living in a native [WebView](https://developer.android.com/reference/android/webkit/WebView) and the native Android platform by using [plugins](https://cordova.apache.org/plugins/?platforms=cordova-android). These plugins expose JavaScript endpoints that can be called from your code and used to call native Android device APIs. Some example Cordova plugins include access to device services like battery status, file access, vibration / ring tones, etc. These features are not typically available to web apps or browsers. - -There are two popular distributions of Cordova: - -- PhoneGap: Support has been discontinued by Adobe. - -- [Ionic](https://ionicframework.com/) - -## Ionic - -[Ionic](https://ionicframework.com/) is a framework that adjusts the user interface (UI) of your app to match the design language of each platform (Android, iOS, Windows). Ionic enables you to use either [Angular](https://ionicframework.com/docs/developer-resources/guides/first-app-v4/intro) or [React](https://ionicframework.com/react). - -> [!NOTE] -> There is a new version of Ionic that uses an alternative to Cordova, called [Capacitor](https://capacitor.ionicframework.com/). This alternative uses containers to make your app [more web-friendly](https://ionicframework.com/blog/announcing-capacitor-1-0/). - -### Get started with Ionic by installing required tools - -To get started building a PWA or hybrid web app with Ionic, you should first install the following tools: - -- Node.js for interacting with the Ionic ecosystem. [Download NodeJS for Windows](https://nodejs.org/en/) or follow the [NodeJS installation guide](../dev-environment/javascript/nodejs-on-wsl.md) using Windows Subsystem for Linux (WSL). You may want to consider using [Node Version Manager (nvm)](../dev-environment/javascript/nodejs-on-wsl.md#install-nvm-nodejs-and-npm) if you will be working with multiple projects and version of NodeJS. - -- VS Code for writing your code. [Download VS Code for Windows](https://code.visualstudio.com/). You may also want to install the [WSL Remote Extension](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-wsl) if you prefer to build your app with a Linux command line. - -- Windows Terminal for working with your preferred command-line interface (CLI). [Install Windows Terminal from Microsoft Store](https://www.microsoft.com/en-us/p/windows-terminal-preview/9n0dx20hk701?activetab=pivot:overviewtab). - -- Git for version control. [Download Git](https://git-scm.com/downloads). - -## Create a new project with Ionic Cordova and Angular - -Install Ionic and Cordova by entering the following in your command line: - -```bash -npm install -g @ionic/cli cordova -``` - -Create an Ionic Angular app using the "Tabs" app template by entering the command: - -```bash -ionic start photo-gallery tabs -``` - -Change into the app folder: - -```bash -cd photo-gallery -``` - -Run the app in your web browser: - -```bash -ionic serve -``` - -For more information, see the [Ionic Cordova Angular docs](https://ionicframework.com/docs/developer-resources/guides/first-app-v4/intro). Visit the [Making your Angular app a PWA](https://ionicframework.com/docs/angular/pwa) section of the Ionic docs to learn how to move your app from being a hybrid to a PWA. - -## Create a new project with Ionic Capacitor and Angular - -Install Ionic and Cordova-Res by entering the following in your command line: - -```bash -npm install -g @ionic/cli native-run cordova-res -``` - -Create an Ionic Angular app using the "Tabs" app template and adding Capacitor by entering the command: - -```bash -ionic start photo-gallery tabs --type=angular --capacitor -``` - -Change into the app folder: - -```bash -cd photo-gallery -``` - -Add components to make the app a PWA: - -```bash -npm install @ionic/pwa-elements -``` - -Import @ionic/pwa-elements by add the following to your `src/main.ts` file: - -```typescript -import { defineCustomElements } from '@ionic/pwa-elements/loader'; - -// Call the element loader after the platform has been bootstrapped -defineCustomElements(window); -``` - -Run the app in your web browser: - -```bash -ionic serve -``` - -For more information, see the [Ionic Capacitor Angular docs](https://ionicframework.com/docs/angular/your-first-app). Visit the [Making your Angular app a PWA](https://ionicframework.com/docs/angular/pwa) section of the Ionic docs to learn how to move your app from being a hybrid to a PWA. - -## Create a new project with Ionic and React - -Install the Ionic CLI by entering the following in your command line: - -```bash -npm install -g @ionic/cli -``` - -Create a new project with React by entering the command: - -```bash -ionic start myApp blank --type=react -``` - -Change into the app folder: - -```bash -cd myApp -``` - -Run the app in your web browser: - -```bash -ionic serve -``` - -For more information, see the [Ionic React docs](https://ionicframework.com/docs/react/quickstart). Visit the [Making your React app a PWA](https://ionicframework.com/docs/react/pwa) section of the Ionic docs to learn how to move your app from being a hybrid to a PWA. - -## Test your Ionic app on a device or emulator - -To test your Ionic app on an Android device, plug-in your device ([make sure it is first enabled for development](emulator.md#enable-your-device-for-development)), then in your command line enter: - -```bash -ionic cordova run android -``` - -To test your Ionic app on an Android device emulator, you must: - -1. [Install the required components -- Java Development Kit (JDK), Gradle, and the Android SDK](https://cordova.apache.org/docs/en/latest/guide/platforms/android/#installing-the-requirements). - -2. Create an Android Virtual Device (AVD): See the [Android developer guide]](https://developer.android.com/studio/run/managing-avds.html). - -3. Enter the command for Ionic to build and deploy your app to the emulator: `ionic cordova emulate [] [options]`. In this case, the command should be: - -```bash -ionic cordova emulate android --list -``` - -See the [Cordova Emulator](https://ionicframework.com/docs/cli/commands/cordova-emulate) in the Ionic docs for more info. - -## Additional resources - -- [Develop Dual-screen apps for Android and get the Surface Duo device SDK](/dual-screen/android/) - -- [Add Windows Defender exclusions to improve performance](defender-settings.md) - -- [Enable Virtualization support to improve emulator performance](emulator.md#enable-virtualization-support) diff --git a/hub/android/wsa/index.md b/hub/android/wsa/index.md deleted file mode 100644 index 6451e20e19..0000000000 --- a/hub/android/wsa/index.md +++ /dev/null @@ -1,279 +0,0 @@ ---- -title: Windows Subsystem for Android™️ -description: Windows Subsystem for Android™️ enables your Windows 11 device to run Android applications that are available in the Amazon Appstore. Learn more about set up, device requirements, installing and uninstalling, input compatibility, testing and debugging, and using the Amazon Appstore. -author: mattwojo -ms.author: mattwoj -ms.reviewer: mousma -manager: jken -ms.topic: article -ms.date: 06/06/2023 ---- - -# Windows Subsystem for Android™️ - -Windows Subsystem for Android™️ enables your Windows 11 device to run Android applications that are available in the Amazon Appstore. Android is a trademark of Google LLC. If you're a developer interested in targeting Windows desktop devices and optimizing for the Windows operating system, this guide is for you. - -To make your Android app available on Windows 11 devices, you must: - -- [Submit your app to the Amazon Appstore](https://developer.amazon.com/apps-and-games/appstore-on-windows-11). - -For more information or support: - -- [Sign up for updates to the Amazon Appstore on Windows program](https://m.amazonappservices.com/developer-interest). -- [Visit the Amazon developer support portal](https://developer.amazon.com/apps-and-games/appstore-on-windows-11) where you can find articles, forums, FAQs, or reach out for direct support via the Appstore "Contact us" page once you set up an Amazon Developer account. - -This guide can help you test and debug your Android app on Windows: - -- [Set up your development environment](#set-up-your-development-environment), including [prerequisites](#prerequisites), [installing the Amazon Appstore](#install-the-amazon-appstore), and using the [Settings](#windows-subsystem-for-android-settings). -- [Test and debug](#test-and-debug) your app on a Windows 11 device. -- Handle input compatibility considerations for Windows devices, such as: [keyboard input](#keyboard-input), [mouse input](#mouse-input), and [window management and resizing](#window-management-and-resizing). -- [Troubleshoot and find answers](#troubleshooting-issues). - -## Developer GitHub - -Want to learn more about Windows Subsystem for Android™️ roadmap, discuss developer issues and file bugs or feature requests with the subsystem team? Visit the [Windows Subsystem for Android™️ Developers GitHub](https://github.com/microsoft/WSA). - -## Preview Program - -The Windows Subsystem for Android™️ Preview Program allows users to receive early-preview builds of the Windows Subsystem for Android™ and Amazon Appstore on Windows. For more details, visit the [Preview Program page](./preview-program.md). - -## Set up your development environment - -To test your Android app in the Windows desktop environment, a bit of set up will be required. - -### Prerequisites - -Windows Subsystem for Android™️ is available on Windows 11. Your device must meet specific requirements: [Device requirements](https://support.microsoft.com/windows/f8d0abb5-44ad-47d8-b9fb-ad6b1459ff6c). - -### Install the Amazon Appstore - -The Microsoft Store will automatically install Windows Subsystem for Android™️ silently in the background when either of the two following user actions are taken: - -1. Install the [Amazon Appstore from the Microsoft Store](https://www.microsoft.com/store/productId/9NJHK44TTKSX). Selecting **Get** will begin the installation of the app. -2. Install an Android app from the Microsoft Store for the first time, which will also install the Amazon Appstore. - -The **Amazon Appstore** app will then appear in the Windows 11 Start menu and be available on search, offering a catalogue of Android apps. The **Windows Subsystem for Android™️** app, which lets you control mobile app settings and features, will also appear in the Start menu. - -![Screenshot of Microsoft Store page featuring the Get button on the Amazon App Store](../../images/wsa-amazon-appstore-get.png) - -> [!NOTE] -> The Amazon Appstore on Windows (a requirement for running Android apps on Windows 11) is available in [select regions](https://support.microsoft.com/windows/countries-and-regions-that-support-amazon-appstore-on-windows-d8dd17c7-5994-4187-9527-ddb076f9493e?preview=true). - -## Windows Subsystem for Android™️ Settings - -To modify Windows Subsystem for Android™️ settings, go to: **Start > All Apps > Windows Subsystem for Android™️**. Learn more about specific settings app features: [Manage settings for mobile apps on Windows](https://support.microsoft.com/windows/000f97e8-8c20-490e-9ef4-cd90d903f847). - -![Screenshot of Latte app settings](../../images/wsa-settings.png) - -## Test and debug - -To test and debug your app on a Windows 11 device using the Windows Subsystem for Android™️ the following set up steps are required. - -### Enable developer mode in Windows Settings - -You must first enable developer mode. Open the **[Windows Subsystem for Android™️](#windows-subsystem-for-android-settings)** settings. Once open, enable **Developer mode** under **Advanced settings**. - -### Connect to the Windows Subsystem for Android™️ for debugging - -To connect to the Windows Subsystem for Android™️ VM for debugging: - -1. Launch an Android app that was installed using the Amazon Appstore. - -2. You can connect using adb connect with the following command (you must have [adb installed](https://developer.android.com/studio/command-line/adb)): - - ```powershell - adb connect 127.0.0.1:58526 - ``` - -### Connect to a test device - -To connect to a test device (with Windows Subsystem for Android™️ installed) on the same network from Windows/Mac: - -1. On the test device (where Windows Subsystem for Android™️ is installed) open a PowerShell window and identify the IP address of the test device by running the command: - - ```powershell - ipconfig - ``` - -2. Using the debugging device terminal where Android Studio and the Android SDK is installed (Mac/Windows), enter the command: - - ```console - adb connect :58526 - ``` - -The `` can be found in the output of "ipconfig" from the test device. You can also deploy and debug apps from Android Studio. - -To use Android Debug Bridge (ADB) to connect your development workstation directly to your Android device so you can install packages and evaluate changes, see [Android Debug Bridge in the Android Open Source Project docs](https://source.android.com/setup/build/adb). - -### Debug your app - -While apps should be installed using the Amazon Appstore, debugging an Android app on a Windows device is possible using an APK (Android application package) and adb (Android Debug Bridge). - -To debug an APK using adb: - -1. Follow the steps to connect to the Windows Subsystem for Android™️ VM above. - -2. Install the APK using the adb install command: `adb install app-debug.apk` - - Expected Output: - - ```powershell - Performing Streamed Install - Success - ``` - -3. A successful “app installed” notification will appear in the Windows notification menu and the app will launch once selected. - -### Building Universal APKs - -Windows Subsystem for Android™️ utilizes Intel Bridge Technology to enable Arm applications on x86 based processors. Arm applications will run on Arm-based processors natively. The emulation layer will induce a performance overhead – for optimal performance, submit your application for both the x86-64 and Arm64 architectures. - -## Input compatibility considerations for Windows devices - -There are a few unique input behaviors to consider that will likely require updates to your Android app code, designed for handheld devices, to be compatible when running on a Windows desktop device via the Amazon Appstore. - -### Keyboard input - -For text input fields handled by an on-screen virtual keyboard input method (or IME), such as `EditText`, apps should behave as expected. ([EditText class in the Android docs](https://developer.android.com/reference/android/widget/EditText)). - -For keystrokes that cannot be anticipated by the framework, apps will need to handle the behavior themselves. If this is already implemented in-app, no extra work is required. - -As an example, some games may already support movement facilitated via keyboard, through `w` `a` `s` `d` keys, alongside touch input. - -The following are keyboard inputs that developers should consider code updates for when building for Windows 11 devices: - -- Enter Key -- Arrow-key and Tab-key Navigation -- Change Selected Item Highlight Color -- Ctrl-based Shortcuts - -Learn more about how to optimize for these keyboard input scenarios on desktop devices by following the Android documentation: - -- [Input compatibility guide in the Android docs](https://developer.android.com/topic/arc/input-compatibility) -- [Handle keyboard input guide in the Android docs](https://developer.android.com/training/keyboard-input) -- [Use touch gestures guide in the Android docs](https://developer.android.com/training/gestures) - -### Mouse input - -Developers should consider updating code for the following mouse inputs when building for Windows devices: - -- Right Click -- Tooltips / Hover Text -- Hover Effects -- Mouse Scroll Wheel Action -- Drag and Drop - -Mouse input, similar to keyboard input, must follow the official Android app guidelines. This means using the `InputDevice` class paired with the `SOURCE_MOUSE` constant. Learn more about how to optimize for these mouse input scenarios on desktop devices by following the Android documentation: - -- [Input compatibility guide in the Android docs](https://developer.android.com/topic/arc/input-compatibility) -- [InputDevice reference in the Android docs](https://developer.android.com/reference/android/view/InputDevice) -- [SOURCE_MOUSE reference in the Android docs](https://developer.android.com/reference/android/view/InputDevice#SOURCE_MOUSE) - -## Window management and resizing - -Unlike traditional mobile form factors, Android apps running on Windows 11 can be freely resized, should be responsive in their resizing, and can be snapped using Windows actions/gestures. - -### Minimum screen requirement - -Windows 11 enforces a minimum screen requirement of 720p resolution (1280x720) with a >9” screen. - -### Letter & pillar boxing - -When the aspect ratio of a window size does not align between the device screen sizes that window is being displayed on, the result may be Letterboxing (the window is wider than it is high, or horizontally longer) or Pillarboxing (the window is more narrow than it is wide, or vertically longer). The result is bars being placed on the sides of the window in order to center it. These bars may be light- or dark-themed depending on the system settings selected. This will only occur as necessary when the Android app is snapped or maximized, allowing Android apps to take advantage of the rich snapping features in Windows and integrate into the windowing model. - -![Letterboxing and Pillarboxing example showing blank bars that center the window](../../images/letterboxing.png) - -### Additional resizing considerations - -The following should also be considered when updating an Android app to run on a Windows 11 device with respect to window management and resizing: - -- Initial launch size -- Window dimensions - - Content bounds - - Free form resizing -- Screen Orientation - -Learn more about how to optimize for window resizing scenarios on desktop devices by following the [Window Management guide in the Android docs](https://developer.android.com/topic/arc/window-management). - -## Application Lifecycle Events - -Developing Android applications for a multi-window environment has an impact on the lifecycle events that you choose to utilize in your application. While overriding the `onPause` event may achieve the results you’d like on a phone or tablet, it’s typically the wrong event to use if you’re changing your app’s UX. - -See the [Android documentation](https://developer.android.com/guide/components/activities/activity-lifecycle) for a description of the lifecycle events. More often than not, you’ll want to use the `onStop` event and not the `onPause` or `onUserLeaveHint` events. In fact, many multi-window Android implementations do not deliver the `onUserLeaveHint` notification, and thus any business critical logic that might be in that event handler will not be called on these platforms, including Windows Subsystem for Android™️. - -## VM lifecycle considerations - -Windows Subsystem for Android™️ utilizes a virtual machine (VM) which provides compatibility with the [AOSP framework](https://source.android.com/) and devices like keyboards, mice, touch, pen, etc. - -There are three possible states for the VM running apps with Windows Subsystem for Android™️: - -1. Running -2. Lightweight Doze: Activated after no app activity for 3 minutes. Deactivated by user activity or an app notification. -3. Not Running: Activated after no app activity for 7 minutes. - -Transitions between these states are triggered by user activity, such as launching or interaction with the Android app or an app notification. Android apps are paused and then stopped when their window is minimized. - -![VM lifecycle graph showing the running, lightweight doze, and not running](../../images/wsa-lifecycle.png) - -### VM Properties - -The properties for the Windows Subsystem for Android™️ VM are listed below. Hardcoding these values is not recommended as that could cause future incompatibilities. - -| Property | Value | -| --- | --- | -| Build.MANUFACTURER | Microsoft Corporation | -| Build.MODEL | Subsystem for Android(TM) | -| Build.VERSION.SDK_INT | 32 | -| Build.BOARD | windows | - -## Redirect to Windows apps - -Windows Subsystem for Android™️ automatically redirects intents for files and common URI schemes to the corresponding Windows default file/protocol handler (if multiple intent filters match, users see a "Windows default app" option in the chooser dialog). Supported file intents include [ACTION_VIEW](https://developer.android.com/reference/android/content/Intent#ACTION_VIEW), [ACTION_EDIT](https://developer.android.com/reference/android/content/Intent#ACTION_EDIT), [ACTION_SEND](https://developer.android.com/reference/android/content/Intent#ACTION_SEND), and [ACTION_SEND_MULTIPLE](https://developer.android.com/reference/android/content/Intent#ACTION_SEND_MULTIPLE), which copy the file to the Windows Downloads folder before opening it. Supported URI intents include [ACTION_VIEW](https://developer.android.com/reference/android/content/Intent#ACTION_VIEW) for the http/https schemes and [ACTION_VIEW](https://developer.android.com/reference/android/content/Intent#ACTION_VIEW) and [ACTION_SENDTO](https://developer.android.com/reference/android/content/Intent#ACTION_SENDTO) for the mailto scheme. - -Android apps can also manually redirect to Windows apps using custom URI schemes. Set the intent action to `com.microsoft.windows.LAUNCH_URI` and add a string extra to the intent named `com.microsoft.windows.EXTRA_URI` with the custom URI as the value. For example, to launch the Windows Calculator app from an Android app (Java): - -```java -Intent intent = new Intent("com.microsoft.windows.LAUNCH_URI"); -intent.putExtra("com.microsoft.windows.EXTRA_URI", "ms-calculator:"); - -try { - startActivity(intent); -} catch (ActivityNotFoundException e) { - // Not running in Windows Subsystem for Android™️ (or running on an older build that did not contain this feature). -} -``` - -## Security - -Both Windows kernel-mode drivers and Windows applications running at medium integrity level (IL) can inspect arbitrary Android containers and Android app memory. There are no plans to add detection for cheats/macro/bot/suspicious behaviors detection in the short-term. - -Developers querying `getSecurityLevel` will get `SECURITY_LEVEL_SW_SECURE_CRYPTO`. Learn more about `getSecurityLevel` in the [Android API Reference guide](https://developer.android.com/reference/android/media/MediaDrm#getSecurityLevel(byte[])). - -## Uninstalling Windows Subsystem for Android™️ - -You can uninstall the Windows Subsystem for Android™️, but note that all associated apps will also be uninstalled. - -- Uninstalling the Amazon Appstore will uninstall the Windows Subsystem for Android™️ and all other Android apps. -- Uninstalling an Amazon Appstore app will only uninstall the app (same behavior as Windows apps). -- Uninstalling the Windows Subsystem for Android™️ will uninstall the Amazon Appstore and all Android apps. - -## Troubleshooting issues - -If you encounter issues specific to the Amazon Appstore on Windows, try the following troubleshooting steps: - -1. Select **Windows search** from the Windows task bar. -2. Search for “Amazon Appstore” and right-click on the Amazon Appstore icon. -3. Select “App Settings” in the dropdown options. -4. Select “Storage and Cache” and click both “Clear Storage” and “Clear cache”. -5. Go back and select “Force Stop”. -6. Close the Amazon Appstore Settings window. -7. Relaunch the Amazon Appstore. - -For further troubleshooting steps relating to the Windows Subsystem for Android™️ Settings app or to leave feedback using Feedback Hub, see [Troubleshooting and FAQ for mobile apps on Windows](https://support.microsoft.com/windows/d6062afd-98a1-4018-a7c8-6b3b680a2ea5). - -For any other developer questions and support, use the [Windows Subsystem for Android™️ tag on Microsoft Q&A](/answers/topics/windows-subsystem-for-android.html). - -## Additional resources - -- [Apps from the Amazon Appstore](https://support.microsoft.com/en-us/windows/apps-from-the-amazon-appstore-abed2335-81bf-490a-92e5-fe01b66e5c48) -- [Accessibility on Windows Subsystem for Android™️](https://support.microsoft.com/windows/97b77924-6df9-4597-8394-15b6e34d1658) diff --git a/hub/android/wsa/preview-program.md b/hub/android/wsa/preview-program.md deleted file mode 100644 index 1b2ada5cb4..0000000000 --- a/hub/android/wsa/preview-program.md +++ /dev/null @@ -1,53 +0,0 @@ ---- -title: Windows Subsystem for Android™️ Preview Program -description: Preview Program for Windows Subsystem for Android. -author: hamza-usmani -ms.author: mousma -ms.reviewer: mattwojo -manager: aleader -ms.topic: article -ms.date: 03/07/2022 ---- - -# Windows Subsystem for Android™️ Preview Program - -The Windows Subsystem for Android™️ Preview Program allows users to receive early-preview builds of the Windows Subsystem for Android™ and Amazon Appstore on Windows. Installing the Amazon Appstore on Windows automatically installs Windows Subsystem for Android™️. Learn more about [installing the Amazon Appstore](https://support.microsoft.com/en-us/windows/install-mobile-apps-and-the-amazon-appstore-f8d0abb5-44ad-47d8-b9fb-ad6b1459ff6c). - -> [!NOTE] -> This program is separate from the Windows Insider Program and *only* enrolls your account into receiving preview builds of Windows Subsystem for Android™️. - -Preview builds may not always be stable and users may encounter issues that block apps or require workarounds. Visit [Troubleshooting and FAQ for mobile apps on Windows](https://support.microsoft.com/windows/troubleshooting-and-faq-for-mobile-apps-on-windows-d6062afd-98a1-4018-a7c8-6b3b680a2ea5) to find help and information on how to leave feedback using Windows Feedback Hub. Your feedback will be useful in improving the quality of Windows Subsystem for Android™️. - -Please note that the Windows Subsystem for Android™ may be substantially modified before it’s public release. Microsoft makes no warranties, express or implied, with respect to the information provided here. Microsoft respects your privacy: -- [Microsoft Privacy Statement](https://privacy.microsoft.com/privacystatement) -- [Microsoft Global Data Privacy Notice](https://privacy.microsoft.com/data-privacy-notice). - - -## Prerequisites - -Windows Subsystem for Android™️ is available on Windows 11. - -- Your device must meet specific requirements. [Install mobile apps and the Amazon Appstore: Device requirements](https://support.microsoft.com/windows/install-mobile-apps-and-the-amazon-appstore-f8d0abb5-44ad-47d8-b9fb-ad6b1459ff6c). -- You must have the [Amazon Appstore installed](https://support.microsoft.com/windows/install-mobile-apps-and-the-amazon-appstore-f8d0abb5-44ad-47d8-b9fb-ad6b1459ff6c) on your Windows 11 device to participate in the preview. An Amazon account is also required to download mobile apps from the Amazon Appstore. -- Windows Subsystem for Android™️ is currently available in [select countries and regions](https://support.microsoft.com/windows/countries-and-regions-that-support-amazon-appstore-on-windows-d8dd17c7-5994-4187-9527-ddb076f9493e). - -## Sign Up - -You will need a Microsoft Account (MSA) email address that you use to sign in to the Microsoft Store. If you do not yet have a Microsoft Account, [create an account here](https://account.microsoft.com/account). - -> [!div class="nextstepaction"] -> [Sign Up for Preview Program](https://aka.ms/WSAPreviewProgram) - -Once you submit your MSA email, you will see a confirmation that you have joined the program and receive a confirmation email. You will be added to a special app flight ring to receive Windows Subsystem for Android™️ preview updates. These updates will be pushed to the Amazon Appstore that you previously installed via the Microsoft Store (see prerequisites). This may take up to 7 days before you begin receiving updates. - -## Opt Out - -If you have previously joined the program and would like to stop receiving preview builds, you can opt out using the form linked below. After opting out of the program, you will receive a confirmation email. It may take up to 7 days before you are no longer in the preview program and return to receiving the general public builds. Opting out of this program will *not* opt your account out of the Windows Insider Program. - -> [!div class="nextstepaction"] -> [Opt out of the Preview Program](https://aka.ms/WSAPreviewProgramOptOut) - -## Share your feedback - -If you run into an issue while using Windows Subsystem for Android™️ or your Amazon Appstore installation, select **Windows key + F** to launch **Feedback Hub** and Use the category **Apps** > **Windows Subsystem for Android™️**. Provide as many details as possible regarding the issue to help us diagnose and resolve the problem. -For more details: [Troubleshooting and FAQ](https://support.microsoft.com/windows/troubleshooting-and-faq-for-mobile-apps-on-windows-d6062afd-98a1-4018-a7c8-6b3b680a2ea5). diff --git a/hub/android/wsa/release-notes.md b/hub/android/wsa/release-notes.md deleted file mode 100644 index e211cbcc77..0000000000 --- a/hub/android/wsa/release-notes.md +++ /dev/null @@ -1,240 +0,0 @@ ---- -title: Windows Subsystem for Android™️ Release Notes -description: Release notes for Windows Subsystem for Android. -author: mattwojo -ms.author: mattwoj -ms.reviewer: mousma -manager: jken -ms.topic: article -ms.date: 03/15/2023 ---- - -# Release Notes for Windows Subsystem for Android™️ - -These release notes are based on updates to the Windows Subsystem for Android™️. For basic information on how to install and run Android™️ apps on Windows, see the Support article: [Installing the Amazon Appstore and Android™️ Apps](https://support.microsoft.com/windows/mobile-apps-and-the-windows-subsystem-for-android-f8d0abb5-44ad-47d8-b9fb-ad6b1459ff6c). - -## Build 2304.40000.3.0 - -June 1, 2023 -- Package verification for apps on WSA: Android apps are scanned using anti-virus software installed on Windows prior to app installation. -- Ability for users to configure how much memory to assign to Android -- Android apps will be launched when a user opens the supported app link from any app (Android AppLink support) -- Linux kernel updated to 5.15.94 -- Improvements to platform reliability and performance - -## Build 2303.40000.3.0 - -April 11, 2023 - -- Picture-in-picture mode now supported -- A new "Partially running" system setting added to WSA Settings app, which runs the subsystem with minimal resources but apps launch quicker than "As needed" mode -- Linux kernel updated to 5.15.78 -- Improvements to platform reliability -- Android 13 security updates - -## Build 2302.4000 - -March 15, 2023 - -- Stability improvements to graphics card selection -- Updates to the Windows Subsystem for Android Settings app to include performance options for graphics cards -- Docking and undocking with external monitors issues fixed with the subsystem -- Fixes to apps with audio buffer issues -- Android 13 security updates - -## Build 2301.40000.4.0 - -February 9, 2023 - -- Improved audio input latency and reliability -- Improvements to camera experience (camera metadata now exposed to camera apps) -- Improvements to framerate performance: certain benchmarks have improved by 10%-20% on ARM and 40%-50% on x64 -- Fixed zooming out in apps using touchpad or mouse -- Improvements to platform reliability -- Using latest Chromium WebView to version 108 -- Synchronizing global microphone and camera privacy toggles between Windows and Android apps -- Android 13 security updates - -## Build 2211.40000.11.0 - -January 10, 2023 - -- Windows Subsystem for Android updated to Android 13 -- Improvements in boot performance -- Improvements to mouse click input -- Improvements in clipboard stability -- Improvements to application resizing -- Reliability improvements to media files opening in Windows -- Jumplist entries for applications supporting app shortcuts - -## Build 2210.40000.7.0 - -November 17, 2022 - -- Enhancement of audio recording quality -- Enhancement of OAuth scenarios -- Support for MPEG2 decoding -- Improvements to the camera experience when the device is not equipped with a camera -- Improvements in input reliability -- Chromium update to 106 - -## Build 2209.40000.26.0 - -October 20, 2022 - -- Improvements to the Camera HAL -- Improvements to clipboard stability -- Improvements to multi-threaded (>8 core) performance -- Improved security for graphic streaming -- Reliability improvements for package launches -- Security updates for ANGLE and GSK -- Annotated telemetry with package installation sources -- Window with legal information has been fixed -- Security updates to the Linux kernel -- Enhancements to platform stability -- Updated to Chromium WebView 105 - -## Build 2208.40000.4.0 - -September 15, 2022 - -- Reliability fixes for App Not Responding (ANR) errors -- Improvements to input compatibility shims -- Improvements to scrolling (smoothness) in apps -- Usability Improvements to the Windows Subsystem for Android Settings app -- Startup performance improvements -- Fixed crashes when copying and pasting extremely large content -- UX improvements for the game controls dialog -- Improvements to networking -- General graphics improvements -- Improvements for gamepad when using multiple apps -- Improved performance of uninstalling apps -- Fixed video playback issue for apps -- Updated to Chromium WebView 104 -- Linux kernel security updates - -## Build 2207.40000.8.0 - -August 31, 2022 - -- New compatibility shim to allow apps to maintain aspect ratio but still support resize -- Accessibility improvements to the Windows Subsystem for Android Settings app -- New compatibility shims in the Windows Subsystem for Android Settings app -- Fixed problems with restarting apps -- Apps that update toast notifications instead of using progress toasts have better behavior -- Game controls user education dialog for apps with compatibility shims enabled -- Improvements with handling VPN -- Scrollbar fix for Windows Subsystem for Android Settings compatibility page -- User crash data and system app crash data is now being reported -- “No internet available” toast notification is now suppressed -- Custom Android toasts now render correctly -- Amazon Appstore 60.09 update -- Android security update -- Improved reliability - -## Build 2206.40000.15.0 - -August 2, 2022 - -- New suite of shims available to toggle in the Windows Subsystem for Android Settings app which enables better experiences in several apps -- Compatibility for games with joysticks (mapped to WASD) -- Compatibility for gamepad in games -- Compatibility for aiming in games with arrow keys -- Compatibility for sliding in games with arrow keys -- Scrolling improvements -- Networking improvements -- Android minimum window size defaulted to 220dp -- Improved dialog when unsupported VPN is detected -- New toggle to view/save diagnostic data in the Windows Subsystem for Android Settings app -- Security updates -- General reliability fixes, including improvements to diagnostic sizes -- Graphics improvements - -## Build 2205.40000.14.0 - -July 6, 2022 - -- Enabled Advanced Networking functionality, including app access to local network devices for ARM -- VM IP address removed from Settings app. With Advanced Networking, now the IP address of the VM is the same as the host/computer IP -- Fixes for non-resizable app content on maximize or resizing -- Fixes for scrolling with mouse and trackpad in apps -- Android May Kernel patches -- Android windows marked secure can no longer be screenshotted -- Improve web browser launching -- Enable doze and app standby while charging for improved power saving -- ADB debug prompts redirected to Windows for improved security -- Updated to Chromium WebView 101 -- Fixes for graphics including app flickering and graphics corruption -- Fixes for video playback -- AV1 Codec support -- Enabled IPv6 and VPN Connectivity -- Increased the performance and reliability connecting to virtual WIFI in the container -- Video playback apps can now prevent the screen from turning off in Windows - -Known Issues: -- Some VPNs may not work with Advanced Networking. If you use a VPN and find Android apps do not have network connectivity, please disable Advanced Networking in the Windows Subsystem for Android Settings app - -## Build 2204.40000.19.0 - -May 20, 2022 - -- Windows Subsystem for Android updated to Android 12.1 -- Advanced networking on by default for newer x64 Windows builds -- Updated Windows Subsystem for Android Settings app: redesigned UX and diagnostics data viewer added -- Simpleperf CPU profiler recording now works with Windows Subsystem for Android -- Windows taskbar now shows which Android apps are using microphone and location -- Improvements to Android app notifications appearing as Windows notifications -- Reduced flicker when apps are restored from minimized state -- Apps are not restarted when devices come out of connected standby on recent Windows builds -- New video hardware decoding (VP8 and VP9) -- Fixes for on-screen keyboard in apps -- Fixes for full screen Android apps and auto-hidden Windows taskbar -- Windows Subsystem for Android updated with Chromium WebView 100 -- Added support for Android NetworkLocationProvider in addition to GpsLocationProvider -- Improved general stability, performance, and reliability - -Known Issues: - -- Instability with camera on ARM devices -- Instability printing via Android apps -- Some apps rendered at lower resolutions may lay out incorrectly -- Some VPNs may not work with Advanced Networking. If you use a VPN and find Android apps do not have network connectivity, please disable Advanced Networking in the Windows Subsystem for Android Settings app -- Some apps that were previously available might be missing from the experience, fail to launch, or function incorrectly for various known issues. We’re working with our partners to address these issues as soon as possible. - - -## Build 2203.40000.3.0 - -March 22, 2022. - -- H.264 Video Hardware Decoding -- Networking changes enabling future improvements in the platform -- Mail Integration with Windows email clients and Android apps -- Disabled force-enabling MSAA (Multisample anti-aliasing) -- Improved scrolling in the Amazon Appstore and Kindle apps - -Known Issues: - -- Video playback in some apps may be choppy on certain systems. -- Coming out of connected standby, apps may be restarted. - - -## Public Preview Build 1.8.32837.0 - -February 15, 2022. Windows Subsystem for Android is available for **public preview**. - -- General improvements to performance and reliability -- Full screen support for apps (via F11) -- Taking pictures with camera metadata and encoding fixed -- Improvements to the OAuth experience -- Improved screen reader support for the Amazon Appstore -- Fix for issue with file attachments not displaying an email dialog correctly -- When Windows Subsystem for Android™️ Settings subsystem resources are configured for continuous mode, the subsystem will restart at Windows boot up -- Windows Subsystem for Android™️ Settings App now includes the ability to choose GPU -- Copy and paste clipboard reliability improvements -- Fixes to camera rotation and aspect ratio -- Fixes for onscreen keyboard in apps - -Known Issues: - -- Apps coming out of modern standby may encounter issues -- Performance may vary when running multiple concurrent apps diff --git a/hub/android/xamarin-android.md b/hub/android/xamarin-android.md deleted file mode 100644 index 0b8053f3ed..0000000000 --- a/hub/android/xamarin-android.md +++ /dev/null @@ -1,221 +0,0 @@ ---- -title: Create Android app with Xamarin.Android -description: How to get started writing Android apps with Xamarin.Android -author: hickeys -ms.author: hickeys -manager: jken -ms.topic: article -keywords: android, windows, xamarin.android, tutorial, xml, axml -ms.date: 04/28/2020 ---- - -# Get started developing for Android using Xamarin.Android - -This guide will help you to get started using Xamarin.Android on Windows to create a cross-platform app that will work on Android devices. - -In this article, you will create a simple Android app using Xamarin.Android and Visual Studio 2019. - -## Requirements - -To use this tutorial, you'll need the following: - -- Windows 11 or Windows 10 -- [Visual Studio 2019: Community, Professional, or Enterprise](https://visualstudio.microsoft.com/downloads/) (see note) -- The "Mobile development with .NET" workload for Visual Studio 2019 - -> [!NOTE] -> This guide works with Visual Studio 2022, Visual Studio 2019, and Visual Studio 2017. If you're using Visual Studio 2017, some instructions might be incorrect due to UI differences between versions of Visual Studio. - -You will also need to have an Android phone or configured emulator in which to run your app. See [Configuring an Android emulator](emulator.md). - -## Create a new Xamarin.Android project - -Start Visual Studio. Select File > New > Project to create a new project. - -In the new project dialog, select the **Android App (Xamarin)** template and click **Next**. - -Name the project **TimeChangerAndroid** and click **Create**. - -In the New Cross Platform App dialog, select **Blank App**. In the **Minimum Android Version**, select **Android 5.0 (Lollipop)**. Click **OK**. - -Xamarin will create a new solution with a single project named **TimeChangerAndroid**. - -## Create a UI with Android XML - -In the **Resources\layout** directory of your project, open **activity_main.xml**. The XML in this file defines the first screen a user will see when opening TimeChanger. - -TimeChanger's UI is simple. It displays the current time and has buttons to adjust the time in increments of one hour. It uses a vertical `LinearLayout` to align the time above the buttons and a horizontal `LinearLayout` to arrange the buttons side-by-side. The content is centered in the screen by setting **android:gravity** attribute to **center** in the vertical `LinearLayout`. - -Replace the contents of **activity_main.xml** with the following code. - -```xml - - - - ``` -For more information about using system colors and resources, see [XAML theme resources](../style/xaml-theme-resources.md). +For more information about using system colors and resources, see [XAML theme resources](../../develop/platform/xaml/xaml-theme-resources.md). As long as you haven’t overridden system colors, a UWP app supports high-contrast themes by default. If a user has chosen that they want the system to use a high-contrast theme from system settings or accessibility tools, the framework automatically uses colors and style settings that produce a high-contrast layout and rendering for controls and components in the UI. diff --git a/hub/apps/design/accessibility/high-contrast-themes.md b/hub/apps/design/accessibility/high-contrast-themes.md index db8ea4bcd7..992c76357b 100644 --- a/hub/apps/design/accessibility/high-contrast-themes.md +++ b/hub/apps/design/accessibility/high-contrast-themes.md @@ -4,8 +4,8 @@ title: Contrast themes label: Contrast design guidelines keywords: template: detail.hbs -ms.date: 12/08/2021 -ms.topic: article +ms.date: 02/27/2025 +ms.topic: how-to ms.localizationpriority: medium --- @@ -81,14 +81,14 @@ This table shows the contrast theme colors and their recommended pairings. Each | Color swatch | Description | |---------|---------| -|:::image type="icon" source="images/sys-color/aquatic-color-window.png":::| **SystemColorWindowColor**
Background of pages, panes, popups, and windows.

Pair with **SystemColorWindowTextColor** | -|:::image type="icon" source="images/sys-color/aquatic-color-windowtext.png"::: | **SystemColorWindowTextColor**
Headings, body copy, lists, placeholder text, app and window borders, any UI that can't be interacted with.

Pair with **SystemColorWindowColor** | -|:::image type="icon" source="images/sys-color/aquatic-color-hotlight.png":::| **SystemColorHotlightColor**
Hyperlinks.

Pair with **SystemColorWindowColor** | -|:::image type="icon" source="images/sys-color/aquatic-color-graytext.png":::| **SystemColorGrayTextColor**
Inactive (disabled) UI.

Pair with **SystemColorWindowColor** | -|:::image type="icon" source="images/sys-color/aquatic-color-highlighttext.png":::| **SystemColorHighlightTextColor**
Foreground color for text or UI that is in selected, interacted with (hover, pressed), or in progress.

Pair with **SystemColorHighlightColor** | -|:::image type="icon" source="images/sys-color/aquatic-color-highlight.png":::| **SystemColorHighlightColor**
Background or accent color for UI that is in selected, interacted with (hover, pressed), or in progress.

Pair with **SystemColorHighlightTextColor** | -|:::image type="icon" source="images/sys-color/aquatic-color-btntext.png":::| **SystemColorButtonTextColor**
Foreground color for buttons and any UI that can be interacted with.

Pair with **SystemColorButtonFaceColor** | -|:::image type="icon" source="images/sys-color/aquatic-color-3dface.png":::| **SystemColorButtonFaceColor**
Background color for buttons and any UI that can be interacted with.

Pair with **SystemColorButtonTextColor** | +|:::image source="images/sys-color/aquatic-color-window.png" alt-text="Color swatch of SystemColorWindowColor used for background of pages, panes, popups, and windows.":::| **SystemColorWindowColor**
Background of pages, panes, popups, and windows.

Pair with **SystemColorWindowTextColor** | +|:::image source="images/sys-color/aquatic-color-windowtext.png" alt-text="Color swatch of SystemColorWindowTextColor used for headings, body copy, lists, placeholder text, app and window borders, any UI that can't be interacted with."::: | **SystemColorWindowTextColor**
Headings, body copy, lists, placeholder text, app and window borders, any UI that can't be interacted with.

Pair with **SystemColorWindowColor** | +|:::image source="images/sys-color/aquatic-color-hotlight.png" alt-text="Color swatch of SystemColorWindowTextColor used for hyperlinks.":::| **SystemColorHotlightColor**
Hyperlinks.

Pair with **SystemColorWindowColor** | +|:::image source="images/sys-color/aquatic-color-graytext.png" alt-text="Color swatch of SystemColorWindowTextColor used for inactive or disabled UI.":::| **SystemColorGrayTextColor**
Inactive or disabled UI.

Pair with **SystemColorWindowColor** | +|:::image source="images/sys-color/aquatic-color-highlighttext.png" alt-text="Color swatch of SystemColorWindowTextColor used for foreground color of text or UI that is selected, interacted with (hover, pressed), or in progress.":::| **SystemColorHighlightTextColor**
Foreground color of text or UI that is selected, interacted with (hover, pressed), or in progress.

Pair with **SystemColorHighlightColor** | +|:::image source="images/sys-color/aquatic-color-highlight.png" alt-text="Color swatch of SystemColorWindowTextColor used for background or accent color of UI that is selected, interacted with (hover, pressed), or in progress.":::| **SystemColorHighlightColor**
Background or accent color of UI that is selected, interacted with (hover, pressed), or in progress.

Pair with **SystemColorHighlightTextColor** | +|:::image source="images/sys-color/aquatic-color-btntext.png" alt-text="Color swatch of SystemColorWindowTextColor used for foreground color of buttons and any UI that can be interacted with.":::| **SystemColorButtonTextColor**
Foreground color of buttons and any UI that can be interacted with.

Pair with **SystemColorButtonFaceColor** | +|:::image source="images/sys-color/aquatic-color-3dface.png" alt-text="Color swatch of SystemColorWindowTextColor used for background color of buttons and any UI that can be interacted with.":::| **SystemColorButtonFaceColor**
Background color of buttons and any UI that can be interacted with.

Pair with **SystemColorButtonTextColor** | The next table shows how the colors appear when used on a background set to **SystemColorWindowColor**. @@ -160,7 +160,7 @@ Here are some recommendations for customizing the contrast theme colors in your > [!TIP] > It's often helpful to look at the WinUI Gallery app to see how common controls use the **SystemColor** brushes. If installed already, open them by clicking the following links: [**WinUI 3 Gallery**](winui3gallery:) or [**WinUI 2 Gallery**](winui2gallery:). > -> If they are not installed, you can download the [**WinUI 3 Gallery**](https://www.microsoft.com/store/productId/9P3JFPWWDZRC) and the [**WinUI 2 Gallery**](https://www.microsoft.com/store/productId/9MSVH128X2ZT) from the Microsoft Store. +> If they are not installed, you can download the [**WinUI 3 Gallery**](https://apps.microsoft.com/detail/9P3JFPWWDZRC) and the [**WinUI 2 Gallery**](https://apps.microsoft.com/detail/9MSVH128X2ZT) from the Microsoft Store. > > You can also get the source code for both from [GitHub](https://github.com/Microsoft/WinUI-Gallery) (use the *main* branch for WinUI 3 and the *winui2* branch for WinUI 2). @@ -174,7 +174,7 @@ In the following code snippet, we show a Grid element declared with a background ``` -Instead, we recommend using the [**{ThemeResource} markup extension**](/windows/uwp/xaml-platform/themeresource-markup-extension) to reference a color in the [**ThemeDictionaries**](/uwp/api/windows.ui.xaml.resourcedictionary.themedictionaries) collection of a [**ResourceDictionary**](/uwp/api/Windows.UI.Xaml.ResourceDictionary). This enables the automatic substitution of colors and brushes based on the user's current theme. +Instead, we recommend using the [**{ThemeResource} markup extension**](/windows/apps/develop/platform/xaml/themeresource-markup-extension) to reference a color in the [**ThemeDictionaries**](/uwp/api/windows.ui.xaml.resourcedictionary.themedictionaries) collection of a [**ResourceDictionary**](/uwp/api/Windows.UI.Xaml.ResourceDictionary). This enables the automatic substitution of colors and brushes based on the user's current theme. ```xaml @@ -249,11 +249,10 @@ The following code snippet (from an App.xaml file) shows an example [**ThemeDict ## Examples -> [!TIP] > [!div class="nextstepaction"] -> [Open the WinUI 3 Gallery app and see color contrast accessibility support in action](winui3gallery://item/AccessibilityColorContrast). +> [Open the WinUI 3 Gallery app and see color contrast accessibility support in action](winui3gallery://item/AccessibilityColorContrast) -> The **WinUI 3 Gallery** app includes interactive examples of most WinUI 3 controls, features, and functionality. Get the app from the [Microsoft Store](https://www.microsoft.com/store/productId/9P3JFPWWDZRC) or get the source code on [GitHub](https://github.com/microsoft/WinUI-Gallery) +[!INCLUDE [winui-3-gallery](../../../includes/winui-3-gallery.md)] ## Related topics diff --git a/hub/apps/design/accessibility/keyboard-accessibility.md b/hub/apps/design/accessibility/keyboard-accessibility.md index 216ffc18e1..34c0b81ae6 100644 --- a/hub/apps/design/accessibility/keyboard-accessibility.md +++ b/hub/apps/design/accessibility/keyboard-accessibility.md @@ -4,32 +4,29 @@ ms.assetid: DDAE8C4B-7907-49FE-9645-F105F8DFAD8B title: Keyboard accessibility label: Keyboard accessibility template: detail.hbs -ms.date: 02/08/2017 +ms.date: 06/07/2024 ms.topic: article keywords: windows 10, uwp ms.localizationpriority: medium --- -# Keyboard accessibility +# Keyboard accessibility +Building keyboard accessibility (for traditional, modified, or keyboard emulation hardware) into your app, provides users who are blind, have low vision, motor disabilities, or have little or no use of their hands, the ability to navigate through and use the full functionality of your app. In addition, users without disabilities might choose the keyboard for navigation due to preference or efficiency. +If your app does not provide good keyboard access, users who are blind or have mobility issues might have difficulty using your app. -If your app does not provide good keyboard access, users who are blind or have mobility issues can have difficulty using your app or may not be able to use it at all. +## Keyboard navigation among UI elements - - - +To interact with a control using the keyboard, the control must have focus. To receive focus (without using a pointer), the control must be accessible through tab navigation. By default, the tab order of controls is the same as the order in which they are added to a design surface, declared in XAML, or programmatically added to a container. -## Keyboard navigation among UI elements -To use the keyboard with a control, the control must have focus, and to receive focus (without using a pointer) the control must be accessible in a UI design via tab navigation. By default, the tab order of controls is the same as the order in which they are added to a design surface, listed in XAML, or programmatically added to a container. +Typically, the default tab order is based on how controls are defined in XAML, particularly as that is the order in which the controls are traversed by screen readers. However, the default order does not necessarily correspond to the visual order. The actual display position might depend on the parent layout container and various properties of child elements that can affect the layout. -In most cases, the default order based on how you defined controls in XAML is the best order, especially because that is the order in which the controls are read by screen readers. However, the default order does not necessarily correspond to the visual order. The actual display position might depend on the parent layout container and certain properties that you can set on the child elements to influence the layout. To be sure your app has a good tab order, test this behavior yourself. Especially if you have a grid metaphor or table metaphor for your layout, the order in which users might read versus the tab order could end up different. That's not always a problem in and of itself. But just make sure to test your app's functionality both as a touchable UI and as a keyboard-accessible UI and verify that your UI makes sense either way. +To ensure your app has an optimal tab order, test the behavior yourself. If you use a grid or table for your layout, the order in which users might read the screen versus the tab order could be very different. This isn't always a problem, but just make sure to test your app's functionality through both touch and keyboard to verify that your UI is optimized for both input methods. -You can make the tab order match the visual order by adjusting the XAML. Or you can override the default tab order by setting the [**TabIndex**](/uwp/api/windows.ui.xaml.controls.control.tabindex) property, as shown in the following example of a [**Grid**](/uwp/api/Windows.UI.Xaml.Controls.Grid) layout that uses column-first tab navigation. +You can make the tab order match the visual order by either adjusting the XAML or overriding the default tab order. THe following example shows how to use the [**TabIndex**](/uwp/api/windows.ui.xaml.controls.control.tabindex) property with a [**Grid**](/uwp/api/Windows.UI.Xaml.Controls.Grid) layout that uses column-first tab navigation. -XAML -```xml - +```xaml ... ... @@ -47,19 +44,21 @@ XAML ``` -You may want to exclude a control from the tab order. You typically do this only by making the control noninteractive, for example by setting its [**IsEnabled**](/uwp/api/windows.ui.xaml.controls.control.isenabled) property to **false**. A disabled control is automatically excluded from the tab order. But occasionally you might want to exclude a control from the tab order even if it is not disabled. In this case, you can set the [**IsTabStop**](/uwp/api/windows.ui.xaml.controls.control.istabstop) property to **false**. +In some cases, you might want to exclude a specific control from the tab order. This is typically accomplished by making the control noninteractive by setting its [**IsEnabled**](/uwp/api/windows.ui.xaml.controls.control.isenabled) property to **false**. A disabled control is automatically excluded from the tab order. + +If you want to exclude an interactive control from the tab order, you can set the [**IsTabStop**](/uwp/api/windows.ui.xaml.controls.control.istabstop) property to **false**. -Any elements that can have focus are usually in the tab order by default. The exception to this is that certain text-display types such as [**RichTextBlock**](/uwp/api/Windows.UI.Xaml.Controls.RichTextBlock) can have focus so that they can be accessed by the clipboard for text selection; however, they're not in the tab order because it is not expected for static text elements to be in the tab order. They're not conventionally interactive (they can't be invoked, and don't require text input, but do support the [Text control pattern](/windows/desktop/WinAuto/uiauto-controlpatternsoverview) that supports finding and adjusting selection points in text). Text should not have the connotation that setting focus to it will enable some action that's possible. Text elements will still be detected by assistive technologies, and read aloud in screen readers, but that relies on techniques other than finding those elements in the practical tab order. +By default, UI elements that support focus are typically included in the tab order. Some exceptions to this include certain text-display types (such as [**RichTextBlock**](/uwp/api/Windows.UI.Xaml.Controls.RichTextBlock)) that support focus for text selection and clipboard access but are not in the tab order because they are static text elements. These controls are not conventionally interactive (they can't be invoked, and don't require text input, but do support the [Text control pattern](/windows/desktop/WinAuto/uiauto-controlpatternsoverview) that supports finding and adjusting selection points in text). Text controls will still be detected by assistive technologies, and read aloud in screen readers, but that relies on techniques other than tab order. Whether you adjust [**TabIndex**](/uwp/api/windows.ui.xaml.controls.control.tabindex) values or use the default order, these rules apply: -- If [**TabIndex**](/uwp/api/windows.ui.xaml.controls.control.tabindex) is not set on an element, the default value used is [Int32.MaxValue](/dotnet/api/system.int32.maxvalue) and the tab order is based on declaration order in the XAML or child collections. +- If [**TabIndex**](/uwp/api/windows.ui.xaml.controls.control.tabindex) is not set on an element, the default value is [Int32.MaxValue](/dotnet/api/system.int32.maxvalue) and the tab order is based on declaration order in the XAML or child collections. - If [**TabIndex**](/uwp/api/windows.ui.xaml.controls.control.tabindex) is set on an element: - UI elements with [**TabIndex**](/uwp/api/windows.ui.xaml.controls.control.tabindex) equal to 0 are added to the tab order based on declaration order in XAML or child collections. - UI elements with [**TabIndex**](/uwp/api/windows.ui.xaml.controls.control.tabindex) greater than 0 are added to the tab order based on the **TabIndex** value. - - UI elements with [**TabIndex**](/uwp/api/windows.ui.xaml.controls.control.tabindex) less than 0 are added to the tab order and appear before any zero value. This potentially differs from HTML's handling of its **tabindex** attribute (and negative **tabindex** was not supported in older HTML specifications). + - UI elements with [**TabIndex**](/uwp/api/windows.ui.xaml.controls.control.tabindex) less than 0 are added to the tab order and appear before any zero value. -For example, the following snippet shows a collection of elements with varying TabIndex settings (B is assigned the value of [Int32.MaxValue](/dotnet/api/system.int32.maxvalue), or 2,147,483,647). +The following code snippet shows a collection of elements with various [**TabIndex**](/uwp/api/windows.ui.xaml.controls.control.tabindex) settings (`B` is assigned the value of [Int32.MaxValue](/dotnet/api/system.int32.maxvalue), or 2,147,483,647). ```xaml @@ -85,22 +84,48 @@ This results in the following tab order: 1. B 1. C +### Keyboard navigation between application panes with F6 + +An application pane is a logical area of prominent, related UI within an application window (for example, Microsoft Edge panes include the address bar, the bookmark bar, the tab bar, and the content panel). The F6 key can be used to navigate between these panes, where groups of child elements can then be accessed using standard keyboard navigation. + +While keyboard navigation can provide an accessibly-compliant UI, making an accessibly-*usable* UI often require a few more steps. Typically, this includes: + +- Listening to **F6** to navigate between important sections of your UI. +- Adding **keyboard shortcuts** for common actions in your UI. +- Adding **access keys** to important controls in your UI. + +See [Keyboard shortcuts](#keyboard-shortcuts) below and [Access keys](../input/access-keys.md) for more guidance about implementing shortcuts and access keys. + +#### Optimize for F6 + +F6 lets keyboard users efficiently navigate between panes of UI without tabbing through potentially hundreds of controls. + +For example, F6 in Microsoft Edge cycles between the address bar, the bookmark bar, the tab bar, and the content panel. As a web page can potentially have hundreds of tabable controls, F6 can make it easier for keyboard users to reach the tab bar and address bar without using application-specific shortcuts. + +The F6 tab cycle can also loosely correspond to [landmarks or headings](landmarks-and-headings.md) in content, though it doesn't need to match exactly. F6 should focus on large, distinct regions in your UI, whereas landmarks can be more granular. For example, you might mark an app bar and its search box as landmarks, but only include the app bar itself in the F6 cycle. + +> [!IMPORTANT] +> You must implement F6 navigation in your app as it is not supported natively. + +Where possible, regions in the F6 cycle should have an accessible name: either through a landmark or by manually adding an [**AutomationProperties.Name**](/uwp/api/windows.ui.xaml.automation.automationproperties.nameproperty) to the "root" element of the region. + +**Shift-F6** should cycle in the opposite direction. + ## Keyboard navigation within a UI element -For composite elements, it is important to ensure proper inner navigation among the contained elements. A composite element can manage its current active child to reduce the overhead of having all child elements able to have focus. Such a composite element is included in the tab order, and it handles keyboard navigation events itself. Many of the composite controls already have some inner navigation logic built into the into control's event handling. For example, arrow-key traversal of items is enabled by default on the [**ListView**](/uwp/api/Windows.UI.Xaml.Controls.ListView), [**GridView**](/uwp/api/windows.ui.xaml.controls.gridview), [**ListBox**](/uwp/api/Windows.UI.Xaml.Controls.ListBox) and [**FlipView**](/uwp/api/Windows.UI.Xaml.Controls.FlipView) controls. +For composite controls, it is important to ensure proper inner navigation among the contained elements. A composite control can manage the currently active child element to reduce the overhead of having all child elements support focus. The composite control is included in the tab order and handles keyboard navigation events itself. Many composite controls already have some inner navigation logic built into their event handling. For example, arrow-key traversal of items is enabled by default on the [**ListView**](/uwp/api/Windows.UI.Xaml.Controls.ListView), [**GridView**](/uwp/api/windows.ui.xaml.controls.gridview), [**ListBox**](/uwp/api/Windows.UI.Xaml.Controls.ListBox) and [**FlipView**](/uwp/api/Windows.UI.Xaml.Controls.FlipView) controls. ## Keyboard alternatives to pointer actions and events for specific control elements -Ensure that UI elements that can be clicked can also be invoked by using the keyboard. To use the keyboard with a UI element, the element must have focus. Only classes that derive from [**Control**](/uwp/api/Windows.UI.Xaml.Controls.Control) support focus and tab navigation. +UI elements that can be clicked should also be invokable through the keyboard. To use the keyboard with a UI element, the element must have focus (only classes that derive from [**Control**](/uwp/api/Windows.UI.Xaml.Controls.Control) support focus and tab navigation). -For UI elements that can be invoked, implement keyboard event handlers for the Spacebar and Enter keys. This makes the basic keyboard accessibility support complete and enables users to accomplish basic app scenarios by using only the keyboard; that is, users can reach all interactive UI elements and activate the default functionality. +For UI elements that can be invoked, implement keyboard event handlers for the Spacebar and Enter keys. This ensures basic keyboard accessibility support and lets users reach all interactive UI elements and activate functionality by using the keyboard only. -In cases where an element that you want to use in the UI cannot have focus, you could create your own custom control. You must set the [**IsTabStop**](/uwp/api/windows.ui.xaml.controls.control.istabstop) property to **true** to enable focus and you must provide a visual indication of the focused state by creating a visual state that decorates the UI with a focus indicator. However, it is often easier to use control composition so that the support for tab stops, focus, and Microsoft UI Automation peers and patterns are handled by the control within which you choose to compose your content. +Where an element does not support focus, you can create your own custom control. In this case, to enable focus, you must set the [**IsTabStop**](/uwp/api/windows.ui.xaml.controls.control.istabstop) property to **true** and you must provide a visual indication of the focused visual state with a focus indicator. -For example, instead of handling a pointer-pressed event on an [**Image**](/uwp/api/Windows.UI.Xaml.Controls.Image), you could wrap that element in a [**Button**](/uwp/api/Windows.UI.Xaml.Controls.Button) to get pointer, keyboard, and focus support. +However, it can be easier to use control composition so that the support for tab stops, focus, and Microsoft UI Automation peers and patterns are handled by the control within which you choose to compose your content. For example, instead of handling a pointer-pressed event on an [**Image**](/uwp/api/Windows.UI.Xaml.Controls.Image), wrap that element in a [**Button**](/uwp/api/Windows.UI.Xaml.Controls.Button) to get pointer, keyboard, and focus support. -XAML -```xml +```xaml @@ -108,25 +133,22 @@ XAML ``` - - +## Keyboard shortcuts -## Keyboard shortcuts -In addition to implementing keyboard navigation and activation for your app, it is a good practice to implement shortcuts for your app's functionality. Tab navigation provides a good, basic level of keyboard support, but with complex forms you may want to add support for shortcut keys as well. This can make your application more efficient to use, even for people who use both a keyboard and pointing devices. +In addition to implementing keyboard navigation and activation, it is also good practice to implement keyboard shortcuts such as [keyboard accelerators](../input/keyboard-accelerators.md) and [access keys](../input/access-keys.md) for important or frequently used functionality. -A *shortcut* is a keyboard combination that enhances productivity by providing an efficient way for the user to access app functionality. There are two kinds of shortcut: +A *shortcut* is a keyboard combination that provides an efficient way for the user to access app functionality. There are two kinds of shortcut: -* An *access key* is a shortcut to a piece of UI in your app. Access keys consist of the Alt key plus a letter key. -* An *accelerator key* is a shortcut to an app command. Your app may or may not have UI that corresponds exactly to the command. Accelerator keys consist of the Ctrl key plus a letter key. +- *Accelerators* are shortcuts that invoke an app command. Your app may or may not provide specific UI that corresponds to the command. Accelerators typically consist of the Ctrl key plus a letter key. +- *Access keys* are shortcuts that set focus to specific UI in your application. Access keys typicaly consist of the Alt key plus a letter key. -It is imperative that you provide an easy way for users who rely on screen readers and other assistive technology to discover your app's shortcut keys. Communicate shortcut keys by using tooltips, accessible names, accessible descriptions, or some other form of on-screen communication. At a minimum, shortcut keys should be well documented in your app's Help content. +Always provide an easy way for users who rely on screen readers and other assistive technology to discover your app's shortcut keys. Communicate shortcut keys by using tooltips, accessible names, accessible descriptions, or some other form of on-screen communication. At a minimum, shortcut keys should be well documented in your app's Help content. You can document access keys through screen readers by setting the [**AutomationProperties.AccessKey**](/uwp/api/windows.ui.xaml.automation.automationproperties.accesskeyproperty) attached property to a string that describes the shortcut key. There is also an [**AutomationProperties.AcceleratorKey**](/uwp/api/windows.ui.xaml.automation.automationproperties.acceleratorkeyproperty) attached property for documenting non-mnemonic shortcut keys, although screen readers generally treat both properties the same way. Try to document shortcut keys in multiple ways, using tooltips, automation properties, and written Help documentation. The following example demonstrates how to document shortcut keys for media play, pause, and stop buttons. -XAML -```xml +```xaml @@ -162,38 +184,31 @@ XAML ``` > [!IMPORTANT] -> Setting the [**AutomationProperties.AcceleratorKey**](/uwp/api/windows.ui.xaml.automation.automationproperties.acceleratorkeyproperty) or [**AutomationProperties.AccessKey**](/uwp/api/windows.ui.xaml.automation.automationproperties.accesskeyproperty) doesn't enable keyboard functionality. It only reports to the UI Automation framework what keys should be used, so that such information can be passed on to users via assistive technologies. The implementation for key handling still needs to be done in code, not XAML. You will still need to attach handlers for [**KeyDown**](/uwp/api/windows.ui.xaml.uielement.keydown) or [**KeyUp**](/uwp/api/windows.ui.xaml.uielement.keyup) events on the relevant control in order to actually implement the keyboard shortcut behavior in your app. Also, the underline text decoration for an access key is not provided automatically. You must explicitly underline the text for the specific key in your mnemonic as inline [**Underline**](/uwp/api/Windows.UI.Xaml.Documents.Underline) formatting if you wish to show underlined text in the UI. +> Setting the [**AutomationProperties.AcceleratorKey**](/uwp/api/windows.ui.xaml.automation.automationproperties.acceleratorkeyproperty) or [**AutomationProperties.AccessKey**](/uwp/api/windows.ui.xaml.automation.automationproperties.accesskeyproperty) doesn't enable keyboard functionality. This only indicates what keys should be used to the UI Automation framework and then can be passed on to users via assistive technologies. + +Key handling is implemented in code-behind, not XAML. You still need to attach handlers for [**KeyDown**](/uwp/api/windows.ui.xaml.uielement.keydown) or [**KeyUp**](/uwp/api/windows.ui.xaml.uielement.keyup) events on the relevant control in order to actually implement the keyboard shortcut behavior in your app. Also, the underline text decoration for an access key is not provided automatically. You must explicitly underline the text for the specific key in your mnemonic as inline [**Underline**](/uwp/api/Windows.UI.Xaml.Documents.Underline) formatting if you wish to show underlined text in the UI. For simplicity, the preceding example omits the use of resources for strings such as "Ctrl+A". However, you must also consider shortcut keys during localization. Localizing shortcut keys is relevant because the choice of key to use as the shortcut key typically depends on the visible text label for the element. For more guidance about implementing shortcut keys, see [Shortcut keys](/windows/win32/uxguide/inter-keyboard) in the Windows User Experience Interaction Guidelines. - - - +### Implementing a key event handler -### Implementing a key event handler -Input events such as the key events use an event concept called *routed events*. A routed event can bubble up through the child elements of a composited control, such that a common control parent can handle events for multiple child elements. This event model is convenient for defining shortcut key actions for a control that contains several composite parts that by design cannot have focus or be part of the tab order. +Input events (such as the key events) use an event concept called *routed events*. A routed event can bubble up through the child elements of a parent composite control, such that the parent control can handle events for multiple child elements. This event model is convenient for defining shortcut key actions for a control that contains several child elements, none of which can have focus or be part of the tab order. For example code that shows how to write a key event handler that includes checking for modifiers such as the Ctrl key, see [Keyboard interactions](../input/keyboard-interactions.md). - - - +## Keyboard navigation for custom controls -## Keyboard navigation for custom controls -We recommend the use of arrow keys as keyboard shortcuts for navigating among child elements, in cases where the child elements have a spacial relationship to each other. If tree-view nodes have separate sub-elements for handling expand-collapse and node activation, use the left and right arrow keys to provide keyboard expand-collapse functionality. If you have an oriented control that supports directional traversal within the control content, use the appropriate arrow keys. +We recommend using the arrow keys as keyboard shortcuts for navigating among child elements in cases where the child elements have a spacial relationship to each other. If tree-view nodes have separate sub-elements for handling expand-collapse and node activation, use the left and right arrow keys to provide keyboard expand-collapse functionality. If you have an oriented control that supports directional traversal within the control content, use the appropriate arrow keys. -Generally you implement custom key handling for custom controls by including an override of [**OnKeyDown**](/uwp/api/windows.ui.xaml.controls.control.onkeydown) and [**OnKeyUp**](/uwp/api/windows.ui.xaml.controls.control.onkeyup) methods as part of the class logic. +Generally you implement custom key handling for custom controls by including an override of the [**OnKeyDown**](/uwp/api/windows.ui.xaml.controls.control.onkeydown) and [**OnKeyUp**](/uwp/api/windows.ui.xaml.controls.control.onkeyup) methods as part of the class logic. - - - +## An example of a visual state for a focus indicator -## An example of a visual state for a focus indicator -We mentioned earlier that any custom control that enables the user to focus it should have a visual focus indicator. Usually that focus indicator is as simple as drawing a rectangle shape immediately around the control's normal bounding rectangle. The [**Rectangle**](/uwp/api/Windows.UI.Xaml.Shapes.Rectangle) for visual focus is a peer element to the rest of the control's composition in a control template, but is initially set with a [**Visibility**](/uwp/api/windows.ui.xaml.uielement.visibility) value of **Collapsed** because the control isn't focused yet. Then, when the control does get focus, a visual state is invoked that specifically sets the **Visibility** of the focus visual to **Visible**. Once focus is moved elsewhere, another visual state is called, and the **Visibility** becomes **Collapsed**. +As mentioned earlier, any custom control that supports focus should have a visual focus indicator. Typically, that focus indicator is just a rectangle outlining the bounding rectangle of the control. The [**Rectangle**](/uwp/api/Windows.UI.Xaml.Shapes.Rectangle) for visual focus is a peer element to the rest of the control's composition in a control template, but is initially set with a [**Visibility**](/uwp/api/windows.ui.xaml.uielement.visibility) value of **Collapsed** because the control isn't focused yet. When the control does get focus, a visual state is invoked that specifically sets the **Visibility** of the focus visual to **Visible**. Once focus is moved elsewhere, another visual state is called, and the **Visibility** becomes **Collapsed**. -All of the default XAML controls will display an appropriate visual focus indicator when focused (if they can be focused). There are also potentially different looks depending on the user's selected theme (particularly if the user is using a high contrast mode.) If you're using the XAML controls in your UI and not replacing the control templates, you don't need to do anything extra to get visual focus indicators on controls that behave and display correctly. But if you're intending to retemplate a control, or if you're curious about how XAML controls provide their visual focus indicators, the remainder of this section explains how this is done in XAML and in the control logic. +All focusable XAML controls display an appropriate visual focus indicator when focused. The user's selected them can also affect the indicator appearance (particularly if the user is using a high contrast mode). If you're using the XAML controls in your UI (and are not replacing the control templates), you don't need to do anything extra to get default visual focus indicators. However, if you intend to retemplate a control, or if you're curious about how XAML controls provide their visual focus indicators, the remainder of this section explains how this is done in XAML and the control logic. Here's some example XAML that comes from the default XAML template for a [**Button**](/uwp/api/Windows.UI.Xaml.Controls.Button). @@ -223,8 +238,7 @@ XAML So far this is just the composition. To control the focus indicator's visibility, you define visual states that toggle the [**Visibility**](/uwp/api/windows.ui.xaml.uielement.visibility) property. This is done using the [VisualStateManager](/uwp/api/Windows.UI.Xaml.VisualStateManager) and the VisualStateManager.VisualStateGroups attached property, as applied to the root element that defines the composition. -XAML -```xml +```xaml @@ -250,30 +264,22 @@ XAML ``` -Note how only one of the named states adjusts [**Visibility**](/uwp/api/windows.ui.xaml.uielement.visibility) directly whereas the others are seemingly empty. The way that visual states work is that as soon as the control uses another state from the same [**VisualStateGroup**](/uwp/api/Windows.UI.Xaml.VisualStateGroup), any animations applied by the previous state are immediately canceled. Because the default **Visibility** from composition is **Collapsed**, this means the rectangle will not appear. The control logic controls this by listening for focus events like [**GotFocus**](/uwp/api/windows.ui.xaml.uielement.gotfocus) and changing the states with [**GoToState**](/uwp/api/windows.ui.xaml.visualstatemanager.gotostate). Often this is already handled for you if you are using a default control or customizing based on a control that already has that behavior. - - - - - -## Keyboard accessibility and Windows Phone -A Windows Phone device typically doesn't have a dedicated, hardware keyboard. However, a Soft Input Panel (SIP) can support several keyboard accessibility scenarios. Screen readers can read text input from the **Text** SIP, including announcing deletions. Users can discover where their fingers are because the screen reader can detect that the user is scanning keys, and it reads the scanned key name aloud. Also, some of the keyboard-oriented accessibility concepts can be mapped to related assistive technology behaviors that don't use a keyboard at all. For example, even though a SIP won't include a Tab key, Narrator supports a touch gesture that's the equivalent of pressing the Tab key, so having a useful tab order through the controls in a UI is still an important accessibility principle. Arrow keys as used for navigating the parts within complex controls are also supported through Narrator touch gestures. Once focus has reached a control that's not for text input, Narrator supports a gesture that invokes that control's action. +Note how only one of the named states adjusts [**Visibility**](/uwp/api/windows.ui.xaml.uielement.visibility) directly whereas the others are apparently empty. With visual states, as soon as the control uses another state from the same [**VisualStateGroup**](/uwp/api/Windows.UI.Xaml.VisualStateGroup), any animations applied by the previous state are immediately canceled. Because the default **Visibility** from composition is **Collapsed**, the rectangle will not appear. The control logic controls this by listening for focus events like [**GotFocus**](/uwp/api/windows.ui.xaml.uielement.gotfocus) and changing the states with [**GoToState**](/uwp/api/windows.ui.xaml.visualstatemanager.gotostate). Often this is already handled for you if you are using a default control or customizing based on a control that already has that behavior. -Keyboard shortcuts aren't typically relevant for Windows Phone apps, because a SIP won't include Control or Alt keys. +## Keyboard accessibility and devices without a hardware keyboard - +Some devices don't have a dedicated, hardware keyboard and rely on a Soft Input Panel (SIP) instead. Screen readers can read text input from the **Text** SIP and users can discover where their fingers are because the screen reader can detect that the user is scanning keys, and reads the scanned key name aloud. Also, some of the keyboard-oriented accessibility concepts can be mapped to related assistive technology behaviors that don't use a keyboard at all. For example, even though a SIP won't include a Tab key, Narrator supports a touch gesture that's the equivalent of pressing the Tab key, so having a useful tab order through the controls in a UI is still crtical for accessibility. Narrator also supports many other touch gestures, including arrow keys for navigating within complex controls (see [Narrator keyboard commands and touch gestures](https://support.microsoft.com/en-us/windows/appendix-b-narrator-keyboard-commands-and-touch-gestures-8bdab3f4-b3e9-4554-7f28-8b15bd37410a)). ## Examples -> [!TIP] > [!div class="nextstepaction"] -> [Open the WinUI 3 Gallery app and see keyboard accessibility support in action](winui3gallery://item/AccessibilityKeyboard). +> [Open the WinUI 3 Gallery app and see keyboard accessibility support in action](winui3gallery://item/AccessibilityKeyboard) -> The **WinUI 3 Gallery** app includes interactive examples of most WinUI 3 controls, features, and functionality. Get the app from the [Microsoft Store](https://www.microsoft.com/store/productId/9P3JFPWWDZRC) or get the source code on [GitHub](https://github.com/microsoft/WinUI-Gallery) +[!INCLUDE [winui-3-gallery](../../../includes/winui-3-gallery.md)] ## Related topics -* [Accessibility](accessibility.md) -* [Keyboard interactions](../input/keyboard-interactions.md) -* [Touch keyboard sample](https://github.com/Microsoft/Windows-universal-samples/tree/master/Samples/TouchKeyboard) -* [XAML accessibility sample](https://github.com/microsoftarchive/msdn-code-gallery-microsoft/tree/411c271e537727d737a53fa2cbe99eaecac00cc0/Official%20Windows%20Platform%20Sample/XAML%20accessibility%20sample) +- [Accessibility](accessibility.md) +- [Keyboard interactions](../input/keyboard-interactions.md) +- [Touch keyboard sample](https://github.com/Microsoft/Windows-universal-samples/tree/master/Samples/TouchKeyboard) +- [XAML accessibility sample](https://github.com/microsoftarchive/msdn-code-gallery-microsoft/tree/411c271e537727d737a53fa2cbe99eaecac00cc0/Official%20Windows%20Platform%20Sample/XAML%20accessibility%20sample) diff --git a/hub/apps/design/accessibility/landmarks-and-headings.md b/hub/apps/design/accessibility/landmarks-and-headings.md index 49244d92ad..b14721226c 100644 --- a/hub/apps/design/accessibility/landmarks-and-headings.md +++ b/hub/apps/design/accessibility/landmarks-and-headings.md @@ -4,7 +4,7 @@ ms.assetid: 019CC63D-D915-4EBD-9442-DE899AB973C9 title: Landmarks and Headings label: Landmarks and Headings template: detail.hbs -ms.date: 01/24/2018 +ms.date: 12/22/2023 ms.topic: article keywords: windows 10, uwp ms.localizationpriority: medium @@ -12,30 +12,46 @@ ms.localizationpriority: medium # Landmarks and Headings -A user interface is typically organized in a visually efficient way, allowing a sighted user to quickly skim for what interests them without having to slow down to read *all* the content. A screen reader user needs to have this same skimming ability. Landmarks and headings define sections of a user interface that aid in more efficient navigation for users of assistive technology (AT). Marking up the content into landmarks and headings provides a screen reader user the option to skim content similar to the way a sighted user would. +**Landmarks** and **headings** help users of assistive technology (AT) navigate a UI more efficiently by uniquely identifying different sections of a user interface. -The concepts of [ARIA landmarks](https://www.w3.org/WAI/GL/wiki/Using_ARIA_landmarks_to_identify_regions_of_a_page), [ARIA headings](https://www.w3.org/TR/WCAG20-TECHS/ARIA12.html), and [HTML headings](https://www.w3.org/TR/2016/NOTE-WCAG20-TECHS-20161007/H42.html) have been used in web content for years to allow faster navigation by screen reader users. Web pages utilize landmarks and headings to make their content more usable by allowing the AT user to quickly get to the large chunk (landmark) and smaller chunk (heading). Specifically, screen readers have commands allowing users to jump between landmarks and jump between headings (next/previous or specific heading level). It is important to consider landmarks and headings in your apps for the same reasons. +## Overview -Landmarks enable content to be grouped into various categories such as search, navigation, main content, and so on. Once grouped, the AT user can quickly navigate between the groups. This quick navigation allows the user to skip potentially substantial amounts of content which previously may have had to be navigated over item by item making for a poor experience. +A user interface is typically organized in a visually efficient way, allowing a sighted user to quickly skim for what interests them without having to slow down to read *all* the content. A screen reader user needs to have this same skimming ability. Marking content as landmarks and headings provides the user of a screen reader the option to skim content similar to the way a sighted user would. -For example, when using a tab panel, consider this a navigational landmark. When using a search edit box, consider this a search landmark and consider setting your main content as a main content landmark. Whether within a landmark or even outside a landmark, consider setting sub elements as headings with logical heading levels. +The concepts of [ARIA landmarks](https://www.w3.org/WAI/GL/wiki/Using_ARIA_landmarks_to_identify_regions_of_a_page), [ARIA headings](https://www.w3.org/TR/WCAG20-TECHS/ARIA12.html), and [HTML headings](https://www.w3.org/TR/2016/NOTE-WCAG20-TECHS-20161007/H42.html) have been used in web content for years to allow faster navigation by screen reader users. Web pages utilize landmarks and headings to make their content more usable by allowing the AT user to quickly get to the large chunk (landmark) and smaller chunk (heading). -Consider the **Ease of Access** page in the Windows Settings app. +Specifically, screen readers have commands allowing users to jump between landmarks and jump between headings (next/previous or specific heading level). -![Ease of Access page in the Windows settings app](images/ease-of-access-settings.png) +Landmarks enable content to be grouped into various categories such as *search*, *navigation*, *main content*, and so on. Once grouped, the AT user can quickly navigate between the groups. This quick navigation allows the user to skip potentially substantial amounts of content that previously required navigation item by item. -There is a search edit box which is wrapped within a search landmark. The navigational elements on the left are wrapped within a navigational landmark and the main content on the right is wrapped within a main content landmark. Taking this further, within the navigational landmark there is a main group heading called **Ease of Access** which is a heading level 1. Under that are the sub options **Vison**, **Hearing**, and so on. These have a heading level 2. Setting headings is continued within the main content again setting the main subject, **Display**, as heading level 1 and sub groups such as **Make everything bigger** as heading level 2. +For example, when using a tab panel, consider making it a *navigation* landmark. When using a search edit box, consider making it a *search* landmark, and consider setting your main content as a *main content* landmark. -The Settings app would be accessible without landmarks and headings, but it becomes more usable with them. A screen reader user can quickly and easily get to the group (landmark) they need and then quickly get to the sub group (heading) as well. +Whether within a landmark or even outside a landmark, consider annotating sub-elements as headings with logical heading levels. -Use [AutomationProperties.LandmarkTypeProperty](/uwp/api/windows.ui.xaml.automation.automationproperties.LandmarkTypeProperty) to setup the UI element as the [type of landmark](/windows/desktop/WinAuto/landmark-type-identifiers) you wish. This landmark UI element would encapsulate all the other UI elements which make sense for that landmark. +## Windows Settings -Use [AutomationProperties.LocalizedLandmarkTypeProperty](/uwp/api/windows.ui.xaml.automation.automationproperties.LocalizedLandmarkTypeProperty) to specifically name the landmark. If you select a predefined landmark type such as main or navigational, these names will be used for the landmark name. However, if you set the landmark type to custom you must specifically name the landmark through this property. You can also use this property to override the default names from the non-custom landmark types. +The following image shows the **Ease of Access** page in a previous version of Windows Settings. + +![Ease of Access page in Windows settings](images/ease-of-access-settings.png) + +For this page, the search edit box is wrapped within a search landmark, the navigation elements on the left are wrapped within a navigation landmark, and the main content on the right is wrapped within a main content landmark. + +Within the navigation landmark there is a main group heading called **Ease of Access** (heading level 1) with sub-options of **Vision**, **Hearing**, and so on (heading level 2). Within the main content, **Display** is set to heading level 1 with sub-groups such as **Make everything bigger** set to heading level 2. + +Windows Settings would be accessible without landmarks and headings, but it becomes much more usable with them. In this case, a user with a screen reader can quickly get to the group (landmark) they're interested in, and from there they can then quickly get to the sub-group (heading). + +## Usage + +Use [AutomationProperties.LandmarkTypeProperty](/uwp/api/windows.ui.xaml.automation.automationproperties.LandmarkTypeProperty) to identify the [type of landmark](/windows/desktop/WinAuto/landmark-type-identifiers) for a UI element. This landmark UI element would then encapsulate all the other UI elements relevant to that landmark. + +Use [AutomationProperties.LocalizedLandmarkTypeProperty](/uwp/api/windows.ui.xaml.automation.automationproperties.LocalizedLandmarkTypeProperty) to name the landmark. If you select a predefined landmark type, such as main or navigation, these names will be used for the landmark name. However, if you set the landmark type to custom, you must name the landmark through this property (you can also use this property to override the default names from the pre-defined landmark types). Use [AutomationProperties.HeadingLevel](/uwp/api/windows.ui.xaml.automation.automationproperties.headinglevelproperty) to set the UI element as a heading of a specific level from *Level1* through *Level9*. +Use the F6 key and handler to support navigation between landmarks, which is a common pattern in complex apps like File Explorer and Outlook. See [Keyboard navigation between application panes with F6](keyboard-accessibility.md#keyboard-navigation-between-application-panes-with-f6) for more guidance. + ## Examples -For numerous code samples showing how to resolve many common programmatic accessibility issues in Windows desktop apps, see [Code samples for resolving common programmatic accessibility issues in Windows desktop apps](/accessibility-tools-docs/). +See the [Code samples for resolving common programmatic accessibility issues in Windows desktop apps](/accessibility-tools-docs/) to resolve many common programmatic accessibility issues in Windows desktop apps. -These code samples are referenced directly by[ Microsoft Accessibility Insights for Windows](https://github.com/microsoft/accessibility-insights-windows), which can help to spotlight many accessibility issues in UI. +These code samples are referenced directly by [Microsoft Accessibility Insights for Windows](https://github.com/microsoft/accessibility-insights-windows), which can help to identify accessibility issues in your app UI. diff --git a/hub/apps/design/accessibility/system-button-narration.md b/hub/apps/design/accessibility/system-button-narration.md index 0de2394456..7d0303fe8d 100644 --- a/hub/apps/design/accessibility/system-button-narration.md +++ b/hub/apps/design/accessibility/system-button-narration.md @@ -4,7 +4,7 @@ title: Screen readers and hardware button events label: Screen readers and hardware button events template: detail.hbs ms.date: 02/20/2020 -ms.topic: article +ms.topic: how-to keywords: windows 10, uwp, accessibility, narrator, screen reader ms.localizationpriority: medium --- diff --git a/hub/apps/design/app-settings/guidelines-for-app-settings.md b/hub/apps/design/app-settings/guidelines-for-app-settings.md index f1a75ece73..d8e6f13c54 100644 --- a/hub/apps/design/app-settings/guidelines-for-app-settings.md +++ b/hub/apps/design/app-settings/guidelines-for-app-settings.md @@ -47,7 +47,7 @@ For a nav pane layout, app settings should be the last item in the list of navig If you're using a [command bar](../controls/command-bar.md) or tool bar, place the settings entry point as one of the last items in the "More" overflow menu. If greater discoverability for the settings entry point is important for your app, place the entry point directly on the command bar and not within the overflow. -![app settings entry point for command bar](../controls/images/appbar_rs2_overflow_icons.png) +![app settings entry point for command bar](images/appbar-overflow-icons.png) **Hub** @@ -55,7 +55,7 @@ If you're using a hub layout, the entry point for app settings should be placed **Tabs/pivots** -For a tabs or pivots layout, we don't recommended placing the app settings entry point as one of the top items within the navigation. Instead, the entry point for app settings should be placed inside the "More" overflow menu of a command bar. +For a tabs or pivots layout, we don't recommend placing the app settings entry point as one of the top items within the navigation. Instead, the entry point for app settings should be placed inside the "More" overflow menu of a command bar. **List-details** @@ -77,7 +77,7 @@ If your app allows users to choose the app's color mode, present these options u - Dark - Windows default -We also recommend adding a hyperlink to the Colors page of the Windows Settings app where users can access and modify the current default app mode. Use the string "Windows color settings" for the hyperlink text and `ms-settings:colors` for the URI. +We also recommend adding a hyperlink to the Colors page of Windows Settings where users can access and modify the current default app mode. Use the string "Windows color settings" for the hyperlink text and `ms-settings:colors` for the URI. !["Choose a mode" section](images/appsettings_mode.png) diff --git a/hub/apps/design/controls/images/appbar_rs2_overflow_icons.png b/hub/apps/design/app-settings/images/appbar-overflow-icons.png similarity index 100% rename from hub/apps/design/controls/images/appbar_rs2_overflow_icons.png rename to hub/apps/design/app-settings/images/appbar-overflow-icons.png diff --git a/hub/apps/design/app-settings/store-and-retrieve-app-data.md b/hub/apps/design/app-settings/store-and-retrieve-app-data.md index 416b6914b7..ef6146ed2b 100644 --- a/hub/apps/design/app-settings/store-and-retrieve-app-data.md +++ b/hub/apps/design/app-settings/store-and-retrieve-app-data.md @@ -5,7 +5,7 @@ ms.assetid: 41676A02-325A-455E-8565-C9EC0BC3A8FE label: App settings and data template: detail.hbs ms.date: 11/14/2017 -ms.topic: article +ms.topic: how-to keywords: windows 10, uwp ms.localizationpriority: medium --- @@ -163,7 +163,7 @@ Roaming data for an app is available in the cloud as long as it is accessed by t > See important note about [roaming data](#roaming-data). - Use roaming for user preferences and customizations, links, and small data files. For example, use roaming to preserve a user's background color preference across all devices. -- Use roaming to let users continue a task across devices. For example, roam app data like the contents of an drafted email or the most recently viewed page in a reader app. +- Use roaming to let users continue a task across devices. For example, roam app data like the contents of a drafted email or the most recently viewed page in a reader app. - Handle the [**DataChanged**](/uwp/api/windows.storage.applicationdata.datachanged) event by updating app data. This event occurs when app data has just finished syncing from the cloud. - Roam references to content rather than raw data. For example, roam a URL rather than the content of an online article. - For important, time critical settings, use the *HighPriority* setting associated with [**RoamingSettings**](/uwp/api/windows.storage.applicationdata.roamingsettings). @@ -406,7 +406,7 @@ if (localSettings.Containers.ContainsKey("exampleContainer")) ## Delete app settings and containers -To delete a simple setting that your app no longer needs, use the [**ApplicationDataContainerSettings.Remove**](/uwp/api/windows.storage.applicationdatacontainersettings.remove) method. This example deletesthe `exampleSetting` local setting that we created earlier. +To delete a simple setting that your app no longer needs, use the [**ApplicationDataContainerSettings.Remove**](/uwp/api/windows.storage.applicationdatacontainersettings.remove) method. This example deletes the `exampleSetting` local setting that we created earlier. ```csharp Windows.Storage.ApplicationDataContainer localSettings = diff --git a/hub/apps/design/basics/commanding-basics.md b/hub/apps/design/basics/commanding-basics.md index dff840dd15..7ab0308583 100644 --- a/hub/apps/design/basics/commanding-basics.md +++ b/hub/apps/design/basics/commanding-basics.md @@ -6,7 +6,7 @@ label: Command design basics template: detail.hbs op-migration-status: ready ms.date: 09/24/2020 -ms.topic: article +ms.topic: concept-article keywords: windows 10, uwp ms.localizationpriority: medium ms.custom: RS5 diff --git a/hub/apps/design/basics/content-basics.md b/hub/apps/design/basics/content-basics.md index 5969c8fb0b..ee5a859c8d 100644 --- a/hub/apps/design/basics/content-basics.md +++ b/hub/apps/design/basics/content-basics.md @@ -105,7 +105,7 @@ Our type ramp (link) is designed to provide an array of sizes that can help comm ## Lists and grids -There are a variety of list and grid styles that can be created. Below are a a variety of compositions used in Windows. +There are a variety of list and grid styles that can be created. Below are a variety of compositions used in Windows. :::row::: :::column::: diff --git a/hub/apps/design/basics/navigate-between-two-pages.md b/hub/apps/design/basics/navigate-between-two-pages.md index 25ee6673de..1e91759512 100644 --- a/hub/apps/design/basics/navigate-between-two-pages.md +++ b/hub/apps/design/basics/navigate-between-two-pages.md @@ -5,14 +5,14 @@ ms.assetid: 0A364C8B-715F-4407-9426-92267E8FB525 label: Peer-to-peer navigation between two pages template: detail.hbs op-migration-status: ready -ms.date: 04/05/2023 -ms.topic: article -keywords: windows 10, uwp +ms.date: 04/03/2025 +ms.topic: how-to ms.localizationpriority: medium dev_langs: - csharp - cppwinrt --- + # Implement navigation between two pages Learn how to use a frame and pages to enable basic peer-to-peer navigation in your app. @@ -21,32 +21,19 @@ Learn how to use a frame and pages to enable basic peer-to-peer navigation in yo Almost every app requires navigation between pages. Even a simple app with a single content page will typically have a settings page that requires navigation. In this article, we walk through the basics of adding a XAML `Page` to your app, and using a `Frame` to navigate between pages. -> [!IMPORTANT] -> We use the **Blank App** template from Microsoft Visual Studio for this example. There are differences in the templates for Windows App SDK/WinUI 3 apps and UWP apps, so be sure to select the correct tab for your app type. - -### [Windows App SDK](#tab/wasdk) - > [!div class="checklist"] > > - **Applies to**: Windows App SDK/WinUI3 > - **Important APIs**: [Microsoft.UI.Xaml.Controls.Frame](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.controls.frame) class, [Microsoft.UI.Xaml.Controls.Page](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.controls.page) class, [Microsoft.UI.Xaml.Navigation](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.navigation) namespace -### [UWP](#tab/uwp) - -> [!div class="checklist"] -> -> - **Applies to**: UWP/WinUI2 -> - **Important APIs**: [Windows.UI.Xaml.Controls.Frame](/uwp/api/windows.ui.xaml.controls.frame) class, [Windows.UI.Xaml.Controls.Page](/uwp/api/windows.ui.xaml.controls.page) class, [Windows.UI.Xaml.Navigation](/uwp/api/windows.ui.xaml.navigation) namespace - ---- +> [!NOTE] +> For navigation in UWP apps, see [App navigation (UWP)](/windows/uwp/ui-input/app-navigation) ## 1. Create a blank app -### [Windows App SDK](#tab/wasdk) - To create a blank app in Visual Studio: -1. To set up your development computer, see [Install tools for the Windows App SDK](/windows/apps/windows-app-sdk/set-up-your-development-environment). +1. To set up your development computer, see [Start developing Windows apps](../../get-started/start-here.md). 1. From the Microsoft Visual Studio start window, select **Create a new project**, OR, on the Visual Studio menu, choose **File** > **New** > **Project**. 1. In the **Create a new project** dialog's drop-down filters, select **C#** or **C++**, **Windows**, and **WinUI**, respectively. 1. Select the **Blank App, Packaged (WinUI 3 in Desktop)** project template, and click **Next**. That template creates a desktop app with a WinUI 3-based user interface. @@ -55,35 +42,10 @@ To create a blank app in Visual Studio: 1. To stop debugging and return to Visual Studio, exit the app, or click **Stop Debugging** from the menu. 1. Remove any example code that's included in the template from the `MainWindow.xaml` and `MainWindow` code-behind files. -> [!TIP] -> For more info, see [Create your first WinUI 3 (Windows App SDK) project](../../winui/winui3/create-your-first-winui3-app.md). - -### [UWP](#tab/uwp) - -To create a blank app in Visual Studio: - -1. From the Microsoft Visual Studio start window, select **Create a new project**, OR, on the Visual Studio menu, choose **File** > **New** > **Project**. -1. In the **Create a new project** dialog's drop-down filters, select **C#** or **C++**, **Windows**, and **UWP**, respectively. -1. Select the **Blank App (Universal Windows)** (C#) or **Blank App (C++/WinRT)** project template, and click **Next**. -1. In the **Project name** box, enter `BasicNavigation`, and click **Create**. -1. In the **New Windows Project** dialog, click **OK** to accept the defaults for target and minimum platform versions. The solution is created, and the project files appear in **Solution Explorer**. -1. To run the program, choose **Debug** > **Start Debugging** from the menu, or press F5. Build and run your solution on your development computer to confirm that the app runs without errors. A blank page is displayed. -1. To stop debugging and return to Visual Studio, exit the app, or click **Stop Debugging** from the menu. - -> [!TIP] -> For more info, see: -> -> - [Create a "Hello, World" app in C#](/windows/uwp/get-started/create-a-hello-world-app-xaml-universal) -> - [Create a "Hello, World" app in C++/WinRT](/windows/uwp/get-started/create-a-basic-windows-10-app-in-cppwinrt) - ---- - ## 2. Use a Frame to navigate between pages When your app has multiple pages, you use a [Frame](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.controls.frame) to navigate between them. The `Frame` class supports various navigation methods such as [Navigate](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.controls.frame.navigate), [GoBack](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.controls.frame.goback), and [GoForward](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.controls.frame.goforward), and properties such as [BackStack](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.controls.frame.backstack), [ForwardStack](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.controls.frame.forwardstack), and [BackStackDepth](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.controls.frame.backstackdepth). -### [Windows App SDK](#tab/wasdk) - When you create a new Windows App SDK project in Visual Studio, the project template creates a `MainWindow` class (of type [Microsoft.UI.Xaml.Window](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.window)). However, it doesn't create a [Frame](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.controls.frame) or [Page](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.controls.page) and doesn't provide any navigation code. To enable navigation between pages, add a `Frame` as the root element of `MainWindow`. You can do that in the [Application.OnLaunched](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.application.onlaunched) method override in the `App.xaml` code-behind file. Open the `App` code-behind file, update the `OnLaunched` override, and handle the [NavigationFailed](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.controls.frame.navigationfailed) event as shown here. @@ -142,123 +104,6 @@ void App::OnNavigationFailed(IInspectable const&, NavigationFailedEventArgs cons > [!NOTE] > For apps with more complex navigation, you will typically use a [NavigationView](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.controls.navigationview) as the root of MainWindow, and place a `Frame` as the content of the navigation view. For more info, see [Navigation view](../controls/navigationview.md). -### [UWP](#tab/uwp) - -When you create a new UWP project in Visual Studio, the project template creates a [Frame](/uwp/api/windows.ui.xaml.controls.frame) and `MainPage` for you, along with the code to navigate to `MainPage` when the app starts. This code is created in the [Application.OnLaunched](/uwp/api/windows.ui.xaml.application.onlaunched) method override in the `App.xaml` code-behind file. - -Here, a [Frame](/uwp/api/Windows.UI.Xaml.Controls.Frame) called `rootFrame` is created and set as the content of the current Window. Then, the `Frame` is navigated to `MainPage`. - -```csharp -protected override void OnLaunched(LaunchActivatedEventArgs e) -{ - Frame rootFrame = Window.Current.Content as Frame; - - // Do not repeat app initialization when the Window already has content, - // just ensure that the window is active - if (rootFrame == null) - { - // Create a Frame to act as the navigation context and navigate to the first page - rootFrame = new Frame(); - - rootFrame.NavigationFailed += OnNavigationFailed; - - if (e.PreviousExecutionState == ApplicationExecutionState.Terminated) - { - //TODO: Load state from previously suspended application - } - - // Place the frame in the current Window - Window.Current.Content = rootFrame; - } - - if (e.PrelaunchActivated == false) - { - if (rootFrame.Content == null) - { - // When the navigation stack isn't restored navigate to the first page, - // configuring the new page by passing required information as a navigation - // parameter - rootFrame.Navigate(typeof(MainPage), e.Arguments); - } - // Ensure the current window is active - Window.Current.Activate(); - } -} - -void OnNavigationFailed(object sender, NavigationFailedEventArgs e) -{ - throw new Exception("Failed to load Page " + e.SourcePageType.FullName); -} -``` - -```cppwinrt -// App.cpp - -void App::OnLaunched(LaunchActivatedEventArgs const& e) -{ - Frame rootFrame{ nullptr }; - auto content = Window::Current().Content(); - if (content) - { - rootFrame = content.try_as(); - } - - // Do not repeat app initialization when the Window already has content, - // just ensure that the window is active - if (rootFrame == nullptr) - { - // Create a Frame to act as the navigation context and associate it with - // a SuspensionManager key - rootFrame = Frame(); - - rootFrame.NavigationFailed({ this, &App::OnNavigationFailed }); - - if (e.PreviousExecutionState() == ApplicationExecutionState::Terminated) - { - // Restore the saved session state only when appropriate, scheduling the - // final launch steps after the restore is complete - } - - if (e.PrelaunchActivated() == false) - { - if (rootFrame.Content() == nullptr) - { - // When the navigation stack isn't restored navigate to the first page, - // configuring the new page by passing required information as a navigation - // parameter - rootFrame.Navigate(xaml_typename(), box_value(e.Arguments())); - } - // Place the frame in the current Window - Window::Current().Content(rootFrame); - // Ensure the current window is active - Window::Current().Activate(); - } - } - else - { - if (e.PrelaunchActivated() == false) - { - if (rootFrame.Content() == nullptr) - { - // When the navigation stack isn't restored navigate to the first page, - // configuring the new page by passing required information as a navigation - // parameter - rootFrame.Navigate(xaml_typename(), box_value(e.Arguments())); - } - // Ensure the current window is active - Window::Current().Activate(); - } - } -} - -void App::OnNavigationFailed(IInspectable const&, NavigationFailedEventArgs const& e) -{ - throw hresult_error(E_FAIL, hstring(L"Failed to load Page ") + e.SourcePageType().Name); -} -``` - ---- - The [Navigate](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.controls.frame.navigate) method is used to display content in this `Frame`. Here, `MainPage.xaml` is passed to the `Navigate` method, so the method loads `MainPage` in the `Frame`. If the navigation to the app's initial window fails, a `NavigationFailed` event occurs, and this code throws an exception in the event handler. @@ -267,8 +112,6 @@ If the navigation to the app's initial window fails, a `NavigationFailed` event The **Blank App** template doesn't create multiple app pages for you. Before you can navigate between pages, you need to add some pages to your app. -### [Windows App SDK](#tab/wasdk) - To add a new item to your app: 1. In **Solution Explorer**, right-click the `BasicNavigation` project node to open the context menu. @@ -308,59 +151,10 @@ Now, these files should be listed as part of your `BasicNavigation` project. > [!IMPORTANT] -> **For C++ projects**, you must add a `#include` directive in the header file of each page that references another page. For the inter-page navigation example presented here, mainpage.xaml.h file contains `#include "Page2.xaml.h"`, in turn, page2.xaml.h contains `#include "MainPage.xaml.h"`. +> **For C++ projects**, you must add a `#include` directive in the header file of each page that references another page. For the inter-page navigation example presented here, **MainPage.xaml.h** file contains `#include "Page2.xaml.h"`, in turn, **Page2.xaml.h** contains `#include "MainPage.xaml.h"`. > > C++ page templates also include an example `Button` and click handler code that you will need to remove from the XAML and code-behind files for the page. -### [UWP](#tab/uwp) - -To add a new item to your app: - -1. In **Solution Explorer**, right-click the `BasicNavigation` project node to open the context menu. -1. Choose **Add** > **New Item** from the context menu. -1. In the **Add New Item** dialog box: - - - (**C#**) select the **WinUI** node in the left pane, then choose **Blank Page (WinUI 3)** in the middle pane. - - (**C++/WinRT**) select the **Visual C++** node in the left pane, then choose **Blank Page (C++/WinRT)** in the middle pane. -1. In the **Name** box, enter `Page2` and press the **Add** button. - -Now, these files should be listed as part of your `BasicNavigation` project. - - - - - - - - - - - - - - -
C#C++
    -
  • MainPage.xaml
  • -
  • MainPage.xaml.cs
  • -
  • Page2.xaml
  • -
  • Page2.xaml.cs
  • -
    -
  • MainPage.xaml
  • -
  • MainPage.cpp
  • -
  • MainPage.h
  • -
  • Page2.xaml
  • -
  • Page2.cpp
  • -
  • Page2.h -
  • -
- -> [!IMPORTANT] -> **For C++ projects**, you must add a `#include` directive in the header file of each page that references another page. For the inter-page navigation example presented here, mainpage.h file contains `#include "Page2.h"`, in turn, page2.h contains `#include "MainPage.h"`. -> -> C++ page templates also include an example `Button` and click handler code that you will need to remove from the XAML and code-behind files for the page. - ---- - ### Add content to the pages In `MainPage.xaml`, replace the existing page content with the following content: @@ -382,8 +176,6 @@ This XAML adds: In the `MainPage` code-behind file, add the following code to handle the `Click` event of the [HyperlinkButton](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.controls.hyperlinkbutton) you added to enable navigation to `Page2.xaml`. -### [Windows App SDK](#tab/wasdk) - ```csharp // MainPage.xaml.cs @@ -413,33 +205,6 @@ void winrt::BasicNavigation::implementation::MainPage::HyperlinkButton_Click(win } ``` -### [UWP](#tab/uwp) - -```csharp -// MainPage.xaml.cs - -private void HyperlinkButton_Click(object sender, RoutedEventArgs e) -{ - Frame.Navigate(typeof(Page2)); -} -``` - -```cppwinrt -// MainPage.h - -void HyperlinkButton_Click(winrt::Windows::Foundation::IInspectable const& sender, winrt::Windows::UI::Xaml::RoutedEventArgs const& e); - -/////////////// -// MainPage.cpp - -void winrt::BasicNavigation::implementation::MainPage::HyperlinkButton_Click(winrt::Windows::Foundation::IInspectable const& sender, winrt::Windows::UI::Xaml::RoutedEventArgs const& e) -{ - Frame().Navigate(winrt::xaml_typename()); -} -``` - ---- - `MainPage` is a subclass of the [Page](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.controls.page) class. The `Page` class has a read-only [Frame](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.controls.page.frame) property that gets the `Frame` containing the `Page`. When the `Click` event handler of the `HyperlinkButton` in `MainPage` calls `Frame.Navigate(typeof(Page2))`, the `Frame` displays the content of `Page2.xaml`. Whenever a page is loaded into the frame, that page is added as a [PageStackEntry](/uwp/api/Windows.UI.Xaml.Navigation.PageStackEntry) to the [BackStack](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.controls.frame.backstack) or [ForwardStack](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.controls.frame.forwardstack) of the [Frame](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.controls.page.frame), allowing for [history and backwards navigation](navigation-history-and-backwards-navigation.md). @@ -458,8 +223,6 @@ Now, do the same in `Page2.xaml`. Replace the existing page content with the fol In the `Page2` code-behind file, add the following code to handle the `Click` event of the [HyperlinkButton](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.controls.hyperlinkbutton) to navigate to `MainPage.xaml`. -### [Windows App SDK](#tab/wasdk) - ```csharp // Page2.xaml.cs @@ -483,33 +246,6 @@ void winrt::BasicNavigation::implementation::Page2::HyperlinkButton_Click(winrt: } ``` -### [UWP](#tab/uwp) - -```csharp -// Page2.xaml.cs - -private void HyperlinkButton_Click(object sender, RoutedEventArgs e) -{ - Frame.Navigate(typeof(MainPage)); -} -``` - -```cppwinrt -// Page2.h - -void HyperlinkButton_Click(winrt::Windows::Foundation::IInspectable const& sender, winrt::Windows::UI::Xaml::RoutedEventArgs const& e); - -/////////////// -// Page2.cpp - -void winrt::BasicNavigation::implementation::Page2::HyperlinkButton_Click(winrt::Windows::Foundation::IInspectable const& sender, winrt::Windows::UI::Xaml::RoutedEventArgs const& e) -{ - Frame().Navigate(winrt::xaml_typename()); -} -``` - ---- - Build and run the app. Click the link that says "Click to go to page 2". The second page that says "Page 2" at the top should be loaded and displayed in the frame. Now click the link on Page 2 to go back to Main Page. ## 4. Pass information between pages @@ -540,8 +276,6 @@ bool Navigate(TypeName const& sourcePageType, IInspectable const& parameter); In the `HyperlinkButton_Click` event handler of the `MainPage` code-behind file, add a second parameter to the `Navigate` method that references the `Text` property of the `name` text box. -### [Windows App SDK](#tab/wasdk) - ```csharp // MainPage.xaml.cs @@ -560,28 +294,6 @@ void winrt::BasicNavigation::implementation::MainPage::HyperlinkButton_Click(win } ``` -### [UWP](#tab/uwp) - -```csharp -// MainPage.xaml.cs - -private void HyperlinkButton_Click(object sender, RoutedEventArgs e) -{ - Frame.Navigate(typeof(Page2), name.Text); -} -``` - -```cppwinrt -// MainPage.cpp - -void winrt::BasicNavigation::implementation::MainPage::HyperlinkButton_Click(winrt::Windows::Foundation::IInspectable const& sender, winrt::Windows::UI::Xaml::RoutedEventArgs const& e) -{ - Frame().Navigate(winrt::xaml_typename(), winrt::box_value(name().Text())); -} -``` - ---- - In `Page2.xaml`, replace the `HyperlinkButton` you added earlier with the following `StackPanel`. This adds a [TextBlock](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.controls.TextBlock) for displaying the text string passed from `MainPage`. ```xaml @@ -595,8 +307,6 @@ In `Page2.xaml`, replace the `HyperlinkButton` you added earlier with the follow In the `Page2` code-behind file, add the following code to override the `OnNavigatedTo` method: -### [Windows App SDK](#tab/wasdk) - ```csharp // Page2.xaml.cs @@ -635,48 +345,6 @@ void Page2::OnNavigatedTo(Microsoft::UI::Xaml::Navigation::NavigationEventArgs c } ``` -### [UWP](#tab/uwp) - -```csharp -// Page2.xaml.cs - -protected override void OnNavigatedTo(NavigationEventArgs e) -{ - if (e.Parameter is string && !string.IsNullOrWhiteSpace((string)e.Parameter)) - { - greeting.Text = $"Hello, {e.Parameter.ToString()}"; - } - else - { - greeting.Text = "Hello!"; - } - base.OnNavigatedTo(e); -} -``` - -```cppwinrt -// Page2.h - -void Page2::OnNavigatedTo(Windows::UI::Xaml::Navigation::NavigationEventArgs const& e) -{ - auto propertyValue{ e.Parameter().as() }; - if (propertyValue.Type() == Windows::Foundation::PropertyType::String) - { - auto name{ winrt::unbox_value(e.Parameter()) }; - if (!name.empty()) - { - greeting().Text(L"Hello, " + name); - __super::OnNavigatedTo(e); - return; - } - } - greeting().Text(L"Hello!"); - __super::OnNavigatedTo(e); -} -``` - ---- - Run the app, type your name in the text box, and then click the link that says `Click to go to page 2`. When the `Click` event of the `HyperlinkButton` in `MainPage` calls `Frame.Navigate(typeof(Page2), name.Text)`, the `name.Text` property is passed to `Page2`, and the value from the event data is used for the message displayed on the page. @@ -719,8 +387,6 @@ bool Navigate(TypeName const& sourcePageType, In the `HyperlinkButton_Click` event handler of the `MainPage` code-behind file, add a third parameter to the `Navigate` method that sets the `infoOverride` parameter to a [SlideNavigationTransitionInfo](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.media.animation.slidenavigationtransitioninfo) with its [Effect](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.media.animation.slidenavigationtransitioninfo.effect) property set to [FromRight](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.media.animation.slidenavigationtransitioneffect). -### [Windows App SDK](#tab/wasdk) - ```csharp // MainPage.xaml.cs @@ -756,48 +422,9 @@ void winrt::BasicNavigation::implementation::MainPage::HyperlinkButton_Click(win } ``` -### [UWP](#tab/uwp) - -```csharp -// MainPage.xaml.cs - -private void HyperlinkButton_Click(object sender, RoutedEventArgs e) -{ - Frame.Navigate(typeof(Page2), - name.Text, - new SlideNavigationTransitionInfo() - { Effect = SlideNavigationTransitionEffect.FromRight}); -} -``` - -```cppwinrt -// pch.h - -#include - -/////////////// -// MainPage.cpp - -using namespace winrt::Windows::UI::Xaml::Media::Animation; - -// ... - -void winrt::BasicNavigation::implementation::MainPage::HyperlinkButton_Click(winrt::Windows::Foundation::IInspectable const& sender, winrt::Windows::UI::Xaml::RoutedEventArgs const& e) -{ - // Create the slide transition and set the transition effect to FromRight. - SlideNavigationTransitionInfo slideEffect = SlideNavigationTransitionInfo(); - slideEffect.Effect(SlideNavigationTransitionEffect(SlideNavigationTransitionEffect::FromRight)); - Frame().Navigate(winrt::xaml_typename(), - winrt::box_value(name().Text()), - slideEffect); -} -``` - ---- - In the `HyperlinkButton_Click` event handler of the `Page2` code-behind file, set the `infoOverride` parameter to a [SlideNavigationTransitionInfo](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.media.animation.slidenavigationtransitioninfo) with its [Effect](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.media.animation.slidenavigationtransitioninfo.effect) property set to [FromLeft](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.media.animation.slidenavigationtransitioneffect). -### [Windows App SDK](#tab/wasdk) + ```csharp // Page2.xaml.cs @@ -829,40 +456,6 @@ void winrt::BasicNavigation::implementation::MainPage::HyperlinkButton_Click(win } ``` -### [UWP](#tab/uwp) - -```csharp -// Page2.xaml.cs - -private void HyperlinkButton_Click(object sender, RoutedEventArgs e) -{ - Frame.Navigate(typeof(MainPage), - null, - new SlideNavigationTransitionInfo() - { Effect = SlideNavigationTransitionEffect.FromLeft}); -} -``` - -```cppwinrt -// Page2.cpp - -using namespace winrt::Windows::UI::Xaml::Media::Animation; - -// ... - -void winrt::BasicNavigation::implementation::MainPage::HyperlinkButton_Click(winrt::Windows::Foundation::IInspectable const& sender, winrt::Windows::UI::Xaml::RoutedEventArgs const& e) -{ - // Create the slide transition and set the transition effect to FromLeft. - SlideNavigationTransitionInfo slideEffect = SlideNavigationTransitionInfo(); - slideEffect.Effect(SlideNavigationTransitionEffect(SlideNavigationTransitionEffect::FromLeft)); - Frame().Navigate(winrt::xaml_typename(), - nullptr, - slideEffect); -} -``` - ---- - Now, when you navigate between pages, the pages slide left and right, which provides a more natural feeling for this transition and reinforces the connection between the pages. ## Related articles diff --git a/hub/apps/design/basics/navigation-basics.md b/hub/apps/design/basics/navigation-basics.md index 0ce021b4c1..8873694e8b 100644 --- a/hub/apps/design/basics/navigation-basics.md +++ b/hub/apps/design/basics/navigation-basics.md @@ -5,7 +5,7 @@ ms.assetid: B65D33BA-AAFE-434D-B6D5-1A0C49F59664 label: Navigation design basics template: detail.hbs op-migration-status: ready -ms.date: 09/24/2020 +ms.date: 04/03/2025 ms.topic: article keywords: windows 10, uwp ms.localizationpriority: medium @@ -256,6 +256,59 @@ Embedded navigation elements can appear in a page's content. Unlike other naviga :::column-end::: :::row-end::: +## Guidelines for custom back navigation behavior + +If you choose to provide your own back stack navigation, the experience should be consistent with other apps. We recommend that you follow the following patterns for navigation actions: + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Navigation actionAdd to navigation history?
Page to page, different peer groupsYes +

In this illustration, the user navigates from level 1 of the app to level 2, crossing peer groups, so the navigation is added to the navigation history.

+

Diagram of navigation across peer groups showing the user navigating from group one to group two and the back to group one.

+

In the next illustration, the user navigates between two peer groups at the same level, again crossing peer groups, so the navigation is added to the navigation history.

+

Diagram of navigation across peer groups showing the user navigating from group one to group two then on to group three and back to group two.

Page to page, same peer group, no on-screen navigation element +

The user navigates from one page to another with the same peer group. There is no on-screen navigation element (such as NavigationView) that provides direct navigation to both pages.

Yes +

In the following illustration, the user navigates between two pages in the same peer group, and the navigation should be added to the navigation history.

+

Navigation within a peer group

Page to page, same peer group, with an on-screen navigation element +

The user navigates from one page to another in the same peer group. Both pages are shown in the same navigation element, such as NavigationView.

It depends +

Yes, add to the navigation history, with two notable exceptions. If you expect users of your app to switch between pages in the peer group frequently, or if you wish to preserve the navigational hierarchy, then do not add to the navigation history. In this case, when the user presses back, go back to the last page before the user navigated to the current peer group.

+

Navigation across peer groups when a navigation element is present

Show a transient UI +

The app displays a pop-up or child window, such as a dialog, splash screen, or on-screen keyboard, or the app enters a special mode, such as multiple selection mode.

No +

When the user presses the back button, dismiss the transient UI (hide the on-screen keyboard, cancel the dialog, etc) and return to the page that spawned the transient UI.

+

Showing a transient UI

Enumerate items +

The app displays content for an on-screen item, such as the details for the selected item in list/details list.

No +

Enumerating items is similar to navigating within a peer group. When the user presses back, navigate to the page that preceded the current page that has the item enumeration.

+

Iterm enumeration

+
+ ## Next: Add navigation code to your app The next article, [Implement basic navigation](navigate-between-two-pages.md), shows the code required to use a `Frame` control to enable basic navigation between two pages in your app. diff --git a/hub/apps/design/basics/navigation-history-and-backwards-navigation.md b/hub/apps/design/basics/navigation-history-and-backwards-navigation.md index fcc713d96b..b0e23b00bb 100644 --- a/hub/apps/design/basics/navigation-history-and-backwards-navigation.md +++ b/hub/apps/design/basics/navigation-history-and-backwards-navigation.md @@ -3,9 +3,8 @@ description: Learn how to implement backwards navigation for traversing the user title: Navigation history and backwards navigation template: detail.hbs op-migration-status: ready -ms.date: 09/24/2020 +ms.date: 04/10/2025 ms.topic: article -keywords: windows 10, uwp ms.localizationpriority: medium dev_langs: - csharp @@ -13,20 +12,25 @@ dev_langs: --- # Navigation history and backwards navigation for Windows apps -> **Important APIs**: [BackRequested event](/uwp/api/Windows.UI.Core.SystemNavigationManager.BackRequested), [SystemNavigationManager class](/uwp/api/Windows.UI.Core.SystemNavigationManager), [OnNavigatedTo](/uwp/api/windows.ui.xaml.controls.page.onnavigatedto) +> [!div class="checklist"] +> +> - **Applies to**: Windows App SDK/WinUI3 +> - **Important APIs**: [Frame](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.controls.frame) class, [Page](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.controls.page) class, [Frame.GoBack](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.controls.frame.goback) method -The Windows app provides a consistent back navigation system for traversing the user's navigation history within an app and, depending on the device, from app to app. - -To implement backwards navigation in your app, place a back button at the top left corner of your app's UI. The user expects the back button to navigate to the previous location in the app's navigation history. Note that it's up to you to decide which navigation actions to add to the navigation history and how to respond to the back button press. - -For most apps that have multiple pages, we recommend that you use the [NavigationView](../controls/navigationview.md) control to provide the navigation framework for your app. It adapts to a variety of screen sizes and supports both _top_ and _left_ navigation styles. If your app uses the `NavigationView` control, then you can use [NavigationView's built-in back button](../controls/navigationview.md#backwards-navigation). +To implement backwards navigation in your app, place a back button at the top left corner of your app's UI. The user expects the back button to navigate to the previous location in the app's navigation history. By default, the [Frame](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.controls.frame) control records navigation actions in its [BackStack](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.controls.frame.backstack) and [ForwardStack](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.controls.frame.forwardstack). However, you can modify which navigation actions are added to the navigation history. > [!NOTE] +>For most apps that have multiple pages, we recommend that you use the [NavigationView](../controls/navigationview.md) control to provide the navigation framework for your app. It adapts to a variety of screen sizes and supports both _top_ and _left_ navigation styles. If your app uses the `NavigationView` control, then you can use [NavigationView's built-in back button](../controls/navigationview.md#backwards-navigation). +> > The guidelines and examples in this article should be used when you implement navigation without using the `NavigationView` control. If you use `NavigationView`, this information provides useful background knowledge, but you should use the specific guidance and examples in the [NavigationView](../controls/navigationview.md) article ## Back button -To create a back button, use the [Button](../controls/buttons.md) control with the `NavigationBackButtonNormalStyle` style, and place the button at the top left hand corner of your app's UI (for details, see the XAML code examples below). +We recommend that you place the back button in the upper left corner of your app. If you [customize the title bar](../../develop/title-bar.md), place the back button in the title bar. See [Title bar design > Back button](/windows/apps/design/basics/titlebar-design#back-button) for more info. + +If you use the [TitleBar](../controls/title-bar.md) control to create a custom title bar, use the built-in back button. Set [IsBackButtonVisible](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.controls.titlebar.isbackbuttonvisible) to `true`, set [IsBackButtonEnabled](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.controls.titlebar.isbackbuttonenabled) as needed, and handle the [BackRequested](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.controls.titlebar.backrequested) event to navigate. + +To create a stand-alone back button, use the [Button](../controls/buttons.md) control with the `TitleBarBackButtonStyle` resource, and place the button at the top left hand corner of your app's UI (for details, see the XAML code examples below). ![Back button in the top left of the app's UI](images/back-nav/back-enabled.png) @@ -39,7 +43,8 @@ To create a back button, use the [Button](../controls/buttons.md) control with t
- - - - - -
- -
-``` - -```c++ -//showing implementations but not header definitions -void MainPage::OnNavigatedTo(NavigationEventArgs^ e) -{ - (void) e; // Unused parameter - this->Loaded+=ref new RoutedEventHandler(this,&MainPage::ProgrammaticFocus); -} -void MainPage::ProgrammaticFocus(Object^ sender, RoutedEventArgs^ e) -{ - this->Focus(Windows::UI::Xaml::FocusState::Programmatic); -} - -void KeyboardSupport::MainPage::MediaButton_Click(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e) -{ - FrameworkElement^ fe = safe_cast(sender); - if (fe->Name == "PlayButton") {DemoMovie->Play();} - if (fe->Name == "PauseButton") {DemoMovie->Pause();} - if (fe->Name == "StopButton") {DemoMovie->Stop();} -} - - -bool KeyboardSupport::MainPage::IsCtrlKeyPressed() -{ - auto ctrlState = CoreWindow::GetForCurrentThread()->GetKeyState(VirtualKey::Control); - return (ctrlState & CoreVirtualKeyStates::Down) == CoreVirtualKeyStates::Down; -} - -void KeyboardSupport::MainPage::Grid_KeyDown(Platform::Object^ sender, Windows::UI::Xaml::Input::KeyRoutedEventArgs^ e) -{ - if (e->Key == VirtualKey::Control) isCtrlKeyPressed = true; -} - - -void KeyboardSupport::MainPage::Grid_KeyUp(Platform::Object^ sender, Windows::UI::Xaml::Input::KeyRoutedEventArgs^ e) -{ - if (IsCtrlKeyPressed()) - { - if (e->Key==VirtualKey::P) { DemoMovie->Play(); } - if (e->Key==VirtualKey::A) { DemoMovie->Pause(); } - if (e->Key==VirtualKey::S) { DemoMovie->Stop(); } - } -} -``` - -```csharp -protected override void OnNavigatedTo(NavigationEventArgs e) -{ - // Set the input focus to ensure that keyboard events are raised. - this.Loaded += delegate { this.Focus(FocusState.Programmatic); }; -} - -private void MediaButton_Click(object sender, RoutedEventArgs e) -{ - switch ((sender as Button).Name) - { - case "PlayButton": DemoMovie.Play(); break; - case "PauseButton": DemoMovie.Pause(); break; - case "StopButton": DemoMovie.Stop(); break; - } -} - -private static bool IsCtrlKeyPressed() -{ - var ctrlState = CoreWindow.GetForCurrentThread().GetKeyState(VirtualKey.Control); - return (ctrlState & CoreVirtualKeyStates.Down) == CoreVirtualKeyStates.Down; -} - -private void Grid_KeyDown(object sender, KeyRoutedEventArgs e) -{ - if (IsCtrlKeyPressed()) - { - switch (e.Key) - { - case VirtualKey.P: DemoMovie.Play(); break; - case VirtualKey.A: DemoMovie.Pause(); break; - case VirtualKey.S: DemoMovie.Stop(); break; - } - } -} -``` - -```VisualBasic -Private isCtrlKeyPressed As Boolean -Protected Overrides Sub OnNavigatedTo(e As Navigation.NavigationEventArgs) - -End Sub - -Private Function IsCtrlKeyPressed As Boolean - Dim ctrlState As CoreVirtualKeyStates = CoreWindow.GetForCurrentThread().GetKeyState(VirtualKey.Control); - Return (ctrlState & CoreVirtualKeyStates.Down) == CoreVirtualKeyStates.Down; -End Function - -Private Sub Grid_KeyDown(sender As Object, e As KeyRoutedEventArgs) - If IsCtrlKeyPressed() Then - Select Case e.Key - Case Windows.System.VirtualKey.P - DemoMovie.Play() - Case Windows.System.VirtualKey.A - DemoMovie.Pause() - Case Windows.System.VirtualKey.S - DemoMovie.Stop() - End Select - End If -End Sub - -Private Sub MediaButton_Click(sender As Object, e As RoutedEventArgs) - Dim fe As FrameworkElement = CType(sender, FrameworkElement) - Select Case fe.Name - Case "PlayButton" - DemoMovie.Play() - Case "PauseButton" - DemoMovie.Pause() - Case "StopButton" - DemoMovie.Stop() - End Select -End Sub -``` - -> [!NOTE] -> Setting [**AutomationProperties.AcceleratorKey**](/dotnet/api/system.windows.automation.automationproperties.acceleratorkey) or [**AutomationProperties.AccessKey**](/dotnet/api/system.windows.automation.automationproperties.accesskey) in XAML provides string information, which documents the shortcut key for invoking that particular action. The information is captured by Microsoft UI Automation clients such as Narrator, and is typically provided directly to the user. -> -> Setting **AutomationProperties.AcceleratorKey** or **AutomationProperties.AccessKey** does not have any action on its own. You will still need to attach handlers for [**KeyDown**](/uwp/api/windows.ui.xaml.uielement.keydown) or [**KeyUp**](/uwp/api/windows.ui.xaml.uielement.keyup) events in order to actually implement the keyboard shortcut behavior in your app. Also, the underline text decoration for an access key is not provided automatically. You must explicitly underline the text for the specific key in your mnemonic as inline [**Underline**](/uwp/api/Windows.UI.Xaml.Documents.Underline) formatting if you wish to show underlined text in the UI. - -  - -## Keyboard routed events - - -Certain events are routed events, including [**KeyDown**](/uwp/api/windows.ui.xaml.uielement.keydown) and [**KeyUp**](/uwp/api/windows.ui.xaml.uielement.keyup). Routed events use the bubbling routing strategy. The bubbling routing strategy means that an event originates from a child object and is then routed up to successive parent objects in the object tree. This presents another opportunity to handle the same event and interact with the same event data. - -Consider the following XAML example, which handles [**KeyUp**](/uwp/api/windows.ui.xaml.uielement.keyup) events for a [**Canvas**](/uwp/api/Windows.UI.Xaml.Controls.Canvas) and two [**Button**](/uwp/api/Windows.UI.Xaml.Controls.Button) objects. In this case, if you release a key while focus is held by either **Button** object, it raises the **KeyUp** event. The event is then bubbled up to the parent **Canvas**. - -```xaml - - ``` -In this code, we add the [**EntranceThemeTransition**](/uwp/api/Windows.UI.Xaml.Media.Animation.EntranceThemeTransition) object to the transition collection of the button. Now, when the button is first rendered, it swiftly slides into view rather than just appear. You can set a few properties on the animation object in order to adjust how far it slides and from what direction, but it's really meant to be a simple API for a specific scenario, that is, to make an eye-catching entrance. +In this code, we add the [**EntranceThemeTransition**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.Media.Animation.EntranceThemeTransition) object to the transition collection of the button. Now, when the button is first rendered, it swiftly slides into view rather than just appear. You can set a few properties on the animation object in order to adjust how far it slides and from what direction, but it's really meant to be a simple API for a specific scenario, that is, to make an eye-catching entrance. -You can also define transition animation themes in the style resources of your app, allowing you to apply the effect uniformly. This example is equivalent to the previous one, only it is applied using a [**Style**](/uwp/api/Windows.UI.Xaml.Style): +You can also define transition animation themes in the style resources of your app, allowing you to apply the effect uniformly. This example is equivalent to the previous one, only it is applied using a [**Style**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.Style): -```xml +```xaml - - - - @@ -308,7 +306,7 @@ You can package the app in an [MSIX package](/windows/msix) for deployment. MSIX 1. Add a new [Windows Application Packaging Project](/windows/msix/desktop/desktop-to-uwp-packaging-dot-net) to your solution. As you create the project, name it **MyDesktopWin32Project** and select **Windows 10, version 1903 (10.0; Build 18362)** for both the **Target version** and **Minimum version**. 2. In the packaging project, right-click the **Applications** node and choose **Add reference**. In the list of projects, select the check box next to the **MyDesktopWin32App** project and click **OK**. - ![Reference project](images/xaml-islands/xaml-island-cpp-6.png) + ![Screenshot of the Reference Manager dialog for the packaging project with the current project selected as a reference.](../images/xaml-islands/xaml-island-cpp-6.png) 3. For info about distributing/deploying the package, see [Manage your MSIX deployment](/windows/msix/desktop/managing-your-msix-deployment-overview). @@ -375,7 +373,7 @@ Next, update the **MyDesktopWin32App** project to define a macro for additional 5. Right-click the **MyDesktopWin32App** project, select **Properties**, and expand **Manifest Tool** -> **Input and Output** in the left pane. Set the **DPI Awareness** property to **Per Monitor High DPI Aware**. If you do not set this property, you may encounter a manifest configuration error in certain high DPI scenarios. - ![Screenshot of the C/C++ project settings.](images/xaml-islands/xaml-island-cpp-8.png) + ![Screenshot of the Property page for the current project with Configuration Properties - Manifest Tool - Input and Output selected and DPI Awareness set to 'Per Monitor High DPI Aware'.](../images/xaml-islands/xaml-island-cpp-8.png) 6. Click **OK** to close the **Property Pages** dialog. @@ -568,7 +566,7 @@ This section demonstrates how to add a WinRT XAML control from the WinUI 2 libra + Text="😍❤💋🌹🎉😎 🐱‍👤" FontSize="16" /> @@ -581,7 +579,7 @@ This section demonstrates how to add a WinRT XAML control from the WinUI 2 libra Run the solution and confirm that **MyDesktopWin32App** opens with the following window. -![MyDesktopWin32App app](images/xaml-islands/xaml-island-cpp-9.png) +![Screenshot of the MyDesktopWin32App app demonstrated in this topic.](../images/xaml-islands/xaml-island-cpp-9.png) ## Next steps diff --git a/hub/apps/desktop/modernize/host-custom-control-with-xaml-islands.md b/hub/apps/desktop/modernize/xaml-islands/host-custom-control-with-xaml-islands.md similarity index 99% rename from hub/apps/desktop/modernize/host-custom-control-with-xaml-islands.md rename to hub/apps/desktop/modernize/xaml-islands/host-custom-control-with-xaml-islands.md index 3865e26186..118b0a6a89 100644 --- a/hub/apps/desktop/modernize/host-custom-control-with-xaml-islands.md +++ b/hub/apps/desktop/modernize/xaml-islands/host-custom-control-with-xaml-islands.md @@ -2,10 +2,8 @@ description: This article demonstrates how to host a custom WinRT XAML control in a WPF app by using XAML Islands. title: Host a custom WinRT XAML control in a WPF app using XAML Islands ms.date: 09/15/2021 -ms.topic: article +ms.topic: how-to keywords: windows 10, uwp, windows forms, wpf, xaml islands, custom controls, user controls, host controls -ms.author: kbridge -author: Karl-Bridge-Microsoft ms.localizationpriority: medium ms.custom: 19H1 --- @@ -342,7 +340,7 @@ The following instructions show you how to package the all the components in the If you're hosting a custom control that contains a control from the WinUI library, you may encounter a problem where the control cannot be loaded in a packaged app and debugging the code shows the following error. -![Failed to host WinUI library control](images/xaml-islands/host-custom-control-error.png) +![Failed to host WinUI library control](../images/xaml-islands/host-custom-control-error.png) To resolve this error, copy the **App.xbf** file from the build output folder of the WPF project to the **\AppX\\** build output folder of the packaging project. diff --git a/hub/apps/desktop/modernize/host-standard-control-with-xaml-islands-cpp.md b/hub/apps/desktop/modernize/xaml-islands/host-standard-control-with-xaml-islands-cpp.md similarity index 99% rename from hub/apps/desktop/modernize/host-standard-control-with-xaml-islands-cpp.md rename to hub/apps/desktop/modernize/xaml-islands/host-standard-control-with-xaml-islands-cpp.md index fa3a2d7a00..6f68bf5451 100644 --- a/hub/apps/desktop/modernize/host-standard-control-with-xaml-islands-cpp.md +++ b/hub/apps/desktop/modernize/xaml-islands/host-standard-control-with-xaml-islands-cpp.md @@ -2,10 +2,8 @@ description: This article demonstrates how to host a standard WinRT XAML control in a C++ desktop (Win32) app by using the XAML Hosting API. title: Host a standard WinRT XAML control in a C++ desktop (Win32) app using XAML Islands ms.date: 10/02/2020 -ms.topic: article +ms.topic: how-to keywords: windows 10, uwp, cpp, win32, xaml islands, wrapped controls, standard controls -ms.author: kbridge -author: Karl-Bridge-Microsoft ms.localizationpriority: medium ms.custom: 19H1 --- @@ -57,7 +55,7 @@ This article demonstrates how to use the [WinRT XAML hosting API](using-the-xaml 6. Add a reference to the Windows Runtime metadata: 1. In **Solution Explorer**, right-click on your project **References** node and select **Add Reference**. 2. Click the **Browse** button at the bottom of the page and navigate to the UnionMetadata folder in your SDK install path. By default the SDK will be installed to `C:\Program Files (x86)\Windows Kits\10\UnionMetadata`. - 3. Then, select the folder named after the Windows version you are targetting (e.g. 10.0.18362.0) and inside of that folder pick the `Windows.winmd` file. + 3. Then, select the folder named after the Windows version you are targeting (e.g. 10.0.18362.0) and inside of that folder pick the `Windows.winmd` file. 4. Click **OK** to close the **Add Reference** dialog. ## Use the XAML hosting API to host a WinRT XAML control diff --git a/hub/apps/desktop/modernize/host-standard-control-with-xaml-islands.md b/hub/apps/desktop/modernize/xaml-islands/host-standard-control-with-xaml-islands.md similarity index 93% rename from hub/apps/desktop/modernize/host-standard-control-with-xaml-islands.md rename to hub/apps/desktop/modernize/xaml-islands/host-standard-control-with-xaml-islands.md index f4f9e0b668..4ef3fa5092 100644 --- a/hub/apps/desktop/modernize/host-standard-control-with-xaml-islands.md +++ b/hub/apps/desktop/modernize/xaml-islands/host-standard-control-with-xaml-islands.md @@ -1,325 +1,323 @@ ---- -title: Use XAML Islands to host a UWP XAML control in a C# WPF app -description: This topic demonstrates two ways to use [XAML Islands](xaml-islands.md) to host a Universal Windows Platform (UWP) XAML control (that is, a first-party control provided by the Windows SDK) in a Windows Presentation Foundation (WPF) app that targets .NET Core 3.1. -ms.date: 02/24/2022 -ms.topic: article -keywords: windows 11, windows 10, uwp, wpf, windows forms, xaml islands, wrapped controls, standard controls, InkCanvas, InkToolbar -ms.author: stwhi -author: stevewhims -ms.localizationpriority: medium ---- - -# Use XAML Islands to host a UWP XAML control in a C# WPF app - -> [!IMPORTANT] -> This topic uses or mentions types from the [CommunityToolkit/Microsoft.Toolkit.Win32](https://github.com/CommunityToolkit/Microsoft.Toolkit.Win32) GitHub repo. For important info about XAML Islands support, please see the [XAML Islands Notice](https://github.com/CommunityToolkit/Microsoft.Toolkit.Win32#xaml-islands-notice) in that repo. - -This topic shows how to build a C# Windows Presentation Foundation (WPF) app (targeting .NET Core 3.1) that uses [XAML Islands](xaml-islands.md) to host a Universal Windows Platform (UWP) XAML control (that is, a first-party control provided by the Windows SDK). We show how to do that in two ways: - -* We show how to host UWP [**InkCanvas**](/uwp/api/Windows.UI.Xaml.Controls.InkCanvas) and [**InkToolbar**](/uwp/api/windows.ui.xaml.controls.inktoolbar) controls by using [wrapped controls](./xaml-islands.md#wrapped-controls) (available in the Windows Community Toolkit). Wrapped controls wrap the interface and functionality of a small set of useful UWP XAML controls. You can add a wrapped control directly to the design surface of your WPF or Windows Forms project, and then use it in the designer like any other WPF or Windows Forms control. - -* We also show how to host a UWP [**CalendarView**](/uwp/api/Windows.UI.Xaml.Controls.CalendarView) control by using the [**WindowsXamlHost**](/windows/communitytoolkit/controls/wpf-winforms/windowsxamlhost) control (available in the Windows Community Toolkit). Because only a small set of UWP XAML controls are available as wrapped controls, you can use **WindowsXamlHost** to host any UWP XAML control. - -The process for hosting a UWP XAML control in a WPF app is similar for a Windows Forms app. - -> [!IMPORTANT] -> Using XAML Islands (wrapped controls or [**WindowsXamlHost**](/windows/communitytoolkit/controls/wpf-winforms/windowsxamlhost)) to host UWP XAML controls is supported only in apps that target .NET Core 3.x. XAML Islands are not supported in apps that target .NET, or in apps that target any version of the .NET Framework. - -## Recommended components - -To host a UWP XAML control in a WPF or Windows Forms app, we recommend that you have the following components in your solution. This topic provides instructions for creating each of these components: - -* **The project and source code for your WPF or Windows Forms app**. - -* **A UWP project that defines a root Application class that derives from XamlApplication**. The [**Microsoft.Toolkit.Win32.UI.XamlHost.XamlApplication**](https://github.com/windows-toolkit/Microsoft.Toolkit.Win32/tree/master/Microsoft.Toolkit.Win32.UI.XamlApplication) class is available in the Windows Community Toolkit). We recommended that you define your **XamlApplication**-derived **Application** class a separate UWP app project that's part of your WPF or Windows Forms Visual Studio solution. - - > [!NOTE] - > Making a **XamlApplication**-derived object available to your WPF or Windows Forms project isn't actually required in order to host a first-party UWP XAML control. But it *is* necessary in order to discover, load, and host custom UWP XAML controls. So—to support the full range of XAML Island scenarios—we recommend that you always define a **XamlApplication**-derived object in any solution in which you use XAML Islands. - - > [!NOTE] - > Your solution can contain only one project that defines a **XamlApplication**-derived object. That one project must reference any other libraries and projects that host UWP XAML controls via XAML Islands. - -## Create a WPF project - -You can follow these instructions to create a new WPF project, and configure it to host XAML Islands. If you have an existing WPF project, then you can adapt these steps and code examples for your project. - -1. If you haven't done so already, then install the latest version of [.NET Core 3.1](https://dotnet.microsoft.com/download/dotnet/3.1). - -1. In Visual Studio, create a new C# project from the **WPF Application** project template. Set the **Project name** to *MyWPFApp* so that you won't need to edit any of the steps or source code in this topic. Set the **Framework** to *.NET Core 3.1**, and click **Create**. - -> [!IMPORTANT] -> Be sure not to use the **WPF App (.NET Framework)** project template. - -## Configure your WPF project - -1. These steps enable [package references](/nuget/consume-packages/package-references-in-project-files): - - 1. In Visual Studio, click **Tools** > **NuGet Package Manager** > **Package Manager Settings**. - 1. On the right, find the **Package Management** > **Default package management format** setting, and set it to **PackageReference**. - -1. Use these steps to install the [**Microsoft.Toolkit.Wpf.UI.Controls**](https://www.nuget.org/packages/Microsoft.Toolkit.Wpf.UI.Controls) NuGet Package: - - 1. Right-click the *MyWPFApp* project node in **Solution Explorer**, and choose **Manage NuGet Packages...**. - - 1. On the **Browse** tab, type or paste *Microsoft.Toolkit.Wpf.UI.Controls* into the search box. Select the latest stable version, and click **Install**. That package provides everything you need to use the wrapped UWP XAML controls for WPF (including [**InkCanvas**](/windows/communitytoolkit/controls/wpf-winforms/inkcanvas), [**InkToolbar**](/windows/communitytoolkit/controls/wpf-winforms/inktoolbar), and the [**WindowsXamlHost**](/windows/communitytoolkit/controls/wpf-winforms/windowsxamlhost) control). - - > [!NOTE] - > For a Windows Forms app, reference the [**Microsoft.Toolkit.Forms.UI.Controls**](https://www.nuget.org/packages/Microsoft.Toolkit.Forms.UI.Controls) package instead. - -1. Most XAML Islands scenarios aren't supported in projects that target **Any CPU**. So to target a specific architecture (such as **x86** or **x64**), do the following: - - 1. Right-click the solution node (*not* the project node) in **Solution Explorer**, and choose **Properties**. - 1. Select **Configuration Properties** on the left. - 1. Click the **Configuration Manager...** button. - 1. Under **Active solution platform**, select **New**. - 1. In the **New Solution Platform** dialog, select **x64** or **x86**, and press **OK**. - 1. Close the open dialog boxes. - -## Define a XamlApplication class in a new UWP project - -In this section we'll be adding a UWP project to the solution, and revising the default **App** class in that project to derive from the [**Microsoft.Toolkit.Win32.UI.XamlHost.XamlApplication**](https://github.com/windows-toolkit/Microsoft.Toolkit.Win32/tree/master/Microsoft.Toolkit.Win32.UI.XamlApplication) class provided by the Windows Community Toolkit. That class supports the [**IXamlMetadataProvider**](/uwp/api/Windows.UI.Xaml.Markup.IXamlMetadataProvider) interface, which enables your app to discover and load metadata for custom UWP XAML controls in assemblies in the current directory of your application at run time. That class also initializes the UWP XAML framework for the current thread. - -1. In **Solution Explorer**, right-click the solution node, and select **Add** > **New Project...**. - -1. Select the C# **Blank App (Universal Windows)** project template. Set the **Project name** to *MyUWPApp* so that you won't need to edit any of the steps or source code in this topic. Set the **Target version** and **Minimum version** to either **Windows 10, version 1903 (Build 18362)** or later. - - > [!NOTE] - > Be sure not to create *MyUWPApp* in a subfolder of *MyWPFApp*. If you do that, then *MyWPFApp* will try to build the UWP XAML markup as if it were WPF XAML. - -1. In *MyUWPApp*, install the [**Microsoft.Toolkit.Win32.UI.XamlApplication**](https://www.nuget.org/packages/Microsoft.Toolkit.Win32.UI.XamlApplication) NuGet package (latest stable version). The process for installng a NuGet package was described in the previous section. - -1. In *MyUWPApp*, open the `App.xaml` file, and replace its contents with the following XAML: - - ```xml - - - ``` - -1. Similarly, open `App.xaml.cs`, and replace its contents with the following code: - - ```csharp - namespace MyUWPApp - { - public sealed partial class App : Microsoft.Toolkit.Win32.UI.XamlHost.XamlApplication - { - public App() - { - this.Initialize(); - } - } - } - ``` - -1. Delete the `MainPage.xaml` and `MainPage.xaml.cs` files. -1. Build the *MyUWPApp* project. - -## In MyWPFApp, add a reference to the MyUWPApp project - -1. Specify the compatible framework version in *MyWPFApp*'s project file like this: - - 1. In **Solution Explorer**, click the *MyWPFApp* project node to open the project file in the editor. - 1. Inside the first **PropertyGroup** element, add the following child element. Change the `19041` portion of the value as necessary to match the target and minimum OS build of the *MyWPFApp* project. - - ```xml - uap10.0.19041 - ``` - -1. In **Solution Explorer**, right-click *MyWPFApp* > **Dependencies**, choose **Add Project Reference...**, and add a reference to the *MyUWPApp* project. - -## Instantiate the XamlApplication object in the entry point of MyWPFApp - -Next, add code to the entry point of *MyWPFApp* to create an instance of the **App** class that you just defined in *MyUWPApp* (the class that derives from **XamlApplication**). - -1. Right-click the *MyWPFApp* project node, select **Add** > **New Item...**, and then select **Class**. Set **Name** to *Program.cs*, and click **Add**. - -1. Replace the contents of `Program.cs` with the following XAML (and then save the file and build the *MyWPFApp* project): - - ```csharp - namespace MyWPFApp - { - public class Program - { - [System.STAThreadAttribute()] - public static void Main() - { - using (new MyUWPApp.App()) - { - var app = new MyWPFApp.App(); - app.InitializeComponent(); - app.Run(); - } - } - } - } - ``` - -1. Right-click the *MyWPFApp* project node, and choose **Properties**. - -1. In **Application** > **General**, click the **Startup object** drop-down, and choose *MyWPFApp.Program* (which is the fully-qualified name of the **Program** class that you just added). If you don't see it, then try closing and reopening Visual Studio. - - > [!NOTE] - > By default, a WPF project defines a **Main** entry point function in a generated code file that isn't intended to be modified. The step above changes the entry point for your project to the **Main** method of the new **Program** class, which enables you to add code that runs as early in the startup process of the app as possible. - -1. Save your changes to the project properties. - -## Use wrapped controls to host an InkCanvas and InkToolbar - -Now that you've configured your project to use UWP XAML Islands, you're ready to add the [**InkCanvas**](/windows/communitytoolkit/controls/wpf-winforms/inkcanvas) and [**InkToolbar**](/windows/communitytoolkit/controls/wpf-winforms/inktoolbar) wrapped UWP XAML controls to the app. - -1. In *MyWPFApp*, open the `MainWindow.xaml` file. - -1. In the **Window** element near the top of the XAML file, add the following attribute. This attribute references the XAML namespace for the **InkCanvas** and **InkToolbar** wrapped UWP XAML controls, and maps it to the **controls** XML namespace. - - ```xml - xmlns:controls="clr-namespace:Microsoft.Toolkit.Wpf.UI.Controls;assembly=Microsoft.Toolkit.Wpf.UI.Controls" - ``` - -1. Still in `MainWindow.xaml`, edit the existing **Grid** element so that it looks like the XAML below. This XAML adds to the **Grid** an [**InkCanvas**](/windows/communitytoolkit/controls/wpf-winforms/inkcanvas) and a [**InkToolbar**](/windows/communitytoolkit/controls/wpf-winforms/inktoolbar) control (prefixed by the **controls** XML namespace that you defined in the previous step). - - ```xml - - - - - - - - - ``` - - > [!NOTE] - > You can also add these and other wrapped controls to the **Window** by dragging them to the designer from the **Windows Community Toolkit** section of the **Toolbox**. - -1. Save `MainWindow.xaml`. - - If you have a device that supports a digital pen (such as a Surface), and you're following along on a physical machine, then you could now build and run the app, and draw digital ink on the screen with the pen. But if you try to write with your mouse, then nothing will happen, because by default **InkCanvas** is enabled only for digital pens. Here's how to enable **InkCanvas** for the mouse. - -1. Still in *MyWPFApp*, open `MainWindow.xaml.cs`. - -1. Add the following namespace directive to the top of the file: - - ```csharp - using Microsoft.Toolkit.Win32.UI.Controls.Interop.WinRT; - ``` - -1. Locate the **MainWindow** constructor. Immediately after the call to **InitializeComponent**, add the following line of code: - - ```csharp - myInkCanvas.InkPresenter.InputDeviceTypes = CoreInputDeviceTypes.Mouse | CoreInputDeviceTypes.Pen; - ``` - - You can use the **InkPresenter** object to customize the default inking experience. The code above uses the **InputDeviceTypes** property to enable mouse as well as pen input. - -1. Save, build, and run. If you're using a computer with a mouse, then confirm that you can draw something in the ink canvas space with the mouse. - -## Host a CalendarView by using the host control - -In this section, we'll use the [**WindowsXamlHost**](/windows/communitytoolkit/controls/wpf-winforms/windowsxamlhost) control to add a [**CalendarView**](/uwp/api/Windows.UI.Xaml.Controls.CalendarView) to the app. - -> [!NOTE] -> The [**WindowsXamlHost**](/windows/communitytoolkit/controls/wpf-winforms/windowsxamlhost) control is provided by the [**Microsoft.Toolkit.Wpf.UI.XamlHost**](https://www.nuget.org/packages/Microsoft.Toolkit.Wpf.UI.XamlHost) package. That package is included with the [**Microsoft.Toolkit.Wpf.UI.Controls**](https://www.nuget.org/packages/Microsoft.Toolkit.Wpf.UI.Controls) package that you installed earlier. - -1. In **Solution Explorer**, in *MyWPFApp*, open the `MainWindow.xaml` file. - -1. In the **Window** element near the top of the XAML file, add the following attribute. This attribute references the XAML namespace for the **WindowsXamlHost** control, and maps it to the **xamlhost** XML namespace. - - ```xml - xmlns:xamlhost="clr-namespace:Microsoft.Toolkit.Wpf.UI.XamlHost;assembly=Microsoft.Toolkit.Wpf.UI.XamlHost" - ``` - -1. Still in `MainWindow.xaml`, edit the existing **Grid** element so that it looks like the XAML below. This XAML adds to the **Grid** a [**WindowsXamlHost**](/windows/communitytoolkit/controls/wpf-winforms/windowsxamlhost) control (prefixed by the **xamlhost** XML namespace that you defined in the previous step). To host a UWP [**CalendarView**](/uwp/api/Windows.UI.Xaml.Controls.CalendarView) control, this XAML sets the **InitialTypeName** property to the fully-qualified name of the control. The XAML also defines an event handler for the **ChildChanged** event, which is raised when the hosted control has been rendered. - - ```xml - - - - ``` - -1. Save `MainWindow.xaml`, and open `MainWindow.xaml.cs`. - -1. Delete this line of code, which we added in the previous section: `myInkCanvas.InkPresenter.InputDeviceTypes = CoreInputDeviceTypes.Mouse | CoreInputDeviceTypes.Pen;`. - -1. Add the following namespace directive to the top of the file: - - ```csharp - using Microsoft.Toolkit.Wpf.UI.XamlHost; - ``` - -1. Add the following **ChildChanged** event handler method to the **MainWindow** class. When the host control has been rendered, this event handler runs and creates a simple event handler for the **SelectedDatesChanged** event of the calendar control. - - ```csharp - private void MyCalendar_ChildChanged(object sender, EventArgs e) - { - WindowsXamlHost windowsXamlHost = (WindowsXamlHost)sender; - - var calendarView = - (Windows.UI.Xaml.Controls.CalendarView)windowsXamlHost.Child; - - if (calendarView != null) - { - calendarView.SelectedDatesChanged += (obj, args) => - { - if (args.AddedDates.Count > 0) - { - MessageBox.Show("The user selected a new date: " + - args.AddedDates[0].DateTime.ToString()); - } - }; - } - } - ``` - -1. Save, build, and run. Confirm that the calendar control is shown in the window, and that a message box is displayed when you select a date. - -## Package the app - -You can optionally package your WPF app in an [MSIX package](/windows/msix) for deployment. MSIX is the modern and reliable app packaging technology for Windows. - -The following instructions show you how to package all the components in the solution into an MSIX package by using the **Windows Application Packaging Project** in Visual Studio (see [Set up your desktop application for MSIX packaging in Visual Studio](/windows/msix/desktop/desktop-to-uwp-packaging-dot-net)). These steps are necessary only if you want to package the WPF app in an MSIX package. - -> [!NOTE] -> If you choose not to package your application in an [MSIX package](/windows/msix) for deployment, then computers that run your app must have the [Visual C++ Runtime](https://support.microsoft.com/help/2977003/the-latest-supported-visual-c-downloads) installed. - -1. Add a new project to your solution created from the **Windows Application Packaging Project** project template. As you create the project, select the same **Target version** and **Minimum version** as you selected for the UWP project. - -1. In the packaging project, right-click the **Dependencies** node, and choose **Add Project Reference...**. In the list of projects, select *MyWPFApp*, and click **OK**. - - > [!NOTE] - > If you want to publish your app in the Microsoft Store, then you also have to add a reference to the UWP project in the packaging project. - -1. If you followed the steps up to this point, then all of the projects in your solution will target the same specific platform (x86 or x64). And that's necessary in order to build the WPF app into an MSIX package using the Windows Application Packaging Project. To confirm that, you can follow these steps: - - 1. Right-click the solution node (*not* the project node) in **Solution Explorer**, and choose **Properties**. - 1. Select **Configuration Properties** on the left. - 1. Click the **Configuration Manager...** button. - 1. Confirm that all of the listed projects have the same value under **Platform**: either *x86* or *x64*. - -1. Right-click the project node for the packaging project that you just added, and click **Set as Startup project**. - -1. Build and run the packaging project. Confirm that the WPF app runs, and that the UWP control(s) display as expected. - -1. For info about distributing/deploying the package, see [Manage your MSIX deployment](/windows/msix/desktop/managing-your-msix-deployment-overview). - -## Related topics - -* [Host WinRT XAML controls in desktop apps (XAML Islands)](./xaml-islands.md) -* [InkCanvas class (UWP)](/uwp/api/Windows.UI.Xaml.Controls.InkCanvas) -* [InkToolbar class (UWP)](/uwp/api/windows.ui.xaml.controls.inktoolbar) -* [CalendarView class (UWP)](/uwp/api/Windows.UI.Xaml.Controls.CalendarView) -* [WindowsXamlHost control for Windows Forms and WPF](/windows/communitytoolkit/controls/wpf-winforms/windowsxamlhost) -* [.NET Core 3.1](https://dotnet.microsoft.com/download/dotnet/3.1) -* [PackageReference in project files](/nuget/consume-packages/package-references-in-project-files) -* [InkCanvas control for Windows Forms and WPF](/windows/communitytoolkit/controls/wpf-winforms/inkcanvas) -* [InkToolbar control for Windows Forms and WPF](/windows/communitytoolkit/controls/wpf-winforms/inktoolbar) -* [IXamlMetadataProvider interface](/uwp/api/Windows.UI.Xaml.Markup.IXamlMetadataProvider) -* [MSIX documentation](/windows/msix) -* [Set up your desktop application for MSIX packaging in Visual Studio](/windows/msix/desktop/desktop-to-uwp-packaging-dot-net) -* [Microsoft Visual C++ Redistributable latest supported downloads](https://support.microsoft.com/help/2977003/the-latest-supported-visual-c-downloads) \ No newline at end of file +--- +title: Use XAML Islands to host a UWP XAML control in a C# WPF app +description: This topic demonstrates two ways to use XAML Islands to host a Universal Windows Platform (UWP) XAML control (that is, a first-party control provided by the Windows SDK) in a Windows Presentation Foundation (WPF) app that targets .NET Core 3.1. +ms.date: 02/24/2022 +ms.topic: how-to +keywords: windows 11, windows 10, uwp, wpf, windows forms, xaml islands, wrapped controls, standard controls, InkCanvas, InkToolbar +ms.localizationpriority: medium +--- + +# Use XAML Islands to host a UWP XAML control in a C# WPF app + +> [!IMPORTANT] +> This topic uses or mentions types from the [CommunityToolkit/Microsoft.Toolkit.Win32](https://github.com/CommunityToolkit/Microsoft.Toolkit.Win32) GitHub repo. For important info about XAML Islands support, please see the [XAML Islands Notice](https://github.com/CommunityToolkit/Microsoft.Toolkit.Win32#xaml-islands-notice) in that repo. + +This topic shows how to build a C# Windows Presentation Foundation (WPF) app (targeting .NET Core 3.1) that uses [XAML Islands](xaml-islands.md) to host a Universal Windows Platform (UWP) XAML control (that is, a first-party control provided by the Windows SDK). We show how to do that in two ways: + +* We show how to host UWP [**InkCanvas**](/uwp/api/Windows.UI.Xaml.Controls.InkCanvas) and [**InkToolbar**](/uwp/api/windows.ui.xaml.controls.inktoolbar) controls by using [wrapped controls](xaml-islands.md#wrapped-controls) (available in the Windows Community Toolkit). Wrapped controls wrap the interface and functionality of a small set of useful UWP XAML controls. You can add a wrapped control directly to the design surface of your WPF or Windows Forms project, and then use it in the designer like any other WPF or Windows Forms control. + +* We also show how to host a UWP [**CalendarView**](/uwp/api/Windows.UI.Xaml.Controls.CalendarView) control by using the [**WindowsXamlHost**](/windows/communitytoolkit/controls/wpf-winforms/windowsxamlhost) control (available in the Windows Community Toolkit). Because only a small set of UWP XAML controls are available as wrapped controls, you can use **WindowsXamlHost** to host any UWP XAML control. + +The process for hosting a UWP XAML control in a WPF app is similar for a Windows Forms app. + +> [!IMPORTANT] +> Using XAML Islands (wrapped controls or [**WindowsXamlHost**](/windows/communitytoolkit/controls/wpf-winforms/windowsxamlhost)) to host UWP XAML controls is supported only in apps that target .NET Core 3.x. XAML Islands are not supported in apps that target .NET, or in apps that target any version of the .NET Framework. + +## Recommended components + +To host a UWP XAML control in a WPF or Windows Forms app, we recommend that you have the following components in your solution. This topic provides instructions for creating each of these components: + +* **The project and source code for your WPF or Windows Forms app**. + +* **A UWP project that defines a root Application class that derives from XamlApplication**. The [**Microsoft.Toolkit.Win32.UI.XamlHost.XamlApplication**](https://github.com/windows-toolkit/Microsoft.Toolkit.Win32/tree/master/Microsoft.Toolkit.Win32.UI.XamlApplication) class is available in the Windows Community Toolkit). We recommended that you define your **XamlApplication**-derived **Application** class a separate UWP app project that's part of your WPF or Windows Forms Visual Studio solution. + + > [!NOTE] + > Making a **XamlApplication**-derived object available to your WPF or Windows Forms project isn't actually required in order to host a first-party UWP XAML control. But it *is* necessary in order to discover, load, and host custom UWP XAML controls. So—to support the full range of XAML Island scenarios—we recommend that you always define a **XamlApplication**-derived object in any solution in which you use XAML Islands. + + > [!NOTE] + > Your solution can contain only one project that defines a **XamlApplication**-derived object. That one project must reference any other libraries and projects that host UWP XAML controls via XAML Islands. + +## Create a WPF project + +You can follow these instructions to create a new WPF project, and configure it to host XAML Islands. If you have an existing WPF project, then you can adapt these steps and code examples for your project. + +1. If you haven't done so already, then install the latest version of [.NET Core 3.1](https://dotnet.microsoft.com/download/dotnet/3.1). + +1. In Visual Studio, create a new C# project from the **WPF Application** project template. Set the **Project name** to *MyWPFApp* so that you won't need to edit any of the steps or source code in this topic. Set the **Framework** to *.NET Core 3.1**, and click **Create**. + +> [!IMPORTANT] +> Be sure not to use the **WPF App (.NET Framework)** project template. + +## Configure your WPF project + +1. These steps enable [package references](/nuget/consume-packages/package-references-in-project-files): + + 1. In Visual Studio, click **Tools** > **NuGet Package Manager** > **Package Manager Settings**. + 1. On the right, find the **Package Management** > **Default package management format** setting, and set it to **PackageReference**. + +1. Use these steps to install the [**Microsoft.Toolkit.Wpf.UI.Controls**](https://www.nuget.org/packages/Microsoft.Toolkit.Wpf.UI.Controls) NuGet Package: + + 1. Right-click the *MyWPFApp* project node in **Solution Explorer**, and choose **Manage NuGet Packages...**. + + 1. On the **Browse** tab, type or paste *Microsoft.Toolkit.Wpf.UI.Controls* into the search box. Select the latest stable version, and click **Install**. That package provides everything you need to use the wrapped UWP XAML controls for WPF (including [**InkCanvas**](/windows/communitytoolkit/controls/wpf-winforms/inkcanvas), [**InkToolbar**](/windows/communitytoolkit/controls/wpf-winforms/inktoolbar), and the [**WindowsXamlHost**](/windows/communitytoolkit/controls/wpf-winforms/windowsxamlhost) control). + + > [!NOTE] + > For a Windows Forms app, reference the [**Microsoft.Toolkit.Forms.UI.Controls**](https://www.nuget.org/packages/Microsoft.Toolkit.Forms.UI.Controls) package instead. + +1. Most XAML Islands scenarios aren't supported in projects that target **Any CPU**. So to target a specific architecture (such as **x86** or **x64**), do the following: + + 1. Right-click the solution node (*not* the project node) in **Solution Explorer**, and choose **Properties**. + 1. Select **Configuration Properties** on the left. + 1. Click the **Configuration Manager...** button. + 1. Under **Active solution platform**, select **New**. + 1. In the **New Solution Platform** dialog, select **x64** or **x86**, and press **OK**. + 1. Close the open dialog boxes. + +## Define a XamlApplication class in a new UWP project + +In this section we'll be adding a UWP project to the solution, and revising the default **App** class in that project to derive from the [**Microsoft.Toolkit.Win32.UI.XamlHost.XamlApplication**](https://github.com/windows-toolkit/Microsoft.Toolkit.Win32/tree/master/Microsoft.Toolkit.Win32.UI.XamlApplication) class provided by the Windows Community Toolkit. That class supports the [**IXamlMetadataProvider**](/uwp/api/Windows.UI.Xaml.Markup.IXamlMetadataProvider) interface, which enables your app to discover and load metadata for custom UWP XAML controls in assemblies in the current directory of your application at run time. That class also initializes the UWP XAML framework for the current thread. + +1. In **Solution Explorer**, right-click the solution node, and select **Add** > **New Project...**. + +1. Select the C# **Blank App (Universal Windows)** project template. Set the **Project name** to *MyUWPApp* so that you won't need to edit any of the steps or source code in this topic. Set the **Target version** and **Minimum version** to either **Windows 10, version 1903 (Build 18362)** or later. + + > [!NOTE] + > Be sure not to create *MyUWPApp* in a subfolder of *MyWPFApp*. If you do that, then *MyWPFApp* will try to build the UWP XAML markup as if it were WPF XAML. + +1. In *MyUWPApp*, install the [**Microsoft.Toolkit.Win32.UI.XamlApplication**](https://www.nuget.org/packages/Microsoft.Toolkit.Win32.UI.XamlApplication) NuGet package (latest stable version). The process for installng a NuGet package was described in the previous section. + +1. In *MyUWPApp*, open the `App.xaml` file, and replace its contents with the following XAML: + + ```xml + + + ``` + +1. Similarly, open `App.xaml.cs`, and replace its contents with the following code: + + ```csharp + namespace MyUWPApp + { + public sealed partial class App : Microsoft.Toolkit.Win32.UI.XamlHost.XamlApplication + { + public App() + { + this.Initialize(); + } + } + } + ``` + +1. Delete the `MainPage.xaml` and `MainPage.xaml.cs` files. +1. Build the *MyUWPApp* project. + +## In MyWPFApp, add a reference to the MyUWPApp project + +1. Specify the compatible framework version in *MyWPFApp*'s project file like this: + + 1. In **Solution Explorer**, click the *MyWPFApp* project node to open the project file in the editor. + 1. Inside the first **PropertyGroup** element, add the following child element. Change the `19041` portion of the value as necessary to match the target and minimum OS build of the *MyWPFApp* project. + + ```xml + uap10.0.19041 + ``` + +1. In **Solution Explorer**, right-click *MyWPFApp* > **Dependencies**, choose **Add Project Reference...**, and add a reference to the *MyUWPApp* project. + +## Instantiate the XamlApplication object in the entry point of MyWPFApp + +Next, add code to the entry point of *MyWPFApp* to create an instance of the **App** class that you just defined in *MyUWPApp* (the class that derives from **XamlApplication**). + +1. Right-click the *MyWPFApp* project node, select **Add** > **New Item...**, and then select **Class**. Set **Name** to *Program.cs*, and click **Add**. + +1. Replace the contents of `Program.cs` with the following XAML (and then save the file and build the *MyWPFApp* project): + + ```csharp + namespace MyWPFApp + { + public class Program + { + [System.STAThreadAttribute()] + public static void Main() + { + using (new MyUWPApp.App()) + { + var app = new MyWPFApp.App(); + app.InitializeComponent(); + app.Run(); + } + } + } + } + ``` + +1. Right-click the *MyWPFApp* project node, and choose **Properties**. + +1. In **Application** > **General**, click the **Startup object** drop-down, and choose *MyWPFApp.Program* (which is the fully-qualified name of the **Program** class that you just added). If you don't see it, then try closing and reopening Visual Studio. + + > [!NOTE] + > By default, a WPF project defines a **Main** entry point function in a generated code file that isn't intended to be modified. The step above changes the entry point for your project to the **Main** method of the new **Program** class, which enables you to add code that runs as early in the startup process of the app as possible. + +1. Save your changes to the project properties. + +## Use wrapped controls to host an InkCanvas and InkToolbar + +Now that you've configured your project to use UWP XAML Islands, you're ready to add the [**InkCanvas**](/windows/communitytoolkit/controls/wpf-winforms/inkcanvas) and [**InkToolbar**](/windows/communitytoolkit/controls/wpf-winforms/inktoolbar) wrapped UWP XAML controls to the app. + +1. In *MyWPFApp*, open the `MainWindow.xaml` file. + +1. In the **Window** element near the top of the XAML file, add the following attribute. This attribute references the XAML namespace for the **InkCanvas** and **InkToolbar** wrapped UWP XAML controls, and maps it to the **controls** XML namespace. + + ```xml + xmlns:controls="clr-namespace:Microsoft.Toolkit.Wpf.UI.Controls;assembly=Microsoft.Toolkit.Wpf.UI.Controls" + ``` + +1. Still in `MainWindow.xaml`, edit the existing **Grid** element so that it looks like the XAML below. This XAML adds to the **Grid** an [**InkCanvas**](/windows/communitytoolkit/controls/wpf-winforms/inkcanvas) and an [**InkToolbar**](/windows/communitytoolkit/controls/wpf-winforms/inktoolbar) control (prefixed by the **controls** XML namespace that you defined in the previous step). + + ```xml + + + + + + + + + ``` + + > [!NOTE] + > You can also add these and other wrapped controls to the **Window** by dragging them to the designer from the **Windows Community Toolkit** section of the **Toolbox**. + +1. Save `MainWindow.xaml`. + + If you have a device that supports a digital pen (such as a Surface), and you're following along on a physical machine, then you could now build and run the app, and draw digital ink on the screen with the pen. But if you try to write with your mouse, then nothing will happen, because by default **InkCanvas** is enabled only for digital pens. Here's how to enable **InkCanvas** for the mouse. + +1. Still in *MyWPFApp*, open `MainWindow.xaml.cs`. + +1. Add the following namespace directive to the top of the file: + + ```csharp + using Microsoft.Toolkit.Win32.UI.Controls.Interop.WinRT; + ``` + +1. Locate the **MainWindow** constructor. Immediately after the call to **InitializeComponent**, add the following line of code: + + ```csharp + myInkCanvas.InkPresenter.InputDeviceTypes = CoreInputDeviceTypes.Mouse | CoreInputDeviceTypes.Pen; + ``` + + You can use the **InkPresenter** object to customize the default inking experience. The code above uses the **InputDeviceTypes** property to enable mouse as well as pen input. + +1. Save, build, and run. If you're using a computer with a mouse, then confirm that you can draw something in the ink canvas space with the mouse. + +## Host a CalendarView by using the host control + +In this section, we'll use the [**WindowsXamlHost**](/windows/communitytoolkit/controls/wpf-winforms/windowsxamlhost) control to add a [**CalendarView**](/uwp/api/Windows.UI.Xaml.Controls.CalendarView) to the app. + +> [!NOTE] +> The [**WindowsXamlHost**](/windows/communitytoolkit/controls/wpf-winforms/windowsxamlhost) control is provided by the [**Microsoft.Toolkit.Wpf.UI.XamlHost**](https://www.nuget.org/packages/Microsoft.Toolkit.Wpf.UI.XamlHost) package. That package is included with the [**Microsoft.Toolkit.Wpf.UI.Controls**](https://www.nuget.org/packages/Microsoft.Toolkit.Wpf.UI.Controls) package that you installed earlier. + +1. In **Solution Explorer**, in *MyWPFApp*, open the `MainWindow.xaml` file. + +1. In the **Window** element near the top of the XAML file, add the following attribute. This attribute references the XAML namespace for the **WindowsXamlHost** control, and maps it to the **xamlhost** XML namespace. + + ```xml + xmlns:xamlhost="clr-namespace:Microsoft.Toolkit.Wpf.UI.XamlHost;assembly=Microsoft.Toolkit.Wpf.UI.XamlHost" + ``` + +1. Still in `MainWindow.xaml`, edit the existing **Grid** element so that it looks like the XAML below. This XAML adds to the **Grid** a [**WindowsXamlHost**](/windows/communitytoolkit/controls/wpf-winforms/windowsxamlhost) control (prefixed by the **xamlhost** XML namespace that you defined in the previous step). To host a UWP [**CalendarView**](/uwp/api/Windows.UI.Xaml.Controls.CalendarView) control, this XAML sets the **InitialTypeName** property to the fully-qualified name of the control. The XAML also defines an event handler for the **ChildChanged** event, which is raised when the hosted control has been rendered. + + ```xml + + + + ``` + +1. Save `MainWindow.xaml`, and open `MainWindow.xaml.cs`. + +1. Delete this line of code, which we added in the previous section: `myInkCanvas.InkPresenter.InputDeviceTypes = CoreInputDeviceTypes.Mouse | CoreInputDeviceTypes.Pen;`. + +1. Add the following namespace directive to the top of the file: + + ```csharp + using Microsoft.Toolkit.Wpf.UI.XamlHost; + ``` + +1. Add the following **ChildChanged** event handler method to the **MainWindow** class. When the host control has been rendered, this event handler runs and creates a simple event handler for the **SelectedDatesChanged** event of the calendar control. + + ```csharp + private void MyCalendar_ChildChanged(object sender, EventArgs e) + { + WindowsXamlHost windowsXamlHost = (WindowsXamlHost)sender; + + var calendarView = + (Windows.UI.Xaml.Controls.CalendarView)windowsXamlHost.Child; + + if (calendarView != null) + { + calendarView.SelectedDatesChanged += (obj, args) => + { + if (args.AddedDates.Count > 0) + { + MessageBox.Show("The user selected a new date: " + + args.AddedDates[0].DateTime.ToString()); + } + }; + } + } + ``` + +1. Save, build, and run. Confirm that the calendar control is shown in the window, and that a message box is displayed when you select a date. + +## Package the app + +You can optionally package your WPF app in an [MSIX package](/windows/msix) for deployment. MSIX is the modern and reliable app packaging technology for Windows. + +The following instructions show you how to package all the components in the solution into an MSIX package by using the **Windows Application Packaging Project** in Visual Studio (see [Set up your desktop application for MSIX packaging in Visual Studio](/windows/msix/desktop/desktop-to-uwp-packaging-dot-net)). These steps are necessary only if you want to package the WPF app in an MSIX package. + +> [!NOTE] +> If you choose not to package your application in an [MSIX package](/windows/msix) for deployment, then computers that run your app must have the [Visual C++ Runtime](https://support.microsoft.com/help/2977003/the-latest-supported-visual-c-downloads) installed. + +1. Add a new project to your solution created from the **Windows Application Packaging Project** project template. As you create the project, select the same **Target version** and **Minimum version** as you selected for the UWP project. + +1. In the packaging project, right-click the **Dependencies** node, and choose **Add Project Reference...**. In the list of projects, select *MyWPFApp*, and click **OK**. + + > [!NOTE] + > If you want to publish your app in the Microsoft Store, then you also have to add a reference to the UWP project in the packaging project. + +1. If you followed the steps up to this point, then all of the projects in your solution will target the same specific platform (x86 or x64). And that's necessary in order to build the WPF app into an MSIX package using the Windows Application Packaging Project. To confirm that, you can follow these steps: + + 1. Right-click the solution node (*not* the project node) in **Solution Explorer**, and choose **Properties**. + 1. Select **Configuration Properties** on the left. + 1. Click the **Configuration Manager...** button. + 1. Confirm that all of the listed projects have the same value under **Platform**: either *x86* or *x64*. + +1. Right-click the project node for the packaging project that you just added, and click **Set as Startup project**. + +1. Build and run the packaging project. Confirm that the WPF app runs, and that the UWP control(s) display as expected. + +1. For info about distributing/deploying the package, see [Manage your MSIX deployment](/windows/msix/desktop/managing-your-msix-deployment-overview). + +## Related topics + +* [Host WinRT XAML controls in desktop apps (XAML Islands)](xaml-islands.md) +* [InkCanvas class (UWP)](/uwp/api/Windows.UI.Xaml.Controls.InkCanvas) +* [InkToolbar class (UWP)](/uwp/api/windows.ui.xaml.controls.inktoolbar) +* [CalendarView class (UWP)](/uwp/api/Windows.UI.Xaml.Controls.CalendarView) +* [WindowsXamlHost control for Windows Forms and WPF](/windows/communitytoolkit/controls/wpf-winforms/windowsxamlhost) +* [.NET Core 3.1](https://dotnet.microsoft.com/download/dotnet/3.1) +* [PackageReference in project files](/nuget/consume-packages/package-references-in-project-files) +* [InkCanvas control for Windows Forms and WPF](/windows/communitytoolkit/controls/wpf-winforms/inkcanvas) +* [InkToolbar control for Windows Forms and WPF](/windows/communitytoolkit/controls/wpf-winforms/inktoolbar) +* [IXamlMetadataProvider interface](/uwp/api/Windows.UI.Xaml.Markup.IXamlMetadataProvider) +* [MSIX documentation](/windows/msix) +* [Set up your desktop application for MSIX packaging in Visual Studio](/windows/msix/desktop/desktop-to-uwp-packaging-dot-net) +* [Microsoft Visual C++ Redistributable latest supported downloads](https://support.microsoft.com/help/2977003/the-latest-supported-visual-c-downloads) diff --git a/hub/apps/desktop/modernize/using-the-xaml-hosting-api.md b/hub/apps/desktop/modernize/xaml-islands/using-the-xaml-hosting-api.md similarity index 99% rename from hub/apps/desktop/modernize/using-the-xaml-hosting-api.md rename to hub/apps/desktop/modernize/xaml-islands/using-the-xaml-hosting-api.md index b685f3bdf8..512ccef85d 100644 --- a/hub/apps/desktop/modernize/using-the-xaml-hosting-api.md +++ b/hub/apps/desktop/modernize/xaml-islands/using-the-xaml-hosting-api.md @@ -2,10 +2,8 @@ description: This article describes how to host WinRT XAML UI in your desktop C++ desktop (Win32) app. title: Using the WinRT XAML hosting API in a C++ desktop (Win32) app ms.date: 03/23/2020 -ms.topic: article +ms.topic: concept-article keywords: windows 10, uwp, windows forms, wpf, win32, xaml islands -ms.author: kbridge -author: Karl-Bridge-Microsoft ms.localizationpriority: medium ms.custom: 19H1 --- @@ -84,7 +82,7 @@ The following diagram illustrates the hierarchy of objects in a XAML Island that * Finally, at the top level is the WinRT XAML control you want to host in your desktop app. This can be any UWP object that derives from [Windows.UI.Xaml.UIElement](/uwp/api/windows.ui.xaml.uielement), including any WinRT XAML control provided by the Windows SDK as well as custom user controls. -![DesktopWindowXamlSource architecture](images/xaml-islands/xaml-hosting-api-rev2.png) +![DesktopWindowXamlSource architecture](../images/xaml-islands/xaml-hosting-api-rev2.png) > [!NOTE] > When you host XAML Islands in a desktop app, you can have multiple trees of XAML content running on the same thread at the same time. To access the root element of a tree of XAML content in a XAML Island and get related information about the context in which it is hosted, use the [XamlRoot](/uwp/api/windows.ui.xaml.xamlroot) class. The [CoreWindow](/uwp/api/windows.ui.core.corewindow), [ApplicationView](/uwp/api/windows.ui.viewmanagement.applicationview), and [Window](/uwp/api/windows.ui.xaml.window) APIs won't provide the correct information for XAML Islands. For more information, see [this section](xaml-islands.md#window-host-context-for-xaml-islands). diff --git a/hub/apps/desktop/modernize/xaml-islands.md b/hub/apps/desktop/modernize/xaml-islands/xaml-islands.md similarity index 91% rename from hub/apps/desktop/modernize/xaml-islands.md rename to hub/apps/desktop/modernize/xaml-islands/xaml-islands.md index 283ce658c8..414570c9bb 100644 --- a/hub/apps/desktop/modernize/xaml-islands.md +++ b/hub/apps/desktop/modernize/xaml-islands/xaml-islands.md @@ -1,183 +1,181 @@ ---- -description: This guide helps you to create Fluent-based UWP UIs directly in your WPF and Windows Forms applications -title: Host WinRT XAML controls in desktop apps -ms.date: 10/20/2020 -ms.topic: article -keywords: windows 10, uwp, windows forms, wpf, xaml islands -ms.author: kbridge -author: Karl-Bridge-Microsoft -ms.localizationpriority: high -ms.custom: 19H1 ---- - -# Host WinRT XAML controls in desktop apps (XAML Islands) - -> [!IMPORTANT] -> This topic uses or mentions types from the [CommunityToolkit/Microsoft.Toolkit.Win32](https://github.com/CommunityToolkit/Microsoft.Toolkit.Win32) GitHub repo. For important info about XAML Islands support, please see the [XAML Islands Notice](https://github.com/CommunityToolkit/Microsoft.Toolkit.Win32#xaml-islands-notice) in that repo. - -Starting in Windows 10, version 1903, you can host WinRT XAML controls in non-UWP desktop applications using a feature called *XAML Islands*. This feature enables you to enhance the look, feel, and functionality of your existing WPF, Windows Forms, and C++ desktop (Win32) applications with the latest Windows UI features that are only available via WinRT XAML controls. This means that you can use UWP features such as [Windows Ink](/windows/uwp/design/input/pen-and-stylus-interactions) and controls that support the [Fluent Design System](/windows/uwp/design/fluent-design-system/index) in your existing WPF, Windows Forms, and C++ desktop applications. - -You can host any WinRT XAML control that derives from [Windows.UI.Xaml.UIElement](/uwp/api/windows.ui.xaml.uielement), including: - -* Most first-party WinRT XAML control provided by the Windows SDK or the WinUI 2 library (see [exceptions](#limitations-and-workarounds)). -* Any custom WinRT XAML control (for example, a user control that consists of several WinRT XAML controls that work together). You must have the source code for the custom control so you can compile it with your application. - -Fundamentally, XAML Islands are created by using the *WinRT XAML hosting API*. This API consists of several Windows Runtime classes and COM interfaces that were introduced in the Windows 10, version 1903 SDK. We also provide a set of XAML Island .NET controls in the [Windows Community Toolkit](/windows/uwpcommunitytoolkit/) that use the WinRT XAML hosting API internally and provide a more convenient development experience for WPF and Windows Forms apps. - -The way you use XAML Islands depends on your application type and the types of WinRT XAML controls you want to host. - -> [!NOTE] -> If you have feedback about XAML Islands, create a new issue in the [Microsoft.Toolkit.Win32 repo](https://github.com/windows-toolkit/Microsoft.Toolkit.Win32/issues) and leave your comments there. - -## Requirements - -XAML Islands have these run time requirements: - -* Windows 10, version 1903, or a later release. -* If your application is not packaged in an [MSIX package](/windows/msix) for deployment, the computer must have the [Visual C++ Runtime](https://support.microsoft.com/en-us/help/2977003/the-latest-supported-visual-c-downloads) installed. - -## WPF and Windows Forms applications - -> [!NOTE] -> Using XAML Islands to host WinRT XAML controls in WPF and Windows Forms apps is currently supported only in apps that target .NET Core 3.x. XAML Islands are not yet supported in apps that target .NET, or in apps that any version of the .NET Framework. - -We recommend that WPF and Windows Forms applications use the XAML Island .NET controls that are available in the Windows Community Toolkit. These controls provide an object model that mimics (or provides access to) the properties, methods, and events of the corresponding WinRT XAML controls. They also handle behavior such as keyboard navigation and layout changes. - -There are two sets of XAML Island controls for WPF and Windows Forms applications: *wrapped controls* and *host controls*. - -### Wrapped controls - -WPF and Windows Forms applications can use a selection of XAML Island controls that wrap the interface and functionality of a specific WinRT XAML control. You can add these controls directly to the design surface of your WPF or Windows Forms project and then use them like any other WPF or Windows Forms control in the designer. - -The following wrapped WinRT XAML controls are currently available in the Windows Community Toolkit. - -| Control | Minimum supported OS | Description | -|-----------------|-------------------------------|-------------| -| [InkCanvas](/windows/communitytoolkit/controls/wpf-winforms/inkcanvas)
[InkToolbar](/windows/communitytoolkit/controls/wpf-winforms/inktoolbar) | Windows 10, version 1903 | Provide a surface and related toolbars for Windows Ink-based user interaction in your Windows Forms or WPF desktop application. | -| [MediaPlayerElement](/windows/communitytoolkit/controls/wpf-winforms/mediaplayerelement) | Windows 10, version 1903 | Embeds a view that streams and renders media content such as video in your Windows Forms or WPF desktop application. | -| [MapControl](/windows/communitytoolkit/controls/wpf-winforms/mapcontrol) | Windows 10, version 1903 | Enables you to display a symbolic or photorealistic map in your Windows Forms or WPF desktop application. | - -For a walkthrough that demonstrates how to use the wrapped WinRT XAML controls, see [Use XAML Islands to host a UWP XAML control in a C# WPF app](host-standard-control-with-xaml-islands.md). - -### Host controls - -For custom controls and other scenarios beyond those covered by the available wrapped controls, WPF and Windows Forms applications can also use the [WindowsXamlHost](/windows/communitytoolkit/controls/wpf-winforms/windowsxamlhost) control that is available in the Windows Community Toolkit. - -| Control | Minimum supported OS | Description | -|-----------------|-------------------------------|-------------| -| [WindowsXamlHost](/windows/communitytoolkit/controls/wpf-winforms/windowsxamlhost) | Windows 10, version 1903 | Can host any WinRT XAML control that derives from [Windows.UI.Xaml.UIElement](/uwp/api/windows.ui.xaml.uielement), including any first-party WinRT XAML control provided by the Windows SDK as well as custom controls. | - -For walkthroughs that demonstrate how to use the **WindowsXamlHost** control, see [Use XAML Islands to host a UWP XAML control in a C# WPF app](host-standard-control-with-xaml-islands.md) and [Host a custom WinRT XAML control in a WPF app using XAML Islands](host-custom-control-with-xaml-islands.md). - - - -### Configure your project to use the XAML Island .NET controls - -The XAML Island .NET controls require Windows 10, version 1903, or a later version. To use these controls, install one of the NuGet packages listed below. These packages provide everything you need to use the XAML Island wrapped controls and host controls, and they include other related NuGet packages that are also required. - -| Type of control | NuGet package | Related articles | -|-----------------|----------------|---------------------| -| [Wrapped controls](#wrapped-controls) | Version 6.0.0 or later of these packages:
  • WPF: [Microsoft.Toolkit.Wpf.UI.Controls](https://www.nuget.org/packages/Microsoft.Toolkit.Wpf.UI.Controls)
  • Windows Forms: [Microsoft.Toolkit.Forms.UI.Controls](https://www.nuget.org/packages/Microsoft.Toolkit.Forms.UI.Controls)
| [Use XAML Islands to host a UWP XAML control in a C# WPF app](host-standard-control-with-xaml-islands.md) | -| [Host control](#host-controls) | Version 6.0.0 or later of these packages:
  • WPF: [Microsoft.Toolkit.Wpf.UI.XamlHost](https://www.nuget.org/packages/Microsoft.Toolkit.Wpf.UI.XamlHost)
  • Windows Forms: [Microsoft.Toolkit.Forms.UI.XamlHost](https://www.nuget.org/packages/Microsoft.Toolkit.Forms.UI.XamlHost)
| [Use XAML Islands to host a UWP XAML control in a C# WPF app](host-standard-control-with-xaml-islands.md)
[Host a custom WinRT XAML control in a WPF app](host-custom-control-with-xaml-islands.md) | - -Be aware of the following details: - -* The host control packages are also included in the wrapped control packages. You can install the wrapped control packages if you want to use both sets of controls. - -* If you're hosting a custom WinRT XAML control, you'll also need to perform some additional steps to reference the custom control. For more info, see [Host a custom WinRT XAML control in a WPF app using XAML Islands](host-custom-control-with-xaml-islands.md). - -### Web view controls - -The Windows Community Toolkit also provides the following .NET controls for hosting web content in WPF and Windows Forms applications. These controls are often used in similar desktop app modernization scenarios as the XAML Island controls, and they are maintained in the same [Microsoft.Toolkit.Win32 repo](https://github.com/windows-toolkit/Microsoft.Toolkit.Win32) repo as the XAML Island controls. - -| Control | Minimum supported OS | Description | -|-----------------|-------------------------------|-------------| -| [WebView](/windows/communitytoolkit/controls/wpf-winforms/webview) | Windows 10, version 1803 | Uses the Microsoft Edge rendering engine to show web content. | -| [WebViewCompatible](/windows/communitytoolkit/controls/wpf-winforms/webviewcompatible) | Windows 7 | Provides a version of **WebView** that is compatible with more OS versions. This control uses the Microsoft Edge rendering engine to show web content on Windows 10 version 1803 and later, and the Internet Explorer rendering engine to show web content on earlier versions of Windows 10, Windows 8.x, and Windows 7. | - -To use these controls, install one of these NuGet packages: - -* WPF: [Microsoft.Toolkit.Wpf.UI.Controls.WebView](https://www.nuget.org/packages/Microsoft.Toolkit.Wpf.UI.Controls.WebView) -* Windows Forms: [Microsoft.Toolkit.Forms.UI.Controls.WebView](https://www.nuget.org/packages/Microsoft.Toolkit.Forms.UI.Controls.WebView) - -## C++ desktop (Win32) applications - -The XAML Island .NET controls are not supported in C++ desktop applications. These applications must instead use the *WinRT XAML hosting API* provided by the Windows 10 SDK (version 1903 and later). - -The WinRT XAML hosting API consists of several Windows Runtime classes and COM interfaces that your C++ desktop application can use to host any WinRT XAML control that derives from [Windows.UI.Xaml.UIElement](/uwp/api/windows.ui.xaml.uielement). You can host WinRT XAML controls in any UI element in your application that has an associated window handle (HWND). For more information about this API, see the following articles. - -* [Using the WinRT XAML hosting API in a C++ desktop app](using-the-xaml-hosting-api.md) -* [Host a standard WinRT XAML control in a C++ desktop app](host-standard-control-with-xaml-islands-cpp.md) -* [Host a custom WinRT XAML control in a C++ desktop app](host-custom-control-with-xaml-islands-cpp.md) - -> [!NOTE] -> The wrapped controls and host controls in the Windows Community Toolkit use the WinRT XAML hosting API internally and implement all of the behavior you would otherwise need to handle yourself if you used the WinRT XAML hosting API directly, including keyboard navigation and layout changes. For WPF and Windows Forms applications, we strongly recommend that you use these controls instead of the WinRT XAML hosting API directly because they abstract away many of the implementation details of using the API. - -## Architecture of XAML Islands - -Here's a quick look at how the different types of XAML Island controls are organized architecturally on top of the WinRT XAML hosting API. - -![Host control Architecture](images/xaml-islands/host-controls.png) - -The APIs that appear at the bottom of this diagram ship with the Windows SDK. The wrapped controls and host controls are available via NuGet packages in the Windows Community Toolkit. - -## Limitations and workarounds - -The following sections discuss limitations and workarounds for certain UWP development scenarios in desktop apps that use XAML Islands. - -### Supported only with workarounds - -:heavy_check_mark: Hosting controls from the [WinUI 2 Library](../../winui/index.md) in a XAML Island is supported conditionally in the current release of XAML Islands. If your desktop app uses an [MSIX package](/windows/msix) for deployment, you can host WinUI controls from prerelease or release versions of the [Microsoft.UI.Xaml](https://www.nuget.org/packages/Microsoft.UI.Xaml) NuGet package. If your desktop app is not packaged using MSIX, you can host WinUI controls only if you install a prerelease version of the [Microsoft.UI.Xaml](https://www.nuget.org/packages/Microsoft.UI.Xaml) NuGet package, or if you use the [Dynamic Dependencies API](./framework-packages/framework-packages-overview.md). Support for hosting controls from the [WinUI 3.0 Library](../../winui/winui3/index.md) is coming in a later release. - -:heavy_check_mark: To access the root element of a tree of XAML content in a XAML Island and get related information about the context in which it is hosted, do not use the [CoreWindow](/uwp/api/windows.ui.core.corewindow), [ApplicationView](/uwp/api/windows.ui.viewmanagement.applicationview), and [Window](/uwp/api/windows.ui.xaml.window) classes. Instead, use the [XamlRoot](/uwp/api/windows.ui.xaml.xamlroot) class. For more information, see [this section](#window-host-context-for-xaml-islands). - -:heavy_check_mark: To support the [Share contract](/windows/uwp/app-to-app/share-data) from a WPF, Windows Forms, or C++ desktop (Win32) app, your app must use the [IDataTransferManagerInterop](/windows/win32/api/shobjidl_core/nn-shobjidl_core-idatatransfermanagerinterop) interface to get the [DataTransferManager](/uwp/api/windows.applicationmodel.datatransfer.datatransfermanager) object to initiate the share operation for a specific window. For a sample that demonstrates how to use this interface in a WPF app, see the [ShareSource sample](https://github.com/microsoft/Windows-classic-samples/tree/master/Samples/ShareSource). - -:heavy_check_mark: Using `x:Bind` with hosted controls in XAML Islands is not supported. You'll have to declare the data model in a .NET Standard library. - -### Not supported - -:no_entry_sign: Using XAML Islands in WPF and Windows Forms apps that target the .NET Framework. XAML Islands are supported only in apps that target .NET Core 3.x. - -:no_entry_sign: UWP XAML content in XAML Islands doesn't respond to Windows theme changes from dark to light or vice versa at run time. Content does respond to high contrast changes at run time. - -:no_entry_sign: Adding a [Windows.UI.Xaml.WebView](/uwp/api/Windows.UI.Xaml.Controls.WebView) control. For WPF and WinForms apps, see [these alternatives](#web-view-controls). - -:no_entry_sign: The [MediaPlayer](/uwp/api/Windows.Media.Playback.MediaPlayer) control and [MediaPlayerElement](/windows/communitytoolkit/controls/wpf-winforms/mediaplayerelement) host control are not supported in full screen mode. - -:no_entry_sign: Text input with the handwriting view. For more information about this feature, see [this article](/windows/uwp/design/controls-and-patterns/text-handwriting-view). - -:no_entry_sign: Text controls that use `@Places` and `@People` content links. For more information about this feature, see [this article](/windows/uwp/design/controls-and-patterns/content-links). - -:no_entry_sign: XAML Islands do not support hosting a [ContentDialog](/uwp/api/Windows.UI.Xaml.Controls.ContentDialog) that contains a control that accepts text input, such as a [TextBox](/uwp/api/windows.ui.xaml.controls.textbox), [RichEditBox](/uwp/api/windows.ui.xaml.controls.richeditbox), or [AutoSuggestBox](/uwp/api/windows.ui.xaml.controls.autosuggestbox). If you do this, the input control will not properly respond to key presses. To achieve similar functionality using a XAML Island, we recommend that you host a [Popup](/uwp/api/Windows.UI.Xaml.Controls.Primitives.Popup) that contains the input control. - -:no_entry_sign: XAML Islands do not currently support displaying SVG files in a hosted [Windows.UI.Xaml.Controls.Image](/uwp/api/Windows.UI.Xaml.Controls.Image) control or by using an [Windows.UI.Xaml.Media.Imaging.SvgImageSource](/uwp/api/windows.ui.xaml.media.imaging.svgimagesource) object. As a workaround, convert the image files you want to display to raster-based formats such as JPG or PNG. - -### Window host context for XAML Islands - -When you host XAML Islands in a desktop app, you can have multiple trees of XAML content running on the same thread at the same time. To access the root element of a tree of XAML content in a XAML Island and get related information about the context in which it is hosted, use the [XamlRoot](/uwp/api/windows.ui.xaml.xamlroot) class. The [CoreWindow](/uwp/api/windows.ui.core.corewindow), [ApplicationView](/uwp/api/windows.ui.viewmanagement.applicationview), and [Window](/uwp/api/windows.ui.xaml.window) classes won't provide the correct information for XAML Islands. [CoreWindow](/uwp/api/windows.ui.core.corewindow) and [Window](/uwp/api/windows.ui.xaml.window) objects do exist on the thread and are accessible to your app, but they won't return meaningful bounds or visibility (they are always invisible and have a size of 1x1). For more information, see [Windowing hosts](/windows/uwp/design/layout/show-multiple-views#windowing-hosts). - -For example, to get the bounding rectangle of the window that contains a WinRT XAML control that is hosted in a XAML Island, use the [XamlRoot.Size](/uwp/api/windows.ui.xaml.xamlroot.size) property of the control. Because every WinRT XAML control that can be hosted in a XAML Island derives from [Windows.UI.Xaml.UIElement](/uwp/api/windows.ui.xaml.uielement), you can use the [XamlRoot](/uwp/api/windows.ui.xaml.uielement.xamlroot) property of the control to access the **XamlRoot** object. - -```csharp -Size windowSize = myUWPControl.XamlRoot.Size; -``` - -Do not use the [CoreWindows.Bounds](/uwp/api/windows.ui.core.corewindow.bounds) property to get the bounding rectangle. - -```csharp -// This will return incorrect information for a WinRT XAML control that is hosted in a XAML Island. -Rect windowSize = CoreWindow.GetForCurrentThread().Bounds; -``` - -For a table of common windowing-related APIs that you should avoid in the context of XAML Islands and the recommended [XamlRoot](/uwp/api/windows.ui.xaml.xamlroot) replacements, see the table in [this section](/windows/uwp/design/layout/show-multiple-views#make-code-portable-across-windowing-hosts). - -For a sample that demonstrates how to use this interface in a WPF app, see the [ShareSource](https://github.com/microsoft/Windows-classic-samples/tree/master/Samples/ShareSource) sample. - -## Additional resources - -For more background information and tutorials about using XAML Islands, see the following articles and resources: - -* [Modernize a WPF app tutorial](modernize-wpf-tutorial.md): This tutorial provides step-by-step instructions for using the wrapped controls and host controls in the Windows Community Toolkit to add WinRT XAML controls to an existing WPF line-of-business application. This tutorial includes the complete code for the WPF application as well as detailed instructions for each step in the process. -* [XAML Islands code samples](https://github.com/microsoft/Xaml-Islands-Samples): This repo contains Windows Forms, WPF, and C++ desktop (Win32) samples that demonstrate how to use XAML Islands. -* [XAML Islands v1 - Updates and Roadmap](https://blogs.windows.com/windowsdeveloper/2019/06/13/xaml-islands-v1-updates-and-roadmap): This blog post discusses many common questions about XAML Islands and provides a detailed development roadmap. \ No newline at end of file +--- +description: This guide helps you to create Fluent-based UWP UIs directly in your WPF and Windows Forms applications +title: Host WinRT XAML controls in desktop apps +ms.date: 10/20/2020 +ms.topic: how-to +keywords: windows 10, uwp, windows forms, wpf, xaml islands +ms.localizationpriority: high +ms.custom: 19H1 +--- + +# Host WinRT XAML controls in desktop apps (XAML Islands) + +> [!IMPORTANT] +> This topic uses or mentions types from the [CommunityToolkit/Microsoft.Toolkit.Win32](https://github.com/CommunityToolkit/Microsoft.Toolkit.Win32) GitHub repo. For important info about XAML Islands support, please see the [XAML Islands Notice](https://github.com/CommunityToolkit/Microsoft.Toolkit.Win32#xaml-islands-notice) in that repo. + +Starting in Windows 10, version 1903, you can host WinRT XAML controls in non-UWP desktop applications using a feature called *XAML Islands*. This feature enables you to enhance the look, feel, and functionality of your existing WPF, Windows Forms, and C++ desktop (Win32) applications with the latest Windows UI features that are only available via WinRT XAML controls. This means that you can use UWP features such as [Windows Ink](/windows/uwp/design/input/pen-and-stylus-interactions) and controls that support the [Fluent Design System](/windows/uwp/design/fluent-design-system/index) in your existing WPF, Windows Forms, and C++ desktop applications. + +You can host any WinRT XAML control that derives from [Windows.UI.Xaml.UIElement](/uwp/api/windows.ui.xaml.uielement), including: + +* Most first-party WinRT XAML control provided by the Windows SDK or the WinUI 2 library (see [exceptions](#limitations-and-workarounds)). +* Any custom WinRT XAML control (for example, a user control that consists of several WinRT XAML controls that work together). You must have the source code for the custom control so you can compile it with your application. + +Fundamentally, XAML Islands are created by using the *WinRT XAML hosting API*. This API consists of several Windows Runtime classes and COM interfaces that were introduced in the Windows 10, version 1903 SDK. We also provide a set of XAML Island .NET controls in the [Windows Community Toolkit](/windows/uwpcommunitytoolkit/) that use the WinRT XAML hosting API internally and provide a more convenient development experience for WPF and Windows Forms apps. + +The way you use XAML Islands depends on your application type and the types of WinRT XAML controls you want to host. + +> [!NOTE] +> If you have feedback about XAML Islands, create a new issue in the [Microsoft.Toolkit.Win32 repo](https://github.com/windows-toolkit/Microsoft.Toolkit.Win32/issues) and leave your comments there. + +## Requirements + +XAML Islands have these run time requirements: + +* Windows 10, version 1903, or a later release. +* If your application is not packaged in an [MSIX package](/windows/msix) for deployment, the computer must have the [Visual C++ Runtime](https://support.microsoft.com/en-us/help/2977003/the-latest-supported-visual-c-downloads) installed. + +## WPF and Windows Forms applications + +> [!NOTE] +> Using XAML Islands to host WinRT XAML controls in WPF and Windows Forms apps is currently supported only in apps that target .NET Core 3.x. XAML Islands are not yet supported in apps that target .NET, or in apps that any version of the .NET Framework. + +We recommend that WPF and Windows Forms applications use the XAML Island .NET controls that are available in the Windows Community Toolkit. These controls provide an object model that mimics (or provides access to) the properties, methods, and events of the corresponding WinRT XAML controls. They also handle behavior such as keyboard navigation and layout changes. + +There are two sets of XAML Island controls for WPF and Windows Forms applications: *wrapped controls* and *host controls*. + +### Wrapped controls + +WPF and Windows Forms applications can use a selection of XAML Island controls that wrap the interface and functionality of a specific WinRT XAML control. You can add these controls directly to the design surface of your WPF or Windows Forms project and then use them like any other WPF or Windows Forms control in the designer. + +The following wrapped WinRT XAML controls are currently available in the Windows Community Toolkit. + +| Control | Minimum supported OS | Description | +|-----------------|-------------------------------|-------------| +| [InkCanvas](/windows/communitytoolkit/controls/wpf-winforms/inkcanvas)
[InkToolbar](/windows/communitytoolkit/controls/wpf-winforms/inktoolbar) | Windows 10, version 1903 | Provide a surface and related toolbars for Windows Ink-based user interaction in your Windows Forms or WPF desktop application. | +| [MediaPlayerElement](/windows/communitytoolkit/controls/wpf-winforms/mediaplayerelement) | Windows 10, version 1903 | Embeds a view that streams and renders media content such as video in your Windows Forms or WPF desktop application. | +| [MapControl](/windows/communitytoolkit/controls/wpf-winforms/mapcontrol) | Windows 10, version 1903 | Enables you to display a symbolic or photorealistic map in your Windows Forms or WPF desktop application. | + +For a walkthrough that demonstrates how to use the wrapped WinRT XAML controls, see [Use XAML Islands to host a UWP XAML control in a C# WPF app](host-standard-control-with-xaml-islands.md). + +### Host controls + +For custom controls and other scenarios beyond those covered by the available wrapped controls, WPF and Windows Forms applications can also use the [WindowsXamlHost](/windows/communitytoolkit/controls/wpf-winforms/windowsxamlhost) control that is available in the Windows Community Toolkit. + +| Control | Minimum supported OS | Description | +|-----------------|-------------------------------|-------------| +| [WindowsXamlHost](/windows/communitytoolkit/controls/wpf-winforms/windowsxamlhost) | Windows 10, version 1903 | Can host any WinRT XAML control that derives from [Windows.UI.Xaml.UIElement](/uwp/api/windows.ui.xaml.uielement), including any first-party WinRT XAML control provided by the Windows SDK as well as custom controls. | + +For walkthroughs that demonstrate how to use the **WindowsXamlHost** control, see [Use XAML Islands to host a UWP XAML control in a C# WPF app](host-standard-control-with-xaml-islands.md) and [Host a custom WinRT XAML control in a WPF app using XAML Islands](host-custom-control-with-xaml-islands.md). + + + +### Configure your project to use the XAML Island .NET controls + +The XAML Island .NET controls require Windows 10, version 1903, or a later version. To use these controls, install one of the NuGet packages listed below. These packages provide everything you need to use the XAML Island wrapped controls and host controls, and they include other related NuGet packages that are also required. + +| Type of control | NuGet package | Related articles | +|-----------------|----------------|---------------------| +| [Wrapped controls](#wrapped-controls) | Version 6.0.0 or later of these packages:
  • WPF: [Microsoft.Toolkit.Wpf.UI.Controls](https://www.nuget.org/packages/Microsoft.Toolkit.Wpf.UI.Controls)
  • Windows Forms: [Microsoft.Toolkit.Forms.UI.Controls](https://www.nuget.org/packages/Microsoft.Toolkit.Forms.UI.Controls)
| [Use XAML Islands to host a UWP XAML control in a C# WPF app](host-standard-control-with-xaml-islands.md) | +| [Host control](#host-controls) | Version 6.0.0 or later of these packages:
  • WPF: [Microsoft.Toolkit.Wpf.UI.XamlHost](https://www.nuget.org/packages/Microsoft.Toolkit.Wpf.UI.XamlHost)
  • Windows Forms: [Microsoft.Toolkit.Forms.UI.XamlHost](https://www.nuget.org/packages/Microsoft.Toolkit.Forms.UI.XamlHost)
| [Use XAML Islands to host a UWP XAML control in a C# WPF app](host-standard-control-with-xaml-islands.md)
[Host a custom WinRT XAML control in a WPF app](host-custom-control-with-xaml-islands.md) | + +Be aware of the following details: + +* The host control packages are also included in the wrapped control packages. You can install the wrapped control packages if you want to use both sets of controls. + +* If you're hosting a custom WinRT XAML control, you'll also need to perform some additional steps to reference the custom control. For more info, see [Host a custom WinRT XAML control in a WPF app using XAML Islands](host-custom-control-with-xaml-islands.md). + +### Web view controls + +The Windows Community Toolkit also provides the following .NET controls for hosting web content in WPF and Windows Forms applications. These controls are often used in similar desktop app modernization scenarios as the XAML Island controls, and they are maintained in the same [Microsoft.Toolkit.Win32 repo](https://github.com/windows-toolkit/Microsoft.Toolkit.Win32) as the XAML Island controls. + +| Control | Minimum supported OS | Description | +|-----------------|-------------------------------|-------------| +| [WebView](/windows/communitytoolkit/controls/wpf-winforms/webview) | Windows 10, version 1803 | Uses the Microsoft Edge rendering engine to show web content. | +| [WebViewCompatible](/windows/communitytoolkit/controls/wpf-winforms/webviewcompatible) | Windows 7 | Provides a version of **WebView** that is compatible with more OS versions. This control uses the Microsoft Edge rendering engine to show web content on Windows 10 version 1803 and later, and the Internet Explorer rendering engine to show web content on earlier versions of Windows 10, Windows 8.x, and Windows 7. | + +To use these controls, install one of these NuGet packages: + +* WPF: [Microsoft.Toolkit.Wpf.UI.Controls.WebView](https://www.nuget.org/packages/Microsoft.Toolkit.Wpf.UI.Controls.WebView) +* Windows Forms: [Microsoft.Toolkit.Forms.UI.Controls.WebView](https://www.nuget.org/packages/Microsoft.Toolkit.Forms.UI.Controls.WebView) + +## C++ desktop (Win32) applications + +The XAML Island .NET controls are not supported in C++ desktop applications. These applications must instead use the *WinRT XAML hosting API* provided by the Windows 10 SDK (version 1903 and later). + +The WinRT XAML hosting API consists of several Windows Runtime classes and COM interfaces that your C++ desktop application can use to host any WinRT XAML control that derives from [Windows.UI.Xaml.UIElement](/uwp/api/windows.ui.xaml.uielement). You can host WinRT XAML controls in any UI element in your application that has an associated window handle (HWND). For more information about this API, see the following articles. + +* [Using the WinRT XAML hosting API in a C++ desktop app](using-the-xaml-hosting-api.md) +* [Host a standard WinRT XAML control in a C++ desktop app](host-standard-control-with-xaml-islands-cpp.md) +* [Host a custom WinRT XAML control in a C++ desktop app](host-custom-control-with-xaml-islands-cpp.md) + +> [!NOTE] +> The wrapped controls and host controls in the Windows Community Toolkit use the WinRT XAML hosting API internally and implement all of the behavior you would otherwise need to handle yourself if you used the WinRT XAML hosting API directly, including keyboard navigation and layout changes. For WPF and Windows Forms applications, we strongly recommend that you use these controls instead of the WinRT XAML hosting API directly because they abstract away many of the implementation details of using the API. + +## Architecture of XAML Islands + +Here's a quick look at how the different types of XAML Island controls are organized architecturally on top of the WinRT XAML hosting API. + +![Host control Architecture](../images/xaml-islands/host-controls.png) + +The APIs that appear at the bottom of this diagram ship with the Windows SDK. The wrapped controls and host controls are available via NuGet packages in the Windows Community Toolkit. + +## Limitations and workarounds + +The following sections discuss limitations and workarounds for certain UWP development scenarios in desktop apps that use XAML Islands. + +### Supported only with workarounds + +:heavy_check_mark: Hosting controls from the [WinUI 2 Library](../../../winui/index.md) in a XAML Island is supported conditionally in the current release of XAML Islands. If your desktop app uses an [MSIX package](/windows/msix) for deployment, you can host WinUI controls from prerelease or release versions of the [Microsoft.UI.Xaml](https://www.nuget.org/packages/Microsoft.UI.Xaml) NuGet package. If your desktop app is not packaged using MSIX, you can host WinUI controls only if you install a prerelease version of the [Microsoft.UI.Xaml](https://www.nuget.org/packages/Microsoft.UI.Xaml) NuGet package, or if you use the [Dynamic Dependencies API](../framework-packages/framework-packages-overview.md). Support for hosting controls from the [WinUI 3.0 Library](../../../winui/winui3/index.md) is coming in a later release. + +:heavy_check_mark: To access the root element of a tree of XAML content in a XAML Island and get related information about the context in which it is hosted, do not use the [CoreWindow](/uwp/api/windows.ui.core.corewindow), [ApplicationView](/uwp/api/windows.ui.viewmanagement.applicationview), and [Window](/uwp/api/windows.ui.xaml.window) classes. Instead, use the [XamlRoot](/uwp/api/windows.ui.xaml.xamlroot) class. For more information, see [this section](#window-host-context-for-xaml-islands). + +:heavy_check_mark: To support the [Share contract](/windows/uwp/app-to-app/share-data) from a WPF, Windows Forms, or C++ desktop (Win32) app, your app must use the [IDataTransferManagerInterop](/windows/win32/api/shobjidl_core/nn-shobjidl_core-idatatransfermanagerinterop) interface to get the [DataTransferManager](/uwp/api/windows.applicationmodel.datatransfer.datatransfermanager) object to initiate the share operation for a specific window. For a sample that demonstrates how to use this interface in a WPF app, see the [ShareSource sample](https://github.com/microsoft/Windows-classic-samples/tree/master/Samples/ShareSource). + +:heavy_check_mark: Using `x:Bind` with hosted controls in XAML Islands is not supported. You'll have to declare the data model in a .NET Standard library. + +### Not supported + +:no_entry_sign: Using XAML Islands in WPF and Windows Forms apps that target the .NET Framework. XAML Islands are supported only in apps that target .NET Core 3.x. + +:no_entry_sign: UWP XAML content in XAML Islands doesn't respond to Windows theme changes from dark to light or vice versa at run time. Content does respond to high contrast changes at run time. + +:no_entry_sign: Adding a [Windows.UI.Xaml.WebView](/uwp/api/Windows.UI.Xaml.Controls.WebView) control. For WPF and WinForms apps, see [these alternatives](#web-view-controls). + +:no_entry_sign: The [MediaPlayer](/uwp/api/Windows.Media.Playback.MediaPlayer) control and [MediaPlayerElement](/windows/communitytoolkit/controls/wpf-winforms/mediaplayerelement) host control are not supported in full screen mode. + +:no_entry_sign: Text input with the handwriting view. For more information about this feature, see [this article](/windows/uwp/design/controls-and-patterns/text-handwriting-view). + +:no_entry_sign: Text controls that use `@Places` and `@People` content links. For more information about this feature, see [this article](/windows/uwp/design/controls-and-patterns/content-links). + +:no_entry_sign: XAML Islands do not support hosting a [ContentDialog](/uwp/api/Windows.UI.Xaml.Controls.ContentDialog) that contains a control that accepts text input, such as a [TextBox](/uwp/api/windows.ui.xaml.controls.textbox), [RichEditBox](/uwp/api/windows.ui.xaml.controls.richeditbox), or [AutoSuggestBox](/uwp/api/windows.ui.xaml.controls.autosuggestbox). If you do this, the input control will not properly respond to key presses. To achieve similar functionality using a XAML Island, we recommend that you host a [Popup](/uwp/api/Windows.UI.Xaml.Controls.Primitives.Popup) that contains the input control. + +:no_entry_sign: XAML Islands do not currently support displaying SVG files in a hosted [Windows.UI.Xaml.Controls.Image](/uwp/api/Windows.UI.Xaml.Controls.Image) control or by using an [Windows.UI.Xaml.Media.Imaging.SvgImageSource](/uwp/api/windows.ui.xaml.media.imaging.svgimagesource) object. As a workaround, convert the image files you want to display to raster-based formats such as JPG or PNG. + +### Window host context for XAML Islands + +When you host XAML Islands in a desktop app, you can have multiple trees of XAML content running on the same thread at the same time. To access the root element of a tree of XAML content in a XAML Island and get related information about the context in which it is hosted, use the [XamlRoot](/uwp/api/windows.ui.xaml.xamlroot) class. The [CoreWindow](/uwp/api/windows.ui.core.corewindow), [ApplicationView](/uwp/api/windows.ui.viewmanagement.applicationview), and [Window](/uwp/api/windows.ui.xaml.window) classes won't provide the correct information for XAML Islands. [CoreWindow](/uwp/api/windows.ui.core.corewindow) and [Window](/uwp/api/windows.ui.xaml.window) objects do exist on the thread and are accessible to your app, but they won't return meaningful bounds or visibility (they are always invisible and have a size of 1x1). For more information, see [Windowing hosts](/windows/uwp/design/layout/show-multiple-views#windowing-hosts). + +For example, to get the bounding rectangle of the window that contains a WinRT XAML control that is hosted in a XAML Island, use the [XamlRoot.Size](/uwp/api/windows.ui.xaml.xamlroot.size) property of the control. Because every WinRT XAML control that can be hosted in a XAML Island derives from [Windows.UI.Xaml.UIElement](/uwp/api/windows.ui.xaml.uielement), you can use the [XamlRoot](/uwp/api/windows.ui.xaml.uielement.xamlroot) property of the control to access the **XamlRoot** object. + +```csharp +Size windowSize = myUWPControl.XamlRoot.Size; +``` + +Do not use the [CoreWindows.Bounds](/uwp/api/windows.ui.core.corewindow.bounds) property to get the bounding rectangle. + +```csharp +// This will return incorrect information for a WinRT XAML control that is hosted in a XAML Island. +Rect windowSize = CoreWindow.GetForCurrentThread().Bounds; +``` + +For a table of common windowing-related APIs that you should avoid in the context of XAML Islands and the recommended [XamlRoot](/uwp/api/windows.ui.xaml.xamlroot) replacements, see the table in [this section](/windows/uwp/design/layout/show-multiple-views#make-code-portable-across-windowing-hosts). + +For a sample that demonstrates how to use this interface in a WPF app, see the [ShareSource](https://github.com/microsoft/Windows-classic-samples/tree/master/Samples/ShareSource) sample. + +## Additional resources + +For more background information and tutorials about using XAML Islands, see the following articles and resources: + +* [Modernize a WPF app tutorial](../modernize-wpf-tutorial.md): This tutorial provides step-by-step instructions for using the wrapped controls and host controls in the Windows Community Toolkit to add WinRT XAML controls to an existing WPF line-of-business application. This tutorial includes the complete code for the WPF application as well as detailed instructions for each step in the process. +* [XAML Islands code samples](https://github.com/microsoft/Xaml-Islands-Samples): This repo contains Windows Forms, WPF, and C++ desktop (Win32) samples that demonstrate how to use XAML Islands. +* [XAML Islands v1 - Updates and Roadmap](https://blogs.windows.com/windowsdeveloper/2019/06/13/xaml-islands-v1-updates-and-roadmap): This blog post discusses many common questions about XAML Islands and provides a detailed development roadmap. diff --git a/hub/apps/desktop/visual-studio-templates.md b/hub/apps/desktop/visual-studio-templates.md index f596e3d283..f33709e818 100644 --- a/hub/apps/desktop/visual-studio-templates.md +++ b/hub/apps/desktop/visual-studio-templates.md @@ -14,11 +14,11 @@ Visual Studio 2019 (and later) provides many project and item templates that hel * Project templates include project files, code files, and other assets that are configured to build an app or a component that can be loaded and used by an app. * Item templates are project files that contain commonly used code and XAML that can be added to a project to reduce development time. For example, you can use an item template to add a new window, page, or control to your app. -For more information about installing and configuring Visual Studio to get access to these templates, see [Install tools for the Windows App SDK](../windows-app-sdk/set-up-your-development-environment.md). +For more information about installing and configuring Visual Studio to get access to these templates, see [Start developing Windows apps](../get-started/start-here.md). ## WinUI templates -The [Windows UI Library (WinUI)](../winui/index.md) is the modern native user interface (UI) platform for Windows apps across desktop (.NET and native Win32) and UWP app platforms. [WinUI 3](../winui/index.md) is the latest major version of WinUI, and it transforms WinUI into a full UX framework for desktop Windows apps. +[WinUI](../winui/index.md) is the modern native user interface (UI) platform for Windows apps across desktop (.NET and native Win32) and UWP app platforms. [WinUI 3](../winui/index.md) is the latest major version of WinUI, and it transforms WinUI into a full UX framework for desktop Windows apps. WinUI 3 is available as part of [the Windows App SDK](../windows-app-sdk/index.md). It includes a VSIX package for Visual Studio 2019 (and later) that provides project and item templates that help you get started building apps with a WinUI-based interface. diff --git a/hub/apps/develop/accessibility.md b/hub/apps/develop/accessibility.md index a4a67e1865..a74224a7d1 100644 --- a/hub/apps/develop/accessibility.md +++ b/hub/apps/develop/accessibility.md @@ -2,10 +2,8 @@ title: Accessibility in Windows 11 and Windows 10 description: This page provides the information for you to get started developing accessible Windows apps. ms.topic: article -ms.date: 09/12/2019 +ms.date: 11/28/2023 keywords: Accessibility in Windows 10, Accessibility, building accessible win32 apps, building accessible UWP apps, building accessible WPF apps, building accessible WinForms apps -ms.author: kbridge -author: Karl-Bridge-Microsoft --- # Accessibility in Windows 11 and Windows 10 @@ -30,7 +28,7 @@ This page provides information on how the various Windows development frameworks **Universal Windows Platform (UWP)** - Develop accessible apps and tools on the modern platform for Windows applications and games on any Windows device (including PCs, phones, Xbox One, HoloLens, and more), and publish them to the Microsoft Store. + Develop accessible apps and tools on the modern platform for Windows applications and games on any Windows device (including PCs, phones, Xbox, HoloLens, and more), and publish them to the Microsoft Store. [Designing inclusive software](/windows/uwp/accessibility/designing-inclusive-software) @@ -237,12 +235,17 @@ Various videos covering how to build accessible Windows applications to general :::row-end::: :::row::: :::column::: - [Windows community - Accessibility](https://community.windows.com/search?q=accessibility) + [Windows community - Accessibility](https://answers.microsoft.com/en-us/search/search?SearchTerm=windows%20accessibility) :::column-end::: :::column::: [Windows Accessibility and Automation Development Forum](https://social.msdn.microsoft.com/Forums/windows/home?forum=windowsaccessibilityandautomation) :::column-end::: +:::row-end::: +:::row::: + :::column::: + [Stack Overflow](https://stackoverflow.com/questions/tagged/windows+accessibility) + :::column-end::: :::column::: [Disability Answer Desk](https://www.microsoft.com/Accessibility/disability-answer-desk) :::column-end::: -:::row-end::: \ No newline at end of file +:::row-end::: diff --git a/hub/apps/develop/ai-powered/ai-powered.md b/hub/apps/develop/ai-powered/ai-powered.md new file mode 100644 index 0000000000..1e88ab919a --- /dev/null +++ b/hub/apps/develop/ai-powered/ai-powered.md @@ -0,0 +1,41 @@ +--- +description: This article lists the Windows features that are powered using AI and links to the how-to articles that show how to use them. +title: AI-powered features +ms.date: 12/11/2025 +ms.topic: article +keywords: windows 10, windows 11, winui 3, ai, artificial intelligence +ms.localizationpriority: medium +--- + + +# AI-powered features + +This section provides guidance for using the Windows App SDK to create apps that leverage AI-powered features in Windows. + +## AI-powered Windows features + +| Topic | Description | +|---------------------------|-----------------------------| +| [Click to Do](/windows/apps/develop/windows-integration/click-to-do) | Learn how to use the Click to Do feature to take action based on content seen in apps. | +| [Copilot hardware key](/windows/apps/develop/windows-integration/microsoft-copilot-key-provider) | Learn how to use the Copilot hardware key feature to quickly access Copilot. | +| [Recall](/windows/apps/develop/windows-integration/recall/index) | Learn how to use the Recall feature to help find content. | +| [Windows Settings connector](/windows/apps/develop/windows-integration/settings-mcp) | Learn how to use the Windows Settings connector via MCP to manage settings on a Windows device. | + +## Other AI features + +| Topic | Description | +|---------------------------|-----------------------------| +| [App Content Search](/windows/ai/apis/app-content-search) | Learn how to use App Content Search to enable AI-powered search capabilities. | +| [Phi Silica](/windows/ai/apis/phi-silica) | Learn how to use Phi Silica to enhance app performance with AI acceleration. | +| [Imaging SDK](/windows/ai/apis/imaging) | Learn how to use the Imaging SDK to add AI-powered image processing capabilities to your apps. | +| [Image generation API](/windows/ai/apis/image-generation) | Learn how to use the Image Generation API to create images from text prompts. | +| [Text Recognition API](/windows/ai/apis/text-recognition) | Learn how to use the Text Recognition API to extract text from images. | +| [Video super resolution](/windows/ai/apis/video-super-resolution) | Learn how to use AI to enhance video playback quality. | + +## Related topics + +* [Windows AI](/windows/ai) +* [Microsoft Foundry on Windows](/windows/ai/overview) +* [Windows ML](/windows/ai/new-windows-ml/overview) +* [MCP on Windows](/windows/ai/mcp/overview) +* [Responsible AI](/windows/ai/rai) diff --git a/hub/apps/develop/app-lifecycle-and-system-services.md b/hub/apps/develop/app-lifecycle-and-system-services.md index 6ab05f7771..5b0b409912 100644 --- a/hub/apps/develop/app-lifecycle-and-system-services.md +++ b/hub/apps/develop/app-lifecycle-and-system-services.md @@ -1,14 +1,14 @@ --- -title: App lifecycle and system services +title: App lifecycle, background tasks, and system services in Windows apps description: This article provides an index of development features that are related to scenarios involving managing the lifecycle of Windows apps and system-level services. -ms.topic: article -ms.date: 10/07/2021 -ms.author: hickeys -author: hickeys +ms.date: 02/13/2025 +ms.topic: concept-article +keywords: windows 11, winui, background task, app service, connected devices, remote systems, app lifecycle ms.localizationpriority: medium +# Customer intent: As a Windows developer, I want to learn about the features available for managing the lifecycle of Windows apps and using system-level services. --- -# App lifecycle and system services +# App lifecycle, background tasks, and system services This article provides an index of development features that are related to scenarios involving managing the lifecycle of Windows apps and using system-level services provided by the Windows OS. @@ -22,8 +22,9 @@ The [Windows App SDK](../windows-app-sdk/index.md) provides the following featur |---------|-------------| | [App lifecycle](../windows-app-sdk/applifecycle/applifecycle.md) | Get an overview of managing the lifecycle of your app. | | [App instancing](../windows-app-sdk/applifecycle/applifecycle-instancing.md) | Control whether multiple instances of your app's process can run at the same time. | +| [Background tasks](../windows-app-sdk/applifecycle/background-tasks.md) | Background tasks are app components that run in the background without a user interface. They can perform actions such as downloading files, syncing data, sending notifications, or updating tiles. | | [Rich activation](../windows-app-sdk/applifecycle/applifecycle-rich-activation.md) | Receive information about different kinds activations for your app. | -| [Power management](../windows-app-sdk/applifecycle/applifecycle-power.md) | Get visibility into how your app affects the device's power state, and enable your app to make intelligent decisions about resource usage. +| [Power management](../windows-app-sdk/applifecycle/applifecycle-power.md) | Get visibility into how your app affects the device's power state, and enable your app to make intelligent decisions about resource usage. | | [Restart](../windows-app-sdk/applifecycle/applifecycle-restart.md) | Programmatically restart your application and set restart options after app termination. | ## Windows OS features @@ -60,4 +61,4 @@ The .NET SDK also provides APIs related to system services for WPF and Windows F | Article | Description | |---------|-------------| | [Threading model (WPF)](/dotnet/framework/wpf/advanced/threading-model) | Learn about the threading model of WPF apps. | -| [System information](/dotnet/framework/winforms/advanced/system-information-and-windows-forms) | Learn how to access sytem information in Windows Forms apps. | +| [System information](/dotnet/framework/winforms/advanced/system-information-and-windows-forms) | Learn how to access system information in Windows Forms apps. | diff --git a/hub/apps/develop/audio-video-camera.md b/hub/apps/develop/audio-video-camera.md index 73a9ac3239..4ade564bd5 100644 --- a/hub/apps/develop/audio-video-camera.md +++ b/hub/apps/develop/audio-video-camera.md @@ -10,8 +10,6 @@ keywords: This article provides an index of development features that are related to scenarios involving audio, video, and camera in Windows apps. -> [!NOTE] -> The [Windows App SDK](../windows-app-sdk/index.md) currently does not provide APIs related to audio, video, and camera scenarios. ## Windows OS features @@ -23,11 +21,10 @@ The following articles provide information about features available via WinRT AP | Article | Description | |---------|-------------| -| [Audio, video, and camera](/windows/uwp/audio-video-camera/) | Learn about development scenarios that involve photos, videos, or audio in your apps. | -| [Camera](/windows/uwp/audio-video-camera/camera) | Learn about how to use the camera or microphone to capture photos, video, or audio. | +| [Camera](./camera/camera.md) | Learn about how to use the camera or microphone to capture photos, video, or audio. | | [Media playback](/windows/uwp/audio-video-camera/media-playback/) | Learn about how to play back audio and video in your apps. | | [Visual layer](/windows/uwp/composition/visual-layer) | The Visual layer provides a high performance, retained-mode API for graphics, effects and animations, and is the foundation for all UI across Windows devices. | -| [XAML platform](/windows/uwp/xaml-platform/) | Describes the XAML language and concepts to apps that use a WinRT XAML-based UI, including XAML UI components provided by Windows 10 and later as well as the Windows UI Library. | +| [XAML platform](/windows/apps/develop/platform/xaml/) | Describes the XAML language and concepts to apps that use a WinRT XAML-based UI, including XAML UI components provided by Windows 10 and later as well as WinUI. | #### Win32 (C++ and COM) APIs @@ -50,6 +47,6 @@ The .NET SDK also provides APIs related to audio, video, and camera scenarios fo | Article | Description | |---------|-------------| | [Graphics (WPF)](/dotnet/framework/wpf/graphics-multimedia/graphics) | Learn about support for multimedia, vector graphics, animation, and content composition in WPF apps. | -| [Mutimedia (WPF)](/dotnet/framework/wpf/graphics-multimedia/multimedia-overview) | Learn about integrating audio and video into your WPF apps. | +| [Multimedia (WPF)](/dotnet/framework/wpf/graphics-multimedia/multimedia-overview) | Learn about integrating audio and video into your WPF apps. | | [Graphics and drawing (Windows Forms)](/dotnet/framework/winforms/advanced/graphics-and-drawing-in-windows-forms) | Learn how to create graphics, draw text, and manipulate graphical images in Windows Forms apps. | | [SoundPlayer class (Windows Forms)](/dotnet/framework/winforms/controls/soundplayer-class-overview) | Learn how to include sounds in your Windows Forms applications. | diff --git a/hub/apps/develop/camera/basic-photo-capture.md b/hub/apps/develop/camera/basic-photo-capture.md new file mode 100644 index 0000000000..5d5868ace6 --- /dev/null +++ b/hub/apps/develop/camera/basic-photo-capture.md @@ -0,0 +1,107 @@ +--- +title: Basic photo, video, and audio capture with MediaCapture +description: Learn how to capture photos and video using the MediaCapture class. +ms.topic: article +ms.date: 07/23/2024 +ms.author: drewbat +author: drewbatgit +ms.localizationpriority: medium +#customer intent: As a developer, I want to access the camera in a Windows app using WinUI 3. +--- + +# Basic photo, video, and audio capture with MediaCapture in a WinUI 3 app + +This article shows the simplest way to capture photos and video using the [**MediaCapture**](/uwp/api/Windows.Media.Capture.MediaCapture) class. The **MediaCapture** class exposes a robust set of APIs that provide low-level control over the capture pipeline and enable advanced capture scenarios, but this article is intended to help you add basic media capture to your app quickly and easily. To learn about more of the features that **MediaCapture** provides, see [**Camera**](camera.md). + +## Initialize the MediaCapture object + +All of the capture methods described in this article require the first step of initializing the [**MediaCapture**](/uwp/api/Windows.Media.Capture.MediaCapture) object. This includes instantiating the object, selecting a capture device, setting initialization parameters, and then calling [**InitializeAsync**](/uwp/api/windows.media.capture.mediacapture.initializeasync). Typically camera apps will display the camera preview while capturing photos or video in their UI using the [MediaPlayerElement](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.controls.mediaplayerelement). For a walkthrough of initializing **MediaCapture** and showing the preview in a XAML UI, see [Show the camera preview in a WinUI 3 app](camera-quickstart-winui3.md). The code examples in this article will assume that an initialized instance of **MediaCapture** has already been created. + +## Capture a photo to a SoftwareBitmap + +The [**SoftwareBitmap**](/uwp/api/Windows.Graphics.Imaging.SoftwareBitmap) class provides a common representation of images across multiple features. If you want to capture a photo and then immediately use the captured image in your app, such as displaying it in XAML, instead of capturing to a file, then you should capture to a **SoftwareBitmap**. You still have the option of saving the image to disk later. + +Capture a photo to a **SoftwareBitmap** using the [**LowLagPhotoCapture**](/uwp/api/Windows.Media.Capture.LowLagPhotoCapture) class. Get an instance of this class by calling [**PrepareLowLagPhotoCaptureAsync**](/uwp/api/windows.media.capture.mediacapture.preparelowlagphotocaptureasync), passing in an [**ImageEncodingProperties**](/uwp/api/Windows.Media.MediaProperties.ImageEncodingProperties) object specifying the image format you want. [**CreateUncompressed**](/uwp/api/windows.media.mediaproperties.imageencodingproperties.createuncompressed) creates an uncompressed encoding with the specified pixel format. Initiate photo capture by calling [**CaptureAsync**](/uwp/api/windows.media.capture.lowlagphotocapture.captureasync), which returns a [**CapturedPhoto**](/uwp/api/Windows.Media.Capture.CapturedPhoto) object. Get a **SoftwareBitmap** by accessing the [**Frame**](/uwp/api/windows.media.capture.capturedphoto.frame) property and then the [**SoftwareBitmap**](/uwp/api/windows.media.capture.capturedframe.softwarebitmap) property. + +You can capture multiple photos by repeatedly calling **CaptureAsync**. When you are done capturing, call [**FinishAsync**](/uwp/api/windows.media.capture.advancedphotocapture.finishasync) to shut down the **LowLagPhotoCapture** session and free up the associated resources. After calling **FinishAsync**, to begin capturing photos again you will need to call [**PrepareLowLagPhotoCaptureAsync**](/uwp/api/windows.media.capture.mediacapture.preparelowlagphotocaptureasync) again to reinitialize the capture session before calling [**CaptureAsync**](/uwp/api/windows.media.capture.lowlagphotocapture.captureasync). + +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.xaml.cs" id="SnippetCameraLowLagPhotoCapture"::: + +## Capture a photo to a memory stream + +You can use **MediaCapture** to capture a photo to an in-memory stream, which you can then use to transcode the photo from the stream to a file on disk. + +Create an [**InMemoryRandomAccessStream**](/uwp/api/Windows.Storage.Streams.InMemoryRandomAccessStream) and then call [**CapturePhotoToStreamAsync**](/uwp/api/windows.media.capture.mediacapture.capturephototostreamasync) to capture a photo to the stream, passing in the stream and an [**ImageEncodingProperties**](/uwp/api/Windows.Media.MediaProperties.ImageEncodingProperties) object specifying the image format that should be used. You can create custom encoding properties by initializing the object yourself, but the class provides static methods, like [**ImageEncodingProperties.CreateJpeg**](/uwp/api/windows.media.mediaproperties.imageencodingproperties.createjpeg) for common encoding formats. + +Create a [**BitmapDecoder**](/uwp/api/Windows.Graphics.Imaging.BitmapDecoder) to decode the image from the in memory stream. Create a [**BitmapEncoder**](/uwp/api/Windows.Graphics.Imaging.BitmapEncoder) to encode the image to file by calling [**CreateForTranscodingAsync**](/uwp/api/windows.graphics.imaging.bitmapencoder.createfortranscodingasync). + +You can optionally create a [**BitmapPropertySet**](/uwp/api/Windows.Graphics.Imaging.BitmapPropertySet) object and then call [**SetPropertiesAsync**](/uwp/api/windows.graphics.imaging.bitmapproperties.setpropertiesasync) on the image encoder to include metadata about the photo in the image file. For more information about encoding properties, see [**Image metadata**](/windows/uwp/audio-video-camera/image-metadata). + +Finally, call [**FlushAsync**](/uwp/api/windows.graphics.imaging.bitmapencoder.flushasync) on the encoder object to transcode the photo from the in-memory stream to the file. + +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.xaml.cs" id="SnippetCameraLowLagPhotoCapture"::: + + +## Capture a video + +Quickly add video capture to your app by using the [**LowLagMediaRecording**](/uwp/api/Windows.Media.Capture.LowLagMediaRecording) class. + +First, the **LowLagMediaRecording** needs to persist while video is being captured, so declare a class variable to for the object. + +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.xaml.cs" id="SnippetCameraDeclareLowLagMediaRecording"::: + + +Call [**PrepareLowLagRecordToStorageFileAsync**](/uwp/api/windows.media.capture.mediacapture.preparelowlagrecordtostoragefileasync) to initialize the media recording, passing in the storage file and a [**MediaEncodingProfile**](/uwp/api/Windows.Media.MediaProperties.MediaEncodingProfile) object specifying the encoding for the video. The class provides static methods, like [**CreateMp4**](/uwp/api/windows.media.mediaproperties.mediaencodingprofile.createmp4), for creating common video encoding profiles. Call [**StartAsync**](/uwp/api/windows.media.capture.lowlagmediarecording.startasync) to begin capturing video. + +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.xaml.cs" id="SnippetCameraStartLowLagMediaRecording"::: + + +To stop recording video, call [**StopAsync**](/uwp/api/windows.media.capture.lowlagmediarecording.stopasync). + +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.xaml.cs" id="SnippetCameraStopLowLagMediaRecording"::: + +You can continue to call **StartAsync** and **StopAsync** to capture additional videos. When you are done capturing videos, call [**FinishAsync**](/uwp/api/windows.media.capture.lowlagmediarecording.finishasync) to dispose of the capture session and clean up associated resources. After this call, you must call **PrepareLowLagRecordToStorageFileAsync** again to reinitialize the capture session before calling **StartAsync**. + +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.xaml.cs" id="SnippetCameraFinalizeLowLagMediaRecording"::: + +When capturing video, you should register a handler for the [**RecordLimitationExceeded**](/uwp/api/windows.media.capture.mediacapture.recordlimitationexceeded) event of the **MediaCapture** object, which will be raised by the operating system if you surpass the limit for a single recording, currently three hours. In the handler for the event, you should finalize your recording by calling [**StopAsync**](/uwp/api/windows.media.capture.lowlagmediarecording.stopasync). + +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.xaml.cs" id="SnippetCameraRecordLimitationExceeded"::: + + +You can pause a video recording and then resume recording without creating a separate output file by calling [**PauseAsync**](/uwp/api/windows.media.capture.lowlagmediarecording.pauseasync) and then calling [**ResumeAsync**](/uwp/api/windows.media.capture.lowlagmediarecording.resumeasync). + +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.xaml.cs" id="SnippetCameraPauseVideoCapture"::: + +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.xaml.cs" id="SnippetCameraResumeVideoCapture"::: + +Calling [**PauseWithResultAsync**](/uwp/api/windows.media.capture.lowlagmediarecording.pausewithresultasync) returns a [**MediaCapturePauseResult**](/uwp/api/Windows.Media.Capture.MediaCapturePauseResult) object. The [**LastFrame**](/uwp/api/windows.media.capture.mediacapturepauseresult.lastframe) property is a [**VideoFrame**](/uwp/api/Windows.Media.VideoFrame) object representing the last frame. To display the frame in XAML, get the **SoftwareBitmap** representation of the video frame. Currently, only images in BGRA8 format with premultiplied or empty alpha channel are supported, so call [**Convert**](/uwp/api/windows.graphics.imaging.softwarebitmap.convert) if necessary to get the correct format. **PauseWithResultAsync** also returns the duration of the video that was recorded in the preceding segment in case you need to track how much total time has been recorded. + +You can also get a result frame when you stop the video by calling [**StopWithResultAsync**](/uwp/api/windows.media.capture.lowlagmediarecording.stopwithresultasync). + +### Play and edit captured video files + +Once you have captured a video to a file, you may want to load the file and play it back within your app's UI. You can do this using the **[MediaPlayerElement](/uwp/api/Windows.UI.Xaml.Controls.MediaPlayerElement)** XAML control and an associated **[MediaPlayer](/uwp/api/windows.media.playback.mediaplayer)**. For information on playing media in a XAML page, see [Play audio and video with MediaPlayer](/windows/uwp/audio-video-camera/play-audio-and-video-with-mediaplayer). + +[TBD - Is the MediaComposition framework supported / recommended for WinUI?] + +You can also create a **[MediaClip](/uwp/api/windows.media.editing.mediaclip)** object from a video file by calling **[CreateFromFileAsync](/uwp/api/windows.media.editing.mediaclip.createfromfileasync)**. A **[MediaComposition](/uwp/api/windows.media.editing.mediacomposition)** provides basic video editing functionality like arranging the sequence of **MediaClip** objects, trimming video length, creating layers, adding background music, and applying video effects. For more information on working with media compositions, see [Media compositions and editing](/windows/uwp/audio-video-camera/media-compositions-and-editing). + + +## Capture audio + +You can quickly add audio capture to your app by using the same technique shown above for capturing video. Call [**PrepareLowLagRecordToStorageFileAsync**](/uwp/api/windows.media.capture.mediacapture.preparelowlagrecordtostoragefileasync) to initialize the capture session, passing in the file and a [**MediaEncodingProfile**](/uwp/api/Windows.Media.MediaProperties.MediaEncodingProfile) which is generated in this example by the [**CreateMp3**](/uwp/api/windows.media.mediaproperties.mediaencodingprofile.createmp3) static method. To begin recording, call [**StartAsync**](/uwp/api/windows.media.capture.lowlagmediarecording.startasync). + +[TBD - This code is throwing 'The request is invalid in the current state.'] + +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.xaml.cs" id="SnippetCameraStartAudioCapture"::: + + +Call [**StopAsync**](/uwp/api/windows.media.capture.lowlagphotosequencecapture.stopasync) to stop the audio recording. + +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.xaml.cs" id="SnippetCameraStopAudioCapture"::: + +You can call **StartAsync** and **StopAsync** multiple times to record several audio files. When you are done capturing audio, call [**FinishAsync**](/uwp/api/windows.media.capture.lowlagmediarecording.finishasync) to dispose of the capture session and clean up associated resources. After this call, you must call **PrepareLowLagRecordToStorageFileAsync** again to reinitialize the capture session before calling **StartAsync**. + +For information about detecting when the system changes the audio level of the audio capture stream, see [Detect and respond to audio level changes by the system](detect-audio-level-changes.md). + diff --git a/hub/apps/develop/camera/camera-privacy-setting.md b/hub/apps/develop/camera/camera-privacy-setting.md new file mode 100644 index 0000000000..fba3ea4ae8 --- /dev/null +++ b/hub/apps/develop/camera/camera-privacy-setting.md @@ -0,0 +1,173 @@ +--- +description: Learn how apps should handle the Windows camera privacy setting. +title: Handle the Windows camera privacy setting +ms.date: 10/23/2024 +ms.topic: how-to +keywords: windows 10, winui 3 +dev_langs: +- csharp +ms.localizationpriority: medium +--- + + +# Handle the Windows camera privacy setting + +Windows allows users to grant or deny access to the device's camera in Windows Settings, under **Privacy & Security -> Camera**. Camera access can be disabled for the entire device, for all unpackaged apps, or for individual packaged apps. This article describes the best practices for checking whether your app has access to the camera and handling the case where access is denied by the user. + +## Check for access before initializing the camera + +For packaged apps, you should check to see if your app has camera access before initializing the camera. Use the [AppCapability](/uwp/api/windows.security.authorization.appcapabilityaccess.appcapability) class to determine if your app has access. + +### [C#](#tab/cs) + +```csharp +bool cameraCapabilityAccess = false; +private void CheckCameraAccessStatus() +{ + var status = AppCapability.Create("Webcam").CheckAccess(); + + if (status == AppCapabilityAccessStatus.Allowed) + { + cameraCapabilityAccess = true; + cameraButton.IsEnabled = true; + } + else + { + cameraCapabilityAccess = false; + cameraButton.IsEnabled = false; + } +} +``` + +### [C++](#tab/cpp) + +```cpp +bool cameraCapabilityAccess; +void MainWindow::CheckCameraAccessStatus() +{ + auto status = AppCapability::Create(L"Webcam").CheckAccess(); + + if (status == AppCapabilityAccessStatus::Allowed) + { + cameraCapabilityAccess = true; + cameraButton().IsEnabled(true); + } + else + { + cameraCapabilityAccess = false; + cameraButton().IsEnabled(false); + } +} +``` +--- + +## Handle the access denied error + +The Windows camera capture APIs will return the error **E_ACCESSDENIED** when apps attempt to access the camera capture device if the user has disabled camera in the camera privacy Settings page. Apps should check for this error when initializing the capture device. If the initialization fails with this error, it is recommended that you direct the user to the camera privacy Settings page and potentially enable access for your app. The camera privacy Settings page can be launched using the URI `ms-settings:privacy-webcam`. + +The following example illustrates how to check for E_ACCESSDENIED when calling [MediaCapture.InitializeAsync](/uwp/api/windows.media.capture.mediacapture.initializeasync). + +### [C#](#tab/cs) + +```csharp +try +{ + await mediaCapture.InitializeAsync(mediaCaptureInitializationSettings); +} +catch (System.UnauthorizedAccessException ex) +{ + // E_ACCESSDENIED, 0x80070005 in hexadecimal, -2147024891 in decimal + if (ex.HResult == -2147024891) + { + StatusTextBlock.Text = "Access to the camera has been denied." + + "Click the Settings button to check the camera privacy settings"; + } + + return; +} +... +// Launch the camera privacy Settings page +private async void LaunchSettingsButton_Click(object sender, RoutedEventArgs e) +{ + bool result = await Windows.System.Launcher.LaunchUriAsync(new Uri("ms-settings:privacy-webcam")); +} +``` + +### [C++](#tab/cpp) + +```cpp +try +{ + co_await mediaCapture.InitializeAsync(mediaCaptureInitializationSettings); +} +catch (winrt::hresult_error const& ex) +{ + winrt::hresult hr = ex.code(); + if (hr == 0x80070005) + { + StatusTextBlock().Text(L"Access to the camera has been denied. Click the Settings button to check the camera privacy settings."); + } + + co_return; +} +``` + +--- + +The following example illustrates handling the E_ACCESSDENIED error returned from [IMFActivate::ActivateObject](/windows/win32/api/mfobjects/nf-mfobjects-imfactivate-activateobject) when initializing an [IMFMediaSource](/windows/win32/api/mfidl/nn-mfidl-imfmediasource) for a capture device. + +```cpp +IMFMediaSource* pSource = NULL; +IMFAttributes* pAttributes = NULL; +IMFActivate** ppDevices = NULL; + +// Create an attribute store to specify the enumeration parameters. +HRESULT hr = MFCreateAttributes(&pAttributes, 1); +if (FAILED(hr)) +{ + goto done; +} + +// Source type: video capture devices +hr = pAttributes->SetGUID( + MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE, + MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_VIDCAP_GUID +); +if (FAILED(hr)) +{ + goto done; +} + +// Enumerate devices. +UINT32 count; +hr = MFEnumDeviceSources(pAttributes, &ppDevices, &count); +if (FAILED(hr)) +{ + goto done; +} + +if (count == 0) +{ + hr = E_FAIL; + goto done; +} + +// Create the media source object. +hr = ppDevices[0]->ActivateObject(IID_PPV_ARGS(&pSource)); +if (FAILED(hr)) +{ + if (hr == E_ACCESSDENIED) + { + int response = MessageBox(hWnd, L"Access to the camera was denied. Open the camera privacy settings?", L"Error", MB_YESNO); + if (response == IDYES) + { + ShellExecute(NULL, L"open", L"ms-settings:privacy-webcam", L"", L".", SW_SHOWDEFAULT); + } + } + goto done; +} +``` + +## Implement fallback behavior + +Apps should implement the previous steps to alert the user detect and alert the user that camera access is restricted due to privacy settings and to direct the user to the camera privacy Settings page to allow them to update their settings. After these steps, the app should retry camera initialization to see if access has been granted. If the user declines to update their settings to allow your app to access to the camera, consider providing alternative functionality. For example, you could disable camera features, switch to a different mode, or display a placeholder image in place of the camera preview. diff --git a/hub/apps/develop/camera/camera-profiles.md b/hub/apps/develop/camera/camera-profiles.md new file mode 100644 index 0000000000..1ea7dbb6a1 --- /dev/null +++ b/hub/apps/develop/camera/camera-profiles.md @@ -0,0 +1,69 @@ +--- +description: Learn how to use camera profiles to support specific resolutions, frame rates, simultaneous access to multiple cameras, and and HDR in a WinUI 3 app. +title: Discover and select camera capabilities with camera profiles +ms.date: 08/13/2024 +ms.topic: article +keywords: windows 10, windows 11, winui3, camera +ms.localizationpriority: medium +#customer intent: As a developer, I want to use camera profiles to select camera capabilities with MediaCapture in a Windows app using WinUI 3. +--- + + +# Discover and select camera capabilities with camera profiles in a WinUI 3 app + +This article shows how to use camera profiles to discover and manage the capabilities of different video capture devices. This includes tasks such as selecting profiles that support specific resolutions or frame rates, profiles that support simultaneous access to multiple cameras, and profiles that support HDR. + +## About camera profiles + +Cameras on different devices support different capabilities including the set of supported capture resolutions, frame rate for video captures, and whether HDR or variable frame rate captures are supported. A set of supported capabilities is defined in a [**MediaCaptureVideoProfileMediaDescription**](/uwp/api/Windows.Media.Capture.MediaCaptureVideoProfileMediaDescription) object. A camera profile, represented by a [**MediaCaptureVideoProfile**](/uwp/api/Windows.Media.Capture.MediaCaptureVideoProfile) object, has three collections of media descriptions; one for photo capture, one for video capture, and another for video preview. + +Before initializing your [**MediaCapture**](/uwp/api/Windows.Media.Capture.MediaCapture) object, you can query the capture devices on the current device to see what profiles are supported. When you select a supported profile, you know that the capture device supports all of the capabilities in the profile's media descriptions. This eliminates the need for a trial and error approach to determining which combinations of capabilities are supported on a particular device. + +## Find a camera that supports camera profiles + +To use camera profiles, you must first check for a camera device that supports the use of camera profiles. The example below shows how to use the [**DeviceInformation.FindAllAsync**](/uwp/api/windows.devices.enumeration.deviceinformation.findallasync) method to retrieve a list of all available video capture devices on either the front or back panel of the current device. It loops through all of the devices in the list, calling the static method, [**IsVideoProfileSupported**](/uwp/api/windows.media.capture.mediacapture.isvideoprofilesupported), for each device to see if it supports video profiles. + +If a device that supports camera profiles is found on the specified panel, the [**Id**](/uwp/api/windows.devices.enumeration.deviceinformation.id) value, containing the device's ID string, is returned. + +:::code language="xaml" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.xaml.cs" id="SnippetGetVideoProfileSupportedDeviceIdAsync"::: + +If the device ID returned from the **GetVideoProfileSupportedDeviceIdAsync** helper method is null or an empty string, there is no device on the specified panel that supports camera profiles. In this case, you should initialize your media capture device without using profiles. + +:::code language="xaml" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.xaml.cs" id="SnippetGetDeviceWithProfileSupport"::: + +## Select a profile based on supported resolution and frame rate + +To select a profile with particular capabilities, such as with the ability to achieve a particular resolution and frame rate, use the method shown previously in this article to get the ID of a capture device that supports using camera profiles. + +Create a new [**MediaCaptureInitializationSettings**](/uwp/api/Windows.Media.Capture.MediaCaptureInitializationSettings) object, passing in the selected device ID. Call the static method [**MediaCapture.FindAllVideoProfiles**](/uwp/api/windows.media.capture.mediacapture.findallvideoprofiles) to get a list of all camera profiles supported by the device. + +This example selects a profile that contains a [**SupportedRecordMediaDescription**](/uwp/api/windows.media.capture.mediacapturevideoprofile.supportedrecordmediadescription) object where the [**Width**](/uwp/api/windows.media.capture.mediacapturevideoprofilemediadescription.width), [**Height**](/uwp/api/windows.media.capture.mediacapturevideoprofilemediadescription.height), and [**FrameRate**](/uwp/api/windows.media.capture.mediacapturevideoprofilemediadescription.framerate) properties match the requested values. If a match is found, [**VideoProfile**](/uwp/api/windows.media.capture.mediacaptureinitializationsettings.videoprofile) and [**RecordMediaDescription**](/uwp/api/windows.media.capture.mediacaptureinitializationsettings.recordmediadescription) of the **MediaCaptureInitializationSettings** are set to the values returned from the query. If no match is found, the default profile is used. + +:::code language="xaml" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.xaml.cs" id="SnippetFindWVGA30FPSProfile"::: + +After you populate the **MediaCaptureInitializationSettings** with your desired camera profile, you simply call [**InitializeAsync**](/uwp/api/windows.media.capture.mediacapture.initializeasync) on your media capture object to configure it to the desired profile. + +:::code language="xaml" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.xaml.cs" id="SnippetInitCaptureWithProfile"::: + + +## Select devices with KnownVideoProfile + +You can use the [**MediaFrameSourceGroup**](/uwp/api/windows.media.capture.frames.mediaframesourcegroup) class to get camera profiles with specific capabilities before initializing the **MediaCapture** object. Frame source groups allow device manufacturers to represent groups of sensors or capture capabilities as a single virtual device. This enables computational photography scenarios such as using depth and color cameras together, but can also be used to select camera profiles for simple capture scenarios. For more information on using **MediaFrameSourceGroup**, see [Process media frames with MediaFrameReader](process-media-frames-with-mediaframereader.md). + +The example below shows how to use **MediaFrameSourceGroup** to find a camera profile that supports that supports the desired scenario. Call [**MediaFrameSourceGroup.FindAllAsync**](/uwp/api/windows.media.capture.frames.mediaframesourcegroup.findallasync) to get a list of all media frame source groups available on the current device. Loop through each source group and call [**MediaCapture.FindKnownVideoProfiles**](/uwp/api/windows.media.capture.mediacapture.findknownvideoprofiles) to get a list of all of the video profiles for the current source group that support the specified [KnownCameraProfile](/uwp/api/windows.media.capture.knownvideoprofile), in this example the value **KnownVideoProfile.HighQualityPhoto** is used. Other values include support for HDR and variable photo sequences, for example. If a profile that meets the requested criteria is found, create a new **MediaCaptureInitializationSettings** object and set the **VideoProfile** to the select profile and the **VideoDeviceId** to the **Id** property of the current media frame source group. Use this **MediaCaptureInitializationSettings** object to initialize the **MediaCapture** object. + +:::code language="xaml" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.xaml.cs" id="SnippetKnownVideoProfile"::: + + +## Determine if a device supports simultaneous photo and video capture + +Many devices support capturing photos and video simultaneously. To determine if a capture device supports this, call [**MediaCapture.FindAllVideoProfiles**](/uwp/api/windows.media.capture.mediacapture.findallvideoprofiles) to get all of the camera profiles supported by the device. Use a link query to find a profile that has at least one entry for both [**SupportedPhotoMediaDescription**](/uwp/api/windows.media.capture.mediacapturevideoprofile.supportedphotomediadescription) and [**SupportedRecordMediaDescription**](/uwp/api/windows.media.capture.mediacapturevideoprofile.supportedrecordmediadescription) which means that the profile supports simultaneous capture. + +:::code language="xaml" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.xaml.cs" id="SnippetSimultaneousPhotoAndVideo"::: + +You can refine this query to look for profiles that support specific resolutions or other capabilities in addition to simultaneous video record. You can also use the [**MediaCapture.FindKnownVideoProfiles**](/uwp/api/windows.media.capture.mediacapture.findknownvideoprofiles) and specify the [**BalancedVideoAndPhoto**](/uwp/api/Windows.Media.Capture.KnownVideoProfile) value to retrieve profiles that support simultaneous capture, but querying all profiles will provide more complete results. + +## Related topics + +* [Camera](camera.md) +* [Basic photo, video, and audio capture with MediaCapture](basic-photo-capture.md) \ No newline at end of file diff --git a/hub/apps/develop/camera/camera-quickstart-winui3.md b/hub/apps/develop/camera/camera-quickstart-winui3.md new file mode 100644 index 0000000000..10bea4c730 --- /dev/null +++ b/hub/apps/develop/camera/camera-quickstart-winui3.md @@ -0,0 +1,108 @@ +--- +title: Show the camera preview in a WinUI 3 app +description: Learn how to show the camera preview in a WinUI 3 app. +ms.topic: article +ms.date: 06/14/2024 +ms.author: drewbat +author: drewbatgit +ms.localizationpriority: medium +#customer intent: As a developer, I want to access the camera in a Windows app using WinUI 3. +--- + +# Show the camera preview in a WinUI 3 app + +In this quickstart, you will learn how to create a basic WinUI 3 camera app that displays the camera preview. In a WinUI 3 app, you use the [MediaPlayerElement](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.controls.mediaplayerelement) control in the [Microsoft.UI.Xaml.Controls](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.controls) namespace to render the camera preview and the WinRT class [MediaCapture](/uwp/api/windows.media.capture.mediacapture) to access the device's camera preview stream. **MediaCapture** provides APIs for performing a wide range of camera-related tasks such as such as capturing photos and videos and configuring the camera's device driver. See the other articles in this section for details about other **MediaCapture** features. + +The code in this walkthrough is adapted from the [MediaCapture WinUI 3 sample on github](https://github.com/microsoft/Windows-Camera/tree/master/Samples/MediaCaptureWinUI3). + +> [!TIP] +> For the UWP version of this article, see [Display the camera preview](/windows/uwp/audio-video-camera/simple-camera-preview-access) in the UWP documentation. + +## Prerequisites + +- Your device must have developer mode enabled. For more information see [Settings for developers](/windows/advanced-settings/developer-mode). +- Visual Studio 2022 or later with the **WinUI application development** workload. + +## Create a new WinUI 3 app + +In Visual Studio, create a new project. In the **Create a new project** dialog, set the language filter to "C#" and the platform filter to "Windows", then select the "Blank App, Packaged (WinUI 3 in desktop)" project template. + + +## Create the UI + +The simple UI for this example includes a **MediaPlayerElement** control for displaying the camera preview, a [ComboBox](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.controls.combobox) that allows you to select from the device's cameras, and buttons for initializing the **MediaCapture** class, starting and stopping the camera preview, and resetting the sample. We also include a [TextBlock](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.controls.textblock) for displaying status messages. + +In your project's MainWindow.xml file, replace the default **StackPanel** control with the following XAML. + +:::code language="xaml" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.xaml" id="SnippetCameraWinUIXaml"::: + + +## Update the MainWindow class definition + +The rest of the code in this article will be added to the **MainWindow** class definition in your project's MainWindow.xaml.cs file. First, add a few class variables that will persist throughout the lifetime of the window. These variables include: + +- A [DeviceInformationCollection](/uwp/api/windows.devices.enumeration.deviceinformationcollection) that will store a [DeviceInformation](/uwp/api/windows.devices.enumeration.deviceinformation) object for each available camera. The **DeviceInformation** object conveys information such as the unique identifier and the friendly name for the camera. +- A **MediaCapture** object that handles interactions with the selected camera's driver and allows you to retrieve the camera's video stream. +- A [MediaFrameSource](/uwp/api/windows.media.capture.frames.mediaframesource) object that represents a source of media frames, such as a video stream. +- A boolean to track when the camera preview is running. Some camera settings can't be changed while the preview is running, so it's a good practice to track the state of the camera preview. + +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.xaml.cs" id="SnippetCameraWinUIClassVars"::: + + +## Populate the list of available cameras + +Next we'll create a helper method to detect the cameras that are present on the current device and populate the **ComboBox** in the UI with the camera names, allowing the user to select a camera to preview.The [DeviceInformation.FindAllAsync](/uwp/api/windows.devices.enumeration.deviceinformation.findallasync) allows you to query for many different kinds of devices. We use [MediaDevice.GetVideoCaptureSelector](/uwp/api/windows.media.devices.mediadevice.getvideocaptureselector) to retrieve the identifier that specifies that we only want to retrieve video capture devices. + +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.xaml.cs" id="SnippetCameraWinUIPopulateCameraList"::: + +Add a call to this helper method to the **MainWindow** class constructor so that the **ComboBox** gets populated when the window loads. + +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.xaml.cs" id="SnippetCameraWinUIConstructor"::: + + +## Initialize the MediaCapture object + +Initialize the **MediaCapture** object by calling [InitializeAsync](/uwp/api/windows.media.capture.mediacapture.initializeasync), passing in a [MediaCaptureInitializationSettings](/uwp/api/windows.media.capture.mediacaptureinitializationsettings) object containing the requested initialization parameters. There are a lot of optional initialization parameters that enable different scenarios. See the API reference page for the complete list. In this simple example we specify a few basic settings, including: + +- The [VideoDeviceId](/uwp/api/windows.media.capture.mediacaptureinitializationsettings.videodeviceid) property specifies the unique identifier of the camera that the **MediaCapture** will attach to. We get the device ID from the **DeviceInformationCollection**, using the selected index of the **ComboBox**. +- The [SharingMode](/uwp/api/windows.media.capture.mediacaptureinitializationsettings.sharingmode) property specifies whether the app is requesting shared, read-only access to the camera, which allows you to view and capture from the video stream, or exclusive control of the camera, which allows you to change the camera configuration. Multiple apps can read from a camera simultaneously, but only one app at a time can have exclusive control. +- The [StreamingCaptureMode](/uwp/api/windows.media.capture.mediacaptureinitializationsettings.streamingcapturemode) property specifies whether we want to capture video, audio, or audio and video. +- The [MediaCaptureMemoryPreference](/uwp/api/windows.media.capture.mediacaptureinitializationsettings.memorypreference) allows us to request to specifically use CPU memory for video frames. The value **Auto** lets the system use GPU memory if it's available. + +Before initializing the **MediaCapture** object we call [AppCapability.CheckAccess](/uwp/api/windows.security.authorization.appcapabilityaccess.appcapability.checkaccess) method to determine if the user has denied our app access to the camera in Windows Settings. + +> [!NOTE] +> Windows allows users to grant or deny access to the device's camera in Windows Settings, under **Privacy & Security -> Camera**. When initializing the capture device, apps should check whether they have access to the camera and handle the case where access is denied by the user. For more information, see [Handle the Windows camera privacy setting](/windows/uwp/audio-video-camera/camera-privacy-setting). + +The **InitializeAsync** call is made from inside a **try** block so that we can recover if initialization fails. Apps should handle initialization failure gracefully. In this simple example, we'll just display an error message on failure. + +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.xaml.cs" id="SnippetCameraWinUIInitMediaCapture"::: + +## Initialize the camera preview + +When the user clicks the start preview button, we will attempt to create a **MediaFrameSource** for a video stream from the camera device with which the **MediaCapture** object was initialized. The available frame sources are exposed by the [MediaCapture.FrameSources](/uwp/api/windows.media.capture.mediacapture.framesources) property. + + To find a frame source that is color video data, as opposed to a depth camera for example, we look for a frame source that has a [SourceKind](/uwp/api/windows.media.capture.frames.mediaframesourceinfo.sourcekind) of [Color](/uwp/api/windows.media.capture.frames.mediaframesourcekind). Some camera drivers provide a dedicated preview stream that is separate from the record stream. To get the preview video stream, we try to select a frame source that has a [MediaStreamType](/uwp/api/windows.media.capture.frames.mediaframesourceinfo.mediastreamtype) of [VideoPreview](/uwp/api/windows.media.capture.mediastreamtype). If no preview streams are found, we can get the record video stream by selecting a **MediaStreamType** of **VideoRecord**. If neither of these frame sources are available, then this capture device can't be used for video preview. + +Once we have selected a frame source, we create a new [MediaPlayer](/uwp/api/windows.media.playback.mediaplayer) object that will be rendered by the **MediaPlayerElement** in our UI. We set the [Source](/uwp/api/windows.media.playback.mediaplayer.source) property of the **MediaPlayer** to a new [MediaSource](/uwp/api/windows.media.core.mediasource) object we create from our selected **MediaFrameSource**. + +Call [Play](/uwp/api/windows.media.playback.mediaplayer.play) on the **MediaPlayer** object to begin rendering the video stream. + +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.xaml.cs" id="SnippetCameraWinUIStartPreview"::: + +Implement a handler for the [MediaFailed](/uwp/api/windows.media.playback.mediaplayer.mediafailed) event so that you can handle errors rendering the preview. + +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.xaml.cs" id="SnippetCameraWinUIMediaFailed"::: + +## Stop the camera preview + +To stop the camera preview, call [Pause](/uwp/api/windows.media.playback.mediaplayer.pause) on the **MediaPlayer** object. + +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.xaml.cs" id="SnippetCameraWinUIStopPreview"::: + + +## Reset the app + +To make it easier to test out the sample app, add a method to reset the state of the app. Camera apps should always dispose of the camera and associated resources when the camera is no longer needed. + +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.xaml.cs" id="SnippetCameraWinUIReset"::: diff --git a/hub/apps/develop/camera/camera.md b/hub/apps/develop/camera/camera.md new file mode 100644 index 0000000000..3298094c35 --- /dev/null +++ b/hub/apps/develop/camera/camera.md @@ -0,0 +1,61 @@ +--- +description: This article lists the camera features that are available for WinUI 3 apps and links to the how-to articles that show how to use them. +title: Camera +ms.date: 10/24/2024 +ms.topic: article +keywords: windows 10, winui 3 +ms.localizationpriority: medium +--- + +# Camera + +This section provides guidance for creating WinUI 3 apps that use the camera or microphone to capture photos, video, or audio. + +## Basic MediaCapture tasks + +| Topic | Description | +|---------------------------|-----------------------------| +| [Capture photos and video in a desktop app with the Windows built-in camera UI](cameracaptureui.md) | Describes how to use the [CameraCaptureUI](/windows/windows-app-sdk/api/winrt/microsoft.windows.media.capture) class to capture photos or videos by using the camera UI built into Windows. This feature allows your app to get a user-captured photo or video with just a few lines of code. | +| [Show the camera preview in a WinUI 3 app](camera-quickstart-winui3.md) | Shows how to quickly display the camera preview stream within a XAML page in a WinUI 3 app. | +| [Basic photo, video, and audio capture with MediaCapture](basic-photo-capture.md) | Shows the simplest way to capture photos and video using the [**MediaCapture**](/uwp/api/Windows.Media.Capture.MediaCapture) class. The **MediaCapture** class exposes a robust set of APIs that provide low-level control over the capture pipeline and enable advanced capture scenarios, but this article is intended to help you add basic media capture to your app quickly and easily. | + +## Advanced MediaCapture tasks + +| Topic | Description | +|--------------------|---------------------------------------------------------| +| [Discover and select camera capabilities with camera profiles](camera-profiles.md) | Learn how to use camera profiles to discover and manage the capabilities of different video capture devices. This includes tasks such as selecting profiles that support specific resolutions or frame rates, profiles that support simultaneous access to multiple cameras, and profiles that support HDR. | +| [Set format, resolution, and frame rate for MediaCapture](set-media-encoding-properties.md) | Learn how to use the [**IMediaEncodingProperties**](/uwp/api/Windows.Media.MediaProperties.IMediaEncodingProperties) interface to set the resolution and frame rate of the camera preview stream and captured photos and video. It also shows how to ensure that the aspect ratio of the preview stream matches that of the captured media. | +| [HDR and low-light photo capture](hdr-low-light-photo-capture.md) | Learn how to use the [**AdvancedPhotoCapture**](/uwp/api/Windows.Media.Capture.AdvancedPhotoCapture) class to capture High Dynamic Range (HDR) and low-light photos. | +| [Manual camera controls for photo and video capture](capture-device-controls-for-photo-and-video-capture.md) | Learn how to use manual device controls to enable enhanced photo and video capture scenarios including optical image stabilization and smooth zoom. | +| [Manual camera controls for video capture](capture-device-controls-for-video-capture.md) | Learn how to use manual device controls to enable enhanced video capture scenarios including HDR video and exposure priority. | +| [Video stabilization effect for video capture](effects-for-video-capture.md) | Learn how to use the video stabilization effect. | +| [Scene analysis for MediaCapture](scene-analysis-for-media-capture.md) | Shows you how to use the [**SceneAnalysisEffect**](/uwp/api/Windows.Media.Core.SceneAnalysisEffect) and the [**FaceDetectionEffect**](/uwp/api/Windows.Media.Core.FaceDetectionEffect) to analyze the content of the media capture preview stream. | +| [Capture a photo sequence with VariablePhotoSequence](variable-photo-sequence.md) | Learn how to capture a variable photo sequence, which allows you to capture multiple frames of images in rapid succession and configure each frame to use different focus, flash, ISO, exposure, and exposure compensation settings. | +| [Process media frames with MediaFrameReader](process-media-frames-with-mediaframereader.md) | Learn how to use a [**MediaFrameReader**](/uwp/api/Windows.Media.Capture.Frames.MediaFrameReader) with [**MediaCapture**](/uwp/api/Windows.Media.Capture.MediaCapture) to get media frames from one or more available sources, including color, depth, and infrared cameras, audio devices, or even custom frame sources such as those that produce skeletal tracking frames. This feature is designed to be used by apps that perform real-time processing of media frames, such as augmented reality and depth-aware camera apps. | +| [Process audio frames with MediaFrameReader](process-media-frames-with-mediaframereader.md) | Learn how to use a [**MediaFrameReader**](/uwp/api/Windows.Media.Capture.Frames.MediaFrameReader) with [**MediaCapture**](/uwp/api/Windows.Media.Capture.MediaCapture) to get audio data from a media frame source. | +| [Detect and respond to audio level changes by the system](detect-audio-level-changes.md) | Learn how to detect and respond to audio level changes by the system. | +| [Launch the camera settings page](launch-camera-settings.md) | Learn how to launch Windows Settings directly to the camera settings page. | +| [Handle the Windows camera privacy setting](camera-privacy-setting.md) | Learn how apps should handle the Windows camera privacy setting. | +| [Connect to remote cameras](connect-to-remote-cameras.md) | Learn how to connect to remote cameras and get a **MediaFrameSourceGroup** to retrieve frames from each camera. | + +## WinUI 3 samples for camera + +* [MediaCapture WinUI 3 sample on github](https://github.com/microsoft/Windows-Camera/tree/master/Samples/MediaCaptureWinUI3). + +## UWP app samples for camera + +* [Camera face detection sample](https://github.com/Microsoft/Windows-universal-samples/tree/master/Samples/CameraFaceDetection) +* [Camera preview frame sample](https://github.com/Microsoft/Windows-universal-samples/tree/master/Samples/CameraGetPreviewFrame) +* [Camera HDR sample](https://github.com/Microsoft/Windows-universal-samples/tree/master/Samples/CameraAdvancedCapture) +* [Camera manual controls sample](https://github.com/Microsoft/Windows-universal-samples/tree/master/Samples/CameraManualControls) +* [Camera profile sample](https://github.com/Microsoft/Windows-universal-samples/tree/master/Samples/CameraProfile) +* [Camera resolution sample](https://github.com/Microsoft/Windows-universal-samples/tree/master/Samples/CameraResolution) +* [Camera starter kit](https://github.com/Microsoft/Windows-universal-samples/tree/master/Samples/CameraStarterKit) +* [Camera video stabilization sample](https://github.com/Microsoft/Windows-universal-samples/tree/master/Samples/CameraVideoStabilization) + +## Related topics + +* [Audio, video, and camera](../audio-video-camera.md) +  + +  \ No newline at end of file diff --git a/hub/apps/develop/camera/cameracaptureui.md b/hub/apps/develop/camera/cameracaptureui.md new file mode 100644 index 0000000000..2ba37b9513 --- /dev/null +++ b/hub/apps/develop/camera/cameracaptureui.md @@ -0,0 +1,186 @@ +--- +title: Capture photos and video in a desktop app with the Windows built-in camera UI +description: Learn how to capture photos and video using the camera UI built into Windows. +ms.topic: how-to +ms.date: 07/23/2024 +ms.author: drewbat +author: drewbatgit +ms.localizationpriority: medium +#customer intent: As a developer, I want to access the camera in a Windows app using WinUI 3. +--- + +# Capture photos and video in a desktop app with the Windows built-in camera UI + +This article describes how to use the [CameraCaptureUI](/windows/windows-app-sdk/api/winrt/microsoft.windows.media.capture) class to capture photos or videos by using the camera UI built into Windows. This feature allows your app to get a user-captured photo or video with just a few lines of code. + +If you want to provide your own camera UI, or if your scenario requires more robust, low-level control of the capture operation, then you should use the [MediaCapture](/uwp/api/windows.media.capture.mediacapture) class, and implement your own capture experience. For more information, see [Basic photo, video, and audio capture with MediaCapture](basic-photo-capture.md). + +Note that the **CameraCaptureUI** class in the [Microsoft.Windows.Media.Capture](/windows/windows-app-sdk/api/winrt/microsoft.windows.media.capture) namespace is not supported for UWP apps. For information on using the UWP version of this feature, see [Capture photos and video in a UWP app with the Windows built-in camera UI](/windows/uwp/audio-video-camera/capture-photos-and-video-with-cameracaptureui) + +## Use the CameraCaptureUI class to capture photos + +Create a new instance of **CameraCaptureUI**, passing in the [AppWindow.Id](/windows/windows-app-sdk/api/winrt/microsoft.ui.windowing.appwindow.id) property of your app window. The [PhotoSettings](/windows/windows-app-sdk/api/winrt/microsoft.windows.media.capture.cameracaptureui.photosettings) property allows you to specify some constraints on the captured photo, including the file format and maximum resolution and whether UI allows the user to crop the photo after it's captured. The [VideoSettings](/windows/windows-app-sdk/api/winrt/microsoft.windows.media.capture.cameracaptureui.videosettings) property provides similar properties for video capture, such as the maximum resolution and duration and whether the UI allows the user to trim the video after it's captured. + +Call [CaptureFileAsync](/windows/windows-app-sdk/api/winrt/microsoft.windows.media.capture.cameracaptureui.capturefileasync) to launch the camera capture UI asynchronously. Use one of the values from the [CameraCaptureUIMode](/windows/windows-app-sdk/api/winrt/microsoft.windows.media.capture.cameracaptureuimode) to specify whether the UI should allow photo capture, video capture, or both. When **CaptureFileAsync** completes, it will return a [StorageFile](/uwp/api/windows.storage.storagefile) file object containing the captured photo or video. If the returned object is null it means that either the user cancelled the capture operation or an error occurred. + +The following example demonstrates launching the **CameraCaptureUI** for photo capture, specifying the image format as PNG and disabling cropping. In this example the captured photo is set as the source for an [Image](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.controls.image) control. + +### [C#](#tab/csharp) + +```csharp +var cameraCaptureUI = new CameraCaptureUI(this.AppWindow.Id); +cameraCaptureUI.PhotoSettings.Format = CameraCaptureUIPhotoFormat.Png; +cameraCaptureUI.PhotoSettings.AllowCropping = false; + +// Capture a photo asynchronously +StorageFile photo = await cameraCaptureUI.CaptureFileAsync(CameraCaptureUIMode.Photo); + +if (photo != null) +{ + // Photo capture was successful + + // Show the captured photo in a XAML Image control + using (IRandomAccessStream fileStream = await photo.OpenAsync(Windows.Storage.FileAccessMode.Read)) + { + // Set the image source to the selected bitmap + BitmapImage bitmapImage = new BitmapImage(); + await bitmapImage.SetSourceAsync(fileStream); + iCapturedImage.Source = bitmapImage; + } +} else +{ + // Photo capture failed or was cancelled +} + +``` + +### [C++/WinRT](#tab/cpp) + +```cpp +// Get the WindowId for the window +Microsoft::UI::WindowId windowId = this->AppWindow().Id(); + +// Initialize CameraCaptureUI with a window handle +winrt::Microsoft::Windows::Media::Capture::CameraCaptureUI cameraUI(windowId); + +// Configure Photo Settings +cameraUI.PhotoSettings().Format(CameraCaptureUIPhotoFormat::Png); +cameraUI.PhotoSettings().AllowCropping(false); + +// Capture a photo asynchronously +auto photo = co_await cameraUI.CaptureFileAsync(CameraCaptureUIMode::Photo); + + +if (photo != nullptr) +{ + // Photo capture was successful + + // Show the captured photo in a XAML Image control + IRandomAccessStream fileStream = co_await photo.OpenAsync(Windows::Storage::FileAccessMode::Read); + BitmapImage bitmapImage = BitmapImage(); + co_await bitmapImage.SetSourceAsync(fileStream); + iCapturedImage().Source(bitmapImage); + +} +else +{ + // Photo capture failed or was cancelled +} +``` + +--- + +## Use the CameraCaptureUI class to capture videos + +The following example demonstrates launching the **CameraCaptureUI** for video capture, specifying the maximum video as standard definition and disabling trimming. In this example the captured photo is set as the source for an [MediaPlayerElement](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.controls.mediaplayerelement) control. + +### [C#](#tab/csharp) + +```csharp +var cameraCaptureUI = new CameraCaptureUI(this.AppWindow.Id); +cameraCaptureUI.VideoSettings.MaxResolution = CameraCaptureUIMaxVideoResolution.StandardDefinition; +cameraCaptureUI.VideoSettings.AllowTrimming = true; +StorageFile videoFile = await cameraCaptureUI.CaptureFileAsync(CameraCaptureUIMode.Video); + +if (videoFile != null) +{ + // Video capture was successful + + // Show the captured video in a MediaPlayerElement control + mediaPlayerElement.Source = MediaSource.CreateFromStorageFile(videoFile); + mediaPlayerElement.MediaPlayer.Play(); +} +else +{ + // Video capture failed or was cancelled +} +``` + +### [C++/WinRT](#tab/cpp) + +```cpp +Microsoft::UI::WindowId windowId = this->AppWindow().Id(); + +winrt::Microsoft::Windows::Media::Capture::CameraCaptureUI cameraUI(windowId); + +cameraUI.VideoSettings().MaxResolution(CameraCaptureUIMaxVideoResolution::StandardDefinition); +cameraUI.VideoSettings().AllowTrimming(true); +StorageFile videoFile = co_await cameraUI.CaptureFileAsync(CameraCaptureUIMode::Video); + +if (videoFile != nullptr) +{ + // Video capture was successful + + // Show the captured video in a MediaPlayerElement control + auto source = winrt::Windows::Media::Core::MediaSource::CreateFromStorageFile(videoFile); + mediaPlayerElement().Source(MediaSource::CreateFromStorageFile(videoFile)); + +} +else +{ + // Photo capture failed or was cancelled +} +``` + +--- + +## Move and rename captured media files + +The **CameraCaptureUI** creates randomized names for captured media files, so you may want to rename and move captured files to keep them organized. The following example moves and renames a captured file. + + +### [C#](#tab/csharp) + +```csharp +StorageFile photo = await cameraCaptureUI.CaptureFileAsync(CameraCaptureUIMode.Photo); + +if (photo != null) +{ + // Move and rename captured photo + StorageFolder destinationFolder = + await ApplicationData.Current.LocalFolder.CreateFolderAsync("ProfilePhotoFolder", + CreationCollisionOption.OpenIfExists); + + await photo.CopyAsync(destinationFolder, "ProfilePhoto.jpg", NameCollisionOption.ReplaceExisting); + await photo.DeleteAsync(); +} +``` + +### [C++/WinRT](#tab/cpp) + +```cpp +auto photo = co_await cameraUI.CaptureFileAsync(CameraCaptureUIMode::Photo); + + +if (photo != nullptr) +{ + // Move and rename captured photo + StorageFolder destinationFolder = co_await ApplicationData::Current().LocalFolder() + .CreateFolderAsync(L"ProfilePhotoFolder", CreationCollisionOption::OpenIfExists); + + co_await photo.CopyAsync(destinationFolder, L"ProfilePhoto.jpg", NameCollisionOption::ReplaceExisting); + co_await photo.DeleteAsync(); +} +``` + +--- diff --git a/uwp/audio-video-camera/capture-device-controls-for-photo-and-video-capture.md b/hub/apps/develop/camera/capture-device-controls-for-photo-and-video-capture.md similarity index 76% rename from uwp/audio-video-camera/capture-device-controls-for-photo-and-video-capture.md rename to hub/apps/develop/camera/capture-device-controls-for-photo-and-video-capture.md index b98c0c90da..ea5576ec6c 100644 --- a/uwp/audio-video-camera/capture-device-controls-for-photo-and-video-capture.md +++ b/hub/apps/develop/camera/capture-device-controls-for-photo-and-video-capture.md @@ -1,28 +1,20 @@ --- -ms.assetid: 831123A7-1F40-4B74-AE9F-69AC9883B4AD -description: This article shows you how to use manual device controls to enable enhanced photo and video capture scenarios including optical image stabilization and smooth zoom. +description: Learn how to use manual device controls to enable enhanced photo and video capture scenarios including optical image stabilization and smooth zoom. title: Manual camera controls for photo and video capture -ms.date: 02/08/2017 +ms.date: 10/24/2024 ms.topic: article -keywords: windows 10, uwp +keywords: windows 10, winui 3 ms.localizationpriority: medium --- -# Manual camera controls for photo and video capture - +# Manual camera controls for photo and video capture This article shows you how to use manual device controls to enable enhanced photo and video capture scenarios including optical image stabilization and smooth zoom. The controls discussed in this article are all added to your app using the same pattern. First, check to see if the control is supported on the current device on which your app is running. If the control is supported, set the desired mode for the control. Typically, if a particular control is unsupported on the current device, you should disable or hide the UI element that allows the user to enable the feature. -The code in this article was adapted from the [Camera Manual Controls SDK sample](https://github.com/Microsoft/Windows-universal-samples/tree/master/Samples/CameraManualControls). You can download the sample to see the code used in context or to use the sample as a starting point for your own app. - > [!NOTE] -> This article builds on concepts and code discussed in [Basic photo, video, and audio capture with MediaCapture](basic-photo-video-and-audio-capture-with-MediaCapture.md), which describes the steps for implementing basic photo and video capture. We recommend that you familiarize yourself with the basic media capture pattern in that article before moving on to more advanced capture scenarios. The code in this article assumes that your app already has an instance of MediaCapture that has been properly initialized. - -All of the device control APIs discussed in this article are members of the [**Windows.Media.Devices**](/uwp/api/Windows.Media.Devices) namespace. - -:::code language="csharp" source="~/../snippets-windows/windows-uwp/audio-video-camera/BasicMediaCaptureWin10/cs/MainPage.xaml.cs" id="SnippetVideoControllersUsing"::: +> This article builds on concepts and code discussed in [Basic photo, video, and audio capture with MediaCapture](basic-photo-capture.md), which describes the steps for implementing basic photo and video capture. We recommend that you familiarize yourself with the basic media capture pattern in that article before moving on to more advanced capture scenarios. The code in this article assumes that your app already has an instance of **MediaCapture** that has been properly initialized. ## Exposure @@ -30,7 +22,7 @@ The [**ExposureControl**](/uwp/api/Windows.Media.Devices.ExposureControl) allows This example uses a [**Slider**](/uwp/api/Windows.UI.Xaml.Controls.Slider) control to adjust the current exposure value and a checkbox to toggle automatic exposure adjustment. -:::code language="xml" source="~/../snippets-windows/windows-uwp/audio-video-camera/BasicMediaCaptureWin10/cs/MainPage.xaml" id="SnippetExposureXAML"::: +:::code language="xml" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.xaml" id="SnippetExposureXAML"::: Check to see if the current capture device supports the **ExposureControl** by checking the [**Supported**](/uwp/api/windows.media.devices.exposurecontrol.supported) property. If the control is supported, you can show and enable the UI for this feature. Set the checked state of the checkbox to indicate if automatic exposure adjustment is currently active to the value of the [**Auto**](/uwp/api/windows.media.devices.exposurecontrol.auto) property. @@ -38,15 +30,15 @@ The exposure value must be within the range supported by the device and must be Set the slider control's value to the current value of the **ExposureControl** after unregistering the [**ValueChanged**](/uwp/api/windows.ui.xaml.controls.primitives.rangebase.valuechanged) event handler so that the event is not triggered when the value is set. -:::code language="csharp" source="~/../snippets-windows/windows-uwp/audio-video-camera/BasicMediaCaptureWin10/cs/MainPage.ManualControls.xaml.cs" id="SnippetExposureControl"::: +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.ManualControls.xaml.cs" id="SnippetExposureControl"::: In the **ValueChanged** event handler, get the current value of the control and the set the exposure value by calling [**SetValueAsync**](/uwp/api/windows.media.devices.exposurecontrol.setvalueasync). -:::code language="csharp" source="~/../snippets-windows/windows-uwp/audio-video-camera/BasicMediaCaptureWin10/cs/MainPage.ManualControls.xaml.cs" id="SnippetExposureSlider"::: +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.ManualControls.xaml.cs" id="SnippetExposureSlider"::: In the **CheckedChanged** event handler of the auto exposure checkbox, turn automatic exposure adjustment on or off by calling [**SetAutoAsync**](/uwp/api/windows.media.devices.exposurecontrol.setautoasync) and passing in a boolean value. -:::code language="csharp" source="~/../snippets-windows/windows-uwp/audio-video-camera/BasicMediaCaptureWin10/cs/MainPage.ManualControls.xaml.cs" id="SnippetExposureCheckBox"::: +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.ManualControls.xaml.cs" id="SnippetExposureCheckBox"::: > [!IMPORTANT] > Automatic exposure mode is only supported while the preview stream is running. Check to make sure that the preview stream is running before turning on automatic exposure. @@ -57,19 +49,19 @@ The [**ExposureCompensationControl**](/uwp/api/Windows.Media.Devices.ExposureCom This example uses a [**Slider**](/uwp/api/Windows.UI.Xaml.Controls.Slider) control to adjust the current exposure compensation value. -:::code language="xml" source="~/../snippets-windows/windows-uwp/audio-video-camera/BasicMediaCaptureWin10/cs/MainPage.xaml" id="SnippetEvXAML"::: +:::code language="xml" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.xaml" id="SnippetEvXAML"::: -Check to see if the current capture device supports the **ExposureCompensationControl** by checking the [Supported](supported-codecs.md) property. If the control is supported, you can show and enable the UI for this feature. +Check to see if the current capture device supports the **ExposureCompensationControl** by checking the [Supported](/windows/uwp/audio-video-camera/supported-codecs) property. If the control is supported, you can show and enable the UI for this feature. The exposure compensation value must be within the range supported by the device and must be an increment of the supported step size. Get the supported values for the current device by checking the [**Min**](/uwp/api/windows.media.devices.exposurecompensationcontrol.min), [**Max**](/uwp/api/windows.media.devices.exposurecompensationcontrol.max), and [**Step**](/uwp/api/windows.media.devices.exposurecompensationcontrol.step) properties, which are used to set the corresponding properties of the slider control. Set slider control's value to the current value of the **ExposureCompensationControl** after unregistering the [**ValueChanged**](/uwp/api/windows.ui.xaml.controls.primitives.rangebase.valuechanged) event handler so that the event is not triggered when the value is set. -:::code language="csharp" source="~/../snippets-windows/windows-uwp/audio-video-camera/BasicMediaCaptureWin10/cs/MainPage.ManualControls.xaml.cs" id="SnippetEvControl"::: +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.ManualControls.xaml.cs" id="SnippetEvControl"::: In the **ValueChanged** event handler, get the current value of the control and the set the exposure value by calling [**SetValueAsync**](/uwp/api/windows.media.devices.exposurecompensationcontrol.setvalueasync). -:::code language="csharp" source="~/../snippets-windows/windows-uwp/audio-video-camera/BasicMediaCaptureWin10/cs/MainPage.ManualControls.xaml.cs" id="SnippetEvValueChanged"::: +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.ManualControls.xaml.cs" id="SnippetEvValueChanged"::: ## Flash @@ -77,23 +69,23 @@ The [**FlashControl**](/uwp/api/Windows.Media.Devices.FlashControl) allows you t This example uses a set of radio buttons to allow the user to switch between on, off, and auto flash settings. A checkbox is also provided to allow toggling of red eye reduction and the video torch. -:::code language="xml" source="~/../snippets-windows/windows-uwp/audio-video-camera/BasicMediaCaptureWin10/cs/MainPage.xaml" id="SnippetFlashXAML"::: +:::code language="xml" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.xaml" id="SnippetFlashXAML"::: Check to see if the current capture device supports the **FlashControl** by checking the [**Supported**](/uwp/api/windows.media.devices.focuscontrol.supported) property. If the control is supported, you can show and enable the UI for this feature. If the **FlashControl** is supported, automatic red eye reduction may or may not be supported, so check the [**RedEyeReductionSupported**](/uwp/api/windows.media.devices.flashcontrol.redeyereductionsupported) property before enabling the UI. Because the **TorchControl** is separate from the flash control, you must also check its [**Supported**](/uwp/api/windows.media.devices.torchcontrol.supported) property before using it. In the [**Checked**](/uwp/api/windows.ui.xaml.controls.primitives.togglebutton.checked) event handler for each of the flash radio buttons, enable or disable the appropriate corresponding flash setting. Note that to set the flash to always be used, you must set the [**Enabled**](/uwp/api/windows.media.devices.flashcontrol.enabled) property to true and the [**Auto**](/uwp/api/windows.media.devices.flashcontrol.auto) property to false. -:::code language="csharp" source="~/../snippets-windows/windows-uwp/audio-video-camera/BasicMediaCaptureWin10/cs/MainPage.ManualControls.xaml.cs" id="SnippetFlashControl"::: +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.ManualControls.xaml.cs" id="SnippetFlashControl"::: -:::code language="csharp" source="~/../snippets-windows/windows-uwp/audio-video-camera/BasicMediaCaptureWin10/cs/MainPage.ManualControls.xaml.cs" id="SnippetFlashRadioButtons"::: +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.ManualControls.xaml.cs" id="SnippetFlashRadioButtons"::: In the handler for the red eye reduction checkbox, set the [**RedEyeReduction**](/uwp/api/windows.media.devices.flashcontrol.redeyereduction) property to the appropriate value. -:::code language="csharp" source="~/../snippets-windows/windows-uwp/audio-video-camera/BasicMediaCaptureWin10/cs/MainPage.ManualControls.xaml.cs" id="SnippetRedEye"::: +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.ManualControls.xaml.cs" id="SnippetRedEye"::: Finally, in the handler for the video torch checkbox, set the [**Enabled**](/uwp/api/windows.media.devices.torchcontrol.enabled) property to the appropriate value. -:::code language="csharp" source="~/../snippets-windows/windows-uwp/audio-video-camera/BasicMediaCaptureWin10/cs/MainPage.ManualControls.xaml.cs" id="SnippetTorch"::: +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.ManualControls.xaml.cs" id="SnippetTorch"::: > [!NOTE] > On some devices the torch will not emit light, even if [**TorchControl.Enabled**](/uwp/api/windows.media.devices.torchcontrol.enabled) is set to true, unless the device has a preview stream running and is actively capturing video. The recommended order of operations is to turn on the video preview, turn on the torch by setting **Enabled** to true, and then initiate video capture. On some devices the torch will light up after the preview is started. On other devices, the torch may not light up until video capture is started. @@ -106,17 +98,17 @@ Three different commonly used methods for adjusting the focus of the camera are Enabling continuous autofocus instructs the camera to adjust the focus dynamically to try to keep the subject of the photo or video in focus. This example uses a radio button to toggle continuous autofocus on and off. -:::code language="xml" source="~/../snippets-windows/windows-uwp/audio-video-camera/BasicMediaCaptureWin10/cs/MainPage.xaml" id="SnippetCAFXAML"::: +:::code language="xml" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.xaml" id="SnippetCAFXAML"::: Check to see if the current capture device supports the **FocusControl** by checking the [**Supported**](/uwp/api/windows.media.devices.flashcontrol.supported) property. Next, determine if continuous autofocus is supported by checking the [**SupportedFocusModes**](/uwp/api/windows.media.devices.focuscontrol.supportedfocusmodes) list to see if it contains the value [**FocusMode.Continuous**](/uwp/api/Windows.Media.Devices.FocusMode), and if so, show the continuous autofocus radio button. -:::code language="csharp" source="~/../snippets-windows/windows-uwp/audio-video-camera/BasicMediaCaptureWin10/cs/MainPage.ManualControls.xaml.cs" id="SnippetCAF"::: +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.ManualControls.xaml.cs" id="SnippetCAF"::: In the [**Checked**](/uwp/api/windows.ui.xaml.controls.primitives.togglebutton.checked) event handler for the continuous autofocus radio button, use the [**VideoDeviceController.FocusControl**](/uwp/api/windows.media.devices.videodevicecontroller.focuscontrol) property to get an instance of the control. Call [**UnlockAsync**](/uwp/api/windows.media.devices.focuscontrol.unlockasync) to unlock the control in case your app has previously called [**LockAsync**](/uwp/api/windows.media.devices.focuscontrol.lockasync) to enable one of the other focus modes. Create a new [**FocusSettings**](/uwp/api/Windows.Media.Devices.FocusSettings) object and set the [**Mode**](/uwp/api/windows.media.devices.focussettings.mode) property to **Continuous**. Set the [**AutoFocusRange**](/uwp/api/windows.media.devices.focussettings.autofocusrange) property to a value appropriate for your app scenario or selected by the user from your UI. Pass your **FocusSettings** object into the [**Configure**](/uwp/api/windows.media.devices.focuscontrol.configure) method, and then call [**FocusAsync**](/uwp/api/windows.media.devices.focuscontrol.focusasync) to initiate continuous autofocus. -:::code language="csharp" source="~/../snippets-windows/windows-uwp/audio-video-camera/BasicMediaCaptureWin10/cs/MainPage.ManualControls.xaml.cs" id="SnippetCafFocusRadioButton"::: +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.ManualControls.xaml.cs" id="SnippetCafFocusRadioButton"::: > [!IMPORTANT] > Autofocus mode is only supported while the preview stream is running. Check to make sure that the preview stream is running before turning on continuous autofocus. @@ -127,19 +119,19 @@ The tap-to-focus technique uses the [**FocusControl**](/uwp/api/Windows.Media.De This example uses a radio button to enable and disable tap-to-focus mode. -:::code language="xml" source="~/../snippets-windows/windows-uwp/audio-video-camera/BasicMediaCaptureWin10/cs/MainPage.xaml" id="SnippetTapFocusXAML"::: +:::code language="xml" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.xaml" id="SnippetTapFocusXAML"::: Check to see if the current capture device supports the **FocusControl** by checking the [**Supported**](/uwp/api/windows.media.devices.flashcontrol.supported) property. The **RegionsOfInterestControl** must be supported, and must support at least one region, in order to use this technique. Check the [**AutoFocusSupported**](/uwp/api/windows.media.devices.regionsofinterestcontrol.autofocussupported) and [**MaxRegions**](/uwp/api/windows.media.devices.regionsofinterestcontrol.maxregions) properties to determine whether to show or hide the radio button for tap-to-focus. -:::code language="csharp" source="~/../snippets-windows/windows-uwp/audio-video-camera/BasicMediaCaptureWin10/cs/MainPage.ManualControls.xaml.cs" id="SnippetTapFocus"::: +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.ManualControls.xaml.cs" id="SnippetTapFocus"::: In the [**Checked**](/uwp/api/windows.ui.xaml.controls.primitives.togglebutton.checked) event handler for the tap-to-focus radio button, use the [**VideoDeviceController.FocusControl**](/uwp/api/windows.media.devices.videodevicecontroller.focuscontrol) property to get an instance of the control. Call [**LockAsync**](/uwp/api/windows.media.devices.focuscontrol.lockasync) to lock the control in case your app has previously called [**UnlockAsync**](/uwp/api/windows.media.devices.focuscontrol.unlockasync) to enable continuous autofocus, and then wait for the user to tap the screen to change the focus. -:::code language="csharp" source="~/../snippets-windows/windows-uwp/audio-video-camera/BasicMediaCaptureWin10/cs/MainPage.ManualControls.xaml.cs" id="SnippetTapFocusRadioButton"::: +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.ManualControls.xaml.cs" id="SnippetTapFocusRadioButton"::: This example focuses on a region when the user taps the screen, and then removes the focus from that region when the user taps again, like a toggle. Use a boolean variable to track the current toggled state. -:::code language="csharp" source="~/../snippets-windows/windows-uwp/audio-video-camera/BasicMediaCaptureWin10/cs/MainPage.ManualControls.xaml.cs" id="SnippetIsFocused"::: +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.ManualControls.xaml.cs" id="SnippetIsFocused"::: The next step is to listen for the event when the user taps the screen by handling the [**Tapped**](/uwp/api/windows.ui.xaml.uielement.tapped) event of the [**CaptureElement**](/uwp/api/Windows.UI.Xaml.Controls.CaptureElement) that is currently displaying the capture preview stream. If the camera isn't currently previewing, or if tap-to-focus mode is disabled, return from the handler without doing anything. @@ -147,7 +139,7 @@ If the tracking variable *\_isFocused* is toggled to false, and if the camera is If the *\_isFocused* toggle is set to true, the user tap should clear the focus from the previous region. This is done in the **TapUnfocus** helper method shown below. -:::code language="csharp" source="~/../snippets-windows/windows-uwp/audio-video-camera/BasicMediaCaptureWin10/cs/MainPage.ManualControls.xaml.cs" id="SnippetTapFocusPreviewControl"::: +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.ManualControls.xaml.cs" id="SnippetTapFocusPreviewControl"::: In the **TapToFocus** helper method, first set the *\_isFocused* toggle to true so that the next screen tap will release the focus from the tapped region. @@ -170,25 +162,27 @@ Finally, call [**FocusAsync**](/uwp/api/windows.media.devices.focuscontrol.focus > 2. [**RegionsOfInterestControl.SetRegionsAsync**](/uwp/api/windows.media.devices.regionsofinterestcontrol.setregionsasync) > 3. [**FocusControl.FocusAsync**](/uwp/api/windows.media.devices.focuscontrol.focusasync) -:::code language="csharp" source="~/../snippets-windows/windows-uwp/audio-video-camera/BasicMediaCaptureWin10/cs/MainPage.ManualControls.xaml.cs" id="SnippetTapToFocus"::: +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.ManualControls.xaml.cs" id="SnippetTapToFocus"::: In the **TapUnfocus** helper method, obtain the **RegionsOfInterestControl** and call [**ClearRegionsAsync**](/uwp/api/windows.media.devices.regionsofinterestcontrol.clearregionsasync) to clear the region that was registered with the control within the **TapToFocus** helper method. Then, get the **FocusControl** and call [**FocusAsync**](/uwp/api/windows.media.devices.focuscontrol.focusasync) to cause the device to refocus without a region of interest. -:::code language="csharp" source="~/../snippets-windows/windows-uwp/audio-video-camera/BasicMediaCaptureWin10/cs/MainPage.ManualControls.xaml.cs" id="SnippetTapUnfocus"::: +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.ManualControls.xaml.cs" id="SnippetTapUnfocus"::: + +The **GetPreviewStreamRectInControl** helper method uses the resolution of the preview stream and the orientation of the device to determine the rectangle within the preview element that contains the preview stream, trimming off any letterboxed padding that the control may provide to maintain the stream's aspect ratio. This method uses class member variables defined in the basic media capture example code found in [Basic photo, video, and audio capture with MediaCapture](basic-photo-capture.md). -The **GetPreviewStreamRectInControl** helper method uses the resolution of the preview stream and the orientation of the device to determine the rectangle within the preview element that contains the preview stream, trimming off any letterboxed padding that the control may provide to maintain the stream's aspect ratio. This method uses class member variables defined in the basic media capture example code found in [Basic photo, video, and audio capture with MediaCapture](basic-photo-video-and-audio-capture-with-MediaCapture.md). +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.ManualControls.xaml.cs" id="SnippetGetPreviewStreamRectInControl"::: -:::code language="csharp" source="~/../snippets-windows/windows-uwp/audio-video-camera/BasicMediaCaptureWin10/cs/MainPage.ManualControls.xaml.cs" id="SnippetGetPreviewStreamRectInControl"::: +The **ConvertUiTapToPreviewRect** helper method takes as arguments the location of the tap event, the desired size of the focus region, and the rectangle containing the preview stream obtained from the **GetPreviewStreamRectInControl** helper method. This method uses these values and the device's current orientation to calculate the rectangle within the preview stream that contains the desired region. Once again, this method uses class member variables defined in the basic media capture example code found in [Capture Photos and Video with MediaCapture](basic-photo-capture.md). -The **ConvertUiTapToPreviewRect** helper method takes as arguments the location of the tap event, the desired size of the focus region, and the rectangle containing the preview stream obtained from the **GetPreviewStreamRectInControl** helper method. This method uses these values and the device's current orientation to calculate the rectangle within the preview stream that contains the desired region. Once again, this method uses class member variables defined in the basic media capture example code found in [Capture Photos and Video with MediaCapture](./index.md). -:::code language="csharp" source="~/../snippets-windows/windows-uwp/audio-video-camera/BasicMediaCaptureWin10/cs/MainPage.ManualControls.xaml.cs" id="SnippetConvertUiTapToPreviewRect"::: + +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.ManualControls.xaml.cs" id="SnippetConvertUiTapToPreviewRect"::: ### Manual focus The manual focus technique uses a **Slider** control to set the current focus depth of the capture device. A radio button is used to toggle manual focus on and off. -:::code language="xml" source="~/../snippets-windows/windows-uwp/audio-video-camera/BasicMediaCaptureWin10/cs/MainPage.xaml" id="SnippetManualFocusXAML"::: +:::code language="xml" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.xaml" id="SnippetManualFocusXAML"::: Check to see if the current capture device supports the **FocusControl** by checking the [**Supported**](/uwp/api/windows.media.devices.focuscontrol.supported) property. If the control is supported, you can show and enable the UI for this feature. @@ -196,29 +190,29 @@ The focus value must be within the range supported by the device and must be an Set the slider control's value to the current value of the **FocusControl** after unregistering the [**ValueChanged**](/uwp/api/windows.ui.xaml.controls.primitives.rangebase.valuechanged) event handler so that the event is not triggered when the value is set. -:::code language="csharp" source="~/../snippets-windows/windows-uwp/audio-video-camera/BasicMediaCaptureWin10/cs/MainPage.ManualControls.xaml.cs" id="SnippetFocus"::: +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.ManualControls.xaml.cs" id="SnippetFocus"::: In the **Checked** event handler for the manual focus radio button, get the **FocusControl** object and call [**LockAsync**](/uwp/api/windows.media.devices.focuscontrol.lockasync) in case your app had previously unlocked the focus with a call to [**UnlockAsync**](/uwp/api/windows.media.devices.focuscontrol.unlockasync). -:::code language="csharp" source="~/../snippets-windows/windows-uwp/audio-video-camera/BasicMediaCaptureWin10/cs/MainPage.ManualControls.xaml.cs" id="SnippetManualFocusChecked"::: +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.ManualControls.xaml.cs" id="SnippetManualFocusChecked"::: In the **ValueChanged** event handler of the manual focus slider, get the current value of the control and the set the focus value by calling [**SetValueAsync**](/uwp/api/windows.media.devices.focuscontrol.setvalueasync). -:::code language="csharp" source="~/../snippets-windows/windows-uwp/audio-video-camera/BasicMediaCaptureWin10/cs/MainPage.ManualControls.xaml.cs" id="SnippetFocusSlider"::: +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.ManualControls.xaml.cs" id="SnippetFocusSlider"::: ### Enable the focus light On devices that support it, you can enable a focus assist light to help the device focus. This example uses a checkbox to enable or disable the focus assist light. -:::code language="xml" source="~/../snippets-windows/windows-uwp/audio-video-camera/BasicMediaCaptureWin10/cs/MainPage.xaml" id="SnippetFocusLightXAML"::: +:::code language="xml" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.xaml" id="SnippetFocusLightXAML"::: Check to see if the current capture device supports the **FlashControl** by checking the [**Supported**](/uwp/api/windows.media.devices.flashcontrol.supported) property. Also check the [**AssistantLightSupported**](/uwp/api/windows.media.devices.flashcontrol.assistantlightsupported) to make sure the assist light is also supported. If these are both supported, you can show and enable the UI for this feature. -:::code language="csharp" source="~/../snippets-windows/windows-uwp/audio-video-camera/BasicMediaCaptureWin10/cs/MainPage.ManualControls.xaml.cs" id="SnippetFocusLight"::: +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.ManualControls.xaml.cs" id="SnippetFocusLight"::: In the **CheckedChanged** event handler, get the capture devices [**FlashControl**](/uwp/api/Windows.Media.Devices.FlashControl) object. Set the [**AssistantLightEnabled**](/uwp/api/windows.media.devices.flashcontrol.assistantlightenabled) property to enable or disable the focus light. -:::code language="csharp" source="~/../snippets-windows/windows-uwp/audio-video-camera/BasicMediaCaptureWin10/cs/MainPage.ManualControls.xaml.cs" id="SnippetFocusLightCheckBox"::: +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.ManualControls.xaml.cs" id="SnippetFocusLightCheckBox"::: ## ISO speed @@ -226,7 +220,7 @@ The [**IsoSpeedControl**](/uwp/api/Windows.Media.Devices.IsoSpeedControl) allows This example uses a [**Slider**](/uwp/api/Windows.UI.Xaml.Controls.Slider) control to adjust the current exposure compensation value and a checkbox to toggle automatic ISO speed adjustment. -:::code language="xml" source="~/../snippets-windows/windows-uwp/audio-video-camera/BasicMediaCaptureWin10/cs/MainPage.xaml" id="SnippetIsoXAML"::: +:::code language="xml" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.xaml" id="SnippetIsoXAML"::: Check to see if the current capture device supports the **IsoSpeedControl** by checking the [**Supported**](/uwp/api/windows.media.devices.isospeedcontrol.supported) property. If the control is supported, you can show and enable the UI for this feature. Set the checked state of the checkbox to indicate if automatic ISO speed adjustment is currently active to the value of the [**Auto**](/uwp/api/windows.media.devices.isospeedcontrol.auto) property. @@ -234,19 +228,19 @@ The ISO speed value must be within the range supported by the device and must be Set the slider control's value to the current value of the **IsoSpeedControl** after unregistering the [**ValueChanged**](/uwp/api/windows.ui.xaml.controls.primitives.rangebase.valuechanged) event handler so that the event is not triggered when the value is set. -:::code language="csharp" source="~/../snippets-windows/windows-uwp/audio-video-camera/BasicMediaCaptureWin10/cs/MainPage.ManualControls.xaml.cs" id="SnippetIsoControl"::: +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.ManualControls.xaml.cs" id="SnippetIsoControl"::: In the **ValueChanged** event handler, get the current value of the control and the set the ISO speed value by calling [**SetValueAsync**](/uwp/api/windows.media.devices.isospeedcontrol.setvalueasync). -:::code language="csharp" source="~/../snippets-windows/windows-uwp/audio-video-camera/BasicMediaCaptureWin10/cs/MainPage.ManualControls.xaml.cs" id="SnippetIsoSlider"::: +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.ManualControls.xaml.cs" id="SnippetIsoSlider"::: In the **CheckedChanged** event handler of the auto ISO speed checkbox, turn on automatic ISO speed adjustment by calling [**SetAutoAsync**](/uwp/api/windows.media.devices.isospeedcontrol.setautoasync). Turn automatic ISO speed adjustment off by calling [**SetValueAsync**](/uwp/api/windows.media.devices.isospeedcontrol.setvalueasync) and passing in the current value of the slider control. -:::code language="csharp" source="~/../snippets-windows/windows-uwp/audio-video-camera/BasicMediaCaptureWin10/cs/MainPage.ManualControls.xaml.cs" id="SnippetIsoCheckBox"::: +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.ManualControls.xaml.cs" id="SnippetIsoCheckBox"::: ## Optical image stabilization -Optical image stabilization (OIS) stabilizes a the captured video stream by mechanically manipulating the hardware capture device, which can provide a superior result than digital stabilization. On devices that don't support OIS, you can use the VideoStabilizationEffect to perform digital stabilization on your captured vide. For more information, see [Effects for video capture](effects-for-video-capture.md). +Optical image stabilization (OIS) stabilizes a captured video stream by mechanically manipulating the hardware capture device, which can provide a superior result than digital stabilization. On devices that don't support OIS, you can use the VideoStabilizationEffect to perform digital stabilization on your captured video. For more information, see [Effects for video capture](effects-for-video-capture.md). Determine if OIS is supported on the current device by checking the [**OpticalImageStabilizationControl.Supported**](/uwp/api/windows.media.devices.opticalimagestabilizationcontrol.supported) property. @@ -254,14 +248,15 @@ The OIS control supports three modes: on, off, and automatic, which means that t Enable or disable OIS by setting the [**OpticalImageStabilizationControl.Mode**](/uwp/api/Windows.Media.Devices.OpticalImageStabilizationMode) to the desired mode. -:::code language="csharp" source="~/../snippets-windows/windows-uwp/audio-video-camera/BasicMediaCaptureWin10/cs/MainPage.xaml.cs" id="SnippetSetOpticalImageStabilizationMode"::: +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.ManualControls.xaml.cs" id="SnippetSetOpticalImageStabilizationMode"::: ## Powerline frequency + Some camera devices support anti-flicker processing that depends on knowing the AC frequency of the powerlines in the current environment. Some devices support automatic determination of the powerline frequency, while others require that the frequency be set manually. The following code example shows how to determine powerline frequency support on the device and, if needed, how to set the frequency manually. First, call the **VideoDeviceController** method [**TryGetPowerlineFrequency**](/uwp/api/windows.media.devices.videodevicecontroller.trygetpowerlinefrequency), passing in an output parameter of type [**PowerlineFrequency**](/uwp/api/Windows.Media.Capture.PowerlineFrequency); if this call fails, the powerline frequency control is not supported on the current device. If the feature is supported, you can determine if automatic mode is available on the device by trying to set auto mode. Do this by calling [**TrySetPowerlineFrequency**](/uwp/api/windows.media.devices.videodevicecontroller.trysetpowerlinefrequency) and passing in the value **Auto**. If the call succeeds, that means that your auto powerline frequency is supported. If the powerline frequency controller is supported on the device but automatic frequency detection is not, you can still manually set the frequency by using **TrySetPowerlineFrequency**. In this example, **MyCustomFrequencyLookup** is a custom method that you implement to determine the correct frequency for the device's current location. -:::code language="csharp" source="~/../snippets-windows/windows-uwp/audio-video-camera/BasicMediaCaptureWin10/cs/MainPage.ManualControls.xaml.cs" id="SnippetPowerlineFrequency"::: +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.ManualControls.xaml.cs" id="SnippetPowerlineFrequency"::: ## White balance @@ -269,7 +264,7 @@ The [**WhiteBalanceControl**](/uwp/api/windows.media.devices.videodevicecontroll This example uses a [**ComboBox**](/uwp/api/Windows.UI.Xaml.Controls.ComboBox) control to select from built-in color temperature presets and a [**Slider**](/uwp/api/Windows.UI.Xaml.Controls.Slider) control for manual white balance adjustment. -:::code language="xml" source="~/../snippets-windows/windows-uwp/audio-video-camera/BasicMediaCaptureWin10/cs/MainPage.xaml" id="SnippetWhiteBalanceXAML"::: +:::code language="xml" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.xaml" id="SnippetWhiteBalanceXAML"::: Check to see if the current capture device supports the **WhiteBalanceControl** by checking the [**Supported**](/uwp/api/windows.media.devices.whitebalancecontrol.supported) property. If the control is supported, you can show and enable the UI for this feature. Set the items of the combo box to the values of the [**ColorTemperaturePreset**](/uwp/api/Windows.Media.Devices.ColorTemperaturePreset) enumeration. And set the selected item to the current value of the [**Preset**](/uwp/api/windows.media.devices.whitebalancecontrol.preset) property. @@ -277,15 +272,15 @@ For manual control, the white balance value must be within the range supported b Set the slider control's value to the current value of the **WhiteBalanceControl** after unregistering the [**ValueChanged**](/uwp/api/windows.ui.xaml.controls.primitives.rangebase.valuechanged) event handler so that the event is not triggered when the value is set. -:::code language="csharp" source="~/../snippets-windows/windows-uwp/audio-video-camera/BasicMediaCaptureWin10/cs/MainPage.ManualControls.xaml.cs" id="SnippetWhiteBalance"::: +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.ManualControls.xaml.cs" id="SnippetWhiteBalance"::: In the [**SelectionChanged**](/uwp/api/windows.ui.xaml.controls.primitives.selector.selectionchanged) event handler of the color temperature preset combo box, get the currently selected preset and set the value of the control by calling [**SetPresetAsync**](/uwp/api/windows.media.devices.whitebalancecontrol.setpresetasync). If the selected preset value is not **Manual**, disable the manual white balance slider. -:::code language="csharp" source="~/../snippets-windows/windows-uwp/audio-video-camera/BasicMediaCaptureWin10/cs/MainPage.ManualControls.xaml.cs" id="SnippetWhiteBalanceComboBox"::: +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.ManualControls.xaml.cs" id="SnippetWhiteBalanceComboBox"::: In the **ValueChanged** event handler, get the current value of the control and the set the white balance value by calling [**SetValueAsync**](/uwp/api/windows.media.devices.exposurecontrol.setvalueasync). -:::code language="csharp" source="~/../snippets-windows/windows-uwp/audio-video-camera/BasicMediaCaptureWin10/cs/MainPage.ManualControls.xaml.cs" id="SnippetWhiteBalanceSlider"::: +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.ManualControls.xaml.cs" id="SnippetWhiteBalanceSlider"::: > [!IMPORTANT] > Adjusting the white balance is only supported while the preview stream is running. Check to make sure that the preview stream is running before setting the white balance value or preset. @@ -299,7 +294,7 @@ The [**ZoomControl**](/uwp/api/Windows.Media.Devices.ZoomControl) allows you to This example uses a [**Slider**](/uwp/api/Windows.UI.Xaml.Controls.Slider) control to adjust the current zoom level. The following section shows how to adjust zoom based on a pinch gesture on the screen. -:::code language="xml" source="~/../snippets-windows/windows-uwp/audio-video-camera/BasicMediaCaptureWin10/cs/MainPage.xaml" id="SnippetZoomXAML"::: +:::code language="xml" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.xaml" id="SnippetZoomXAML"::: Check to see if the current capture device supports the **ZoomControl** by checking the [**Supported**](/uwp/api/windows.media.devices.zoomcontrol.supported) property. If the control is supported, you can show and enable the UI for this feature. @@ -307,13 +302,13 @@ The zoom level value must be within the range supported by the device and must b Set the slider control's value to the current value of the **ZoomControl** after unregistering the [**ValueChanged**](/uwp/api/windows.ui.xaml.controls.primitives.rangebase.valuechanged) event handler so that the event is not triggered when the value is set. -:::code language="csharp" source="~/../snippets-windows/windows-uwp/audio-video-camera/BasicMediaCaptureWin10/cs/MainPage.ManualControls.xaml.cs" id="SnippetZoomControl"::: +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.ManualControls.xaml.cs" id="SnippetZoomControl"::: In the **ValueChanged** event handler, create a new instance of the [**ZoomSettings**](/uwp/api/Windows.Media.Devices.ZoomSettings) class, setting the [**Value**](/uwp/api/windows.media.devices.zoomsettings.value) property to the current value of the zoom slider control. If the [**SupportedModes**](/uwp/api/windows.media.devices.zoomcontrol.supportedmodes) property of the **ZoomControl** contains [**ZoomTransitionMode.Smooth**](/uwp/api/Windows.Media.Devices.ZoomTransitionMode), it means the device supports smooth transitions between zoom levels. Since this modes provides a better user experience, you will typically want to use this value for the [**Mode**](/uwp/api/windows.media.devices.zoomsettings.mode) property of the **ZoomSettings** object. Finally, change the current zoom settings by passing your **ZoomSettings** object into the [**Configure**](/uwp/api/windows.media.devices.zoomcontrol.configure) method of the **ZoomControl** object. -:::code language="csharp" source="~/../snippets-windows/windows-uwp/audio-video-camera/BasicMediaCaptureWin10/cs/MainPage.ManualControls.xaml.cs" id="SnippetZoomSlider"::: +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.ManualControls.xaml.cs" id="SnippetZoomSlider"::: ### Smooth zoom using pinch gesture @@ -321,11 +316,11 @@ As discussed in the previous section, on devices that support it, smooth zoom mo First, determine if the digital zoom control is supported on the current device by checking the [**ZoomControl.Supported**](/uwp/api/windows.media.devices.zoomcontrol.supported) property. Next, determine if smooth zoom mode is available by checking the [**ZoomControl.SupportedModes**](/uwp/api/windows.media.devices.zoomcontrol.supportedmodes) to see if it contains the value [**ZoomTransitionMode.Smooth**](/uwp/api/Windows.Media.Devices.ZoomTransitionMode). -:::code language="csharp" source="~/../snippets-windows/windows-uwp/audio-video-camera/BasicMediaCaptureWin10/cs/MainPage.xaml.cs" id="SnippetIsSmoothZoomSupported"::: +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.ManualControls.xaml.cs" id="SnippetIsSmoothZoomSupported"::: On a multi-touch enabled device, a typical scenario is to adjust the zoom factor based on a two-finger pinch gesture. Set the [**ManipulationMode**](/uwp/api/windows.ui.xaml.uielement.manipulationmode) property of the [**CaptureElement**](/uwp/api/Windows.UI.Xaml.Controls.CaptureElement) control to [**ManipulationModes.Scale**](/uwp/api/Windows.UI.Xaml.Input.ManipulationModes) to enable the pinch gesture. Then, register for the [**ManipulationDelta**](/uwp/api/windows.ui.xaml.uielement.manipulationdelta) event which is raised when the pinch gesture changes size. -:::code language="csharp" source="~/../snippets-windows/windows-uwp/audio-video-camera/BasicMediaCaptureWin10/cs/MainPage.xaml.cs" id="SnippetRegisterPinchGestureHandler"::: +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.ManualControls.xaml.cs" id="SnippetRegisterPinchGestureHandler"::: In the handler for the **ManipulationDelta** event, update the zoom factor based on the change in the user's pinch gesture. The [**ManipulationDelta.Scale**](/uwp/api/Windows.UI.Input.ManipulationDelta) value represents the change in scale of the pinch gesture such that a small increase in the size of the pinch is a number slightly larger than 1.0 and a small decrease in the pinch size is a number slightly smaller than 1.0. In this example, the current value of the zoom control is multiplied by the scale delta. @@ -333,9 +328,9 @@ Before setting the zoom factor, you must make sure that the value is not less th Set the zoom level on the capture device by creating a new [**ZoomSettings**](/uwp/api/Windows.Media.Devices.ZoomSettings) object. Set the [**Mode**](/uwp/api/windows.media.devices.zoomsettings.mode) property to [**ZoomTransitionMode.Smooth**](/uwp/api/Windows.Media.Devices.ZoomTransitionMode) and then set the [**Value**](/uwp/api/windows.media.devices.zoomsettings.value) property to your desired zoom factor. Finally, call [**ZoomControl.Configure**](/uwp/api/windows.media.devices.zoomcontrol.configure) to set the new zoom value on the device. The device will smoothly transition to the new zoom value. -:::code language="csharp" source="~/../snippets-windows/windows-uwp/audio-video-camera/BasicMediaCaptureWin10/cs/MainPage.xaml.cs" id="SnippetManipulationDelta"::: +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.ManualControls.xaml.cs" id="SnippetManipulationDelta"::: ## Related topics * [Camera](camera.md) -* [Basic photo, video, and audio capture with MediaCapture](basic-photo-video-and-audio-capture-with-MediaCapture.md) +* [Basic photo, video, and audio capture with MediaCapture](basic-photo-capture.md) diff --git a/hub/apps/develop/camera/capture-device-controls-for-video-capture.md b/hub/apps/develop/camera/capture-device-controls-for-video-capture.md new file mode 100644 index 0000000000..08ad23930b --- /dev/null +++ b/hub/apps/develop/camera/capture-device-controls-for-video-capture.md @@ -0,0 +1,83 @@ +--- +description: Learn how to use manual device controls to enable enhanced video capture scenarios including HDR video and exposure priority in a WinUI 3 app. +title: Manual camera controls for video capture +ms.date: 10/24/2024 +ms.topic: article +keywords: windows 10, winui 3 +ms.localizationpriority: medium +--- + +# Manual camera controls for video capture + +This article shows you how to use manual device controls to enable enhanced video capture scenarios, including HDR video and exposure priority. + +The video device controls discussed in this article are all added to your app by using the same pattern. First, check to see if the control is supported on the current device on which your app is running. If the control is supported, set the desired mode for the control. Typically, if a particular control is unsupported on the current device, you should disable or hide the UI element that allows the user to enable the feature. + +> [!NOTE] +> This article builds on concepts and code discussed in [Basic photo, video, and audio capture with MediaCapture](basic-photo-capture.md), which describes the steps for implementing basic photo and video capture. We recommend that you familiarize yourself with the basic media capture pattern in that article before moving on to more advanced capture scenarios. The code in this article assumes that your app already has an instance of **MediaCapture** that has been properly initialized. + +## HDR video + +The high dynamic range (HDR) video feature applies HDR processing to the video stream of the capture device. Determine if HDR video is supported by selecting the [**HdrVideoControl.Supported**](/uwp/api/windows.media.devices.hdrvideocontrol.supported) property. + +The HDR video control supports three modes: on, off, and automatic, which means that the device dynamically determines if HDR video processing would improve the media capture and, if so, enables HDR video. To determine if a particular mode is supported on the current device, check to see if the [**HdrVideoControl.SupportedModes**](/uwp/api/windows.media.devices.hdrvideocontrol.supportedmodes) collection contains the desired mode. + +Enable or disable HDR video processing by setting the [**HdrVideoControl.Mode**](/uwp/api/windows.media.devices.hdrvideocontrol.mode) to the desired mode. This control requires that the stream is at a stopped state before the mode is set, see [KSPROPERTY_CAMERACONTROL_EXTENDED_VIDEOHDR](/windows-hardware/drivers/stream/ksproperty-cameracontrol-extended-videohdr). + +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.ManualControls.xaml.cs" id="SnippetSetHdrVideoMode"::: + +## Exposure priority + +The [**ExposurePriorityVideoControl**](/uwp/api/Windows.Media.Devices.ExposurePriorityVideoControl), when enabled, evaluates the video frames from the capture device to determine if the video is capturing a low-light scene. If so, the control lowers the frame rate of the captured video in order to increase the exposure time for each frame and improve the visual quality of the captured video. + +Determine if the exposure priority control is supported on the current device by checking the [**ExposurePriorityVideoControl.Supported**](/uwp/api/windows.media.devices.exposurepriorityvideocontrol.supported) property. + +Enable or disable the exposure priority control by setting the [**ExposurePriorityVideoControl.Enabled**](/uwp/api/windows.media.devices.exposurepriorityvideocontrol.enabled) to the desired mode. + +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.ManualControls.xaml.cs" id="SnippetEnableExposurePriority"::: + +## Temporal denoising + +Starting with Windows 10, version 1803, you can enable temporal denoising for video on devices that support it. This feature fuses the image data from multiple adjacent frames in real time to produce video frames that have less visual noise. + +The [**VideoTemporalDenoisingControl**](/uwp/api/windows.media.devices.videotemporaldenoisingcontrol) allows your app to determine if temporal denoising is supported on the current device, and if so, which denoising modes are supported. The available denoising modes are [**Off**](/uwp/api/windows.media.devices.videotemporaldenoisingmode), [**On**](/uwp/api/windows.media.devices.videotemporaldenoisingmode), and [**Auto**](/uwp/api/windows.media.devices.videotemporaldenoisingmode). A device may not support all modes, but every device must support either **Auto** or **On** and **Off**. + +The following example uses a simple UI to provide radio buttons allowing the user to switch between denoising modes. + +:::code language="xml" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.xaml" id="SnippetDenoiseXAML"::: + +In the following method, the [**VideoTemporalDenoisingControl.Supported**](/uwp/api/windows.media.devices.videotemporaldenoisingcontrol.supported) property is checked to see if temporal denoising is supported at all on the current device. If so, then we check to make sure that **Off** and **Auto** or **On** is supported, in which case we make our radio buttons visible. Next, the **Auto** and **On** buttons are made visible if those methods are supported. + +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.ManualControls.xaml.cs" id="SnippetUpdateDenoiseCapabilities"::: + +In the **Checked** event handler for the radio buttons, the name of the button is checked and the corresponding mode is set by setting the [**VideoTemporalDenoisingControl.Mode**](/uwp/api/windows.media.devices.videotemporaldenoisingcontrol.mode) property. + +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.ManualControls.xaml.cs" id="SnippetDenoiseButtonChecked"::: + +### Disabling temporal denoising while processing frames + +Video that has been processed using temporal denoising can be more pleasing to the human eye. However, because temporal denoising can impact image consistency and decrease the amount of details in the frame, apps that perform image processing on the frames, such as registration or optical character recognition, may want to programmatically disable denoising when image processing is enabled. + +The following example determines which denoising modes are supported and stores this information in some class variables. + +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.ManualControls.xaml.cs" id="SnippetDenoiseFrameReaderVars"::: + +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.ManualControls.xaml.cs" id="SnippetDenoiseCapabilitiesForFrameProcessing"::: + +When the app enables frame processing, it sets the denoising mode to **Off** if that mode is supported so that the frame processing can use raw frames that have not been denoised. + +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.ManualControls.xaml.cs" id="SnippetEnableFrameProcessing"::: + +When the app disables frame processing, it sets the denoising mode to **On** or **Auto**, depending on which mode is supported. + +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.ManualControls.xaml.cs" id="SnippetDisableFrameProcessing"::: + +For more information on obtaining video frames for image processing, see [Process media frames with MediaFrameReader](process-media-frames-with-mediaframereader.md). + +## Related topics + +* [Camera](camera.md) +* [Basic photo, video, and audio capture with MediaCapture](basic-photo-capture.md) +* [Process media frames with MediaFrameReader](process-media-frames-with-mediaframereader.md) +* [**VideoTemporalDenoisingControl**](/uwp/api/windows.media.devices.videotemporaldenoisingcontrol) +  diff --git a/hub/apps/develop/camera/connect-to-remote-cameras.md b/hub/apps/develop/camera/connect-to-remote-cameras.md new file mode 100644 index 0000000000..94340d965f --- /dev/null +++ b/hub/apps/develop/camera/connect-to-remote-cameras.md @@ -0,0 +1,51 @@ +--- +ms.assetid: +description: Learn how to connect to remote cameras and get a MediaFrameSourceGroup to retrieve frames from each camera. +title: Connect to remote cameras +ms.date: 10/10/2024 +ms.topic: article +ms.custom: 19H1 +keywords: windows 10, winui 3 +ms.localizationpriority: medium +--- + +# Connect to remote cameras + +This article shows you how to connect to one or more remote cameras and get a [**MediaFrameSourceGroup**](/uwp/api/Windows.Media.Capture.Frames.MediaFrameSourceGroup) object that allows you to read frames from each camera. For more information on reading frames from a media source, see [Process media frames with MediaFrameReader](process-media-frames-with-mediaframereader.md). For more information on pairing with devices, see [Pair devices](/windows/uwp/devices-sensors/pair-devices). + +> [!NOTE] +> The features discussed in this article are available starting with Windows 10, version 1903. + +## Create a DeviceWatcher class to watch for available remote cameras + +The [**DeviceWatcher**](/uwp/api/windows.devices.enumeration.devicewatcher) class monitors the devices available to your app and notifies your app when devices are added or removed. Get an instance of **DeviceWatcher** by calling [**DeviceInformation.CreateWatcher**](/uwp/api/windows.devices.enumeration.deviceinformation.createwatcher#Windows_Devices_Enumeration_DeviceInformation_CreateWatcher_System_String_), passing in an Advanced Query Syntax (AQS) string that identifies the type of devices you want to monitor. The AQS string specifying network camera devices is the following: + +```syntax +@"System.Devices.InterfaceClassGuid:=""{B8238652-B500-41EB-B4F3-4234F7F5AE99}"" AND System.Devices.InterfaceEnabled:=System.StructuredQueryType.Boolean#True" +``` + +> [!NOTE] +> The helper method [**MediaFrameSourceGroup.GetDeviceSelector**](/uwp/api/windows.media.capture.frames.mediaframesourcegroup.getdeviceselector) returns an AQS string that will monitor locally-connected and remote network cameras. To monitor only network cameras, you should use the AQS string shown above. + +When you start the returned **DeviceWatcher** by calling the [**Start**](/uwp/api/windows.devices.enumeration.devicewatcher.start) method, it will raise the [**Added**](/uwp/api/windows.devices.enumeration.devicewatcher.added) event for every network camera that is currently available. Until you stop the watcher by calling [**Stop**](/uwp/api/windows.devices.enumeration.devicewatcher.stop), the **Added** event will be raised when new network camera devices become available and the [**Removed**](/uwp/api/windows.devices.enumeration.devicewatcher.removed) event will be raised when a camera device becomes unavailable. + +The event args passed into the **Added** and **Removed** event handlers are a [**DeviceInformation**](/uwp/api/Windows.Devices.Enumeration.DeviceInformation) or a [**DeviceInformationUpdate**](/uwp/api/windows.devices.enumeration.deviceinformationupdate) object, respectively. Each of these objects has an **Id** property that is the identifier for the network camera for which the event was fired. Pass this ID into the [**MediaFrameSourceGroup.FromIdAsync**](/uwp/api/windows.media.capture.frames.mediaframesourcegroup.fromidasync) method to get a [**MediaFrameSourceGroup**](/uwp/api/windows.media.capture.frames.mediaframesourcegroup.fromidasync) object that you can use to retrieve frames from the camera. + +## Remote camera pairing helper class + +The following example shows a helper class that uses a **DeviceWatcher** to create and update an **ObservableCollection** of **MediaFrameSourceGroup** objects to support data binding to the list of cameras. Typical apps would wrap the **MediaFrameSourceGroup** in a custom model class. Note that the helper class maintains a reference to the app's [**DispatcherQueue**](/windows/windows-app-sdk/api/winrt/microsoft.ui.dispatching.dispatcherqueue) and updates the collection of cameras on the UI thread. + +Also, this example handles the [**DeviceWatcher.Updated**](/uwp/api/windows.devices.enumeration.devicewatcher.updated) event in addition to the **Added** and **Removed** events. In the **Updated** handler, the associated remote camera device is removed from and then added back to the collection. + +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/RemoteCameraPairingHelper.cs" id="SnippetRemoteCameraPairingHelper"::: + +:::code language="cppwinrt" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/cpp/CameraWinUI/RemoteCameraPairingHelper.cpp" id="SnippetRemoteCameraPairingHelper"::: + + + +## Related topics + +* [Camera](camera.md) +* [Basic photo, video, and audio capture with MediaCapture](basic-photo-capture.md) +* [Camera frames sample](https://github.com/Microsoft/Windows-universal-samples/tree/master/Samples/CameraFrames) +* [Process media frames with MediaFrameReader](process-media-frames-with-mediaframereader.md) diff --git a/hub/apps/develop/camera/detect-audio-level-changes.md b/hub/apps/develop/camera/detect-audio-level-changes.md new file mode 100644 index 0000000000..34c5dec7d9 --- /dev/null +++ b/hub/apps/develop/camera/detect-audio-level-changes.md @@ -0,0 +1,36 @@ +--- +title: "Detect and respond to audio level changes by the system" +description: Learn how to detect and respond to audio level changes by the system. +ms.topic: article +ms.date: 08/07/2024 +ms.author: drewbat +author: drewbatgit +ms.localizationpriority: medium +#customer intent: As a developer, I want to detect and respond to audio level changes by the system in a Windows app using WinUI 3. +--- + +# Detect and respond to audio level changes by the system + +Learn how to detect and respond to audio level changes by the system. Starting with Windows 10, version 1803, your app can detect when the system lowers or mutes the audio level of your app's audio capture and audio render streams. For example, the system may mute your app's streams when it goes into the background. + +To learn about capturing audio using the [**MediaCapture**](/uwp/api/Windows.Media.Capture.MediaCapture) class, see [Basic photo, video, and audio capture with MediaCapture](basic-photo-capture.md). For information about audio playback using [MediaPlayer](/uwp/api/windows.media.playback.mediaplayer), see TBD. + + +The [**AudioStateMonitor**](/uwp/api/windows.media.audio.audiostatemonitor) class allows you to register to receive an event when the system modifies the volume of an audio capture or render stream. Get an instance of **AudioStateMonitor** for monitoring audio capture streams by calling [**CreateForCaptureMonitoring**](/uwp/api/windows.media.audio.audiostatemonitor.createforcapturemonitoring#Windows_Media_Audio_AudioStateMonitor_CreateForCaptureMonitoring). Get an instance for monitoring audio render streams by calling [**CreateForRenderMonitoring**](/uwp/api/windows.media.audio.audiostatemonitor.createforrendermonitoring). Register a handler for the [**SoundLevelChanged**](/uwp/api/windows.media.audio.audiostatemonitor.soundlevelchanged) event of each monitor to be notified when the audio for the corresponding stream category is changed by the system. + +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.xaml.cs" id="SnippetAudioStateVars"::: + +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.xaml.cs" id="SnippetRegisterAudioStateMonitor"::: + +In the **SoundLevelChanged** handler for the capture stream, you can check the [**SoundLevel**](/uwp/api/windows.media.audio.audiostatemonitor.soundlevel) property of the **AudioStateMonitor** sender to determine the new sound level. Note that a capture stream should never be lowered, or "ducked", by the system. It should only ever be muted or switched back to full volume. If the audio stream is muted, you can stop a capture in progress. If the audio stream is restored to full volume, you can start capturing again. + +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.xaml.cs" id="SnippetCaptureSoundLevelChanged"::: + +The following code example illustrates an implementation of the **SoundLevelChanged** handler for audio rendering. Depending on your app scenario, and the type of content you are playing, you may want to pause audio playback when the sound level is ducked. + +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.xaml.cs" id="SnippetRenderSoundLevelChanged"::: + +## Related topics + +[Basic photo, video, and audio capture with MediaCapture](basic-photo-capture.md) + diff --git a/hub/apps/develop/camera/effects-for-video-capture.md b/hub/apps/develop/camera/effects-for-video-capture.md new file mode 100644 index 0000000000..b10806d4d1 --- /dev/null +++ b/hub/apps/develop/camera/effects-for-video-capture.md @@ -0,0 +1,98 @@ +--- +description: Learn how to apply effects to the camera preview and recording video streams and shows you how to use the video stabilization effect. +title: Effects for video capture +ms.date: 09/10/2024 +ms.topic: article +keywords: windows 10, windows 11, winui3, camera +ms.localizationpriority: medium +--- + +# Effects for video capture + +This topic shows you how to apply effects to the camera preview and recording video streams and shows you how to use the video stabilization effect. + +> [!NOTE] +> This article builds on concepts and code discussed in [Basic photo, video, and audio capture with MediaCapture](basic-photo-capture.md), which describes the steps for implementing basic photo and video capture. We recommend that you familiarize yourself with the basic media capture pattern in that article before moving on to more advanced capture scenarios. The code in this article assumes that your app already has an instance of **MediaCapture** that has been properly initialized. + +## Adding and removing effects from the camera video stream + +To capture or preview video from the device's camera, use the [**MediaCapture**](/uwp/api/Windows.Media.Capture.MediaCapture) class as described in [Basic photo, video, and audio capture with MediaCapture](basic-photo-capture.md). After you have initialized the **MediaCapture** object, you can add one or more video effects to the preview or capture stream by calling [**AddVideoEffectAsync**](/uwp/api/windows.media.capture.mediacapture.addvideoeffectasync), passing in an [**IVideoEffectDefinition**](/uwp/api/Windows.Media.Effects.IVideoEffectDefinition) object representing the effect to be added, and a member of the [**MediaStreamType**](/uwp/api/Windows.Media.Capture.MediaStreamType) enumeration indicating whether the effect should be added to the camera's preview stream or the record stream. + +> [!NOTE] +> On some devices, the preview stream and the capture stream are the same, which means that if you specify **MediaStreamType.VideoPreview** or **MediaStreamType.VideoRecord** when you call **AddVideoEffectAsync**, the effect will be applied to both preview and record streams. You can determine whether the preview and record streams are the same on the current device by checking the [**VideoDeviceCharacteristic**](/uwp/api/windows.media.capture.mediacapturesettings.videodevicecharacteristic) property of the [**MediaCaptureSettings**](/uwp/api/windows.media.capture.mediacapture.mediacapturesettings) for the **MediaCapture** object. If the value of this property is **VideoDeviceCharacteristic.AllStreamsIdentical** or **VideoDeviceCharacteristic.PreviewRecordStreamsIdentical**, then the streams are the same and any effect you apply to one will affect the other. + +The following example adds an effect to both the camera preview and record streams. This example illustrates checking to see if the record and preview streams are the same. + +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.VideoEffects.xaml.cs" id="SnippetBasicAddEffect"::: + +Note that **AddVideoEffectAsync** returns an object that implements [**IMediaExtension**](/uwp/api/Windows.Media.IMediaExtension) that represents the added video effect. Some effects allow you to change the effect settings by passing a [**PropertySet**](/uwp/api/Windows.Foundation.Collections.PropertySet) into the [**SetProperties**](/uwp/api/windows.media.imediaextension.setproperties) method. + +Starting with Windows 10, version 1607, you can also use the object returned by **AddVideoEffectAsync** to remove the effect from the video pipeline by passing it into [**RemoveEffectAsync**](/uwp/api/windows.media.capture.mediacapture.removeeffectasync). **RemoveEffectAsync** automatically determines whether the effect object parameter was added to the preview or record stream, so you don't need to specify the stream type when making the call. + +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.VideoEffects.xaml.cs" id="SnippetRemoveOneEffect"::: + +You can also remove all effects from the preview or capture stream by calling [**ClearEffectsAsync**](/uwp/api/windows.media.capture.mediacapture.cleareffectsasync) and specifying the stream for which all effects should be removed. + +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.VideoEffects.xaml.cs" id="SnippetClearAllEffects"::: + +## Video stabilization effect + +The video stabilization effect manipulates the frames of a video stream to minimize shaking caused by holding the capture device in your hand. Because this technique causes the pixels to be shifted right, left, up, and down, and because the effect can't know what the content just outside the video frame is, the stabilized video is cropped slightly from the original video. A utility function is provided to allow you to adjust your video encoding settings to optimally manage the cropping performed by the effect. + +On devices that support it, Optical Image Stabilization (OIS) stabilizes video by mechanically manipulating the capture device and, therefore, does not need to crop the edges of the video frames. For more information, see [Capture device controls for video capture](capture-device-controls-for-video-capture.md). + +### Set up your app to use video stabilization + +Declare a member variable to store the [**VideoStabilizationEffect**](/uwp/api/Windows.Media.Core.VideoStabilizationEffect) object. As part of the effect implementation, you will modify the encoding properties that you use to encode the captured video. Declare two variables to store a backup copy of the initial input and output encoding properties so that you can restore them later when the effect is disabled. Finally, declare a member variable of type [**MediaEncodingProfile**](/uwp/api/Windows.Media.MediaProperties.MediaEncodingProfile) because this object will be accessed from multiple locations within your code. + +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.VideoEffects.xaml.cs" id="SnippetDeclareVideoStabilizationEffect"::: + +For this scenario, you should assign the media encoding profile object to a member variable so that you can access it later. + +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.VideoEffects.xaml.cs" id="SnippetEncodingProfileMember"::: + +### Initialize the video stabilization effect + +After your **MediaCapture** object has been initialized, create a new instance of the [**VideoStabilizationEffectDefinition**](/uwp/api/Windows.Media.Core.VideoStabilizationEffectDefinition) object. Call [**MediaCapture.AddVideoEffectAsync**](/uwp/api/windows.media.capture.mediacapture.addvideoeffectasync) to add the effect to the video pipeline and retrieve an instance of the [**VideoStabilizationEffect**](/uwp/api/Windows.Media.Core.VideoStabilizationEffect) class. Specify [**MediaStreamType.VideoRecord**](/uwp/api/Windows.Media.Capture.MediaStreamType) to indicate that the effect should be applied to the video record stream. + +Register an event handler for the [**EnabledChanged**](/uwp/api/windows.media.core.videostabilizationeffect.enabledchanged) event and call the helper method **SetUpVideoStabilizationRecommendationAsync**, both of which are discussed later in this article. Finally, set the [**Enabled**](/uwp/api/windows.media.core.videostabilizationeffect.enabled) property of the effect to true to enable the effect. + +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.VideoEffects.xaml.cs" id="SnippetCreateVideoStabilizationEffect"::: + +### Use recommended encoding properties + +As discussed earlier in this article, the technique that the video stabilization effect uses necessarily causes the stabilized video to be cropped slightly from the source video. Define the following helper function in your code in order to adjust the video encoding properties to optimally handle this limitation of the effect. This step is not required in order to use the video stabilization effect, but if you don't perform this step, the resulting video will be upscaled slightly and therefore have slightly lower visual fidelity. + +Call [**GetRecommendedStreamConfiguration**](/uwp/api/windows.media.core.videostabilizationeffect.getrecommendedstreamconfiguration) on your video stabilization effect instance, passing in the [**VideoDeviceController**](/uwp/api/Windows.Media.Devices.VideoDeviceController) object, which informs the effect about your current input stream encoding properties, and your **MediaEncodingProfile** which lets the effect know your current output encoding properties. This method returns a [**VideoStreamConfiguration**](/uwp/api/Windows.Media.Capture.VideoStreamConfiguration) object containing new recommended input and output stream encoding properties. + +The recommended input encoding properties are, if it is supported by the device, a higher resolution that the initial settings you provided so that there is minimal loss in resolution after the effect's cropping is applied. + +Call [**VideoDeviceController.SetMediaStreamPropertiesAsync**](/uwp/api/windows.media.devices.videodevicecontroller.setmediastreampropertiesasync) to set the new encoding properties. Before setting the new properties, use the member variable to store the initial encoding properties so that you can change the settings back when you disable the effect. + +If the video stabilization effect must crop the output video, the recommended output encoding properties will be the size of the cropped video. This means that the output resolution will match the cropped video size. If you do not use the recommended output properties, the video will be scaled up to match the initial output size, which will result in a loss of visual fidelity. + +Set the [**Video**](/uwp/api/windows.media.mediaproperties.mediaencodingprofile.video) property of the **MediaEncodingProfile** object. Before setting the new properties, use the member variable to store the initial encoding properties so that you can change the settings back when you disable the effect. + +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.VideoEffects.xaml.cs" id="SnippetSetUpVideoStabilizationRecommendationAsync"::: + +### Handle the video stabilization effect being disabled + +The system may automatically disable the video stabilization effect if the pixel throughput is too high for the effect to handle or if it detects that the effect is running slowly. If this occurs, the EnabledChanged event is raised. The **VideoStabilizationEffect** instance in the *sender* parameter indicates the new state of the effect, enabled or disabled. The [**VideoStabilizationEffectEnabledChangedEventArgs**](/uwp/api/Windows.Media.Core.VideoStabilizationEffectEnabledChangedEventArgs) has a [**VideoStabilizationEffectEnabledChangedReason**](/uwp/api/Windows.Media.Core.VideoStabilizationEffectEnabledChangedReason) value indicating why the effect was enabled or disabled. Note that this event is also raised if you programmatically enable or disable the effect, in which case the reason will be **Programmatic**. + +Typically, you would use this event to adjust your app's UI to indicate the current status of video stabilization. + +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.VideoEffects.xaml.cs" id="SnippetVideoStabilizationEnabledChanged"::: + +### Clean up the video stabilization effect + +To clean up the video stabilization effect, call [**RemoveEffectAsync**](/uwp/api/windows.media.capture.mediacapture.removeeffectasync) to remove the effect from the video pipeline. If the member variables containing the initial encoding properties are not null, use them to restore the encoding properties. Finally, remove the **EnabledChanged** event handler and set the effect to null. + +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.VideoEffects.xaml.cs" id="SnippetCleanUpVisualStabilizationEffect"::: + +## Related topics + +* [Camera](camera.md) +* [Basic photo, video, and audio capture with MediaCapture](basic-photo-capture.md) +  + +  diff --git a/hub/apps/develop/camera/hdr-low-light-photo-capture.md b/hub/apps/develop/camera/hdr-low-light-photo-capture.md new file mode 100644 index 0000000000..f5183fad1e --- /dev/null +++ b/hub/apps/develop/camera/hdr-low-light-photo-capture.md @@ -0,0 +1,129 @@ +--- +ms.assetid: 0186EA01-8446-45BA-A109-C5EB4B80F368 +description: Learn how to use the AdvancedPhotoCapture class to capture high dynamic range (HDR) and low-light photos in a WinUI 3 app. +title: High dynamic range (HDR) and low-light photo capture +ms.date: 08/22/2024 +ms.topic: article +keywords: windows 10, windows 11, winui3, camera +ms.localizationpriority: medium +--- +# High dynamic range (HDR) and low-light photo capture + +This article shows you how to use the [**AdvancedPhotoCapture**](/uwp/api/Windows.Media.Capture.AdvancedPhotoCapture) class to capture high dynamic range (HDR) photos. This API also allows you to obtain a reference frame from the HDR capture before the processing of the final image is complete. + +Other articles related to HDR capture include: + +- You can use the [**SceneAnalysisEffect**](/uwp/api/Windows.Media.Core.SceneAnalysisEffect) to allow the system to evaluate the content of the media capture preview stream to determine if HDR processing would improve the capture result. For more information, see [Scene analysis for MediaCapture](scene-analysis-for-media-capture.md). + +- Use the [**HdrVideoControl**](/uwp/api/Windows.Media.Devices.HdrVideoControl) to capture video using the Windows built-in HDR processing algorithm. For more information, see [Capture device controls for video capture](capture-device-controls-for-video-capture.md). + +- You can use the [**VariablePhotoSequenceCapture**](/uwp/api/Windows.Media.Capture.Core.VariablePhotoSequenceCapture) to capture a sequence of photos, each with different capture settings, and implement your own HDR or other processing algorithm. For more information, see [Variable photo sequence](variable-photo-sequence.md). + +> [!NOTE] +> Starting with Windows 10, version 1709, recording video and using **AdvancedPhotoCapture** concurrently is supported. This is not supported in previous versions. This change means that you can have a prepared **[LowLagMediaRecording](/uwp/api/windows.media.capture.lowlagmediarecording)** and **[AdvancedPhotoCapture](/uwp/api/windows.media.capture.advancedphotocapture)** at the same time. You can start or stop video recording between calls to **[MediaCapture.PrepareAdvancedPhotoCaptureAsync](/uwp/api/windows.media.capture.mediacapture.prepareadvancedphotocaptureasync)** and **[AdvancedPhotoCapture.FinishAsync](/uwp/api/windows.media.capture.advancedphotocapture.FinishAsync)**. You can also call **[AdvancedPhotoCapture.CaptureAsync](/uwp/api/windows.media.capture.advancedphotocapture.CaptureAsync)** while video is recording. However, some **AdvancedPhotoCapture** scenarios, like capturing an HDR photo while recording video would cause some video frames to be altered by the HDR capture, resulting in a negative user experience. For this reason, the list of modes returned by the **[AdvancedPhotoControl.SupportedModes](/uwp/api/windows.media.devices.advancedphotocontrol.SupportedModes)** will be different while video is recording. You should check this value immediately after starting or stopping video recording to ensure that the desired mode is supported in the current video recording state. + +> [!NOTE] +> Starting with Windows 10, version 1709, when the **AdvancedPhotoCapture** is set to HDR mode, the setting of the [**FlashControl.Enabled**](/uwp/api/windows.media.devices.flashcontrol.enabled) property is ignored and the flash is never fired. For other capture modes, if the **FlashControl.Enabled**, it will override the **AdvancedPhotoCapture** settings and cause a normal photo to be captured with flash. If [**Auto**](/uwp/api/windows.media.devices.flashcontrol.auto) is set to true, the **AdvancedPhotoCapture** may or may not use flash, depending on the camera driver's default behavior for the conditions in the current scene. On previous releases, the **AdvancedPhotoCapture** flash setting always overrides the **FlashControl.Enabled** setting. + +There is a full sample demonstrating the use of the **AdvancedPhotoCapture** class that you can use to see the API used in context or as a starting point for your own app. For more information see, [Camera Advanced Capture sample](https://github.com/Microsoft/Windows-universal-samples/tree/master/Samples/CameraAdvancedCapture). + +## HDR photo capture + +### Determine if HDR photo capture is supported on the current device + +The HDR capture technique described in this article is performed using the [**AdvancedPhotoCapture**](/uwp/api/Windows.Media.Capture.AdvancedPhotoCapture) object. Not all devices support HDR capture with **AdvancedPhotoCapture**. Determine if the device on which your app is currently running supports the technique by getting the **MediaCapture** object's [**VideoDeviceController**](/uwp/api/Windows.Media.Devices.VideoDeviceController) and then getting the [**AdvancedPhotoControl**](/uwp/api/Windows.Media.Devices.AdvancedPhotoControl) property. Check the video device controller's [**SupportedModes**](/uwp/api/windows.media.devices.advancedphotocontrol.supportedmodes) collection to see if it includes [**AdvancedPhotoMode.Hdr**](/uwp/api/Windows.Media.Devices.AdvancedPhotoMode). If it does, HDR capture using **AdvancedPhotoCapture** is supported. + +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.xaml.cs" id="SnippetHdrSupported"::: + +### Configure and prepare the AdvancedPhotoCapture object + +Because you will need to access the [**AdvancedPhotoCapture**](/uwp/api/Windows.Media.Capture.AdvancedPhotoCapture) instance from multiple places within your code, you should declare a member variable to hold the object. + +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.xaml.cs" id="SnippetDeclareAdvancedCapture"::: + +In your app, after you have initialized the **MediaCapture** object, create an [**AdvancedPhotoCaptureSettings**](/uwp/api/Windows.Media.Devices.AdvancedPhotoCaptureSettings) object and set the mode to [**AdvancedPhotoMode.Hdr**](/uwp/api/Windows.Media.Devices.AdvancedPhotoMode). Call the [**AdvancedPhotoControl**](/uwp/api/Windows.Media.Devices.AdvancedPhotoControl) object's [**Configure**](/uwp/api/windows.media.devices.advancedphotocontrol.configure) method, passing in the **AdvancedPhotoCaptureSettings** object you created. + +Call the **MediaCapture** object's [**PrepareAdvancedPhotoCaptureAsync**](/uwp/api/windows.media.capture.mediacapture.prepareadvancedphotocaptureasync), passing in an [**ImageEncodingProperties**](/uwp/api/Windows.Media.MediaProperties.ImageEncodingProperties) object specifying the type of encoding the capture should use. The **ImageEncodingProperties** class provides static methods for creating the image encodings that are supported by **MediaCapture**. + +**PrepareAdvancedPhotoCaptureAsync** returns the [**AdvancedPhotoCapture**](/uwp/api/Windows.Media.Capture.AdvancedPhotoCapture) object you will use to initiate photo capture. You can use this object to register handlers for the [**OptionalReferencePhotoCaptured**](/uwp/api/windows.media.capture.advancedphotocapture.optionalreferencephotocaptured) and [**AllPhotosCaptured**](/uwp/api/windows.media.capture.advancedphotocapture.allphotoscaptured) which are discussed later in this article. + +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.xaml.cs" id="SnippetCreateAdvancedCaptureAsync"::: + +### Capture an HDR photo + +Capture an HDR photo by calling the [**AdvancedPhotoCapture**](/uwp/api/Windows.Media.Capture.AdvancedPhotoCapture) object's [**CaptureAsync**](/uwp/api/windows.media.capture.advancedphotocapture.captureasync) method. This method returns an [**AdvancedCapturedPhoto**](/uwp/api/Windows.Media.Capture.AdvancedCapturedPhoto) object that provides the captured photo in its [**Frame**](/uwp/api/windows.media.capture.advancedcapturedphoto.frame) property. Next, the photo is saved to disk. + +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.xaml.cs" id="SnippetCaptureHdrPhotoAsync"::: + + +### Get optional reference frame + +The HDR process captures multiple frames and then composites them into a single image after all of the frames have been captured. You can get access to a frame after it is captured but before the entire HDR process is complete by handling the [**OptionalReferencePhotoCaptured**](/uwp/api/windows.media.capture.advancedphotocapture.optionalreferencephotocaptured) event. You don't need to do this if you are only interested in the final HDR photo result. + +> [!IMPORTANT] +> [**OptionalReferencePhotoCaptured**](/uwp/api/windows.media.capture.advancedphotocapture.optionalreferencephotocaptured) is not raised on devices that support hardware HDR and therefore do not generate reference frames. Your app should handle the case where this event is not raised. + +Because the reference frame arrives out of context of the call to **CaptureAsync**, a mechanism is provided to pass context information to the **OptionalReferencePhotoCaptured** handler. First you should call an object that will contain your context information. The name and contents of this object is up to you. This example defines an object that has members to track the file name and camera orientation of the capture. + +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.xaml.cs" id="SnippetAdvancedCaptureContext"::: + + +Create a new instance of your context object, populate its members, and then pass it into the overload of [**CaptureAsync**](/uwp/api/windows.media.capture.advancedphotocapture.captureasync) that accepts an object as a parameter. + +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.xaml.cs" id="SnippetCaptureWithContext"::: + +In the [**OptionalReferencePhotoCaptured**](/uwp/api/windows.media.capture.advancedphotocapture.optionalreferencephotocaptured) event handler, cast the [**Context**](/uwp/api/windows.media.capture.optionalreferencephotocapturedeventargs.context) property of the [**OptionalReferencePhotoCapturedEventArgs**](/uwp/api/Windows.Media.Capture.OptionalReferencePhotoCapturedEventArgs) object to your context object class. This example modifies the file name to distinguish the reference frame image from the final HDR image and then saves the image to disk. + +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.xaml.cs" id="SnippetOptionalReferencePhotoCaptured"::: + +### Receive a notification when all frames have been captured + +The HDR photo capture has two steps. First, multiple frames are captured, and then the frames are processed into the final HDR image. You can't initiate another capture while the source HDR frames are still being captured, but you can initiate a capture after all of the frames have been captured but before the HDR post-processing is complete. The [**AllPhotosCaptured**](/uwp/api/windows.media.capture.advancedphotocapture.allphotoscaptured) event is raised when the HDR captures are complete, letting you know that you can initiate another capture. A typical scenario is to disable your UI's capture button when HDR capture begins and then reenable it when **AllPhotosCaptured** is raised. + +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.xaml.cs" id="SnippetAllPhotosCaptured"::: + +### Clean up the AdvancedPhotoCapture object + +When your app is done capturing, before disposing of the **MediaCapture** object, you should shut down the [**AdvancedPhotoCapture**](/uwp/api/Windows.Media.Capture.AdvancedPhotoCapture) object by calling [**FinishAsync**](/uwp/api/windows.media.capture.advancedphotocapture.finishasync) and setting your member variable to null. + +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.xaml.cs" id="SnippetCleanUpAdvancedPhotoCapture"::: + +## Low-light photo capture + +Starting with Windows 10, version 1607, **AdvancedPhotoCapture** can be used to capture photos using a built-in algorithm that enhances the quality of photos captured in low-light settings. When you use the low-light feature of the [**AdvancedPhotoCapture**](/uwp/api/Windows.Media.Capture.AdvancedPhotoCapture) class, the system will evaluate the current scene and, if needed, apply an algorithm to compensate for low-light conditions. If the system determines that the algorithm is not needed, a regular capture is performed instead. + +Before using low-light photo capture, determine if the device on which your app is currently running supports the technique by getting the **MediaCapture** object's [**VideoDeviceController**](/uwp/api/Windows.Media.Devices.VideoDeviceController) and then getting the [**AdvancedPhotoControl**](/uwp/api/Windows.Media.Devices.AdvancedPhotoControl) property. Check the video device controller's [**SupportedModes**](/uwp/api/windows.media.devices.advancedphotocontrol.supportedmodes) collection to see if it includes [**AdvancedPhotoMode.LowLight**](/uwp/api/Windows.Media.Devices.AdvancedPhotoMode). If it does, low-light capture using **AdvancedPhotoCapture** is supported. + +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.xaml.cs" id="SnippetLowLightSupported"::: + +In your app, after you have initialized the **MediaCapture** object, create an [**AdvancedPhotoCaptureSettings**](/uwp/api/Windows.Media.Devices.AdvancedPhotoCaptureSettings) object and set the mode to [**AdvancedPhotoMode.LowLight**](/uwp/api/Windows.Media.Devices.AdvancedPhotoMode). Call the [**AdvancedPhotoControl**](/uwp/api/Windows.Media.Devices.AdvancedPhotoControl) object's [**Configure**](/uwp/api/windows.media.devices.advancedphotocontrol.configure) method, passing in the **AdvancedPhotoCaptureSettings** object you created. + +Call the **MediaCapture** object's [**PrepareAdvancedPhotoCaptureAsync**](/uwp/api/windows.media.capture.mediacapture.prepareadvancedphotocaptureasync), passing in an [**ImageEncodingProperties**](/uwp/api/Windows.Media.MediaProperties.ImageEncodingProperties) object specifying the type of encoding the capture should use. + +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.xaml.cs" id="SnippetCreateAdvancedCaptureLowLightAsync"::: + +To capture a photo, call [**CaptureAsync**](/uwp/api/windows.media.capture.advancedphotocapture.captureasync). + +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.xaml.cs" id="SnippetCaptureLowLight"::: + +You can capture multiple low-light photos without reconfiguring the **AdvancedPhotoCapture** object, but when you are done capturing, you should call [**FinishAsync**](/uwp/api/windows.media.capture.advancedphotocapture.finishasync) to clean up the object and associated resources. + +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.xaml.cs" id="SnippetCleanUpAdvancedPhotoCapture"::: + +## Working with AdvancedCapturedPhoto objects + +[**AdvancedPhotoCapture.CaptureAsync**](/uwp/api/windows.media.capture.advancedphotocapture.captureasync) returns an [**AdvancedCapturedPhoto**](/uwp/api/Windows.Media.Capture.AdvancedCapturedPhoto) object representing the captured photo. This object exposes the [**Frame**](/uwp/api/windows.media.capture.advancedcapturedphoto.frame) property which returns a [**CapturedFrame**](/uwp/api/Windows.Media.Capture.CapturedFrame) object representing the image. The [**OptionalReferencePhotoCaptured**](/uwp/api/windows.media.capture.advancedphotocapture.optionalreferencephotocaptured) event also provides a **CapturedFrame** object in its event args. After you get an object of this type, there are a number of things you can do with it, including creating a [**SoftwareBitmap**](/uwp/api/Windows.Graphics.Imaging.SoftwareBitmap) or saving the image to a file. + +## Get a SoftwareBitmap from a CapturedFrame + +Get a **SoftwareBitmap** from a **CapturedFrame** object by simply accessing the [**SoftwareBitmap**](/uwp/api/windows.media.capture.capturedframe.softwarebitmap) property of the object. However, most encoding formats do not support **SoftwareBitmap** with **AdvancedPhotoCapture**, so you should check and make sure the property is not null before using it. + +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.xaml.cs" id="SnippetSoftwareBitmapFromCapturedFrame"::: + +In the current release, the only encoding format that supports **SoftwareBitmap** for **AdvancedPhotoCapture** is uncompressed NV12. So, if you want to use this feature, you must specify that encoding when you call [**PrepareAdvancedPhotoCaptureAsync**](/uwp/api/windows.media.capture.mediacapture.prepareadvancedphotocaptureasync). + +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.xaml.cs" id="SnippetUncompressedNv12"::: + +Of course, you can always save the image to a file and then load the file into a **SoftwareBitmap** in a separate step. For more information about working with **SoftwareBitmap**, see [**Create, edit, and save bitmap images**](/windows/uwp/audio-video-camera/imaging). + + diff --git a/hub/apps/develop/camera/launch-camera-settings.md b/hub/apps/develop/camera/launch-camera-settings.md new file mode 100644 index 0000000000..1004c98008 --- /dev/null +++ b/hub/apps/develop/camera/launch-camera-settings.md @@ -0,0 +1,29 @@ +--- +description: Learn how to launch Windows Settings directly to the camera settings page. +title: Launch the camera settings page +ms.date: 11/26/2024 +ms.topic: article +keywords: windows 10, winui 3 +dev_langs: +- csharp +ms.localizationpriority: medium +--- + + +# Launch the camera settings page + +Windows defines a set of URIs that allow apps to launch Windows Settings and display a particular settings page. This article explains how to launch Windows Settings directly to the camera settings page and, optionally, navigate directly to the settings for a particular camera on the device. For more information, see [Launch Windows Settings](/windows/apps/develop/launch/launch-settings). + +## The camera settings URL + +Starting with Windows 11, Build 22000, the URI `ms-settings:camera` launches Windows Settings and navigates to the camera settings page. Note that in previous versions of Windows, this same URI would launch the default camera application. In addition to the general camera settings page, you can append the query string parameter `cameraId` set to the symbolic link name, in escaped URI format, to launch directly to the settings page for the associated camera. + +In the following example, the [DeviceInformation](/uwp/api/Windows.Devices.Enumeration.DeviceInformation) class is used to retrieve the symbolic link name for the first video capture device on the current machine, if one exists. Next, [LaunchUriAsync](/uwp/api/windows.system.launcher.launchuriasync) is called to launch Windows Settings. The `ms-settings:camera` Uri specifies that the camera settings page should be shown. The optional query string parameter `cameraId` is set to the symbolic link name for the camera, escaped with a call to [Url.EscapeDataString](/dotnet/api/system.uri.escapedatastring), to specify that the settings for the associated camera should be shown. + + +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.xaml.cs" id="SnippetLaunchCameraSettings"::: + + +## Related topics + +* [Launch Windows Settings](/windows/apps/develop/launch/launch-settings) \ No newline at end of file diff --git a/uwp/audio-video-camera/process-audio-frames-with-mediaframereader.md b/hub/apps/develop/camera/process-audio-frames-with-mediaframereader.md similarity index 76% rename from uwp/audio-video-camera/process-audio-frames-with-mediaframereader.md rename to hub/apps/develop/camera/process-audio-frames-with-mediaframereader.md index 687c320713..2bb2e4dcec 100644 --- a/uwp/audio-video-camera/process-audio-frames-with-mediaframereader.md +++ b/hub/apps/develop/camera/process-audio-frames-with-mediaframereader.md @@ -14,30 +14,18 @@ This article shows you how to use a [**MediaFrameReader**](/uwp/api/Windows.Medi > [!NOTE] > The features discussed in this article are only available starting with Windows 10, version 1803. -> [!NOTE] -> There is an Universal Windows app sample that demonstrates using **MediaFrameReader** to display frames from different frame sources, including color, depth, and infrared camreas. For more information, see [Camera frames sample](https://github.com/Microsoft/Windows-universal-samples/tree/master/Samples/CameraFrames). - ## Setting up your project The process for acquiring audio frames is largely the same as acquiring other types of media frames. As with any app that uses **MediaCapture**, you must declare that your app uses the *webcam* capability before attempting to access any camera device. If your app will capture from an audio device, you should also declare the *microphone* device capability. -**Add capabilities to the app manifest** - -1. In Microsoft Visual Studio, in **Solution Explorer**, open the designer for the application manifest by double-clicking the **package.appxmanifest** item. -2. Select the **Capabilities** tab. -3. Check the box for **Webcam** and the box for **Microphone**. -4. For access to the Pictures and Videos library check the boxes for **Pictures Library** and the box for **Videos Library**. - - - ## Select frame sources and frame source groups The first step in capturing audio frames is to initialize a [**MediaFrameSource**](/uwp/api/Windows.Media.Capture.Frames.MediaFrameSource) representing the source of the audio data, such as a microphone or other audio capture device. To do this, you must create a new instance of the [**MediaCapture**](/uwp/api/Windows.Media.Capture.MediaCapture) object. For this example, the only initialization setting for the **MediaCapture** is setting the [**StreamingCaptureMode**](/uwp/api/windows.media.capture.mediacaptureinitializationsettings.streamingcapturemode) to indicate that we want to stream audio from the capture device. -After calling [**MediaCapture.InitializeAsync**](/uwp/api/windows.media.capture.mediacapture.initializeasync), you can get the list of accessible media frame sources with the [**FrameSources**](/uwp/api/windows.media.capture.mediacapture.framesources) property. This example uses a Linq query to select all frame sources where the [**MediaFrameSourceInfo**](/uwp/api/windows.media.capture.frames.mediaframesourceinfo) describing the frame source has a [**MediaStreamType**](/uwp/api/windows.media.capture.frames.mediaframesourceinfo.mediastreamtype) of **Audio**, indicating that the media source produces audio data. +After calling [**MediaCapture.InitializeAsync**](/uwp/api/windows.media.capture.mediacapture.initializeasync), you can get the list of accessible media frame sources with the [**FrameSources**](/uwp/api/windows.media.capture.mediacapture.framesources) property. This example selects all frame sources where the [**MediaFrameSourceInfo**](/uwp/api/windows.media.capture.frames.mediaframesourceinfo) describing the frame source has a [**MediaStreamType**](/uwp/api/windows.media.capture.frames.mediaframesourceinfo.mediastreamtype) of **Audio**, indicating that the media source produces audio data. If the query returns one or more frame sources, you can check the [**CurrentFormat**](/uwp/api/windows.media.capture.frames.mediaframesource.currentformat) property to see if the source supports the audio format you desire - in this example, float audio data. Check the [**AudioEncodingProperties**](/uwp/api/windows.media.capture.frames.mediaframeformat.audioencodingproperties) to make sure the audio encoding you desire is supported by the source. -:::code language="csharp" source="~/../snippets-windows/windows-uwp/audio-video-camera/Frames_Win10/cs/Frames_Win10/MainPage.xaml.cs" id="SnippetInitAudioFrameSource"::: +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.FrameReader.xaml.cs" id="SnippetInitAudioFrameSource"::: ## Create and Start the MediaFrameReader @@ -45,34 +33,34 @@ Get a new instance of **MediaFrameReader** by calling [**MediaCapture.CreateFram Register a handler for the [**MediaFrameReader.FrameArrived**](/uwp/api/windows.media.capture.frames.mediaframereader.framearrived) event, which is raised by the system when a new frame of audio data is available. Call [**StartAsync**](/uwp/api/windows.media.capture.frames.mediaframereader.startasync) to begin the acquisition of audio frames. If the frame reader fails to start, the status value returned from the call will have a value other than [**Success**](/uwp/api/windows.media.capture.frames.mediaframereaderstartstatus). -:::code language="csharp" source="~/../snippets-windows/windows-uwp/audio-video-camera/Frames_Win10/cs/Frames_Win10/MainPage.xaml.cs" id="SnippetCreateAudioFrameReader"::: +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.FrameReader.xaml.cs" id="SnippetCreateAudioFrameReader"::: In the **FrameArrived** event handler, call [**TryAcquireLatestFrame**](/uwp/api/windows.media.capture.frames.mediaframereader.tryacquirelatestframe) on the **MediaFrameReader** object passed as the sender to the handler to attempt to retrieve a reference to the latest media frame. Note that this object can be null, so you should always check before using the object. The typs of media frame wrapped in the **MediaFrameReference** returned from **TryAcquireLatestFrame** depends on what type of frame source or sources you configured the frame reader to acquire. Since the frame reader in this example was set up to acquire audio frames, it gets the underlying frame using the [**AudioMediaFrame**](/uwp/api/windows.media.capture.frames.mediaframereference.audiomediaframe) property. This **ProcessAudioFrame** helper method in the example below shows how to get an [**AudioFrame**](/uwp/api/windows.media.audioframe) which provides information such as the timestamp of the frame and whether it is discontinuous from the **AudioMediaFrame** object. To read or process the audio sample data, you will need to get the [**AudioBuffer**](/uwp/api/windows.media.audiobuffer) object from the **AudioMediaFrame** object, create an [**IMemoryBufferReference**](/uwp/api/windows.foundation.imemorybufferreference), and then call the COM method **IMemoryBufferByteAccess::GetBuffer** to retrieve the data. See the note below the code listing for more information on accessing native buffers. -The format of the data depends on the frame source. In this example, when selecting a media frame source, we explicitly made certain that the selected frame source used a single channel of float data. The rest of the example code shows how to determine the duration and sample count for the audio data in the frame. +The format of the data depends on the frame source. In this example, when selecting a media frame source, we explicitly made certain that the selected frame source used two channels of float data. The rest of the example code shows how to determine the duration and sample count for the audio data in the frame. -:::code language="csharp" source="~/../snippets-windows/windows-uwp/audio-video-camera/Frames_Win10/cs/Frames_Win10/MainPage.xaml.cs" id="SnippetProcessAudioFrame"::: +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.FrameReader.xaml.cs" id="SnippetProcessAudioFrame"::: > [!NOTE] > In order to do operate on the audio data, you must access a native memory buffer. To do this, you must use the **IMemoryBufferByteAccess** COM interface by including the code listing below. Operations on the native buffer must be performed in a method that uses the **unsafe** keyword. You also need to check the box to allow unsafe code in the **Build** tab of the **Project -> Properties** dialog. -:::code language="csharp" source="~/../snippets-windows/windows-uwp/audio-video-camera/Frames_Win10/cs/Frames_Win10/FrameRenderer.cs" id="SnippetIMemoryBufferByteAccess"::: +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.FrameReader.xaml.cs" id="SnippetIMemoryBufferByteAccess"::: ## Additional information on using MediaFrameReader with audio data You can retrieve the [**AudioDeviceController**](/uwp/api/Windows.Media.Devices.AudioDeviceController) associated with the audio frame source by accessing the [**MediaFrameSource.Controller**](/uwp/api/windows.media.capture.frames.mediaframesource.controller) property. This object can be used to get or set the stream properties of the capture device or to control the capture level. The following example mutes the audio device so that frames continue to be acquired by the frame reader, but all samples have value of 0. -:::code language="csharp" source="~/../snippets-windows/windows-uwp/audio-video-camera/Frames_Win10/cs/Frames_Win10/MainPage.xaml.cs" id="SnippetAudioDeviceControllerMute"::: +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.FrameReader.xaml.cs" id="SnippetAudioDeviceControllerMute"::: -You can use an [**AudioFrame**](/uwp/api/windows.media.audioframe) object to pass audio data captured by a media frame source into an [**AudioGraph**](/uwp/api/windows.media.audio.audiograph). Pass the frame into the [**AddFrame**](/uwp/api/windows.media.audio.audioframeinputnode.addframe) method of an [**AudioFrameInputNode**](/uwp/api/windows.media.audio.audioframeinputnode). For more information on using audio graphs to capture, process, and mix audio signals, see [Audio graphs](audio-graphs.md). +You can use an [**AudioFrame**](/uwp/api/windows.media.audioframe) object to pass audio data captured by a media frame source into an [**AudioGraph**](/uwp/api/windows.media.audio.audiograph). Pass the frame into the [**AddFrame**](/uwp/api/windows.media.audio.audioframeinputnode.addframe) method of an [**AudioFrameInputNode**](/uwp/api/windows.media.audio.audioframeinputnode). For more information on using audio graphs to capture, process, and mix audio signals, see [Audio graphs](/windows/uwp/audio-video-camera/audio-graphs). ## Related topics * [Process media frames with MediaFrameReader](process-media-frames-with-mediaframereader.md) * [Camera](camera.md) -* [Basic photo, video, and audio capture with MediaCapture](basic-photo-video-and-audio-capture-with-MediaCapture.md) +* [Basic photo, video, and audio capture with MediaCapture](basic-photo-capture.md) * [Camera frames sample](https://github.com/Microsoft/Windows-universal-samples/tree/master/Samples/CameraFrames) -* [Audio graphs](audio-graphs.md) +* [Audio graphs](/windows/uwp/audio-video-camera/audio-graphs)   diff --git a/uwp/audio-video-camera/process-media-frames-with-mediaframereader.md b/hub/apps/develop/camera/process-media-frames-with-mediaframereader.md similarity index 75% rename from uwp/audio-video-camera/process-media-frames-with-mediaframereader.md rename to hub/apps/develop/camera/process-media-frames-with-mediaframereader.md index 093dfaefbc..6c23c660f3 100644 --- a/uwp/audio-video-camera/process-media-frames-with-mediaframereader.md +++ b/hub/apps/develop/camera/process-media-frames-with-mediaframereader.md @@ -1,12 +1,12 @@ --- -ms.assetid: a128edc8-8a80-4645-ac29-908ede2d1c72 -description: This article shows you how to use a MediaFrameReader with MediaCapture to get media frames from one or more available sources, including color, depth, and infrared cameras, audio devices, or even custom frame sources such as those that produce skeletal tracking frames. +description: Learn how to use a MediaFrameReader with MediaCapture to get media frames from one or more available sources, including color, depth, and infrared cameras, audio devices, or even custom frame sources such as those that produce skeletal tracking frames. title: Process media frames with MediaFrameReader -ms.date: 02/08/2017 +ms.date: 01/08/2025 ms.topic: article -keywords: windows 10, uwp +keywords: windows 10, windows 11, winui3, camera ms.localizationpriority: medium --- + # Process media frames with MediaFrameReader This article shows you how to use a [**MediaFrameReader**](/uwp/api/Windows.Media.Capture.Frames.MediaFrameReader) with [**MediaCapture**](/uwp/api/Windows.Media.Capture.MediaCapture) to get media frames from one or more available sources, including color, depth, and infrared cameras, audio devices, or even custom frame sources such as those that produce skeletal tracking frames. This feature is designed to be used by apps that perform real-time processing of media frames, such as augmented reality and depth-aware camera apps. @@ -17,38 +17,25 @@ If you are interested in simply capturing video or photos, such as a typical pho > The features discussed in this article are only available starting with Windows 10, version 1607. > [!NOTE] -> There is an Universal Windows app sample that demonstrates using **MediaFrameReader** to display frames from different frame sources, including color, depth, and infrared camreas. For more information, see [Camera frames sample](https://github.com/Microsoft/Windows-universal-samples/tree/master/Samples/CameraFrames). +> There is a Universal Windows app sample that demonstrates using **MediaFrameReader** to display frames from different frame sources, including color, depth, and infrared cameras. For more information, see [Camera frames sample](https://github.com/Microsoft/Windows-universal-samples/tree/master/Samples/CameraFrames). > [!NOTE] > A new set of APIs for using **MediaFrameReader** with audio data were introduced in Windows 10, version 1803. For more information, see [Process audio frames with MediaFrameReader](process-audio-frames-with-mediaframereader.md). -## Setting up your project -As with any app that uses **MediaCapture**, you must declare that your app uses the *webcam* capability before attempting to access any camera device. If your app will capture from an audio device, you should also declare the *microphone* device capability. - -**Add capabilities to the app manifest** - -1. In Microsoft Visual Studio, in **Solution Explorer**, open the designer for the application manifest by double-clicking the **package.appxmanifest** item. -2. Select the **Capabilities** tab. -3. Check the box for **Webcam** and the box for **Microphone**. -4. For access to the Pictures and Videos library check the boxes for **Pictures Library** and the box for **Videos Library**. - -The example code in this article uses APIs from the following namespaces, in addition to those included by the default project template. - -:::code language="csharp" source="~/../snippets-windows/windows-uwp/audio-video-camera/Frames_Win10/cs/Frames_Win10/MainPage.xaml.cs" id="SnippetFramesUsing"::: - ## Select frame sources and frame source groups + Many apps that process media frames need to get frames from multiple sources at once, such as a device's color and depth cameras. The [**MediaFrameSourceGroup**](/uwp/api/Windows.Media.Capture.Frames.MediaFrameSourceGroup) object represents a set of media frame sources that can be used simultaneously. Call the static method [**MediaFrameSourceGroup.FindAllAsync**](/uwp/api/windows.media.capture.frames.mediaframesourcegroup.findallasync) to get a list of all of the groups of frame sources supported by the current device. -:::code language="csharp" source="~/../snippets-windows/windows-uwp/audio-video-camera/Frames_Win10/cs/Frames_Win10/MainPage.xaml.cs" id="SnippetFindAllAsync"::: +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.FrameReader.xaml.cs" id="SnippetFindAllAsync"::: -You can also create a [**DeviceWatcher**](/uwp/api/Windows.Devices.Enumeration.DeviceWatcher) using [**DeviceInformation.CreateWatcher**](/uwp/api/windows.devices.enumeration.deviceinformation.createwatcher) and the value returned from [**MediaFrameSourceGroup.GetDeviceSelector**](/uwp/api/windows.media.capture.frames.mediaframesourcegroup.getdeviceselector) to receive notifications when the available frame source groups on the device changes, such as when an external camera is plugged in. For more information see [**Enumerate devices**](../devices-sensors/enumerate-devices.md). +You can also create a [**DeviceWatcher**](/uwp/api/Windows.Devices.Enumeration.DeviceWatcher) using [**DeviceInformation.CreateWatcher**](/uwp/api/windows.devices.enumeration.deviceinformation.createwatcher) and the value returned from [**MediaFrameSourceGroup.GetDeviceSelector**](/uwp/api/windows.media.capture.frames.mediaframesourcegroup.getdeviceselector) to receive notifications when the available frame source groups on the device changes, such as when an external camera is plugged in. For more information see [**Enumerate devices**](/windows/uwp/devices-sensors/enumerate-devices). A [**MediaFrameSourceGroup**](/uwp/api/Windows.Media.Capture.Frames.MediaFrameSourceGroup) has a collection of [**MediaFrameSourceInfo**](/uwp/api/Windows.Media.Capture.Frames.MediaFrameSourceInfo) objects that describe the frame sources included in the group. After retrieving the frame source groups available on the device, you can select the group that exposes the frame sources you are interested in. The following example shows the simplest way to select a frame source group. This code simply loops over all of the available groups and then loops over each item in the [**SourceInfos**](/uwp/api/windows.media.capture.frames.mediaframesourcegroup.sourceinfos) collection. Each **MediaFrameSourceInfo** is checked to see if it supports the features we are seeking. In this case, the [**MediaStreamType**](/uwp/api/windows.media.capture.frames.mediaframesourceinfo.mediastreamtype) property is checked for the value [**VideoPreview**](/uwp/api/Windows.Media.Capture.MediaStreamType), meaning the device provides a video preview stream, and the [**SourceKind**](/uwp/api/windows.media.capture.frames.mediaframesourceinfo.sourcekind) property is checked for the value [**Color**](/uwp/api/Windows.Media.Capture.Frames.MediaFrameSourceKind), indicating that the source provides color frames. -:::code language="csharp" source="~/../snippets-windows/windows-uwp/audio-video-camera/Frames_Win10/cs/Frames_Win10/MainPage.xaml.cs" id="SnippetSimpleSelect"::: +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.FrameReader.xaml.cs" id="SnippetSimpleSelect"::: This method of identifying the desired frame source group and frame sources works for simple cases, but if you want to select frame sources based on more complex criteria, it can quickly become cumbersome. Another method is to use Linq syntax and anonymous objects to make the selection. The following example uses the **Select** extension method to transform the **MediaFrameSourceGroup** objects in the *frameSourceGroups* list into an anonymous object with two fields: *sourceGroup*, representing the group itself, and *colorSourceInfo*, which represents the color frame source in the group. The *colorSourceInfo* field is set to the result of **FirstOrDefault**, which selects the first object for which the provided predicate resolves to true. In this case, the predicate is true if the stream type is **VideoPreview**, the source kind is **Color**, and if the camera is on the front panel of the device. @@ -56,24 +43,19 @@ From the list of anonymous objects returned from the query described above, the Now you can use the fields of the selected object to get references to the selected **MediaFrameSourceGroup** and the **MediaFrameSourceInfo** object representing the color camera. These will be used later to initialize the **MediaCapture** object and create a **MediaFrameReader** for the selected source. Finally, you should test to see if the source group is null, meaning the current device doesn't have your requested capture sources. -:::code language="csharp" source="~/../snippets-windows/windows-uwp/audio-video-camera/Frames_Win10/cs/Frames_Win10/MainPage.xaml.cs" id="SnippetSelectColor"::: +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.FrameReader.xaml.cs" id="SnippetSelectColor"::: The following example uses a similar technique as described above to select a source group that contains color, depth, and infrared cameras. -:::code language="csharp" source="~/../snippets-windows/windows-uwp/audio-video-camera/Frames_Win10/cs/Frames_Win10/MainPage.xaml.cs" id="SnippetColorInfraredDepth"::: +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.FrameReader.xaml.cs" id="SnippetColorInfraredDepth"::: > [!NOTE] > Starting with Windows 10, version 1803, you can use the [**MediaCaptureVideoProfile**](/uwp/api/Windows.Media.Capture.MediaCaptureVideoProfile) class to select a media frame source with a set of desired capabilities. For more information, see the section **Use video profiles to select a frame source** later in this article. ## Initialize the MediaCapture object to use the selected frame source group -The next step is to initialize the **MediaCapture** object to use the frame source group you selected in the previous step. - -The **MediaCapture** object is typically used from multiple locations within your app, so you should declare a class member variable to hold it. - -:::code language="csharp" source="~/../snippets-windows/windows-uwp/audio-video-camera/Frames_Win10/cs/Frames_Win10/MainPage.xaml.cs" id="SnippetDeclareMediaCapture"::: -Create an instance of the **MediaCapture** object by calling the constructor. Next, create a [**MediaCaptureInitializationSettings**](/uwp/api/windows.media.capture.mediacaptureinitializationsettings) object that will be used to initialize the **MediaCapture** object. In this example, the following settings are used: +The next step is to initialize the **MediaCapture** object to use the frame source group you selected in the previous step. Create an instance of the **MediaCapture** object by calling the constructor. Next, create a [**MediaCaptureInitializationSettings**](/uwp/api/windows.media.capture.mediacaptureinitializationsettings) object that will be used to initialize the **MediaCapture** object. In this example, the following settings are used: * [**SourceGroup**](/uwp/api/windows.media.capture.mediacaptureinitializationsettings.sourcegroup) - This tells the system which source group you will be using to get frames. Remember that the source group defines a set of media frame sources that can be used simultaneously. * [**SharingMode**](/uwp/api/windows.media.capture.mediacaptureinitializationsettings.sharingmode) - This tells the system whether you need exclusive control over the capture source devices. If you set this to [**ExclusiveControl**](/uwp/api/Windows.Media.Capture.MediaCaptureSharingMode), it means that you can change the settings of the capture device, such as the format of the frames it produces, but this means that if another app already has exclusive control, your app will fail when it tries to initialize the media capture device. If you set this to [**SharedReadOnly**](/uwp/api/Windows.Media.Capture.MediaCaptureSharingMode), you can receive frames from the frame sources even if they are in use by another app, but you can't change the settings for the devices. @@ -82,19 +64,21 @@ Create an instance of the **MediaCapture** object by calling the constructor. Ne Call [**InitializeAsync**](/uwp/api/windows.media.capture.mediacapture.initializeasync) to initialize the **MediaCapture** with your desired settings. Be sure to call this within a *try* block in case initialization fails. -:::code language="csharp" source="~/../snippets-windows/windows-uwp/audio-video-camera/Frames_Win10/cs/Frames_Win10/MainPage.xaml.cs" id="SnippetInitMediaCapture"::: +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.FrameReader.xaml.cs" id="SnippetInitMediaCaptureFrameReader"::: ## Set the preferred format for the frame source + To set the preferred format for a frame source, you need to get a [**MediaFrameSource**](/uwp/api/Windows.Media.Capture.Frames.MediaFrameSource) object representing the source. You get this object by accessing the [**Frames**](/previous-versions/windows/apps/phone/jj207578(v=win.10)) dictionary of the initialized **MediaCapture** object, specifying the identifier of the frame source you want to use. This is why we saved the [**MediaFrameSourceInfo**](/uwp/api/Windows.Media.Capture.Frames.MediaFrameSourceInfo) object when we were selecting a frame source group. -The [**MediaFrameSource.SupportedFormats**](/uwp/api/windows.media.capture.frames.mediaframesource.supportedformats) property contains a list of [**MediaFrameFormat**](/uwp/api/Windows.Media.Capture.Frames.MediaFrameFormat) objects describing the supported formats for the frame source. Use the **Where** Linq extension method to select a format based on desired properties. In this example, a format is selected that has a width of 1080 pixels and can supply frames in 32-bit RGB format. The **FirstOrDefault** extension method selects the first entry in the list. If the selected format is null, then the requested format is not supported by the frame source. If the format is supported, you can request that the source use this format by calling [**SetFormatAsync**](../develop/index.md). +The [**MediaFrameSource.SupportedFormats**](/uwp/api/windows.media.capture.frames.mediaframesource.supportedformats) property contains a list of [**MediaFrameFormat**](/uwp/api/Windows.Media.Capture.Frames.MediaFrameFormat) objects describing the supported formats for the frame source. In this example, a format is selected that has a width of 1080 pixels and can supply frames in 32-bit RGB format. The **FirstOrDefault** extension method selects the first entry in the list. If the selected format is null, then the requested format is not supported by the frame source. If the format is supported, you can request that the source use this format by calling [**SetFormatAsync**](/uwp/api/windows.media.capture.frames.mediaframesource.setformatasync). -:::code language="csharp" source="~/../snippets-windows/windows-uwp/audio-video-camera/Frames_Win10/cs/Frames_Win10/MainPage.xaml.cs" id="SnippetGetPreferredFormat"::: +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.FrameReader.xaml.cs" id="SnippetGetPreferredFormat"::: ## Create a frame reader for the frame source + To receive frames for a media frame source, use a [**MediaFrameReader**](/uwp/api/Windows.Media.Capture.Frames.MediaFrameReader). -:::code language="csharp" source="~/../snippets-windows/windows-uwp/audio-video-camera/Frames_Win10/cs/Frames_Win10/MainPage.xaml.cs" id="SnippetDeclareMediaFrameReader"::: +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.FrameReader.xaml.cs" id="SnippetDeclareMediaFrameReader"::: Instantiate the frame reader by calling [**CreateFrameReaderAsync**](/uwp/api/windows.media.capture.mediacapture.createframereaderasync) on your initialized **MediaCapture** object. The first argument to this method is the frame source from which you want to receive frames. You can create a separate frame reader for each frame source you want to use. The second argument tells the system the output format in which you want frames to arrive. This can save you from having to do your own conversions to frames as they arrive. Note that if you specify a format that is not supported by the frame source, an exception will be thrown, so be sure that this value is in the [**SupportedFormats**](/uwp/api/windows.media.capture.frames.mediaframesource.supportedformats) collection. @@ -102,24 +86,25 @@ After creating the frame reader, register a handler for the [**FrameArrived**](/ Tell the system to start reading frames from the source by calling [**StartAsync**](/uwp/api/windows.media.capture.frames.mediaframereader.startasync). -:::code language="csharp" source="~/../snippets-windows/windows-uwp/audio-video-camera/Frames_Win10/cs/Frames_Win10/MainPage.xaml.cs" id="SnippetCreateFrameReader"::: +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.FrameReader.xaml.cs" id="SnippetCreateFrameReader"::: ## Handle the frame arrived event + The [**MediaFrameReader.FrameArrived**](/uwp/api/windows.media.capture.frames.mediaframereader.framearrived) event is raised whenever a new frame is available. You can choose to process every frame that arrives or only use frames when you need them. Because the frame reader raises the event on its own thread, you may need to implement some synchronization logic to make sure that you aren't attempting to access the same data from multiple threads. This section shows you how to synchronize drawing color frames to an image control in a XAML page. This scenario addresses the additional synchronization constraint that requires all updates to XAML controls be performed on the UI thread. The first step in displaying frames in XAML is to create an Image control. -:::code language="xml" source="~/../snippets-windows/windows-uwp/audio-video-camera/Frames_Win10/cs/Frames_Win10/MainPage.xaml" id="SnippetImageElementXAML"::: +:::code language="xml" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.xaml" id="SnippetImageElementXAML"::: In your code behind page, declare a class member variable of type **SoftwareBitmap** which will be used as a back buffer that all incoming images will be copied to. Note that the image data itself isn't copied, just the object references. Also, declare a boolean to track whether our UI operation is currently running. -:::code language="csharp" source="~/../snippets-windows/windows-uwp/audio-video-camera/Frames_Win10/cs/Frames_Win10/MainPage.xaml.cs" id="SnippetDeclareBackBuffer"::: +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.FrameReader.xaml.cs" id="SnippetDeclareBackBuffer"::: Because the frames will arrive as **SoftwareBitmap** objects, you need to create a [**SoftwareBitmapSource**](/uwp/api/Windows.UI.Xaml.Media.Imaging.SoftwareBitmapSource) object which allows you to use a **SoftwareBitmap** as the source for a XAML **Control**. You should set the image source somewhere in your code before you start the frame reader. -:::code language="csharp" source="~/../snippets-windows/windows-uwp/audio-video-camera/Frames_Win10/cs/Frames_Win10/MainPage.xaml.cs" id="SnippetImageElementSource"::: +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.FrameReader.xaml.cs" id="SnippetImageElementSource"::: -Now it's time to implement the **FrameArrived** event handler. When the handler is called, the *sender* parameter contains a reference to the **MediaFrameReader** object which raised the event. Call [**TryAcquireLatestFrame**](/uwp/api/windows.media.capture.frames.mediaframereader.tryacquirelatestframe) on this object to attempt to get the latest frame. As the name implies, **TryAcquireLatestFrame** may not succeed in returning a frame. So, when you access the VideoMediaFrame and then SoftwareBitmap properties, be sure to test for null. In this example the null condtional operator ? is used to access the **SoftwareBitmap** and then the retrieved object is checked for null. +Now it's time to implement the **FrameArrived** event handler. When the handler is called, the *sender* parameter contains a reference to the **MediaFrameReader** object which raised the event. Call [**TryAcquireLatestFrame**](/uwp/api/windows.media.capture.frames.mediaframereader.tryacquirelatestframe) on this object to attempt to get the latest frame. As the name implies, **TryAcquireLatestFrame** may not succeed in returning a frame. So, when you access the VideoMediaFrame and then SoftwareBitmap properties, be sure to test for null. In this example the null conditional operator ? is used to access the **SoftwareBitmap** and then the retrieved object is checked for null. The **Image** control can only display images in BRGA8 format with either pre-multiplied or no alpha. If the arriving frame is not in that format, the static method [**Convert**](/uwp/api/windows.graphics.imaging.softwarebitmap.convert) is used to convert the software bitmap to the correct format. @@ -135,17 +120,19 @@ Finally, the *_taskRunning* variable is set back to false so that the task can b > If you access the [**SoftwareBitmap**](/uwp/api/windows.media.capture.frames.videomediaframe.softwarebitmap) or [**Direct3DSurface**](/uwp/api/windows.media.capture.frames.videomediaframe.direct3dsurface) objects provided by the [**VideoMediaFrame**](/uwp/api/windows.media.capture.frames.mediaframereference.videomediaframe) property of a [**MediaFrameReference**](/uwp/api/Windows.Media.Capture.Frames.MediaFrameReference), the system creates a strong reference to these objects, which means that they will not be disposed when you call [**Dispose**](/uwp/api/windows.media.capture.frames.mediaframereference.close) on the containing **MediaFrameReference**. You must explicitly call the **Dispose** method of the **SoftwareBitmap** or **Direct3DSurface** directly for the objects to be immediately disposed. Otherwise, the garbage collector will eventually free the memory for these objects, but you can't know when this will occur, and if the number of allocated bitmaps or surfaces exceeds the maximum amount allowed by the system, the flow of new frames will stop. You can copy retrieved frames, using the [**SoftwareBitmap.Copy**](/uwp/api/windows.graphics.imaging.softwarebitmap.copy) method for example, and then release the original frames to overcome this limitation. Also, if you create the **MediaFrameReader** using the overload [CreateFrameReaderAsync(Windows.Media.Capture.Frames.MediaFrameSource inputSource, System.String outputSubtype, Windows.Graphics.Imaging.BitmapSize outputSize)](/uwp/api/windows.media.capture.mediacapture.createframereaderasync#Windows_Media_Capture_MediaCapture_CreateFrameReaderAsync_Windows_Media_Capture_Frames_MediaFrameSource_System_String_Windows_Graphics_Imaging_BitmapSize_) or [CreateFrameReaderAsync(Windows.Media.Capture.Frames.MediaFrameSource inputSource, System.String outputSubtype)](/uwp/api/windows.media.capture.mediacapture.createframereaderasync#Windows_Media_Capture_MediaCapture_CreateFrameReaderAsync_Windows_Media_Capture_Frames_MediaFrameSource_System_String_), the frames returned are copies of the original frame data and so they do not cause frame acquisition to halt when they are retained. -:::code language="csharp" source="~/../snippets-windows/windows-uwp/audio-video-camera/Frames_Win10/cs/Frames_Win10/MainPage.xaml.cs" id="SnippetFrameArrived"::: +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.FrameReader.xaml.cs" id="SnippetFrameArrived"::: ## Cleanup resources + When you are done reading frames, be sure to stop the media frame reader by calling [**StopAsync**](/uwp/api/windows.media.capture.frames.mediaframereader.stopasync), unregistering the **FrameArrived** handler, and disposing of the **MediaCapture** object. -:::code language="csharp" source="~/../snippets-windows/windows-uwp/audio-video-camera/Frames_Win10/cs/Frames_Win10/MainPage.xaml.cs" id="SnippetCleanup"::: +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.FrameReader.xaml.cs" id="SnippetCleanupFrameReader"::: -For more information about cleaning up media capture objects when your application is suspended, see [**Display the camera preview**](simple-camera-preview-access.md). +For more information about cleaning up media capture objects when your application is suspended, see [**Show the camera preview in a WinUI 3 app**](camera-quickstart-winui3.md). ## The FrameRenderer helper class -The Universal Windows [Camera frames sample](https://github.com/Microsoft/Windows-universal-samples/tree/master/Samples/CameraFrames) provides a helper class that makes it easy to display the frames from color, infrared, and depth sources in your app. Typically, you will want to do something more with depth and infrared data than just display it to the screen, but this helper class is a helpful tool for demonstrating the frame reader feature and for debugging your own frame reader implementation. + +This section provides the full code listing for a provides a helper class that makes it easy to display the frames from color, infrared, and depth sources in your app. Typically, you will want to do something more with depth and infrared data than just display it to the screen, but this helper class is a helpful tool for demonstrating the frame reader feature and for debugging your own frame reader implementation. The code in this section is adapted from the [Camera frames sample](https://github.com/Microsoft/Windows-universal-samples/tree/master/Samples/CameraFrames). The **FrameRenderer** helper class implements the following methods. @@ -154,36 +141,37 @@ The **FrameRenderer** helper class implements the following methods. * **ConvertToDisplayableImage** - This methods checks the format of the media frame and, if necessary, converts it to a displayable format. For color images, this means making sure that the color format is BGRA8 and that the bitmap alpha mode is premultiplied. For depth or infrared frames, each scanline is processed to convert the depth or infrared values to a psuedocolor gradient, using the **PsuedoColorHelper** class that is also included in the sample and listed below. > [!NOTE] -> In order to do pixel manipulation on **SoftwareBitmap** images, you must access a native memory buffer. To do this, you must use the IMemoryBufferByteAccess COM interface included in the code listing below and you must update your project properties to allow compilation of unsafe code. For more information, see [Create, edit, and save bitmap images](imaging.md). +> In order to do pixel manipulation on **SoftwareBitmap** images, you must access a native memory buffer. To do this, you must use the IMemoryBufferByteAccess COM interface included in the code listing below and you must update your project properties to allow compilation of unsafe code. For more information, see [Create, edit, and save bitmap images](/windows/uwp/audio-video-camera/imaging). + +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/FrameRenderer.cs" id="SnippetIMemoryBufferByteAccess"::: -:::code language="csharp" source="~/../snippets-windows/windows-uwp/audio-video-camera/Frames_Win10/cs/Frames_Win10/FrameRenderer.cs" id="SnippetIMemoryBufferByteAccess"::: +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI//FrameRenderer.cs" id="SnippetFrameRenderer"::: -:::code language="csharp" source="~/../snippets-windows/windows-uwp/audio-video-camera/Frames_Win10/cs/Frames_Win10/FrameRenderer.cs" id="SnippetFrameRenderer"::: +## Use MultiSourceMediaFrameReader to get time-correlated frames from multiple sources -## Use MultiSourceMediaFrameReader to get time-corellated frames from multiple sources -Starting with Windows 10, version 1607, you can use [**MultiSourceMediaFrameReader**](/uwp/api/windows.media.capture.frames.multisourcemediaframereader) to receive time-corellated frames from multiple sources. This API makes it easier to do processing that requires frames from multiple sources that were taken in close temporal proximity, such as using the [**DepthCorrelatedCoordinateMapper**](/uwp/api/windows.media.devices.core.depthcorrelatedcoordinatemapper) class. One limitation of using this new method is that frame-arrived events are only raised at the rate of the slowest capture source. Extra frames from faster sources will be dropped. Also, because the system expects frames to arrive from different sources at different rates, it does not automatically recognize if a source has stopped generating frames altogether. The example code in this section shows how to use an event to create your own timeout logic that gets invoked if correlated frames don't arrive within an app-defined time limit. +Starting with Windows 10, version 1607, you can use [**MultiSourceMediaFrameReader**](/uwp/api/windows.media.capture.frames.multisourcemediaframereader) to receive time-correlated frames from multiple sources. This API makes it easier to do processing that requires frames from multiple sources that were taken in close temporal proximity, such as using the [**DepthCorrelatedCoordinateMapper**](/uwp/api/windows.media.devices.core.depthcorrelatedcoordinatemapper) class. One limitation of using this new method is that frame-arrived events are only raised at the rate of the slowest capture source. Extra frames from faster sources will be dropped. Also, because the system expects frames to arrive from different sources at different rates, it does not automatically recognize if a source has stopped generating frames altogether. The example code in this section shows how to use an event to create your own timeout logic that gets invoked if correlated frames don't arrive within an app-defined time limit. The steps for using [**MultiSourceMediaFrameReader**](/uwp/api/windows.media.capture.frames.multisourcemediaframereader) are similar to the steps for using [**MediaFrameReader**](/uwp/api/Windows.Media.Capture.Frames.MediaFrameReader) described previously in this article. This example will use a color source and a depth source. Declare some string variables to store the media frame source IDs that will be used to select frames from each source. Next, declare a [**ManualResetEventSlim**](/dotnet/api/system.threading.manualreseteventslim), a [**CancellationTokenSource**](/dotnet/api/system.threading.cancellationtokensource), and an [**EventHandler**](/dotnet/api/system.eventhandler) that will be used to implement timeout logic for the example. -:::code language="csharp" source="~/../snippets-windows/windows-uwp/audio-video-camera/Frames_Win10/cs/Frames_Win10/MainPage.xaml.cs" id="SnippetMultiFrameDeclarations"::: +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.FrameReader.xaml.cs" id="SnippetMultiFrameDeclarations"::: Using the techniques described previously in this article, query for a [**MediaFrameSourceGroup**](/uwp/api/Windows.Media.Capture.Frames.MediaFrameSourceGroup) that includes the color and depth sources required for this example scenario. After selecting the desired frame source group, get the [**MediaFrameSourceInfo**](/uwp/api/Windows.Media.Capture.Frames.MediaFrameSourceInfo) for each frame source. -:::code language="csharp" source="~/../snippets-windows/windows-uwp/audio-video-camera/Frames_Win10/cs/Frames_Win10/MainPage.xaml.cs" id="SnippetSelectColorAndDepth"::: +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.FrameReader.xaml.cs" id="SnippetSelectColorAndDepth"::: Create and initialize a **MediaCapture** object, passing the selected frame source group in the initialization settings. -:::code language="csharp" source="~/../snippets-windows/windows-uwp/audio-video-camera/Frames_Win10/cs/Frames_Win10/MainPage.xaml.cs" id="SnippetMultiFrameInitMediaCapture"::: +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.FrameReader.xaml.cs" id="SnippetMultiFrameInitMediaCapture"::: After initializing the **MediaCapture** object, retrieve [**MediaFrameSource**](/uwp/api/Windows.Media.Capture.Frames.MediaFrameSource) objects for the color and depth cameras. Store the ID for each source so that you can select the arriving frame for the corresponding source. -:::code language="csharp" source="~/../snippets-windows/windows-uwp/audio-video-camera/Frames_Win10/cs/Frames_Win10/MainPage.xaml.cs" id="SnippetGetColorAndDepthSource"::: +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.FrameReader.xaml.cs" id="SnippetGetColorAndDepthSource"::: Create and initialize the **MultiSourceMediaFrameReader** by calling [**CreateMultiSourceFrameReaderAsync**](/uwp/api/windows.media.capture.mediacapture.createmultisourceframereaderasync) and passing an array of frame sources that the reader will use. Register an event handler for the [**FrameArrived**](/uwp/api/windows.media.capture.frames.multisourcemediaframereader.FrameArrived) event. This example creates an instance the **FrameRenderer** helper class, described previously in this article, to render frames to an **Image** control. Start the frame reader by calling [**StartAsync**](/uwp/api/windows.media.capture.frames.multisourcemediaframereader.StartAsync). Register an event handler for the **CorellationFailed** event declared earlier in the example. We will signal this event if one of the media frame sources being used stops producing frames. Finally, call [**Task.Run**](/dotnet/api/system.threading.tasks.task.run#System_Threading_Tasks_Task_Run_System_Action_) to call the timeout helper method, **NotifyAboutCorrelationFailure**, on a separate thread. The implementation of this method is shown later in this article. -:::code language="csharp" source="~/../snippets-windows/windows-uwp/audio-video-camera/Frames_Win10/cs/Frames_Win10/MainPage.xaml.cs" id="SnippetInitMultiFrameReader"::: +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.FrameReader.xaml.cs" id="SnippetInitMultiFrameReader"::: The **FrameArrived** event is raised whenever a new frame is available from all of the media frame sources that are managed by the **MultiSourceMediaFrameReader**. This means that the event will be raised on the cadence of the slowest media source. If one source produces multiple frames in the time that a slower source produces one frame, the extra frames from the fast source will be dropped. @@ -193,60 +181,62 @@ Call the [**Set**](/dotnet/api/system.threading.manualreseteventslim.set#System_ Finally, perform any processing on the time-correlated media frames. This example simply displays the frame from the depth source. -:::code language="csharp" source="~/../snippets-windows/windows-uwp/audio-video-camera/Frames_Win10/cs/Frames_Win10/MainPage.xaml.cs" id="SnippetMultiFrameArrived"::: +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.FrameReader.xaml.cs" id="SnippetMultiFrameArrived"::: The **NotifyCorrelationFailure** helper method was run on a separate thread after the frame reader was started. In this method, check to see if the frame received event has been signaled. Remember, in the **FrameArrived** handler, we set this event whenever a set of correlated frames arrive. If the event hasn't been signaled for some app-defined period of time - 5 seconds is a reasonable value - and the task wasn't cancelled using the **CancellationToken**, then it's likely that one of the media frame sources has stopped reading frames. In this case you typically want to shut down the frame reader, so raise the app-defined **CorrelationFailed** event. In the handler for this event you can stop the frame reader and clean up it's associated resources as shown previously in this article. -:::code language="csharp" source="~/../snippets-windows/windows-uwp/audio-video-camera/Frames_Win10/cs/Frames_Win10/MainPage.xaml.cs" id="SnippetNotifyCorrelationFailure"::: +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.FrameReader.xaml.cs" id="SnippetNotifyCorrelationFailure"::: -:::code language="csharp" source="~/../snippets-windows/windows-uwp/audio-video-camera/Frames_Win10/cs/Frames_Win10/MainPage.xaml.cs" id="SnippetCorrelationFailure"::: +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.FrameReader.xaml.cs" id="SnippetCorrelationFailure"::: ## Use buffered frame acquisition mode to preserve the sequence of acquired frames + Starting with Windows 10, version 1709, you can set the **[AcquisitionMode](/uwp/api/windows.media.capture.frames.mediaframereader.AcquisitionMode)** property of a **MediaFrameReader** or **MultiSourceMediaFrameReader** to **Buffered** to preserve the sequence of frames passed into your app from the frame source. -:::code language="csharp" source="~/../snippets-windows/windows-uwp/audio-video-camera/Frames_Win10/cs/Frames_Win10/MainPage.xaml.cs" id="SnippetSetBufferedFrameAcquisitionMode"::: +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.FrameReader.xaml.cs" id="SnippetSetBufferedFrameAcquisitionMode"::: In the default acquisition mode, **Realtime**, if multiple frames are acquired from the source while your app is still handling the **FrameArrived** event for a previous frame, the system will send your app the most recently acquired frame and drop additional frames waiting in the buffer. This provides your app with the most recent available frame at all times. This is typically the most useful mode for realtime computer vision applications. In **Buffered** acquisition mode, the system will keep all frames in the buffer and provide them to your app through the **FrameArrived** event in the order received. Note that in this mode, when system's buffer for frames is filled, the system will stop acquiring new frames until your app completes the **FrameArrived** event for previous frames, freeing up more space in the buffer. ## Use MediaSource to display frames in a MediaPlayerElement -Starting with Windows, version 1709, you can display frames acquired from a **MediaFrameReader** directly in a **[MediaPlayerElement](/uwp/api/windows.ui.xaml.controls.mediaplayerelement)** control in your XAML page. This is achieved by using the **[MediaSource.CreateFromMediaFrameSource](/uwp/api/windows.media.core.mediasource.createfrommediaframesource)** to create **[MediaSource](/uwp/api/windows.media.core.mediasource)** object that can be used directly by a **[MediaPlayer](/uwp/api/windows.media.playback.mediaplayer)** associated with a **MediaPlayerElement**. For detailed information on working with **MediaPlayer** and **MediaPlayerElement**, see [Play audio and video with MediaPlayer](play-audio-and-video-with-mediaplayer.md). + +Starting with Windows, version 1709, you can display frames acquired from a **MediaFrameReader** directly in a **[MediaPlayerElement](/uwp/api/windows.ui.xaml.controls.mediaplayerelement)** control in your XAML page. This is achieved by using the **[MediaSource.CreateFromMediaFrameSource](/uwp/api/windows.media.core.mediasource.createfrommediaframesource)** to create **[MediaSource](/uwp/api/windows.media.core.mediasource)** object that can be used directly by a **[MediaPlayer](/uwp/api/windows.media.playback.mediaplayer)** associated with a **MediaPlayerElement**. For detailed information on working with **MediaPlayer** and **MediaPlayerElement**, see [Play audio and video with MediaPlayer](/windows/uwp/audio-video-camera/play-audio-and-video-with-mediaplayer). The following code examples show you a simple implementation that displays the frames from a front-facing and back-facing camera simultaneously in a XAML page. First, add two **MediaPlayerElement** controls to your XAML page. -:::code language="xml" source="~/../snippets-windows/windows-uwp/audio-video-camera/Frames_Win10/cs/Frames_Win10/MainPage.xaml" id="SnippetMediaPlayerElement1XAML"::: +:::code language="xml" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.xaml" id="SnippetMediaPlayerElement1XAML"::: -:::code language="xml" source="~/../snippets-windows/windows-uwp/audio-video-camera/Frames_Win10/cs/Frames_Win10/MainPage.xaml" id="SnippetMediaPlayerElement2XAML"::: +:::code language="xml" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.xaml" id="SnippetMediaPlayerElement2XAML"::: Next, using the techniques shown in previous sections in this article, select a **MediaFrameSourceGroup** that contains **MediaFrameSourceInfo** objects for color cameras on the front panel and back panel. Note that the **MediaPlayer** does not automatically convert frames from non-color formats, such as a depth or infrared data, into color data. Using other sensor types may produce unexpected results. -:::code language="csharp" source="~/../snippets-windows/windows-uwp/audio-video-camera/Frames_Win10/cs/Frames_Win10/MainPage.xaml.cs" id="SnippetMediaSourceSelectGroup"::: +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.FrameReader.xaml.cs" id="SnippetMediaSourceSelectGroup"::: Initialize the **MediaCapture** object to use the selected **MediaFrameSourceGroup**. -:::code language="csharp" source="~/../snippets-windows/windows-uwp/audio-video-camera/Frames_Win10/cs/Frames_Win10/MainPage.xaml.cs" id="SnippetMediaSourceInitMediaCapture"::: +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.FrameReader.xaml.cs" id="SnippetMediaSourceInitMediaCapture"::: Finally, call **[MediaSource.CreateFromMediaFrameSource](/uwp/api/windows.media.core.mediasource.createfrommediaframesource)** to create a **MediaSource** for each frame source by using the **[Id](/uwp/api/windows.media.capture.frames.mediaframesourceinfo.Id)** property of the associated **MediaFrameSourceInfo** object to select one of the frame sources in the **MediaCapture** object's **[FrameSources](/uwp/api/windows.media.capture.mediacapture.FrameSources)** collection. Initialize a new **MediaPlayer** object and assign it to a **MediaPlayerElement** by calling **[SetMediaPlayer](/uwp/api/windows.ui.xaml.controls.mediaplayerelement.MediaPlayer)**. Then set the **[Source](/uwp/api/windows.media.playback.mediaplayer.Source)** property to the newly created **MediaSource** object. -:::code language="csharp" source="~/../snippets-windows/windows-uwp/audio-video-camera/Frames_Win10/cs/Frames_Win10/MainPage.xaml.cs" id="SnippetMediaSourceMediaPlayer"::: +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.FrameReader.xaml.cs" id="SnippetMediaSourceMediaPlayer"::: ## Use video profiles to select a frame source -A camera profile, represented by a [**MediaCaptureVideoProfile**](/uwp/api/Windows.Media.Capture.MediaCaptureVideoProfile) object, represents a set of capabilities that a particular capture device provides, such as frame rates, resolutions, or advanced features like HDR capture. A capture device may support multiple profiles, allowing you to select the one that is optimized for your capture scenario. Starting with Windows 10, version 1803, you can use **MediaCaptureVideoProfile** to select a media frame source with particular capabilities before initializing the **MediaCapture** object. The following example method looks for a video profile that supports HDR with Wide Color Gamut (WCG) and returns a **MediaCaptureInitializationSettings** object that can be used to initialize the **MediaCapture** to use the selected device and profile. +A camera profile, represented by a [**MediaCaptureVideoProfile**](/uwp/api/Windows.Media.Capture.MediaCaptureVideoProfile) object, represents a set of capabilities that a particular capture device provides, such as frame rates, resolutions, or advanced features like HDR capture. A capture device may support multiple profiles, allowing you to select the one that is optimized for your capture scenario. Starting with Windows 10, version 1803, you can use **MediaCaptureVideoProfile** to select a media frame source with particular capabilities before initializing the **MediaCapture** object. The following example code looks for a video profile that supports HDR with Wide Color Gamut (WCG) and returns a **MediaCaptureInitializationSettings** object that can be used to initialize the **MediaCapture** to use the selected device and profile. First, call [**MediaFrameSourceGroup.FindAllAsync**](/uwp/api/windows.media.capture.frames.mediaframesourcegroup.findallasync) to get a list of all media frame source groups available on the current device. Loop through each source group and call [**MediaCapture.FindKnownVideoProfiles**](/uwp/api/windows.media.capture.mediacapture.findknownvideoprofiles) to get a list of all of the video profiles for the current source group that support the specified profile, in this case HDR with WCG photo. If a profile that meets the criteria is found, create a new **MediaCaptureInitializationSettings** object and set the **VideoProfile** to the select profile and the **VideoDeviceId** to the **Id** property of the current media frame source group. -:::code language="csharp" source="~/../snippets-windows/windows-uwp/audio-video-camera/Frames_Win10/cs/Frames_Win10/MainPage.xaml.cs" id="SnippetGetSettingsWithProfile"::: +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.FrameReader.xaml.cs" id="SnippetGetSettingsWithProfile"::: For more information on using camera profiles, see [Camera profiles](camera-profiles.md). ## Related topics * [Camera](camera.md) -* [Basic photo, video, and audio capture with MediaCapture](basic-photo-video-and-audio-capture-with-MediaCapture.md) +* [Basic photo, video, and audio capture with MediaCapture](basic-photo-capture.md) * [Camera frames sample](https://github.com/Microsoft/Windows-universal-samples/tree/master/Samples/CameraFrames)   diff --git a/hub/apps/develop/camera/scene-analysis-for-media-capture.md b/hub/apps/develop/camera/scene-analysis-for-media-capture.md new file mode 100644 index 0000000000..479c54551d --- /dev/null +++ b/hub/apps/develop/camera/scene-analysis-for-media-capture.md @@ -0,0 +1,102 @@ +--- +description: Learn how to use the SceneAnalysisEffect and the FaceDetectionEffect to analyze the content of the MediaCapture preview stream in a WinUI 3 app. +title: Effects for analyzing camera frames +ms.date: 02/08/2017 +ms.topic: article +keywords: windows 10, windows 11, winui3, camera +ms.localizationpriority: medium +--- +# Scene analysis for MediaCapture + +This article describes how to use the [**SceneAnalysisEffect**](/uwp/api/Windows.Media.Core.SceneAnalysisEffect) and the [**FaceDetectionEffect**](/uwp/api/Windows.Media.Core.FaceDetectionEffect) to analyze the content of the media capture preview stream. + +## Scene analysis effect + +The [**SceneAnalysisEffect**](/uwp/api/Windows.Media.Core.SceneAnalysisEffect) analyzes the video frames in the media capture preview stream and recommends processing options to improve the capture result. Currently, the effect supports detecting whether the capture would be improved by using High Dynamic Range (HDR) processing. + +If the effect recommends using HDR, you can do this in the following ways: + +- Use the [**AdvancedPhotoCapture**](/uwp/api/Windows.Media.Capture.AdvancedPhotoCapture) class to capture photos using the Windows built-in HDR processing algorithm. For more information, see [High dynamic range (HDR) and low-light photo capture](hdr-low-light-photo-capture.md). + +- Use the [**HdrVideoControl**](/uwp/api/Windows.Media.Devices.HdrVideoControl) to capture video using the Windows built-in HDR processing algorithm. For more information, see [Capture device controls for video capture](capture-device-controls-for-video-capture.md). + +- Use the [**VariablePhotoSequenceControl**](/uwp/api/Windows.Media.Devices.Core.VariablePhotoSequenceController) to capture a sequence of frames that you can then composite using a custom HDR implementation. For more information, see [Variable photo sequence](variable-photo-sequence.md). + + +### Initialize the scene analysis effect and add it to the preview stream + +Video effects are implemented using two APIs, an effect definition, which provides settings that the capture device needs to initialize the effect, and an effect instance, which can be used to control the effect. Since you may want to access the effect instance from multiple places within your code, you should typically declare a member variable to hold the object. + +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.VideoEffects.xaml.cs" id="SnippetDeclareSceneAnalysisEffect"::: + +In your app, after you have initialized the **MediaCapture** object, create a new instance of [**SceneAnalysisEffectDefinition**](/uwp/api/Windows.Media.Core.SceneAnalysisEffectDefinition). + +Register the effect with the capture device by calling [**AddVideoEffectAsync**](/uwp/api/windows.media.capture.mediacapture.addvideoeffectasync) on your **MediaCapture** object, providing the **SceneAnalysisEffectDefinition** and specifying [**MediaStreamType.VideoPreview**](/uwp/api/Windows.Media.Capture.MediaStreamType) to indicate that the effect should be applied to the video preview stream, as opposed to the capture stream. **AddVideoEffectAsync** returns an instance of the added effect. Because this method can be used with multiple effect types, you must cast the returned instance to a [**SceneAnalysisEffect**](/uwp/api/Windows.Media.Core.SceneAnalysisEffect) object. + +To receive the results of the scene analysis, you must register a handler for the [**SceneAnalyzed**](/uwp/api/windows.media.core.sceneanalysiseffect.sceneanalyzed) event. + +Currently, the scene analysis effect only includes the high dynamic range analyzer. Enable HDR analysis by setting the effect's [**HighDynamicRangeControl.Enabled**](/uwp/api/windows.media.core.highdynamicrangecontrol.enabled) to true. + +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.VideoEffects.xaml.cs"::: + +### Implement the SceneAnalyzed event handler + +The results of the scene analysis are returned in the **SceneAnalyzed** event handler. The [**SceneAnalyzedEventArgs**](/uwp/api/Windows.Media.Core.SceneAnalyzedEventArgs) object passed into the handler has a [**SceneAnalysisEffectFrame**](/uwp/api/Windows.Media.Core.SceneAnalysisEffectFrame) object which has a [**HighDynamicRangeOutput**](/uwp/api/Windows.Media.Core.HighDynamicRangeOutput) object. The [**Certainty**](/uwp/api/windows.media.core.highdynamicrangeoutput.certainty) property of the high dynamic range output provides a value between 0 and 1.0 where 0 indicates that HDR processing would not help improve the capture result and 1.0 indicates that HDR processing would help. You can decide the threshold point at which you want to use HDR or show the results to the user and let the user decide. + +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.VideoEffects.xaml.cs" id="SnippetSceneAnalyzed"::: + +The [**HighDynamicRangeOutput**](/uwp/api/Windows.Media.Core.HighDynamicRangeOutput) object passed into the handler also has a [**FrameControllers**](/uwp/api/windows.media.core.highdynamicrangeoutput.framecontrollers) property which contains suggested frame controllers for capturing a variable photo sequence for HDR processing. For more information, see [Variable photo sequence](variable-photo-sequence.md). + +### Clean up the scene analysis effect + +When your app is done capturing, before disposing of the **MediaCapture** object, you should disable the scene analysis effect by setting the effect's [**HighDynamicRangeAnalyzer.Enabled**](/uwp/api/windows.media.core.highdynamicrangecontrol.enabled) property to false and unregister your [**SceneAnalyzed**](/uwp/api/windows.media.core.sceneanalysiseffect.sceneanalyzed) event handler. Call [**MediaCapture.ClearEffectsAsync**](/uwp/api/windows.media.capture.mediacapture.cleareffectsasync), specifying the video preview stream since that was the stream to which the effect was added. Finally, set your member variable to null. + +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.VideoEffects.xaml.cs" id="SnippetCleanUpSceneAnalysisEffectAsync"::: + +## Face detection effect + +The [**FaceDetectionEffect**](/uwp/api/Windows.Media.Core.FaceDetectionEffect) identifies the location of faces within the media capture preview stream. The effect allows you to receive a notification whenever a face is detected in the preview stream and provides the bounding box for each detected face within the preview frame. On supported devices, the face detection effect also provides enhanced exposure and focus on the most important face in the scene. + +### Initialize the face detection effect and add it to the preview stream + +Video effects are implemented using two APIs, an effect definition, which provides settings that the capture device needs to initialize the effect, and an effect instance, which can be used to control the effect. Since you may want to access the effect instance from multiple places within your code, you should typically declare a member variable to hold the object. + +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.VideoEffects.xaml.cs" id="SnippetDeclareFaceDetectionEffect"::: + +In your app, after you have initialized the **MediaCapture** object, create a new instance of [**FaceDetectionEffectDefinition**](/uwp/api/Windows.Media.Core.FaceDetectionEffectDefinition). Set the [**DetectionMode**](/uwp/api/windows.media.core.facedetectioneffectdefinition.detectionmode) property to prioritize faster face detection or more accurate face detection. Set [**SynchronousDetectionEnabled**](/uwp/api/windows.media.core.facedetectioneffectdefinition.synchronousdetectionenabled) to specify that incoming frames are not delayed waiting for face detection to complete as this can result in a choppy preview experience. + +Register the effect with the capture device by calling [**AddVideoEffectAsync**](/uwp/api/windows.media.capture.mediacapture.addvideoeffectasync) on your **MediaCapture** object, providing the **FaceDetectionEffectDefinition** and specifying [**MediaStreamType.VideoPreview**](/uwp/api/Windows.Media.Capture.MediaStreamType) to indicate that the effect should be applied to the video preview stream, as opposed to the capture stream. **AddVideoEffectAsync** returns an instance of the added effect. Because this method can be used with multiple effect types, you must cast the returned instance to a [**FaceDetectionEffect**](/uwp/api/Windows.Media.Core.FaceDetectionEffect) object. + +Enable or disable the effect by setting the [**FaceDetectionEffect.Enabled**](/uwp/api/windows.media.core.facedetectioneffect.enabled) property. Adjust how often the effect analyzes frames by setting the [**FaceDetectionEffect.DesiredDetectionInterval**](/uwp/api/windows.media.core.facedetectioneffect.desireddetectioninterval) property. Both of these properties can be adjusted while media capture is ongoing. + +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.VideoEffects.xaml.cs" id="SnippetCreateFaceDetectionEffectAsync"::: + +### Receive notifications when faces are detected + +If you want to perform some action when faces are detected, such as drawing a box around detected faces in the video preview, you can register for the [**FaceDetected**](/uwp/api/windows.media.core.facedetectioneffect.facedetected) event. + +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.VideoEffects.xaml.cs" id="SnippetRegisterFaceDetectionHandler"::: + +In the handler for the event, you can get a list of all faces detected in a frame by accessing the [**FaceDetectionEffectFrame.DetectedFaces**](/uwp/api/windows.media.core.facedetectioneffectframe.detectedfaces) property of the [**FaceDetectedEventArgs**](/uwp/api/Windows.Media.Core.FaceDetectedEventArgs). The [**FaceBox**](/uwp/api/windows.media.faceanalysis.detectedface.facebox) property is a [**BitmapBounds**](/uwp/api/Windows.Graphics.Imaging.BitmapBounds) structure that describes the rectangle containing the detected face in units relative to the preview stream dimensions. To view sample code that transforms the preview stream coordinates into screen coordinates, see the [face detection UWP sample](https://github.com/Microsoft/Windows-universal-samples/tree/master/Samples/CameraFaceDetection). + +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.VideoEffects.xaml.cs" id="SnippetFaceDetected"::: + +### Clean up the face detection effect + +When your app is done capturing, before disposing of the **MediaCapture** object, you should disable the face detection effect with [**FaceDetectionEffect.Enabled**](/uwp/api/windows.media.core.facedetectioneffect.enabled) and unregister your [**FaceDetected**](/uwp/api/windows.media.core.facedetectioneffect.facedetected) event handler if you previously registered one. Call [**MediaCapture.ClearEffectsAsync**](/uwp/api/windows.media.capture.mediacapture.cleareffectsasync), specifying the video preview stream since that was the stream to which the effect was added. Finally, set your member variable to null. + +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.VideoEffects.xaml.cs" id="SnippetCleanUpFaceDetectionEffectAsync"::: + +### Check for focus and exposure support for detected faces + +Not all devices have a capture device that can adjust its focus and exposure based on detected faces. Because face detection consumes device resources, you may only want to enable face detection on devices that can use the feature to enhance capture. To see if face-based capture optimization is available, get the [**VideoDeviceController**](/uwp/api/Windows.Media.Devices.VideoDeviceController) for your initialized [**MediaCapture**](/uwp/api/Windows.Media.Capture.MediaCapture) and then get the video device controller's [**RegionsOfInterestControl**](/uwp/api/Windows.Media.Devices.RegionsOfInterestControl). Check to see if the [**MaxRegions**](/uwp/api/windows.media.devices.regionsofinterestcontrol.maxregions) supports at least one region. Then check to see if either [**AutoExposureSupported**](/uwp/api/windows.media.devices.regionsofinterestcontrol.autoexposuresupported) or [**AutoFocusSupported**](/uwp/api/windows.media.devices.regionsofinterestcontrol.autofocussupported) are true. If these conditions are met, then the device can take advantage of face detection to enhance capture. + +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.VideoEffects.xaml.cs" id="SnippetAreFaceFocusAndExposureSupported"::: + +## Related topics + +* [Camera](camera.md) +* [Basic photo, video, and audio capture with MediaCapture](basic-photo-capture.md) +  + +  diff --git a/hub/apps/develop/camera/set-media-encoding-properties.md b/hub/apps/develop/camera/set-media-encoding-properties.md new file mode 100644 index 0000000000..cd782ed386 --- /dev/null +++ b/hub/apps/develop/camera/set-media-encoding-properties.md @@ -0,0 +1,66 @@ +--- +description: Learn how to use the IMediaEncodingProperties interface to set the resolution and frame rate of the camera preview stream and captured photos and video in a WinUI 3 app. +title: Set format, resolution, and frame rate for MediaCapture +ms.date: 02/08/2017 +ms.topic: article +keywords: windows 10, windows 11, winui3, camera +ms.localizationpriority: medium +--- +# Set format, resolution, and frame rate for MediaCapture in a WinUI 3 app + +This article shows you how to use the [**IMediaEncodingProperties**](/uwp/api/Windows.Media.MediaProperties.IMediaEncodingProperties) interface to set the resolution and frame rate of the camera preview stream and captured photos and video. It also shows how to ensure that the aspect ratio of the preview stream matches that of the captured media. + +Camera profiles offer a simpler, higher level mechanism for discovering and setting the stream properties of the camera, but they are not supported for all devices. For more information, see [Camera profiles](camera-profiles.md). + +## Determine if the preview and capture streams are independent + +On some devices, the same hardware pin is used for both preview and capture streams. On these devices, setting the encoding properties such as the format, resolution and frame rate on one will affect both. On devices that use different hardware pins for capture and preview, the properties can be set for each stream independently. Use the following code to determine if the preview and capture streams are independent. This example sets a boolean global variable that can be used to switch the app's behavior if the streams are shared or independent. + +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.xaml.cs" id="SnippetCheckIfStreamsAreIdentical"::: + +## A media encoding properties helper class + +Creating a simple helper class to wrap the functionality of the [**IMediaEncodingProperties**](/uwp/api/Windows.Media.MediaProperties.IMediaEncodingProperties) interface makes it easier to select a set of encoding properties that meet particular criteria. This helper class is particularly useful due to the following behavior of the encoding properties feature: + +> [!NOTE] +> The [**VideoDeviceController.GetAvailableMediaStreamProperties**](/uwp/api/windows.media.devices.videodevicecontroller.getavailablemediastreamproperties) method takes a member of the [**MediaStreamType**](/uwp/api/Windows.Media.Capture.MediaStreamType) enumeration, such as **VideoRecord** or **Photo**, and returns a list of either [**ImageEncodingProperties**](/uwp/api/Windows.Media.MediaProperties.ImageEncodingProperties) or [**VideoEncodingProperties**](/uwp/api/Windows.Media.MediaProperties.VideoEncodingProperties) objects that convey the stream encoding settings, such as the resolution of the captured photo or video. The results of calling **GetAvailableMediaStreamProperties** may include **ImageEncodingProperties** or **VideoEncodingProperties** regardless of what **MediaStreamType** value is specified. For this reason, you should always check the type of each returned value and cast it to the appropriate type before attempting to access any of the property values. + +The helper class defined below handles the type checking and casting for [**ImageEncodingProperties**](/uwp/api/Windows.Media.MediaProperties.ImageEncodingProperties) or [**VideoEncodingProperties**](/uwp/api/Windows.Media.MediaProperties.VideoEncodingProperties) so that your app code doesn't need to distinguish between the two types. In addition to this, the helper class exposes properties for the aspect ratio of the properties, the frame rate (for video encoding properties only), and a friendly name that makes it easier to display the encoding properties in your UI. + +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/StreamPropertiesHelper.cs" id="SnippetStreamPropertiesHelper"::: + +## Get a list of available stream properties + +Get a list of the available stream properties for a capture device by getting the [**VideoDeviceController**](/uwp/api/Windows.Media.Devices.VideoDeviceController) for your app's [**MediaCapture**](/uwp/api/Windows.Media.Capture.MediaCapture) object and then calling [**GetAvailableMediaStreamProperties**](/uwp/api/windows.media.devices.videodevicecontroller.getavailablemediastreamproperties) and passing in one of the [**MediaStreamType**](/uwp/api/Windows.Media.Capture.MediaStreamType) values, **VideoPreview**, **VideoRecord**, or **Photo**. In this example, a list of **StreamPropertiesHelper** objects, defined previously in this article, is created for each of the [**IMediaEncodingProperties**](/uwp/api/Windows.Media.MediaProperties.IMediaEncodingProperties) values returned from **GetAvailableMediaStreamProperties**. This example orders the returned properties based first on resolution and then on frame rate. + +If your app has specific resolution or frame rate requirements, you can select a set of media encoding properties programmatically. A typical camera app will instead expose the list of available properties in the UI and allow the user to select their desired settings. A **ComboBoxItem** is created for each item in the list of **StreamPropertiesHelper** objects in the list. The content is set to the friendly name returned by the helper class and the tag is set to the helper class itself so it can be used later to retrieve the associated encoding properties. Each **ComboBoxItem** is then added to a **ComboBox** defined in the UI. + +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.xaml.cs" id="SnippetGetStreamProperties"::: + +## Set the desired stream properties + +Tell the video device controller to use your desired encoding properties by calling [**SetMediaStreamPropertiesAsync**](/uwp/api/windows.media.devices.videodevicecontroller.setmediastreampropertiesasync), passing in the **MediaStreamType** value indicating whether the photo, video, or preview properties should be set. This example uses the **ComboBox** populated in the example from the previous section, where the media stream properties are retrieved from the tag property from the selected item. + +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.xaml.cs" id="SnippetSetStreamProperties"::: + +Note that your app must have exclusive control of the capture device in order to change the media stream properties. + +## Match the aspect ratio of the preview and capture streams + +A typical camera app will provide UI for the user to select the video or photo capture resolution but will programmatically set the preview resolution. There are a few different strategies for selecting the best preview stream resolution for your app: + +- Select the highest available preview resolution, letting the UI framework perform any necessary scaling of the preview. + +- Select the preview resolution closest to the capture resolution so that the preview displays the closest representation to the final captured media. + +- Select the preview resolution closest to the size of the [**CaptureElement**](/uwp/api/Windows.UI.Xaml.Controls.CaptureElement) so that no more pixels than necessary are going through the preview stream pipeline. + +> [!NOTE] +> It is possible, on some devices, to set a different aspect ratio for the camera's preview stream and capture stream. Frame cropping caused by this mismatch can result in content being present in the captured media that was not visible in the preview which can result in a negative user experience. It is strongly recommended that you use the same aspect ratio, within a small tolerance window, for the preview and capture streams. It is fine to have entirely different resolutions enabled for capture and preview as long as the aspect ratio match closely. + + +To ensure that the photo or video capture streams match the aspect ratio of the preview stream, this example calls [**VideoDeviceController.GetMediaStreamProperties**](/uwp/api/windows.media.devices.videodevicecontroller.getmediastreamproperties) and passes in the **VideoPreview** enum value to request the current stream properties for the preview stream. Next a small aspect ratio tolerance window is defined so that we can include aspect ratios that are not exactly the same as the preview stream, as long as they are close. Next, the **StreamPropertiesHelper** objects where the aspect ratio is within the defined tolerance range of the preview stream are selected. + +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.xaml.cs" id="SnippetMatchPreviewAspectRatio"::: + +SnippetMatchPreviewAspectRatio \ No newline at end of file diff --git a/hub/apps/develop/camera/variable-photo-sequence.md b/hub/apps/develop/camera/variable-photo-sequence.md new file mode 100644 index 0000000000..fe213a3c7b --- /dev/null +++ b/hub/apps/develop/camera/variable-photo-sequence.md @@ -0,0 +1,87 @@ +--- +description: Learn how to capture a variable photo sequence, which allows you to capture multiple frames of images in rapid succession and configure each frame to use different focus, flash, ISO, exposure, and exposure compensation settings. +title: Variable photo sequence +ms.date: 09/13/2024 +ms.topic: article +keywords: windows 10, windows 11, winui3, camera +ms.localizationpriority: medium +--- +# Variable photo sequence + +This article shows you how to capture a variable photo sequence, which allows you to capture multiple frames of images in rapid succession and configure each frame to use different focus, flash, ISO, exposure, and exposure compensation settings. This feature enables scenarios like creating High Dynamic Range (HDR) images. + +If you want to capture HDR images but don't want to implement your own processing algorithm, you can use the [**AdvancedPhotoCapture**](/uwp/api/Windows.Media.Capture.AdvancedPhotoCapture) API to use the HDR capabilities built-in to Windows. For more information, see [High dynamic range (HDR) and low-light photo capture](hdr-low-light-photo-capture.md). + +> [!NOTE] +> This article builds on concepts and code discussed in [Basic photo, video, and audio capture with MediaCapture](basic-photo-capture.md), which describes the steps for implementing basic photo and video capture. It is recommended that you familiarize yourself with the basic media capture pattern in that article before moving on to more advanced capture scenarios. The code in this article assumes that your app already has an instance of MediaCapture that has been properly initialized. + +## Set up your app to use variable photo sequence capture + +Declare a member variable to store the [**VariablePhotoSequenceCapture**](/uwp/api/Windows.Media.Capture.Core.VariablePhotoSequenceCapture) object, which is used to initiate the photo sequence capture. Declare an array of [**SoftwareBitmap**](/uwp/api/Windows.Graphics.Imaging.SoftwareBitmap) objects to store each captured image in the sequence. Also, declare an array to store the [**CapturedFrameControlValues**](/uwp/api/Windows.Media.Capture.CapturedFrameControlValues) object for each frame. This can be used by your image processing algorithm to determine what settings were used to capture each frame. Finally, declare an index that will be used to track which image in the sequence is currently being captured. + +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.xaml.cs" id="SnippetVPSMemberVariables"::: + +## Prepare the variable photo sequence capture + +After you have initialized your [**MediaCapture**](/uwp/api/Windows.Media.Capture.MediaCapture), make sure that variable photo sequences are supported on the current device by getting an instance of the [**VariablePhotoSequenceController**](/uwp/api/Windows.Media.Devices.Core.VariablePhotoSequenceController) from the media capture's [**VideoDeviceController**](/uwp/api/Windows.Media.Devices.VideoDeviceController) and checking the [**Supported**](/uwp/api/windows.media.devices.core.variablephotosequencecontroller.supported) property. + +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.xaml.cs" id="SnippetIsVPSSupported"::: + +Get a [**FrameControlCapabilities**](/uwp/api/Windows.Media.Devices.Core.FrameControlCapabilities) object from the variable photo sequence controller. This object has a property for every setting that can be configured per frame of a photo sequence. These include: + +- [**Exposure**](/uwp/api/windows.media.devices.core.framecontrolcapabilities.exposure) +- [**ExposureCompensation**](/uwp/api/windows.media.devices.core.framecontrolcapabilities.exposurecompensation) +- [**Flash**](/uwp/api/windows.media.devices.core.framecontrolcapabilities.flash) +- [**Focus**](/uwp/api/windows.media.devices.core.framecontrolcapabilities.focus) +- [**IsoSpeed**](/uwp/api/windows.media.devices.core.framecontrolcapabilities.isospeed) +- [**PhotoConfirmation**](/uwp/api/windows.media.devices.core.framecontrolcapabilities.photoconfirmationsupported) + +This example will set a different exposure compensation value for each frame. To verify that exposure compensation is supported for photo sequences on the current device, check the [**Supported**](/uwp/api/windows.media.devices.exposurecompensationcontrol.supported) property of the [**FrameExposureCompensationCapabilities**](/uwp/api/Windows.Media.Devices.Core.FrameExposureCompensationCapabilities) object accessed through the **ExposureCompensation** property. + +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.xaml.cs" id="SnippetIsExposureCompensationSupported"::: + +Create a new [**FrameController**](/uwp/api/Windows.Media.Devices.Core.FrameController) object for each frame you want to capture. This example captures three frames. Set the values for the controls you want to vary for each frame. Then, clear the [**DesiredFrameControllers**](/uwp/api/windows.media.devices.core.variablephotosequencecontroller.desiredframecontrollers) collection of the **VariablePhotoSequenceController** and add each frame controller to the collection. + +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.xaml.cs" id="SnippetInitFrameControllers"::: + +Create an [**ImageEncodingProperties**](/uwp/api/Windows.Media.MediaProperties.ImageEncodingProperties) object to set the encoding you want to use for the captured images. Call the static method [**MediaCapture.PrepareVariablePhotoSequenceCaptureAsync**](/uwp/api/windows.media.capture.mediacapture.preparevariablephotosequencecaptureasync), passing in the encoding properties. This method returns a [**VariablePhotoSequenceCapture**](/uwp/api/Windows.Media.Capture.Core.VariablePhotoSequenceCapture) object. Finally, register event handlers for the [**PhotoCaptured**](/uwp/api/windows.media.capture.core.variablephotosequencecapture.photocaptured) and [**Stopped**](/uwp/api/windows.media.capture.core.variablephotosequencecapture.stopped) events. + +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.xaml.cs" id="SnippetPrepareVPS"::: + +## Start the variable photo sequence capture + +To start the capture of the variable photo sequence, call [**VariablePhotoSequenceCapture.StartAsync**](/uwp/api/windows.media.capture.core.variablephotosequencecapture.startasync). Be sure to initialize the arrays for storing the captured images and frame control values and set the current index to 0. Set your app's recording state variable and update your UI to disable starting another capture while this capture is in progress. + +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.xaml.cs" id="SnippetStartVPSCapture"::: + +## Receive the captured frames + +The [**PhotoCaptured**](/uwp/api/windows.media.capture.core.variablephotosequencecapture.photocaptured) event is raised for each captured frame. Save the frame control values and captured image for the frame and then increment the current frame index. This example shows how to get a [**SoftwareBitmap**](/uwp/api/Windows.Graphics.Imaging.SoftwareBitmap) representation of each frame. For more information on using **SoftwareBitmap**, see [Imaging](/windows/uwp/audio-video-camera/imaging). + +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.xaml.cs" id="SnippetOnPhotoCaptured"::: + +## Handle the completion of the variable photo sequence capture + +The [**Stopped**](/uwp/api/windows.media.capture.core.variablephotosequencecapture.stopped) event is raised when all of the frames in the sequence have been captured. Update the recording state of your app and update your UI to allow the user to initiate new captures. At this point, you can pass the captured images and frame control values to your image processing code. + +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.xaml.cs" id="SnippetOnStopped"::: + +## Update frame controllers + +If you want to perform another variable photo sequence capture with different per frame settings, you don't need to completely reinitialize the **VariablePhotoSequenceCapture**. You can either clear the [**DesiredFrameControllers**](/uwp/api/windows.media.devices.core.variablephotosequencecontroller.desiredframecontrollers) collection and add new frame controllers or you can modify the existing frame controller values. The following example checks the [**FrameFlashCapabilities**](/uwp/api/Windows.Media.Devices.Core.FrameFlashCapabilities) object to verify that the current device supports flash and flash power for variable photo sequence frames. If so, each frame is updated to enable the flash at 100% power. The exposure compensation values that were previously set for each frame are still active. + +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.xaml.cs" id="SnippetUpdateFrameControllers"::: + +## Clean up the variable photo sequence capture + +When you are done capturing variable photo sequences or your app is suspending, clean up the variable photo sequence object by calling [**FinishAsync**](/uwp/api/windows.media.capture.core.variablephotosequencecapture.finishasync). Unregister the object's event handlers and set it to null. + +:::code language="csharp" source="~/../snippets-windows/winappsdk/audio-video-camera/camera-winui/CS/CameraWinUI/MainWindow.xaml.cs" id="SnippetCleanUpVPS"::: + +## Related topics + +* [Camera](camera.md) +* [Basic photo, video, and audio capture with MediaCapture](basic-photo-capture.md) +  + +  diff --git a/hub/apps/develop/communication.md b/hub/apps/develop/communication.md deleted file mode 100644 index 1ba6857713..0000000000 --- a/hub/apps/develop/communication.md +++ /dev/null @@ -1,48 +0,0 @@ ---- -title: Communication -description: This article provides an index of development features that are related to communication scenarios in Windows apps. -ms.topic: article -ms.date: 10/13/2021 -keywords: ---- - -# Communication - -This article provides an index of development features that are related to scenarios involving communication in Windows apps. - -> [!NOTE] -> The [Windows App SDK](../windows-app-sdk/index.md) currently does not provide APIs related to communication scenarios. - -## Windows OS features - -Windows 10 and later OS releases provide a wide variety of APIs related to communication scenarios for apps. These features are available via a combination of WinRT and Win32 (C++ and COM) APIs provided by the [Windows SDK](https://developer.microsoft.com/windows/downloads/windows-sdk). - -#### WinRT APIs - -The following articles provide information about features available via WinRT APIs provided by the Windows SDK. - -| Article | Description | -|---------|-------------| -| [App-to-app communication](/windows/uwp/app-to-app/) | Learn how to share data between apps, including how to use the Share contract, copy and paste, drag and drop, and app services. | -| [Interprocess communication](/windows/uwp/communication/interprocess-communication) | Learn about ways to perform interprocess communication (IPC) between UWP apps, packaged desktop apps, and unpackaged desktop apps. | -| [Networking and web services](/windows/uwp/networking/) | Learn about networking and web services technologies that are available to apps. | -| [Sharing named objects](/windows/uwp/communication/sharing-named-objects) | Learn how to share named objects between between UWP apps, packaged desktop apps, and unpackaged desktop apps. | - -#### Win32 (C++ and COM) APIs - -The following articles provide information about features available via Win32 (C++ and COM) APIs provided by the Windows SDK. - -| Article | Description | -|---------|-------------| -| [Networking and Internet](/windows/win32/networking) | Learn about APIs, components, and services that support your app's use of networking and the Internet. | -| [Remote Procedure Call](/windows/win32/rpc/rpc-start-page) | Learn about using Remote Procedure Call (RPC) to create distributed client/server programs. | -| [Windows Sockets 2 (Winsock)](/windows/win32/winsock/windows-sockets-start-page-2) | Learn how to use Windows Sockets 2 (Winsock) to create advanced Internet, intranet, and other network-capable apps. | - -## .NET features - -The .NET SDK also provides APIs related to communication scenarios for WPF and Windows Forms apps. - -| Article | Description | -|---------|-------------| -| [Network programming in the .NET Framework](/dotnet/framework/network-programming/) | Learn about building network-enabled apps using .NET. | -| [Networking in Windows Forms](/dotnet/framework/winforms/advanced/networking-in-windows-forms-applications) | Learn about additional networking scenarios for Windows Forms apps. | diff --git a/hub/apps/develop/communication/copy-and-paste.md b/hub/apps/develop/communication/copy-and-paste.md new file mode 100644 index 0000000000..57b9ecf3ee --- /dev/null +++ b/hub/apps/develop/communication/copy-and-paste.md @@ -0,0 +1,194 @@ +--- +description: Learn how to implement copy and paste functionality in WinUI and UWP apps using the clipboard APIs. Includes code examples and best practices. +title: Copy and Paste in WinUI and UWP Apps +ms.date: 10/15/2025 +ms.topic: how-to +keywords: windows 11, uwp, winrt, windows runtime, winui +ms.localizationpriority: medium +# Customer intent: As a Windows app developer, I want to learn how to implement copy and paste functionality in my app using the clipboard. +--- + +# Copy and paste + +Copy and paste is a fundamental way for users to exchange data between apps or within an app. This article shows you how to implement copy and paste in WinUI and Universal Windows Platform (UWP) apps using the clipboard APIs. You'll learn how to copy, cut, and paste data, track clipboard changes, and use the [DataPackage](/uwp/api/Windows.ApplicationModel.DataTransfer.DataPackage) class to handle different data formats. + +> [!NOTE] +> You can also use these APIs in other desktop apps through Windows Runtime (WinRT) APIs. For more information, see [Call Windows Runtime APIs in desktop apps](/windows/apps/desktop/modernize/desktop-to-uwp-enhance). + +For complete code examples that demonstrate different copy and paste scenarios, see the [UWP clipboard sample on GitHub](https://github.com/microsoft/Windows-universal-samples/tree/master/Samples/Clipboard). + +## Check for built-in clipboard support + +In many cases, you do not need to write code to support clipboard operations. Many of the default XAML controls you can use to create apps already support clipboard operations. + +## Get set up + +First, include the [Windows.ApplicationModel.DataTransfer](/uwp/api/Windows.ApplicationModel.DataTransfer) namespace in your app. Then, add an instance of the [DataPackage](/uwp/api/Windows.ApplicationModel.DataTransfer.DataPackage) object. This object contains both the data the user wants to copy and any properties (such as a description) that you want to include. + +### [C#](#tab/cs) + +```cs +using Windows.ApplicationModel.DataTransfer; +... +var dataPackage = new DataPackage(); +``` + +### [C++/WinRT](#tab/cppwinrt) + +```cppwinrt +#include +using namespace winrt::Windows::ApplicationModel::DataTransfer; +... +DataPackage dataPackage; +``` + +--- + +## Copy and cut + +Copy and cut (also referred to as *move*) work almost exactly the same. Choose which operation you want by using the [RequestedOperation](/uwp/api/windows.applicationmodel.datatransfer.datapackage.requestedoperation) property. + +### [C#](#tab/cs) + +```cs +// copy +dataPackage.RequestedOperation = DataPackageOperation.Copy; +// or cut +dataPackage.RequestedOperation = DataPackageOperation.Move; +``` + +### [C++/WinRT](#tab/cppwinrt) + +```cppwinrt +// copy +dataPackage.RequestedOperation(DataPackageOperation::Copy); +// or cut +dataPackage.RequestedOperation(DataPackageOperation::Move); +``` + +--- + +## Set the copied content + +Next, you can add the data that a user has selected to the [DataPackage](/uwp/api/Windows.ApplicationModel.DataTransfer.DataPackage) object. If this data is supported by the **DataPackage** class, you can use one of the corresponding [methods](/uwp/api/windows.applicationmodel.datatransfer.datapackage#methods) of the **DataPackage** object. Here's how to add text by using the [SetText](/uwp/api/windows.applicationmodel.datatransfer.datapackage.settext) method: + +### [C#](#tab/cs) + +```cs +dataPackage.SetText("Hello World!"); +``` + +### [C++/WinRT](#tab/cppwinrt) + +```cppwinrt +dataPackage.SetText(L"Hello World!"); +``` + +--- + +The last step is to add the [DataPackage](/uwp/api/Windows.ApplicationModel.DataTransfer.DataPackage) to the clipboard by calling the static [SetContent](/uwp/api/windows.applicationmodel.datatransfer.clipboard.setcontent) method. + +### [C#](#tab/cs) + +```cs +Clipboard.SetContent(dataPackage); +``` + +### [C++/WinRT](#tab/cppwinrt) + +```cppwinrt +Clipboard::SetContent(dataPackage); +``` + +--- + +## Paste + +To get the contents of the clipboard, call the static [GetContent](/uwp/api/windows.applicationmodel.datatransfer.clipboard.getcontent) method. This method returns a [DataPackageView](/uwp/api/Windows.ApplicationModel.DataTransfer.DataPackageView) that contains the content. This object is almost identical to a [DataPackage](/uwp/api/Windows.ApplicationModel.DataTransfer.DataPackage) object, except that its contents are read-only. With that object, you can use either the [AvailableFormats](/uwp/api/windows.applicationmodel.datatransfer.datapackageview.availableformats) or the [Contains](/uwp/api/windows.applicationmodel.datatransfer.datapackageview.contains) method to identify what formats are available. Then, you can call the corresponding [DataPackageView](/uwp/api/Windows.ApplicationModel.DataTransfer.DataPackageView) method to get the data. + +### [C#](#tab/cs) + +```cs +async void OutputClipboardText() +{ + DataPackageView dataPackageView = Clipboard.GetContent(); + if (dataPackageView.Contains(StandardDataFormats.Text)) + { + string text = await dataPackageView.GetTextAsync(); + // To output the text from this example, you need a TextBlock control + TextOutput.Text = "Clipboard now contains: " + text; + } +} +``` + +### [C++/WinRT](#tab/cppwinrt) + +```cppwinrt +void MainPage::OutputClipboardText() +{ + DataPackageView dataPackageView = Clipboard::GetContent(); + if (dataPackageView.Contains(StandardDataFormats::Text())) + { + hstring text = dataPackageView.GetTextAsync().get(); + // To output the text from this example, you need a TextBlock control + TextOutput().Text(L"Clipboard now contains: " + text); + } +} +``` + +--- + +## Track changes to the clipboard + +In addition to copy and paste commands, you may also want to track clipboard changes. Do this by handling the clipboard's [ContentChanged](/uwp/api/windows.applicationmodel.datatransfer.clipboard.contentchanged) event. + +### [C#](#tab/cs) + +```cs +Clipboard.ContentChanged += async (s, e) => +{ + DataPackageView dataPackageView = Clipboard.GetContent(); + if (dataPackageView.Contains(StandardDataFormats.Text)) + { + string text = await dataPackageView.GetTextAsync(); + // To output the text from this example, you need a TextBlock control + TextOutput.Text = "Clipboard now contains: " + text; + } +} +``` +### [C++/WinRT](#tab/cppwinrt) + +```cppwinrt +Clipboard::ContentChanged([this](auto const&, auto const&) +{ + DataPackageView dataPackageView = Clipboard::GetContent(); + if (dataPackageView.Contains(StandardDataFormats::Text())) + { + hstring text = dataPackageView.GetTextAsync().get(); + // To output the text from this example, you need a TextBlock control + TextOutput().Text(L"Clipboard now contains: " + text); + } +}); +``` + +--- + +## Related content + +- [Clipboard sample](https://github.com/microsoft/Windows-universal-samples/tree/master/Samples/Clipboard) +- [Communication](index.md) +- [DataTransfer](/uwp/api/windows.applicationmodel.datatransfer) +- [DataPackage](/uwp/api/windows.applicationmodel.datatransfer.datapackage) +- [DataPackageView](/uwp/api/windows.applicationmodel.datatransfer.datapackageview) +- [DataPackagePropertySet]( /uwp/api/Windows.ApplicationModel.DataTransfer.DataPackagePropertySet) +- [DataRequest](/uwp/api/windows.applicationmodel.datatransfer.datarequest) +- [DataRequested]( /uwp/api/Windows.ApplicationModel.DataTransfer.DataTransferManager) +- [FailWithDisplayText](/uwp/api/windows.applicationmodel.datatransfer.datarequest.failwithdisplaytext) +- [ShowShareUi](/uwp/api/windows.applicationmodel.datatransfer.datatransfermanager.showshareui) +- [RequestedOperation](/uwp/api/windows.applicationmodel.datatransfer.datapackage.requestedoperation) +- [ControlsList](/windows/apps/design/controls/index) +- [SetContent](/uwp/api/windows.applicationmodel.datatransfer.clipboard.setcontent) +- [GetContent](/uwp/api/windows.applicationmodel.datatransfer.clipboard.getcontent) +- [AvailableFormats](/uwp/api/windows.applicationmodel.datatransfer.datapackageview.availableformats) +- [Contains](/uwp/api/windows.applicationmodel.datatransfer.datapackageview.contains) +- [ContentChanged](/uwp/api/windows.applicationmodel.datatransfer.clipboard.contentchanged) diff --git a/hub/apps/develop/communication/index.md b/hub/apps/develop/communication/index.md new file mode 100644 index 0000000000..efa0a344ae --- /dev/null +++ b/hub/apps/develop/communication/index.md @@ -0,0 +1,57 @@ +--- +title: Communication features for Windows apps +description: Discover communication features and APIs for Windows apps, including networking, data sharing, and interprocess communication. Learn how to implement these capabilities. +ms.topic: concept-article +ms.date: 10/13/2025 +# Customer intent: As a Windows app developer, I want to learn about communication features and APIs that I can use in my Windows apps. +--- + +# Communication + +Communication features enable Windows apps to share data, connect over networks, and interact with other applications. This article provides an index of development features for implementing communication scenarios in Windows apps. + +> [!NOTE] +> The [Windows App SDK](../../windows-app-sdk/index.md) currently does not provide APIs related to communication scenarios. However, in Windows 11 you can share data between apps by integrating with the [Windows Share Sheet](../windows-integration/integrate-sharesheet-overview.md) in packaged and unpackaged desktop apps. + +## Windows OS features + +Windows 10 and later OS releases provide a wide variety of APIs related to communication scenarios for apps. These features are available via a combination of WinRT and Win32 (C++ and COM) APIs provided by the [Windows SDK](https://developer.microsoft.com/windows/downloads/windows-sdk). + +#### WinRT APIs + +The following articles provide information about features available via WinRT APIs provided by the Windows SDK. + +| Article | Description | +|---------|-------------| +| [Copy and paste](copy-and-paste.md) | Learn how to implement copy and paste functionality in your WinUI, UWP, or other desktop app using the clipboard. | +| [App-to-app communication](/windows/uwp/app-to-app/) | Learn how to share data between apps, including how to use the Share contract, copy and paste, drag and drop, and app services. | +| [Interprocess communication](/windows/uwp/communication/interprocess-communication) | Learn about ways to perform interprocess communication (IPC) between UWP apps, packaged desktop apps, and unpackaged desktop apps. | +| [Networking and web services](/windows/uwp/networking/) | Learn about networking and web services technologies that are available to apps. | +| [Sharing named objects](/windows/uwp/communication/sharing-named-objects) | Learn how to share named objects between UWP apps, packaged desktop apps, and unpackaged desktop apps. | + +#### Win32 (C++ and COM) APIs + +The following articles provide information about features available via Win32 (C++ and COM) APIs provided by the Windows SDK. + +| Article | Description | +|---------|-------------| +| [Networking and Internet](/windows/win32/networking) | Learn about APIs, components, and services that support your app's use of networking and the Internet. | +| [Remote Procedure Call](/windows/win32/rpc/rpc-start-page) | Learn about using Remote Procedure Call (RPC) to create distributed client/server programs. | +| [Windows Sockets 2 (Winsock)](/windows/win32/winsock/windows-sockets-start-page-2) | Learn how to use Windows Sockets 2 (Winsock) to create advanced Internet, intranet, and other network-capable apps. | + +## .NET features + +The .NET SDK also provides APIs related to communication scenarios for WPF and Windows Forms apps. + +| Article | Description | +|---------|-------------| +| [Network programming in the .NET Framework](/dotnet/framework/network-programming/) | Learn about building network-enabled apps using .NET. | +| [Networking in Windows Forms](/dotnet/framework/winforms/advanced/networking-in-windows-forms-applications) | Learn about additional networking scenarios for Windows Forms apps. | + +## Related content + +[App-to-app communication](/windows/uwp/app-to-app/) + +[Develop Windows desktop apps](../index.md) + +[Integrate Share options in your Windows app](../windows-integration/integrate-sharesheet-overview.md) diff --git a/hub/apps/develop/data-access/cosmos-db-data-access.md b/hub/apps/develop/data-access/cosmos-db-data-access.md index 4e7c4b8963..924c223be3 100644 --- a/hub/apps/develop/data-access/cosmos-db-data-access.md +++ b/hub/apps/develop/data-access/cosmos-db-data-access.md @@ -1,23 +1,23 @@ --- title: Use a Cosmos DB database from a Windows app -description: Learn how to connect your Windows App SDK app to a Cosmos DB database and test the connection programmatically. -ms.date: 12/06/2022 -ms.topic: article -keywords: windows 10, windows 11, windows app sdk, Cosmos DB, azure, cloud, nosql, database +description: Learn how to connect your Windows app to a Cosmos DB database and test the connection programmatically. +ms.date: 08/01/2024 +ms.topic: how-to +keywords: windows, windows app sdk, Cosmos DB, azure, cloud, nosql, database, wpf, uwp, winforms, windows forms, winui ms.localizationpriority: medium +#customer intent: As a Windows developer, I want to learn how to connect my Windows app to a Cosmos DB database so that I can store and retrieve data in the cloud. --- # Use a Cosmos DB database from a Windows app -This article contains the steps required to enable working with a Cosmos DB database from a Windows App SDK app. It also contains a small code snippet showing how you can interact with the database in code. +This article contains the steps required to enable working with a Cosmos DB database from a Windows app. It also contains a small code snippet showing how you can interact with the database in code. ## Set up your solution -To connect your app directly to a Cosmos DB database, your WinUI app can target any minimum version of Windows supported by Windows App SDK. Follow these steps to install the package and try out example code for some basic tasks. +This example can be used with any WPF, Windows Forms, WinUI 3, and UWP project to connect your Windows app to a Cosmos DB database. Follow these steps to install the package and try out example code for some basic tasks. -Open the **Package Manager Console** (View -> Other Windows -> Package Manager Console). Use the command `Install-Package Microsoft.Azure.Cosmos` to install the NuGet package for the **Azure Cosmos DB for NoSQL client library for .NET**. This will allow you to programmatically access Cosmos DB databases. - -Build your project and make sure that the build was successful with no errors. +1. Open the **Package Manager Console** (View -> Other Windows -> Package Manager Console). Use the command `Install-Package Microsoft.Azure.Cosmos` to install the NuGet package for the **Azure Cosmos DB for NoSQL client library for .NET**. This will allow you to programmatically access Cosmos DB databases. +1. Build your project and make sure that the build was successful with no errors. Next, you'll need to create a Cosmos DB instance in Azure. You can do this by following the steps in [Create a NoSQL database account in Azure Cosmos DB](/azure/cosmos-db/create-cosmosdb-resources-portal). @@ -70,8 +70,7 @@ public async Task CosmosSample(string endpoint, string authKey) } ``` -## See also +## Related content - [Azure Cosmos DB for NoSQL client library for .NET](/azure/cosmos-db/nosql/quickstart-dotnet) - - [Use a MySQL database in a Windows app](mysql-database.md) diff --git a/hub/apps/develop/data-access/images/sqlite-core-package.png b/hub/apps/develop/data-access/images/sqlite-core-package.png deleted file mode 100644 index d8c82bb4a3..0000000000 Binary files a/hub/apps/develop/data-access/images/sqlite-core-package.png and /dev/null differ diff --git a/hub/apps/develop/data-access/images/sqlite-nuget-package.png b/hub/apps/develop/data-access/images/sqlite-nuget-package.png new file mode 100644 index 0000000000..2db17b8de6 Binary files /dev/null and b/hub/apps/develop/data-access/images/sqlite-nuget-package.png differ diff --git a/hub/apps/develop/data-access/index.md b/hub/apps/develop/data-access/index.md index 13bf0652f1..389ebbd94a 100644 --- a/hub/apps/develop/data-access/index.md +++ b/hub/apps/develop/data-access/index.md @@ -1,29 +1,32 @@ --- ms.assetid: dc686801-edd0-44b1-afb9-20486fd9c34e title: Data access in Windows apps -description: Learn how to store data on the device in a private database and use object relational mapping in Windows App SDK apps. -ms.date: 12/06/2022 -ms.topic: article +description: Learn how to store data on the device in a private database and use object relational mapping in Windows apps. +ms.date: 08/01/2024 +ms.topic: concept-article keywords: windows 10, windows 11, windows app sdk, data, database, relational, tables, sqlite, cosmosdb, mysql ms.localizationpriority: medium +#customer intent: As a Windows app developer, I want to learn how to store data on the device in a private database and use object relational mapping in Windows apps so that I can create apps that store and retrieve data. --- -# Data access in Windows apps +# Data access in Windows apps? You can store data on the user's device by using a SQLite database. You can also connect your Windows app directly to a SQL Server, Cosmos DB, MySQL, or MongoDB database without having to use an external service layer. +## Topics in this section + +In this section, you'll learn how to store and retrieve data in a Windows app by using different back-end databases. Each topic provides a guide to help you get started. + | Topic | Description | |-------|------------| | [Use a SQLite database on Windows](sqlite-data-access.md) | Shows you how to use SQLite to store and retrieve data in a light-weight database on the user's device. SQLite is a server-less, embedded database engine. | | [Use a SQL Server database in a Windows app](sql-server-database.md) | Shows you how to connect directly to a SQL Server database and then store and retrieve data by using classes in the [System.Data.SqlClient](/dotnet/api/system.data.sqlclient) namespace. No service layer required. | -| [Use a Cosmos DB database in a Windows app](cosmos-db-data-access.md) | Shows you how to work with a [Cosmos DB](/azure/cosmos-db/introduction) database and and test the connection programmatically. Cosmos DB is a cloud-based document database. | -| [Use a MySQL database in a Windows app](mysql-database.md) | Shows you how to connect to a MySQL database and interact with the database in a Windows App SDK application. MySQL is an open source, cross-platform relational database. | -| [Use a MongoDB database in a Windows app](mongodb-database.md) | Shows you how to work with a MongoDB database and and test the connection programmatically. MongoDB is a cross-platform document database. | +| [Use a Cosmos DB database in a Windows app](cosmos-db-data-access.md) | Shows you how to work with a [Cosmos DB](/azure/cosmos-db/introduction) database and test the connection programmatically. Cosmos DB is a cloud-based document database. | +| [Use a MySQL database in a Windows app](mysql-database.md) | Shows you how to connect to a MySQL database and interact with the database in a Windows application. MySQL is an open source, cross-platform relational database. | +| [Use a MongoDB database in a Windows app](mongodb-database.md) | Shows you how to work with a MongoDB database and test the connection programmatically. MongoDB is a cross-platform document database. | -## Related topics +## Related content - [Customer Orders Database sample](https://github.com/Microsoft/Windows-appsample-customers-orders-database) - - [UWP data access](/windows/uwp/data-access/) - - [.NET data documentation](/ef/dotnet-data/) diff --git a/hub/apps/develop/data-access/mongodb-database.md b/hub/apps/develop/data-access/mongodb-database.md index bf3ed03efc..74933b72ae 100644 --- a/hub/apps/develop/data-access/mongodb-database.md +++ b/hub/apps/develop/data-access/mongodb-database.md @@ -1,21 +1,25 @@ --- title: Use a MongoDB database in a Windows app -description: Learn how to connect your Windows App SDK app directly to a MongoDB database and test the connection programmatically. -ms.date: 12/08/2022 -ms.topic: article -keywords: windows 10, windows 11, windows app sdk, MongoDB, database +description: Learn how to connect your Windows app directly to a MongoDB database and test the connection programmatically. +ms.date: 08/01/2024 +ms.topic: how-to +keywords: windows, windows app sdk, mongodb, nosql, database, uwp, wpf, winforms, windows forms, winui ms.localizationpriority: medium +#customer intent: As a Windows developer, I want to learn how to connect my Windows app directly to a MongoDB database so that I can store and retrieve data. --- # Use a MongoDB database in a Windows app -This article contains the steps required to enable working with a MongoDB database from a Windows App SDK app. It also contains a small code snippet showing how you can interact with the database in code. +This article contains the steps required to enable working with a MongoDB database from a Windows app. It also contains a small code snippet showing how you can interact with the database in code. ## Set up your solution -To connect your app directly to a MongoDB database, your WinUI app can target any minimum version of Windows supported by Windows App SDK. Follow these steps to install the package and try out the example code to read data from an existing MongoDB database. +This example can be used with any WPF, Windows Forms, WinUI 3, and UWP project to connect your Windows app to MongoDB. Follow these steps to install the package and try out the example code to read data from an existing MongoDB database. -Open the **Package Manager Console** (View -> Other Windows -> Package Manager Console). Use the command `Install-Package MongoDB.Driver` to install the NuGet package for the official driver for MongoDB. This will allow you to programmatically access MongoDB databases. +1. Open the **Package Manager Console** (View -> Other Windows -> Package Manager Console). +1. Use the command `Install-Package MongoDB.Driver` to install the NuGet package for the official driver for MongoDB. + +This will allow you to programmatically access MongoDB databases. ## Test your connection using sample code @@ -41,8 +45,7 @@ Console.WriteLine(document1.ToString()); Note that the IP address and database name will need to be customized. The port, 27017, is the default MongoDB port number. In a production application, connection information such as server address and database name should be stored in app configuration rather than hard-coded (see [**Adding Azure App Configuration by using Visual Studio Connected Services**](/visualstudio/azure/vs-azure-tools-connected-services-app-configuration)). -## See also +## Related content - [Use a SQL Server database in a Windows app](sql-server-database.md) - - [Use a MySQL database in a Windows app](mysql-database.md) diff --git a/hub/apps/develop/data-access/mysql-database.md b/hub/apps/develop/data-access/mysql-database.md index f2b8d66069..37ef31368d 100644 --- a/hub/apps/develop/data-access/mysql-database.md +++ b/hub/apps/develop/data-access/mysql-database.md @@ -1,28 +1,39 @@ --- title: Use a MySQL database in a Windows app -description: Learn how to connect to a MySQL database from your Windows App SDK app, and test your connection using sample code. -ms.date: 12/06/2022 -ms.topic: article -keywords: windows 10, windows 11, windows app sdk, MySQL, database +description: Learn how to connect to a MySQL database from your Windows app, and test your connection using sample code. +ms.date: 01/23/2025 +ms.custom: copilot-scenario-highlight +ms.topic: how-to +keywords: windows, windows app sdk, MySQL, database, uwp, wpf, winforms, windows forms, winui ms.localizationpriority: medium +#customer intent: As a Windows developer, I want to learn how to connect to a MySQL database from my Windows app so that I can store and retrieve data. --- # Use a MySQL database in a Windows app -This article contains the steps required to enable working with a MySQL database from a Widows App SDK app. It also contains a small code snippet showing how you can interact with the database in code. +This article contains the steps required to enable working with a MySQL database from a Windows app. It also contains a small code snippet showing how you can interact with the database in code. + +> [!TIP] +> You can use AI assistance to [create a MySQL connection string with GitHub Copilot](#building-a-connection-string-with-github-copilot). ## Set up your solution -To connect your app directly to a MySQL database, your WinUI app can target any minimum version of Windows supported by Windows App SDK. Follow these steps to install the package and try out the example code to read data from an existing MySQL database. +This example can be used with any WPF, Windows Forms, WinUI 3, and UWP project to connect your Windows app to a MySQL database. Follow these steps to install the package and try out the example code to read data from an existing MySQL database. + +1. Open the **Package Manager Console** (View -> Other Windows -> Package Manager Console). +1. Use the command `Install-Package MySql.Data` to install the NuGet package for the MySQL core class library. + +This will allow you to programmatically access MySQL databases. -Open the **Package Manager Console** (View -> Other Windows -> Package Manager Console). Use the command `Install-Package MySql.Data` to install the NuGet package for the MySQL core class library. This will allow you to programmatically access MySQL databases. +> [!NOTE] +> [MySQL Connector/NET](https://dev.mysql.com/downloads/connector/net/) version 6.4.4 or later is required to use the `MySql.Data` package with Windows authentication. ## Test your connection using sample code -The following is an example of connecting to and reading from a remote MySQL database. Note that the IP address, credentials, and database name will need to be customized. +The following is an example of connecting to and reading from a remote MySQL database. Note that the server address and database name will need to be customized. ``` csharp -const string M_str_sqlcon = "server=10.xxx.xx.xxx;user id=foo;password=bar;database=baz"; +const string M_str_sqlcon = "Server=myServerAddress;Database=myDataBase;IntegratedSecurity=yes;Uid=auth_windows;"; using (var mySqlCn = new MySqlConnection(M_str_sqlcon)) { using (var mySqlCmd = new MySqlCommand("select * from table1", mySqlCn)) @@ -42,6 +53,21 @@ using (var mySqlCn = new MySqlConnection(M_str_sqlcon)) > [!IMPORTANT] > In production applications, connection information should be stored securely in app configuration (see [**Adding Azure App Configuration by using Visual Studio Connected Services**](/visualstudio/azure/vs-azure-tools-connected-services-app-configuration)). Connection strings and other secrets should not be hard-coded. -## See also +## Building a connection string with GitHub Copilot + +You can use GitHub Copilot to build the connection string for your MySQL database. You can customize the prompt to create a connection string per your requirements. + +The following text shows an example prompt for Copilot Chat that generates a connection string similar to the one shown in the previous code snippet: + +```copilot-prompt +Show me how to create a MySQL connection string to a server named myServerAddress and a database called myDatabase. Use Windows authentication. +``` + +GitHub Copilot is powered by AI, so surprises and mistakes are possible. For more information, see [Copilot FAQs](https://aka.ms/copilot-general-use-faqs). + +Learn more about [GitHub Copilot in Visual Studio](/visualstudio/ide/visual-studio-github-copilot-install-and-states) and [GitHub Copilot in VS Code](https://code.visualstudio.com/docs/copilot/overview). + +## Related content - [Use a SQL Server database in a Windows app](sql-server-database.md) +- [Data access in Windows apps](index.md) diff --git a/hub/apps/develop/data-access/sql-server-database.md b/hub/apps/develop/data-access/sql-server-database.md index 99b9bf7be9..b72ad6a106 100644 --- a/hub/apps/develop/data-access/sql-server-database.md +++ b/hub/apps/develop/data-access/sql-server-database.md @@ -1,29 +1,34 @@ --- title: Use a SQL Server database in a Windows app description: Learn how to connect a Windows App SDK app directly to a SQL Server database, and store and retrieve data by using System.Data.SqlClient. -ms.date: 12/06/2022 -ms.topic: article +ms.date: 10/15/2024 +ms.topic: how-to keywords: windows 10, windows 11, Windows App SDK, SQL Server, database ms.localizationpriority: medium +#customer intent: As a Windows developer, I want to learn how to connect my Windows App SDK app directly to a SQL Server database so that I can store and retrieve data. --- # Use a SQL Server database in a Windows app Your app can connect directly to a SQL Server database and then store and retrieve data by using classes in the [System.Data.SqlClient](/dotnet/api/system.data.sqlclient) namespace. +## Getting started + In this guide, we'll show you one way to do that in your Windows App SDK apps. If you install the [Northwind](/dotnet/framework/data/adonet/sql/linq/downloading-sample-databases) sample database onto your SQL Server instance, and then use these snippets, you'll end up with a basic UI that shows products from the Northwind sample database. ![Northwind products](images/products-northwind.png) +> [!TIP] +> You can also get scripts to create the **Northwind** and **pubs** sample databases from the [SQL Server Samples GitHub repository](https://github.com/microsoft/sql-server-samples/blob/master/samples/databases/northwind-pubs/readme.md). + The snippets that appear in this guide are based on this [UWP sample app](https://github.com/StefanWickDev/IgniteDemos/tree/master/NorthwindDemo). ## First, set up your solution To connect your app directly to a SQL Server database, your app can target any minimum version of Windows supported by Windows App SDK. You can find that information in the properties page of your project. -Open the **Package.appxmanifest** file of your Windows App SDK project in the manifest designer. - -In the **Capabilities** tab, select the **Enterprise Authentication** checkbox if you are using Windows Authentication for authenticating your SQL Server. +1. Open the **Package.appxmanifest** file of your Windows App SDK project in the manifest designer. +1. In the **Capabilities** tab, select the **Enterprise Authentication** checkbox if you are using Windows Authentication for authenticating your SQL Server. ![Enterprise Authentication Capability](images/enterprise-authentication.png) @@ -51,18 +56,14 @@ In this section, we'll do these things: In the **App.xaml.cs** file, add a property to the `App` class, that gives other classes in your solution access to the connection string. -Our connection string points to the Northwind database in a SQL Server Express instance. +Our connection string points to the Northwind database in a SQL Server Express instance. The connection string in this snippet assumes you kept the default instance name `SQLEXPRESS` when installing SQL Server Express. You can make changes to the connection string to match your SQL Server instance, database, and authentication method. ```csharp sealed partial class App : Application { // Connection string for using Windows Authentication. private string connectionString = - @"Data Source=YourServerName\SQLEXPRESS;Initial Catalog=NORTHWIND;Integrated Security=SSPI"; - - // This is an example connection string for using SQL Server Authentication. - // private string connectionString = - // @"Data Source=YourServerName\YourInstanceName;Initial Catalog=DatabaseName; User Id=XXXXX; Password=XXXXX"; + @"Data Source=.\SQLEXPRESS;Initial Catalog=NORTHWIND;Integrated Security=SSPI"; public string ConnectionString { get => connectionString; set => connectionString = value; } @@ -71,7 +72,7 @@ sealed partial class App : Application ``` > [!IMPORTANT] -> In production applications, connection information should be stored securely in app configuration (see [**Adding Azure App Configuration by using Visual Studio Connected Services**](/visualstudio/azure/vs-azure-tools-connected-services-app-configuration)). Connection strings and other secrets should not be hard-coded. +> In production applications, connection information should be stored securely in app configuration (see [**Adding Azure App Configuration by using Visual Studio Connected Services**](/visualstudio/azure/vs-azure-tools-connected-services-app-configuration)). Connection strings and other secrets should never be hard-coded. ### Create a class to hold product data @@ -218,6 +219,9 @@ Start the project and see products from the Northwind sample database appear in Explore the [System.Data.SqlClient](/dotnet/api/system.data.sqlclient) namespace to see what other things you can do with data in your SQL Server database. +> [!TIP] +> Try asking [Microsoft Copilot](https://copilot.microsoft.com/) for help with your SQL queries. Copilot can help you write SQL queries, and suggest ways to improve your code. + ## Trouble connecting to your database? In most cases, some aspect of the SQL Server configuration needs to be changed. If you're able to connect to your database from another type of desktop application such as a Windows Forms or WPF application, ensure that you've enabled TCP/IP for SQL Server. You can do that in the **Computer Management** console. (See [Windows Tools/Administrative Tools](/windows/client-management/administrative-tools-in-windows-10#tools) for more information.) @@ -228,16 +232,7 @@ Then, make sure that your SQL Server Browser service is running. ![SQL Server Browser Service](images/sql-browser-service.png) -## Next steps - -### Use a lightweight database to store data on the users device - -See [Use a SQLite database in a Windows app](sqlite-data-access.md). - -### Share code between different apps across multiple platforms - -See [Share code between desktop and UWP](/windows/uwp/porting/desktop-to-uwp-migrate). - -### Add master detail pages with Azure SQL back ends +## Next step -See [Customer Orders Database sample](https://github.com/Microsoft/Windows-appsample-customers-orders-database). +> [!div class="nextstepaction"] +> [Use a SQLite database in a Windows app](sqlite-data-access.md) diff --git a/hub/apps/develop/data-access/sqlite-data-access.md b/hub/apps/develop/data-access/sqlite-data-access.md index 31f7fb5a29..479edcc51a 100644 --- a/hub/apps/develop/data-access/sqlite-data-access.md +++ b/hub/apps/develop/data-access/sqlite-data-access.md @@ -1,17 +1,52 @@ --- title: Use a SQLite database in a Windows app description: Learn how to use a SQLite database in a Windows app to store and retrieve data in a lightweight database on the user's device. -ms.date: 12/06/2022 -ms.topic: article -keywords: windows 10, windows 11, windows app sdk, SQLite, database +ms.date: 09/25/2025 +ms.topic: how-to +keywords: windows 10, windows 11, windows app sdk, winui, SQLite, database ms.localizationpriority: medium +ms.custom: copilot-scenario-highlight +#customer intent: As a Windows developer, I want to learn how to use a SQLite database in a Windows app to store and retrieve data in a lightweight database on the user's device. --- # Use a SQLite database in a Windows app -You can use SQLite to store and retrieve data in a lightweight database on the user's device. This guide shows you how to do it in your Windows App SDK apps. +[SQLite](https://sqlite.org/index.html) provides a reliable, lightweight database solution for storing data locally in Windows apps. Unlike traditional database systems that require separate server installations and complex configurations, SQLite runs entirely within your application process and stores data in a single file on the user's device. -## Some benefits of using SQLite for local storage +This tutorial shows you how to integrate SQLite into your WinUI application using Microsoft's recommended data access libraries. You'll learn to set up a database, create tables, and implement basic data operations—all while following security best practices to protect against common vulnerabilities. + +## What you'll accomplish + +In this tutorial, you'll learn how to: + +- Configure your Windows app to use SQLite with the Microsoft.Data.SQLite library +- Create and initialize a local database +- Implement secure data insertion and retrieval methods +- Build a simple user interface to interact with your data + +## Prerequisites + +To complete this tutorial, you need: + +- Visual Studio 2022 or later with **WinUI application development** workload +- Basic familiarity with C# and XAML +- Understanding of fundamental database concepts + +## Key improvements this approach offers + +Using SQLite for local data storage in your Windows app offers several advantages: + +- Simplified deployment: No separate database server installation required +- Enhanced security: Data stays local on the user's device +- Improved performance: Direct file access eliminates network latency +- Reduced complexity: Single-file database simplifies backup and migration + +The techniques you'll learn apply to any Windows app that needs to store structured data locally, from simple settings storage to complex data management scenarios. + +> [!TIP] +> You can use AI assistance to help [avoid SQL injection attacks in SQLite](#avoid-sql-injection-attacks). + +## Benefits of SQLite for local storage :heavy_check_mark: SQLite is lightweight and self-contained. It's a code library without any other dependencies. There's nothing to configure. @@ -29,7 +64,7 @@ We recommend that you use either [Entity Framework Core](/ef/core/) or the open- ### Entity Framework Core -Entity Framework (EF) is an object-relational mapper that you can use to work with relational data by using domain-specific objects. If you've already used this framework to work with data in other .NET apps, you can use the same code in your Windows App SDK app and it will work with appropriate changes to the connection string. +Entity Framework (EF) is an object-relational mapper that you can use to work with relational data by using domain-specific objects. If you've already used this framework to work with data in other .NET apps, you can use the same code in your WinUI app and it will work with appropriate changes to the connection string. To try it out, see [Getting Started with EF Core](/ef/core/get-started/overview/first-app). @@ -39,9 +74,9 @@ The [Microsoft.Data.Sqlite](/dotnet/api/microsoft.data.sqlite) library implement The rest of this guide helps you to use this library. -## Set up your solution to use the Microsoft.Data.SQlite library +## Set up your solution to use the Microsoft.Data.SQLite library -We'll start with a basic Windows App SDK project, and then install the SQLite NuGet package. +We'll start with a basic WinUI project, and then install the SQLite NuGet package. See [Create a WinUI app](/windows/apps/tutorials/winui-notes/intro) for instructions on how to create your first WinUI project. All supported versions of Windows support SQLite, so your app does not have to package SQLite libraries. Instead, your app can use the version of SQLite that comes installed with Windows. This helps you in a few ways. @@ -53,15 +88,15 @@ All supported versions of Windows support SQLite, so your app does not have to p Let's start by adding a class to your project named **DataAccess**. If you plan to share your data access logic with other client code, you can use a .NET class library project to contain your data access code, but we won't use one in our example. -Right-click the solution, and then click **Manage NuGet Packages for Solution**. +1. Right-click the solution, and then click **Manage NuGet Packages for Solution**. -![A screenshot of Visual Studio's Solution Explorer with the project right-clicked and the Manage NuGet Packages option highlighted.](images/manage-nuget-2.png) + ![A screenshot of Visual Studio's Solution Explorer with the project right-clicked and the Manage NuGet Packages option highlighted.](images/manage-nuget-2.png) -At this point, you have a choice. You can use the version of SQLite that is included with Windows or if you have some reason to use a specific version of SQLite, you can include the SQLite library in your package. We are going to use the version of SQLite that's included with Windows. + At this point, you have a choice. You can use the version of SQLite that is included with Windows or if you have some reason to use a specific version of SQLite, you can include the SQLite library in your package. We are going to use the version of SQLite that's included with Windows. -Choose the **Browse** tab, search for the **Microsoft.Data.SQLite.Core** package, and then install the latest stable version. +1. Choose the **Browse** tab, search for the **Microsoft.Data.SQLite** package, and then install the latest stable version. -![SQLite Core package](images/sqlite-core-package.png) + ![SQLite NuGet package](images/sqlite-nuget-package.png) ## Add and retrieve data in a SQLite database @@ -81,8 +116,8 @@ We'll do these things: Open the `DataAccess` class in your project and make that class static. ->[!NOTE] ->While our example will place data access code in a static class, this is a design choice and is completely optional. +> [!NOTE] +> While the example will put your data access code in a static class, this is a design choice and is completely optional. ```csharp public static class DataAccess @@ -247,7 +282,19 @@ public MainWindow() That's it. Explore the [Microsoft.Data.Sqlite](/dotnet/api/microsoft.data.sqlite) to see what other things you can do with your SQLite database. Check out the links below to learn about other ways to use data in your Windows apps. -## Next steps +## Avoid SQL injection attacks + +The code in this example uses parameterized queries to prevent SQL injection attacks. Never concatenate user input into a SQL query string. Always use parameters. You can ask Copilot for more tips on avoiding SQL injection attacks. + +The following text shows an example prompt for Copilot: + +```copilot-prompt +Can you provide some best practices to avoid SQL injection attacks when writing SQLite queries in C# code? +``` + +Copilot is powered by AI, so surprises and mistakes are possible. For more information, see [Copilot FAQs](https://aka.ms/copilot-general-use-faqs). + +## Related content ### Connect your app directly to a SQL Server database diff --git a/hub/apps/develop/data-and-files.md b/hub/apps/develop/data-and-files.md index 5d89725062..9dff102dc2 100644 --- a/hub/apps/develop/data-and-files.md +++ b/hub/apps/develop/data-and-files.md @@ -47,8 +47,8 @@ The .NET SDK also provides APIs related to data and files scenarios for WPF and | Article | Description | |---------|-------------| -| [Resources in .NET apps](/dotnet/framework/resources/) | Learn general strategies for managing app resouces in .NET apps. | -| [Application resource, content, and data files (WPF)](/dotnet/framework/wpf/app-development/wpf-application-resource-content-and-data-files) | Learn how to manage app resouces in WPF apps. | +| [Resources in .NET apps](/dotnet/framework/resources/) | Learn general strategies for managing app resources in .NET apps. | +| [Application resource, content, and data files (WPF)](/dotnet/framework/wpf/app-development/wpf-application-resource-content-and-data-files) | Learn how to manage app resources in WPF apps. | | [Application settings (Windows Forms)](/dotnet/framework/winforms/advanced/application-settings-for-windows-forms) | Learn how to create, store, and maintain custom application and user preferences in Windows Forms apps. | | [LINQ](/dotnet/standard/linq/) | Learn how to use Language-Integrated Query (LINQ) to perform language-level data queries in .NET apps. | | [XML documents and data](/dotnet/standard/data/xml/) | Learn how to parse and write XML, edit XML data in memory, validate XML data, and perform XSLT transformations in .NET apps. | diff --git a/hub/apps/develop/data-binding/bind-to-hierarchical-data-and-create-a-master-details-view.md b/hub/apps/develop/data-binding/bind-to-hierarchical-data-and-create-a-master-details-view.md index 322484c741..c991be22a3 100644 --- a/hub/apps/develop/data-binding/bind-to-hierarchical-data-and-create-a-master-details-view.md +++ b/hub/apps/develop/data-binding/bind-to-hierarchical-data-and-create-a-master-details-view.md @@ -1,29 +1,30 @@ --- ms.assetid: 6c563dd4-3dd0-4175-a1ab-7a1103fc9559 -title: Bind hierarchical data and create a master/details view with Windows App SDK -description: You can make a multi-level master/details (also known as list-details) view of hierarchical data by binding items controls to CollectionViewSource instances that are bound together in a chain. -ms.date: 12/13/2022 -ms.topic: article +title: Bind hierarchical data and create a master/details view with WinUI +description: Create a multi-level master/details view of hierarchical data in WinUI by binding items controls to CollectionViewSource instances. Learn how to implement this structure. +ms.date: 11/11/2025 +ms.topic: how-to keywords: windows 10, windows 11, winui, windows app sdk, windows ui, xBind ms.localizationpriority: medium +# customer intent: As a Windows developer, I want to learn how to bind hierarchical data and create a master/details view with WinUI. --- -# Bind hierarchical data and create a master/details view with Windows App SDK +# Bind hierarchical data and create a master/details view with WinUI -> [!NOTE] -> Also see the [Master/detail UWP sample](https://github.com/Microsoft/Windows-universal-samples/tree/master/Samples/XamlMasterDetail). +Learn how to create a multilevel master/details view of hierarchical data in WinUI by binding items controls to [CollectionViewSource](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.data.collectionviewsource) instances. This article explains how to use the [{x:Bind} markup extension](/windows/apps/develop/platform/xaml/x-bind-markup-extension) for better performance and the [{Binding} markup extension](/windows/apps/develop/platform/xaml/binding-markup-extension) when flexibility is needed. -You can make a multi-level master/details (also known as list-details) view of hierarchical data by binding items controls to [**CollectionViewSource**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.data.collectionviewsource) instances that are bound together in a chain. In this topic we use the [{x:Bind} markup extension](/windows/uwp/xaml-platform/x-bind-markup-extension) where possible, and the more flexible (but less performant) [{Binding} markup extension](/windows/uwp/xaml-platform/binding-markup-extension) where necessary. +One common structure for WinUI apps is to navigate to different details pages when a user makes a selection in a master list. This structure is useful when you want to provide a rich visual representation of each item at every level in a hierarchy. Another option is to display multiple levels of data on a single page. This structure is useful when you want to display a few simple lists that let the user quickly drill down to an item of interest. This article describes how to implement this interaction. The [CollectionViewSource](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.data.collectionviewsource) instances keep track of the current selection at each hierarchical level. -One common structure for Windows App SDK apps is to navigate to different details pages when a user makes a selection in a master list. This is useful when you want to provide a rich visual representation of each item at every level in a hierarchy. Another option is to display multiple levels of data on a single page. This is useful when you want to display a few simple lists that let the user quickly drill down to an item of interest. This topic describes how to implement this interaction. The [**CollectionViewSource**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.data.collectionviewsource) instances keep track of the current selection at each hierarchical level. +You create a view of a sports team hierarchy that's organized into lists for leagues, divisions, and teams, and includes a team details view. When you select an item from any list, the subsequent views update automatically. -We'll create a view of a sports team hierarchy that is organized into lists for leagues, divisions, and teams, and includes a team details view. When you select an item from any list, the subsequent views update automatically. +:::image type="content" source="images/xaml-masterdetails.png" alt-text="Screenshot of a master/details view of a sports hierarchy. The view includes leagues, divisions, and teams."::: -![master/details view of a sports hierarchy](images/xaml-masterdetails.png) +> [!TIP] +> Also see the [Master/detail UWP sample](https://github.com/Microsoft/Windows-universal-samples/tree/master/Samples/XamlMasterDetail). ## Prerequisites -This topic assumes that you know how to create a basic Windows App SDK app. For instructions on creating your first Windows App SDK app, see [Create your first WinUI 3 (Windows App SDK) project](/windows/apps/winui/winui3/create-your-first-winui3-app). +This article assumes that you know how to create a basic WinUI app. For instructions on creating your first WinUI app, see [Create a WinUI app](/windows/apps/tutorials/winui-notes/intro). ## Create the project @@ -31,14 +32,11 @@ Create a new **Blank App, Packaged (WinUI 3 in Desktop)** project. Name it "Mast ## Create the data model -Add a new class to your project, name it **ViewModel.cs**, and add this code to it. This will be your binding source class. +Add a new class to your project, name it **ViewModel.cs**, and add this code to it. This class is your binding source class. ```cs -using System; using System.Collections.Generic; using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace MasterDetailsBinding { @@ -83,7 +81,7 @@ namespace MasterDetailsBinding return from y in Enumerable.Range(1, 3) select new Division { - Name = String.Format("Division {0}-{1}", x, y), + Name = string.Format("Division {0}-{1}", x, y), Teams = GetTeams(x, y).ToList() }; } @@ -93,7 +91,7 @@ namespace MasterDetailsBinding return from z in Enumerable.Range(1, 4) select new Team { - Name = String.Format("Team {0}-{1}-{2}", x, y, z), + Name = string.Format("Team {0}-{1}-{2}", x, y, z), Wins = 25 - (x * y * z), Losses = x * y * z }; @@ -104,7 +102,7 @@ namespace MasterDetailsBinding ## Create the view -Next, expose the binding source class from the class that represents your page of markup. We do that by adding a property of type `LeagueList` to **MainWindow**. +Next, expose the binding source class from the class that represents your page of markup. Add a property of type `LeagueList` to **MainWindow**. ```cs namespace MasterDetailsBinding @@ -113,7 +111,7 @@ namespace MasterDetailsBinding { public MainWindow() { - this.InitializeComponent(); + InitializeComponent(); ViewModel = new LeagueList(); } public LeagueList ViewModel { get; set; } @@ -121,7 +119,7 @@ namespace MasterDetailsBinding } ``` -Finally, replace the contents of the **MainWindow.xaml** file with the following markup, which declares three [**CollectionViewSource**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.data.collectionviewsource) instances and binds them together in a chain. The subsequent controls can then bind to the appropriate `CollectionViewSource`, depending on its level in the hierarchy. +Finally, replace the contents of the **MainWindow.xaml** file with the following markup. This markup declares three [**CollectionViewSource**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.data.collectionviewsource) instances and binds them together in a chain. The subsequent controls can then bind to the appropriate `CollectionViewSource`, depending on its level in the hierarchy. ``` xaml - - - - - - - - - - + + + + + + + + + + @@ -201,7 +199,7 @@ Finally, replace the contents of the **MainWindow.xaml** file with the following ``` -Note that by binding directly to the [**CollectionViewSource**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.data.collectionviewsource), you're implying that you want to bind to the current item in bindings where the path cannot be found on the collection itself. There's no need to specify the `CurrentItem` property as the path for the binding, although you can do that if there's any ambiguity. For example, the [**ContentControl**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.controls.contentcontrol) representing the team view has its [**Content**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.controls.contentcontrol.content) property bound to the `Teams` `CollectionViewSource`. However, the controls in the [**DataTemplate**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.datatemplate) bind to properties of the `Team` class because the `CollectionViewSource` automatically supplies the currently selected team from the teams list when necessary. +When you bind directly to the [**CollectionViewSource**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.data.collectionviewsource), you imply that you want to bind to the current item in bindings where the path can't be found on the collection itself. You don't need to specify the `CurrentItem` property as the path for the binding, although you can add it if there's any ambiguity. For example, the [**ContentControl**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.controls.contentcontrol) representing the team view has its [**Content**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.controls.contentcontrol.content) property bound to the `Teams` `CollectionViewSource`. However, the controls in the [**DataTemplate**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.datatemplate) bind to properties of the `Team` class because the `CollectionViewSource` automatically supplies the currently selected team from the teams list when necessary. ## See also diff --git a/hub/apps/develop/data-binding/data-binding-and-mvvm.md b/hub/apps/develop/data-binding/data-binding-and-mvvm.md index 06d38545ef..8dc5284a2d 100644 --- a/hub/apps/develop/data-binding/data-binding-and-mvvm.md +++ b/hub/apps/develop/data-binding/data-binding-and-mvvm.md @@ -1,37 +1,38 @@ --- ms.assetid: b7a8ec88-3013-4e5a-a110-fab3f20ee4bf title: Windows data binding and MVVM -description: Data binding is at the core of the Model-View-ViewModel (MVVM) UI architectural design pattern, and enables loose coupling between UI and non-UI code. -ms.date: 12/13/2022 -ms.topic: article +description: Learn how data binding in the Model-View-ViewModel (MVVM) pattern enables loose coupling between UI and non-UI code for better maintainability. +ms.date: 11/11/2025 +ms.topic: concept-article keywords: windows 10, windows 11, windows app sdk, winui, windows ui, mvvm ms.localizationpriority: medium +# customer intent: As a Windows developer, I want to learn how data binding in the Model-View-ViewModel (MVVM) pattern enables loose coupling between UI and non-UI code so that I can improve maintainability. --- # Windows data binding and MVVM -Model-View-ViewModel (MVVM) is a UI architectural design pattern for decoupling UI and non-UI code. With MVVM, you define your UI declaratively in XAML and use data binding markup to link it to other layers containing data and commands. The data binding infrastructure provides a loose coupling that keeps the UI and the linked data synchronized and routes user input to the appropriate commands. +Model-View-ViewModel (MVVM) is a UI architectural design pattern that decouples UI and non-UI code. Learn how MVVM enables loose coupling using data binding in XAML to synchronize UI and data, improving maintainability and reducing dependencies. -Because it provides loose coupling, the use of data binding reduces hard dependencies between different kinds of code. This makes it easier to change individual code units (methods, classes, controls, etc.) without causing unintended side effects in other units. This decoupling is an example of the *separation of concerns*, which is an important concept in many design patterns. +Because it provides loose coupling, the use of data binding reduces hard dependencies between different kinds of code. This approach makes it easier to change individual code units (methods, classes, controls, and so on) without causing unintended side effects in other units. This decoupling is an example of the *separation of concerns*, which is an important concept in many design patterns. ## Benefits of MVVM Decoupling your code has many benefits, including: * Enabling an iterative, exploratory coding style. Change that is isolated is less risky and easier to experiment with. -* Simplifying unit testing. Code units that are isolated from one another can be tested individually and outside of production environments. -* Supporting team collaboration. Decoupled code that adheres to well-designed interfaces can be developed by separate individuals or teams, and integrated later. +* Simplifying unit testing. You can test code units that are isolated from one another individually and outside of production environments. +* Supporting team collaboration. Separate individuals or teams can develop decoupled code that adheres to well-designed interfaces and integrate it later. * Improving maintainability. Fixing bugs in decoupled code is less likely to cause regressions in other code. -In contrast with MVVM, an app with a more conventional "code-behind" structure typically uses data binding for display-only data, and responds to user input by directly handling events exposed by controls. The event handlers are implemented in code-behind files (such as MainWindow.xaml.cs), and are often tightly coupled to the controls, typically containing code that manipulates the UI directly. This makes it difficult or impossible to replace a control without having to update the event handling code. With this architecture, code-behind files often accumulate code that isn't directly related to the UI, such as database-access code, which ends up being duplicated and modified for use with other windows. +In contrast with MVVM, an app with a more conventional "code-behind" structure typically uses data binding for display-only data. It responds to user input by directly handling events exposed by controls. The event handlers are implemented in code-behind files (such as MainWindow.xaml.cs) and are often tightly coupled to the controls. They typically contain code that manipulates the UI directly. This structure makes it difficult or impossible to replace a control without having to update the event handling code. With this architecture, code-behind files often accumulate code that isn't directly related to the UI, such as database-access code, which ends up being duplicated and modified for use with other windows. ## App layers -When using the MVVM pattern, an app is divided into the following layers: +When you use the MVVM pattern, divide your app into the following layers: -* The **model** layer defines the types that represent your business data. This includes everything required to model the core app domain, and often includes core app logic. This layer is completely independent of the view and view-model layers, and often resides partially in the cloud. Given a fully implemented model layer, you can create multiple different client apps if you so choose, such as Windows App SDK and web apps that work with the same underlying data. -* The **view** layer defines the UI using XAML markup. The markup includes data binding expressions (such as [x:Bind](/windows/uwp/xaml-platform/x-bind-markup-extension)) that define the connection between specific UI components and various view-model and model members. Code-behind files are sometimes used as part of the view layer to contain additional code needed to customize or manipulate the UI, or to extract data from event handler arguments before calling a view-model method that performs the work. -* The **view-model** layer provides data binding targets for the view. In many cases, the view-model exposes the model directly, or provides members that wrap specific model members. The view-model can also define members for keeping track of data that is relevant to the UI but not to the model, such as the display order of a list of items. The view-model also serves as an integration point with other services such as data access code. For simple projects, you might not need a separate model layer, but only a view-model that encapsulates all the data you need. +* The **model** layer defines the types that represent your business data. This layer includes everything required to model the core app domain and often includes core app logic. This layer is completely independent of the view and view-model layers and often resides partially in the cloud. Given a fully implemented model layer, you can create multiple different client apps if you choose, such as Windows App SDK and web apps that work with the same underlying data. +* The **view** layer defines the UI by using XAML markup. The markup includes data binding expressions (such as [x:Bind](/windows/apps/develop/platform/xaml/x-bind-markup-extension)) that define the connection between specific UI components and various view-model and model members. You can sometimes use code-behind files as part of the view layer to contain additional code needed to customize or manipulate the UI or to extract data from event handler arguments before calling a view-model method that performs the work. +* The **view-model** layer provides data binding targets for the view. In many cases, the view-model exposes the model directly or provides members that wrap specific model members. The view-model can also define members for keeping track of data that is relevant to the UI but not to the model, such as the display order of a list of items. The view-model also serves as an integration point with other services such as data access code. For simple projects, you might not need a separate model layer, but only a view-model that encapsulates all the data you need. ## Basic and advanced MVVM @@ -39,7 +40,7 @@ As with any design pattern, there is more than one way to implement MVVM, and ma Although sophisticated MVVM frameworks can be very useful, especially for enterprise-scale projects, there is typically a cost associated with adopting any particular pattern or technique, and the benefits are not always clear, depending on the scale and size of your project. Fortunately, you can adopt only those techniques that provide a clear and tangible benefit, and ignore others until you need them. -In particular, you can get a lot of benefit simply by understanding and applying the full power of data binding and separating your app logic into the layers described earlier. This can be achieved using only the capabilities provided by the Windows App SDK, and without using any external frameworks. In particular, the [{x:Bind} markup extension](/windows/uwp/xaml-platform/x-bind-markup-extension) makes data binding easier and higher performing than in previous XAML platforms, eliminating the need for a lot of the boilerplate code required earlier. +In particular, you can get a lot of benefit simply by understanding and applying the full power of data binding and separating your app logic into the layers described earlier. This can be achieved using only the capabilities provided by the Windows App SDK, and without using any external frameworks. In particular, the [{x:Bind} markup extension](/windows/apps/develop/platform/xaml/x-bind-markup-extension) makes data binding easier and higher performing than in previous XAML platforms, eliminating the need for a lot of the boilerplate code required earlier. For additional guidance on using basic, out-of-the-box MVVM, check out the [Customers Orders Database UWP sample](https://github.com/Microsoft/Windows-appsample-customers-orders-database) on GitHub. Many of the other [UWP app samples](https://github.com/Microsoft?q=windows-appsample ) also use a basic MVVM architecture, and the [Traffic App UWP sample](https://github.com/Microsoft/Windows-appsample-trafficapp) includes both code-behind and MVVM versions, with notes describing the [MVVM conversion](https://github.com/Microsoft/Windows-appsample-trafficapp/blob/MVVM/MVVM.md). @@ -49,7 +50,7 @@ For additional guidance on using basic, out-of-the-box MVVM, check out the [Cust ### Topics [Data binding in depth](data-binding-in-depth.md) -[{x:Bind} markup extension](/windows/uwp/xaml-platform/x-bind-markup-extension) +[{x:Bind} markup extension](/windows/apps/develop/platform/xaml/x-bind-markup-extension) ### UWP MVVM Samples diff --git a/hub/apps/develop/data-binding/data-binding-in-depth.md b/hub/apps/develop/data-binding/data-binding-in-depth.md index db33a384be..bf1c1448c3 100644 --- a/hub/apps/develop/data-binding/data-binding-in-depth.md +++ b/hub/apps/develop/data-binding/data-binding-in-depth.md @@ -1,64 +1,65 @@ --- ms.assetid: 2a50c798-6244-4fda-9091-a10a9e87fae2 title: Windows data binding in depth -description: Learn how to use data binding in Windows App SDK applications -ms.date: 12/12/2022 -ms.topic: article +description: Learn how to use data binding in WinUI applications to simplify UI development and improve app maintainability. +ms.date: 11/11/2025 +ms.topic: concept-article keywords: windows 10, windows 11, windows app sdk, winui, windows ui ms.localizationpriority: medium dev_langs: - csharp - cppwinrt +# customer intent: As a Windows developer, I want to understand data binding in depth so that I can effectively use it in my WinUI applications. --- # Windows data binding in depth -In this article, we will describe the Windows App SDK data binding features for the APIs that reside in the [**Microsoft.UI.Xaml.Data** namespace](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.data). +This article describes the WinUI data binding features using the APIs in the [Microsoft.UI.Xaml.Data namespace](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.data). > [!NOTE] > This topic describes data binding features in detail. For a short, practical introduction, see [Data binding overview](data-binding-overview.md). ## Important APIs -- [**{x:Bind} markup extension**](/windows/uwp/xaml-platform/x-bind-markup-extension) -- [**Binding class**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.data.binding) -- [**DataContext**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.frameworkelement.datacontext) -- [**INotifyPropertyChanged**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.data.inotifypropertychanged) +- [{x:Bind} markup extension](/windows/apps/develop/platform/xaml/x-bind-markup-extension) +- [Binding class](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.data.binding) +- [DataContext](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.frameworkelement.datacontext) +- [INotifyPropertyChanged](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.data.inotifypropertychanged) ## Introduction -Data binding is a way for your app's UI to display data, and optionally to stay in sync with that data. Data binding allows you to separate the concern of data from the concern of UI, and that results in a simpler conceptual model as well as better readability, testability, and maintainability of your app. +Data binding is a technique that allows your app's UI to display and synchronize data efficiently. By separating data concerns from UI concerns, it simplifies app design, enhances readability, and improves maintainability. -You can use data binding to simply display values from a data source when the UI is first shown, but not to respond to changes in those values. This is a mode of binding called *one-time*, and it works well for a value that doesn't change during run-time. Alternatively, you can choose to "observe" the values and to update the UI when they change. This mode is called *one-way*, and it works well for read-only data. Ultimately, you can choose to both observe and update, so that changes that the user makes to values in the UI are automatically pushed back into the data source. This mode is called *two-way*, and it works well for read-write data. Here are some examples. +You can use data binding to simply display values from a data source when the UI is first shown, but not to respond to changes in those values. This mode of binding is called *one-time*, and it works well for a value that doesn't change during run-time. Alternatively, you can choose to "observe" the values and to update the UI when they change. This mode is called *one-way*, and it works well for read-only data. Ultimately, you can choose to both observe and update, so that changes that the user makes to values in the UI are automatically pushed back into the data source. This mode is called *two-way*, and it works well for read-write data. Here are some examples. -- You could use the one-time mode to bind an [**Image**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.controls.image) to the current user's photo. -- You could use the one-way mode to bind a [**ListView**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.controls.listview) to a collection of real-time news articles grouped by newspaper section. -- You could use the two-way mode to bind a [**TextBox**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.controls.textbox) to a customer's name in a form. +- You could use the one-time mode to bind an [Image](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.controls.image) to the current user's photo. +- You could use the one-way mode to bind a [ListView](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.controls.listview) to a collection of real-time news articles grouped by newspaper section. +- You could use the two-way mode to bind a [TextBox](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.controls.textbox) to a customer's name in a form. -Independent of mode, there are two kinds of binding, and they're both typically declared in UI markup. You can choose to use either the [{x:Bind} markup extension](/windows/uwp/xaml-platform/x-bind-markup-extension) or the [{Binding} markup extension](/windows/uwp/xaml-platform/binding-markup-extension). And you can even use a mixture of the two in the same app—even on the same UI element. `{x:Bind}` was new in UWP for Windows 10 and it has better performance. All the details described in this topic apply to both kinds of binding unless we explicitly say otherwise. +Independent of mode, there are two kinds of binding, and you typically declare both in UI markup. You can choose to use either the [{x:Bind} markup extension](/windows/apps/develop/platform/xaml/x-bind-markup-extension) or the [{Binding} markup extension](/windows/apps/develop/platform/xaml/binding-markup-extension). You can even use a mixture of the two in the same app—even on the same UI element. `{x:Bind}` was new in UWP for Windows 10 and it has better performance. All the details described in this topic apply to both kinds of binding unless we explicitly say otherwise. -### UWP Sample apps that demonstrate {x:Bind} +### UWP sample apps that demonstrate {x:Bind} - [{x:Bind} sample](https://github.com/Microsoft/Windows-universal-samples/tree/master/Samples/XamlBind). - [QuizGame](https://github.com/microsoft/Windows-appsample-networkhelper). - [XAML UI Basics sample](https://github.com/Microsoft/Windows-universal-samples/tree/master/Samples/XamlUIBasics). -### UWP Sample apps that demonstrate {Binding} +### UWP sample apps that demonstrate {Binding} - Download the [UWP Bookstore1](https://codeload.github.com/MicrosoftDocs/windows-topic-specific-samples/zip/Bookstore1Universal_10) app. - Download the [Bookstore2](https://codeload.github.com/MicrosoftDocs/windows-topic-specific-samples/zip/Bookstore2Universal_10) app. ## Every binding involves these pieces -- A *binding source*. This is the source of the data for the binding, and it can be an instance of any class that has members whose values you want to display in your UI. -- A *binding target*. This is a [**DependencyProperty**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.dependencyproperty) of the [**FrameworkElement**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.frameworkelement) in your UI that displays the data. -- A *binding object*. This is the piece that transfers data values from the source to the target, and optionally from the target back to the source. The binding object is created at XAML load time from your [{x:Bind}](/windows/uwp/xaml-platform/x-bind-markup-extension) or [{Binding}](/windows/uwp/xaml-platform/binding-markup-extension) markup extension. +- A *binding source*. This source provides the data for the binding. It can be an instance of any class that has members whose values you want to display in your UI. +- A *binding target*. This target is a [DependencyProperty](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.dependencyproperty) of the [FrameworkElement](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.frameworkelement) in your UI that displays the data. +- A *binding object*. This object transfers data values from the source to the target, and optionally from the target back to the source. The binding object is created at XAML load time from your [{x:Bind}](/windows/apps/develop/platform/xaml/x-bind-markup-extension) or [{Binding}](/windows/apps/develop/platform/xaml/binding-markup-extension) markup extension. -In the following sections, we'll take a closer look at the binding source, the binding target, and the binding object. And we'll link the sections together with the example of binding a button's content to a string property named `NextButtonText`, which belongs to a class named `HostViewModel`. +In the following sections, you take a closer look at the binding source, the binding target, and the binding object. The sections link together with the example of binding a button's content to a string property named `NextButtonText`, which belongs to a class named `HostViewModel`. ### Binding source -Here's a very rudimentary implementation of a class that we could use as a binding source. +Here's a basic implementation of a class that you can use as a binding source. ``` csharp public class HostViewModel @@ -72,11 +73,11 @@ public class HostViewModel } ``` -That implementation of `HostViewModel`, and its property `NextButtonText`, are only appropriate for one-time binding. But one-way and two-way bindings are extremely common, and in those kinds of binding the UI automatically updates in response to changes in the data values of the binding source. In order for those kinds of binding to work correctly, you need to make your binding source *observable* to the binding object. So in our example, if we want to one-way or two-way bind to the `NextButtonText` property, then any changes that happen at run-time to the value of that property need to be made observable to the binding object. +That implementation of `HostViewModel`, and its property `NextButtonText`, work only for one-time binding. But one-way and two-way bindings are extremely common. In those kinds of binding, the UI automatically updates in response to changes in the data values of the binding source. For those kinds of binding to work correctly, you need to make your binding source *observable* to the binding object. So in our example, if you want to one-way or two-way bind to the `NextButtonText` property, then any changes that happen at run-time to the value of that property need to be observable to the binding object. -One way of doing that is to derive the class that represents your binding source from [**DependencyObject**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.dependencyobject), and expose a data value through a [**DependencyProperty**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.dependencyproperty). That's how a [**FrameworkElement**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.frameworkelement) becomes observable. A `FrameworkElement` is a good binding source right out of the box. +One way to do that is to derive the class that represents your binding source from [DependencyObject](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.dependencyobject), and expose a data value through a [DependencyProperty*](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.dependencyproperty). That's how a [FrameworkElement](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.frameworkelement) becomes observable. A `FrameworkElement` is a good binding source right out of the box. -A more lightweight way of making a class observable—and a necessary one for classes that already have a base class—is to implement [**System.ComponentModel.INotifyPropertyChanged**](/dotnet/api/system.componentmodel.inotifypropertychanged). This really just involves implementing a single event named `PropertyChanged`. An example using `HostViewModel` is below. +A more lightweight way of making a class observable—and a necessary one for classes that already have a base class—is to implement [System.ComponentModel.INotifyPropertyChanged](/dotnet/api/system.componentmodel.inotifypropertychanged). This approach involves implementing a single event named `PropertyChanged`. An example using `HostViewModel` is shown in the following code. ``` csharp ... @@ -112,9 +113,9 @@ public class HostViewModel : INotifyPropertyChanged } ``` -Now the `NextButtonText` property is observable. When you author a one-way or a two-way binding to that property (we'll show how later), the resulting binding object subscribes to the `PropertyChanged` event. When that event is raised, the binding object's handler receives an argument containing the name of the property that has changed. That's how the binding object knows which property's value to go and read again. +Now the `NextButtonText` property is observable. When you author a one-way or a two-way binding to that property (we'll show how later), the resulting binding object subscribes to the `PropertyChanged` event. When that event is raised, the binding object's handler receives an argument containing the name of the property that changed. That's how the binding object knows which property's value to read again. -So that you don't have to implement the pattern shown above multiple times, if you're using C# then you can just derive from the `BindableBase` base class that you'll find in the [QuizGame](https://github.com/microsoft/Windows-appsample-networkhelper) sample (in the "Common" folder). Here's an example of how that looks. +So that you don't have to implement the pattern shown earlier multiple times, if you're using C#, you can derive from the `BindableBase` base class that you'll find in the [QuizGame](https://github.com/microsoft/Windows-appsample-networkhelper) sample (in the "Common" folder). Here's an example of how that looks. ``` csharp public class HostViewModel : BindableBase @@ -134,25 +135,25 @@ public class HostViewModel : BindableBase } ``` -Raising the `PropertyChanged` event with an argument of [**String.Empty**](/dotnet/api/system.string.empty) or `null` indicates that all non-indexer properties on the object should be re-read. You can raise the event to indicate that indexer properties on the object have changed by using an argument of "Item\[*indexer*\]" for specific indexers (where *indexer* is the index value), or a value of "Item\[\]" for all indexers. +Raising the `PropertyChanged` event with an argument of [String.Empty](/dotnet/api/system.string.empty) or `null` indicates that all non-indexer properties on the object should be re-read. You can raise the event to indicate that indexer properties on the object have changed by using an argument of "Item\[*indexer*\]" for specific indexers (where *indexer* is the index value), or a value of "Item\[\]" for all indexers. -A binding source can be treated either as a single object whose properties contain data, or as a collection of objects. In C# code, you can one-time bind to an object that implements [**List<T>**](/dotnet/api/system.collections.generic.list-1) to display a collection that doesn't change at run-time. For an observable collection (observing when items are added to and removed from the collection), one-way bind to [**ObservableCollection<T>**](/dotnet/api/system.collections.objectmodel.observablecollection-1) instead. To bind to your own collection classes, use the guidance in the following table. +You can treat a binding source either as a single object whose properties contain data, or as a collection of objects. In C# code, you can one-time bind to an object that implements [**List<T>**](/dotnet/api/system.collections.generic.list-1) to display a collection that doesn't change at run-time. For an observable collection (observing when items are added to and removed from the collection), one-way bind to [ObservableCollection<T>](/dotnet/api/system.collections.objectmodel.observablecollection-1) instead. To bind to your own collection classes, use the guidance in the following table. | Scenario | C# (CLR) | C++/WinRT | |-|-|-| | Bind to an object. | Can be any object. | Can be any object. | -| Get property change notifications from a bound object. | Object must implement [**INotifyPropertyChanged**](/dotnet/api/system.componentmodel.inotifypropertychanged). | Object must implement [**INotifyPropertyChanged**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.data.inotifypropertychanged). | -| Bind to a collection. | [**List<T>**](/dotnet/api/system.collections.generic.list-1) | [**IVector**](/uwp/api/windows.foundation.collections.ivector_t_) of [**IInspectable**](/windows/win32/api/inspectable/nn-inspectable-iinspectable), or [**IBindableObservableVector**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.interop.ibindableobservablevector). See [XAML items controls; bind to a C++/WinRT collection](/windows/uwp/cpp-and-winrt-apis/binding-collection) and [Collections with C++/WinRT](/windows/uwp/cpp-and-winrt-apis/collections). | -| Get collection change notifications from a bound collection. | [**ObservableCollection<T>**](/dotnet/api/system.collections.objectmodel.observablecollection-1)|[**IObservableVector**](/uwp/api/windows.foundation.collections.iobservablevector_t_) of [**IInspectable**](/windows/win32/api/inspectable/nn-inspectable-iinspectable). For example, [**winrt::single_threaded_observable_vector<T>**](/uwp/cpp-ref-for-winrt/single-threaded-observable-vector). | -| Implement a collection that supports binding. | Extend [**List<T>**](/dotnet/api/system.collections.generic.list-1) or implement [**IList**](/dotnet/api/system.collections.ilist), [**IList**](/dotnet/api/system.collections.generic.ilist-1)<[**Object**](/dotnet/api/system.object)>, [**IEnumerable**](/dotnet/api/system.collections.ienumerable), or [**IEnumerable**](/dotnet/api/system.collections.generic.ienumerable-1)<Object>. Binding to generic `IList` and `IEnumerable` is not supported. | Implement [**IVector**](/uwp/api/windows.foundation.collections.ivector_t_) of [**IInspectable**](/windows/win32/api/inspectable/nn-inspectable-iinspectable). See [XAML items controls; bind to a C++/WinRT collection](/windows/uwp/cpp-and-winrt-apis/binding-collection) and [Collections with C++/WinRT](/windows/uwp/cpp-and-winrt-apis/collections). | -| Implement a collection that supports collection change notifications. | Extend [**ObservableCollection<T>**](/dotnet/api/system.collections.objectmodel.observablecollection-1) or implement (non-generic) [**IList**](/dotnet/api/system.collections.ilist) and [**INotifyCollectionChanged**](/dotnet/api/system.collections.specialized.inotifycollectionchanged). | Implement [**IObservableVector**](/uwp/api/windows.foundation.collections.iobservablevector_t_) of [**IInspectable**](/windows/win32/api/inspectable/nn-inspectable-iinspectable), or [**IBindableObservableVector**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.interop.ibindableobservablevector). | -| Implement a collection that supports incremental loading. | Extend [**ObservableCollection<T>**](/dotnet/api/system.collections.objectmodel.observablecollection-1) or implement (non-generic) [**IList**](/dotnet/api/system.collections.ilist) and [**INotifyCollectionChanged**](/dotnet/api/system.collections.specialized.inotifycollectionchanged). Additionally, implement [**ISupportIncrementalLoading**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.data.isupportincrementalloading). | Implement [**IObservableVector**](/uwp/api/windows.foundation.collections.iobservablevector_t_) of [**IInspectable**](/windows/win32/api/inspectable/nn-inspectable-iinspectable), or [**IBindableObservableVector**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.interop.ibindableobservablevector). Additionally, implement [**ISupportIncrementalLoading**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.data.isupportincrementalloading) | +| Get property change notifications from a bound object. | Object must implement [INotifyPropertyChanged](/dotnet/api/system.componentmodel.inotifypropertychanged). | Object must implement [INotifyPropertyChanged](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.data.inotifypropertychanged). | +| Bind to a collection. | [List<T>](/dotnet/api/system.collections.generic.list-1) | [IVector](/uwp/api/windows.foundation.collections.ivector_t_) of [IInspectable](/windows/win32/api/inspectable/nn-inspectable-iinspectable), or [IBindableObservableVector](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.interop.ibindableobservablevector). See [XAML items controls; bind to a C++/WinRT collection](/windows/uwp/cpp-and-winrt-apis/binding-collection) and [Collections with C++/WinRT](/windows/uwp/cpp-and-winrt-apis/collections). | +| Get collection change notifications from a bound collection. | [ObservableCollection<T>](/dotnet/api/system.collections.objectmodel.observablecollection-1)|[IObservableVector](/uwp/api/windows.foundation.collections.iobservablevector_t_) of [IInspectable](/windows/win32/api/inspectable/nn-inspectable-iinspectable). For example, [winrt::single_threaded_observable_vector<T>](/uwp/cpp-ref-for-winrt/single-threaded-observable-vector). | +| Implement a collection that supports binding. | Extend [List<T>](/dotnet/api/system.collections.generic.list-1) or implement [IList](/dotnet/api/system.collections.ilist), [IList](/dotnet/api/system.collections.generic.ilist-1)<[Object](/dotnet/api/system.object)>, [IEnumerable](/dotnet/api/system.collections.ienumerable), or [IEnumerable](/dotnet/api/system.collections.generic.ienumerable-1)<Object>. Binding to generic `IList` and `IEnumerable` isn't supported. | Implement [IVector](/uwp/api/windows.foundation.collections.ivector_t_) of [IInspectable](/windows/win32/api/inspectable/nn-inspectable-iinspectable). See [XAML items controls; bind to a C++/WinRT collection](/windows/uwp/cpp-and-winrt-apis/binding-collection) and [Collections with C++/WinRT](/windows/uwp/cpp-and-winrt-apis/collections). | +| Implement a collection that supports collection change notifications. | Extend [ObservableCollection<T>](/dotnet/api/system.collections.objectmodel.observablecollection-1) or implement (non-generic) [IList](/dotnet/api/system.collections.ilist) and [INotifyCollectionChanged](/dotnet/api/system.collections.specialized.inotifycollectionchanged). | Implement [IObservableVector](/uwp/api/windows.foundation.collections.iobservablevector_t_) of [IInspectable](/windows/win32/api/inspectable/nn-inspectable-iinspectable), or [IBindableObservableVector](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.interop.ibindableobservablevector). | +| Implement a collection that supports incremental loading. | Extend [ObservableCollection<T>](/dotnet/api/system.collections.objectmodel.observablecollection-1) or implement (non-generic) [IList](/dotnet/api/system.collections.ilist) and [INotifyCollectionChanged](/dotnet/api/system.collections.specialized.inotifycollectionchanged). Additionally, implement [ISupportIncrementalLoading](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.data.isupportincrementalloading). | Implement [IObservableVector](/uwp/api/windows.foundation.collections.iobservablevector_t_) of [IInspectable](/windows/win32/api/inspectable/nn-inspectable-iinspectable), or [IBindableObservableVector](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.interop.ibindableobservablevector). Additionally, implement [ISupportIncrementalLoading](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.data.isupportincrementalloading) | -You can bind list controls to arbitrarily large data sources, and still achieve high performance, by using incremental loading. For example, you can bind list controls to Bing image query results without having to load all the results at once. Instead, you load only some results immediately, and load additional results as needed. To support incremental loading, you must implement [**ISupportIncrementalLoading**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.data.isupportincrementalloading) on a data source that supports collection change notifications. When the data binding engine requests more data, your data source must make the appropriate requests, integrate the results, and then send the appropriate notifications in order to update the UI. +You can bind list controls to arbitrarily large data sources, and still achieve high performance, by using incremental loading. For example, you can bind list controls to Bing image query results without having to load all the results at once. Instead, you load only some results immediately, and load additional results as needed. To support incremental loading, you must implement [ISupportIncrementalLoading](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.data.isupportincrementalloading) on a data source that supports collection change notifications. When the data binding engine requests more data, your data source must make the appropriate requests, integrate the results, and then send the appropriate notifications in order to update the UI. ### Binding target -In the two examples below, the `Button.Content` property is the binding target, and its value is set to a markup extension that declares the binding object. First [{x:Bind}](/windows/uwp/xaml-platform/x-bind-markup-extension) is shown, and then [{Binding}](/windows/uwp/xaml-platform/binding-markup-extension). Declaring bindings in markup is the common case (it's convenient, readable, and toolable). But you can avoid markup and imperatively (programmatically) create an instance of the [**Binding**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.data.binding) class instead if you need to. +In the following two examples, the `Button.Content` property is the binding target. Its value is set to a markup extension that declares the binding object. The first example shows [{x:Bind}](/windows/apps/develop/platform/xaml/x-bind-markup-extension), and the second example shows [{Binding}](/windows/apps/develop/platform/xaml/binding-markup-extension). Declaring bindings in markup is the common case because it's convenient, readable, and toolable. But if you need to, you can avoid markup and imperatively (programmatically) create an instance of the [Binding](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.data.binding) class instead. ``` xaml ``` +> [!NOTE] +> Keyboard accelerators are implemented as virtual-keys. Localized accelerators must be chosen from the predefined collection of [Virtual-Key codes](/windows/win32/inputdev/virtual-key-codes) (otherwise, a XAML parser error will occur). + ### Setup an accelerator programmatically Here is an example of programmatically defining an accelerator: @@ -634,8 +639,8 @@ public class MyListView : ListView ## Related articles -- [Keyboard interactions](keyboard-interactions.md) -- [Access keys](access-keys.md) +- [Keyboard interactions](../../design/input/keyboard-interactions.md) +- [Access keys](../../design/input/access-keys.md) - [VirtualKey Enum](/uwp/api/windows.system.virtualkey) ### Samples diff --git a/hub/apps/develop/input/keyboard-events.md b/hub/apps/develop/input/keyboard-events.md new file mode 100644 index 0000000000..64b6754974 --- /dev/null +++ b/hub/apps/develop/input/keyboard-events.md @@ -0,0 +1,407 @@ +--- +description: Respond to keystroke actions from hardware or software keyboards in your apps using both keyboard and class event handlers. +title: Keyboard events +ms.assetid: ac500772-d6ed-4a3a-825b-210a9c3c8f59 +label: Keyboard events +template: detail.hbs +keywords: keyboard, gamepad, remote, accessibility, navigation, focus, text, input, user interactions, key up, key down +ms.date: 07/09/2021 +ms.topic: article +pm-contact: chigy +design-contact: kimsea +dev-contact: niallm +doc-status: Published +ms.localizationpriority: medium +--- +# Keyboard events + +## Keyboard events and focus + +The following keyboard events can occur for both hardware and touch keyboards. + +| Event | Description | +|--------------------------------------------|--------------------------------| +| [**KeyDown**](/uwp/api/windows.ui.xaml.uielement.keydown) | Occurs when a key is pressed. | +| [**KeyUp**](/uwp/api/windows.ui.xaml.uielement.keyup) | Occurs when a key is released. | + +> [!IMPORTANT] +> Some XAML controls handle input events internally. In these cases, it might appear that an input event doesn't occur because your event listener doesn't invoke the associated handler. Typically, this subset of keys is processed by the class handler to provide built in support of basic keyboard accessibility. For example, the [**Button**](/uwp/api/Windows.UI.Xaml.Controls.Button) class overrides the [**OnKeyDown**](/uwp/api/windows.ui.xaml.controls.control.onkeydown) events for both the Space key and the Enter key (as well as [**OnPointerPressed**](/uwp/api/windows.ui.xaml.controls.control.onpointerpressed)) and routes them to the [**Click**](/uwp/api/windows.ui.xaml.controls.primitives.buttonbase.click) event of the control. When a key press is handled by the control class, the [**KeyDown**](/uwp/api/windows.ui.xaml.uielement.keydown) and [**KeyUp**](/uwp/api/windows.ui.xaml.uielement.keyup) events are not raised. +> This provides a built-in keyboard equivalent for invoking the button, similar to tapping it with a finger or clicking it with a mouse. Keys other than Space or Enter still fire [**KeyDown**](/uwp/api/windows.ui.xaml.uielement.keydown) and [**KeyUp**](/uwp/api/windows.ui.xaml.uielement.keyup) events. For more info about how class-based handling of events works (specifically, the "Input event handlers in controls" section), see [Events and routed events overview](/windows/apps/develop/platform/xaml/events-and-routed-events-overview). + + +Controls in your UI generate keyboard events only when they have input focus. An individual control gains focus when the user clicks or taps directly on that control in the layout, or uses the Tab key to step into a tab sequence within the content area. + +You can also call a control's [**Focus**](/uwp/api/windows.ui.xaml.controls.control.focus) method to force focus. This is necessary when you implement shortcut keys, because keyboard focus is not set by default when your UI loads. For more info, see the **Shortcut keys example** later in this topic. + +For a control to receive input focus, it must be enabled, visible, and have [**IsTabStop**](/uwp/api/windows.ui.xaml.controls.control.istabstop) and [**HitTestVisible**](/uwp/api/windows.ui.xaml.uielement.ishittestvisible) property values of **true**. This is the default state for most controls. When a control has input focus, it can raise and respond to keyboard input events as described later in this topic. You can also respond to a control that is receiving or losing focus by handling the [**GotFocus**](/uwp/api/windows.ui.xaml.uielement.gotfocus) and [**LostFocus**](/uwp/api/windows.ui.xaml.uielement.lostfocus) events. + +By default, the tab sequence of controls is the order in which they appear in the Extensible Application Markup Language (XAML). However, you can modify this order by using the [**TabIndex**](/uwp/api/windows.ui.xaml.controls.control.tabindex) property. For more info, see [Implementing keyboard accessibility](/previous-versions/windows/apps/hh868161(v=win.10)). + +## Keyboard event handlers + +An input event handler implements a delegate that provides the following information: + +- The sender of the event. The sender reports the object where the event handler is attached. +- Event data. For keyboard events, that data will be an instance of [**KeyRoutedEventArgs**](/uwp/api/Windows.UI.Xaml.Input.KeyRoutedEventArgs). The delegate for handlers is [**KeyEventHandler**](/uwp/api/windows.ui.xaml.input.keyeventhandler). The most relevant properties of **KeyRoutedEventArgs** for most handler scenarios are [**Key**](/uwp/api/windows.ui.xaml.input.keyroutedeventargs.key) and possibly [**KeyStatus**](/uwp/api/windows.ui.xaml.input.keyroutedeventargs.keystatus). +- [**OriginalSource**](/uwp/api/windows.ui.xaml.routedeventargs.originalsource). Because the keyboard events are routed events, the event data provides **OriginalSource**. If you deliberately allow events to bubble up through an object tree, **OriginalSource** is sometimes the object of concern rather than sender. However, that depends on your design. For more information about how you might use **OriginalSource** rather than sender, see the "Keyboard Routed Events" section of this topic, or [Events and routed events overview](/windows/apps/develop/platform/xaml/events-and-routed-events-overview). + + +### Attaching a keyboard event handler + +You can attach keyboard event-handler functions for any object that includes the event as a member. This includes any [**UIElement**](/uwp/api/Windows.UI.Xaml.UIElement) derived class. The following XAML example shows how to attach handlers for the [**KeyUp**](/uwp/api/windows.ui.xaml.uielement.keyup) event for a [**Grid**](/uwp/api/Windows.UI.Xaml.Controls.Grid). + +```xaml + + ... + +``` + +You can also attach an event handler in code. For more info, see [Events and routed events overview](/windows/apps/develop/platform/xaml/events-and-routed-events-overview). + +### Defining a keyboard event handler + +The following example shows the incomplete event handler definition for the [**KeyUp**](/uwp/api/windows.ui.xaml.uielement.keyup) event handler that was attached in the preceding example. + +```csharp +void Grid_KeyUp(object sender, KeyRoutedEventArgs e) +{ + //handling code here +} +``` + +```vb +Private Sub Grid_KeyUp(ByVal sender As Object, ByVal e As KeyRoutedEventArgs) + ' handling code here +End Sub +``` + +```c++ +void MyProject::MainPage::Grid_KeyUp( + Platform::Object^ sender, + Windows::UI::Xaml::Input::KeyRoutedEventArgs^ e) + { + //handling code here + } +``` + +### Using KeyRoutedEventArgs + +All keyboard events use [**KeyRoutedEventArgs**](/uwp/api/Windows.UI.Xaml.Input.KeyRoutedEventArgs) for event data, and **KeyRoutedEventArgs** contains the following properties: + +- [**Key**](/uwp/api/windows.ui.xaml.input.keyroutedeventargs.key) +- [**KeyStatus**](/uwp/api/windows.ui.xaml.input.keyroutedeventargs.keystatus) +- [**Handled**](/uwp/api/windows.ui.xaml.input.keyroutedeventargs.handled) +- [**OriginalSource**](/uwp/api/windows.ui.xaml.routedeventargs.originalsource) (inherited from [**RoutedEventArgs**](/uwp/api/Windows.UI.Xaml.RoutedEventArgs)) + +### Virtual keys + +The [**KeyDown**](/uwp/api/windows.ui.xaml.uielement.keydown) event is raised if a key is pressed. Likewise, [**KeyUp**](/uwp/api/windows.ui.xaml.uielement.keyup) is raised if a key is released. Usually, you listen to the events to process a specific key value. To determine which key is pressed or released, check the [**Key**](/uwp/api/windows.ui.xaml.input.keyroutedeventargs.key) value in the event data. **Key** returns a [**VirtualKey**](/uwp/api/Windows.System.VirtualKey) value. The **VirtualKey** enumeration includes all the supported keys. + +### Modifier keys + +Modifier keys are keys such as Ctrl or Shift that users typically press in combination with other keys. Your app can use these combinations as custom keyboard shortcuts to invoke app commands. + +> [!NOTE] +> For built-in keyboard shortcuts, see [Access keys](../../design/input/access-keys.md) and [Keyboard accelerators](../../design/input/keyboard-accelerators.md). + +You can detect shortcut key combinations in the [**KeyDown**](/uwp/api/windows.ui.xaml.uielement.keydown) and [**KeyUp**](/uwp/api/windows.ui.xaml.uielement.keyup) event handlers. When a keyboard event occurs for a non-modifier key, you can then check whether a modifier key is in the pressed state. + +Alternatively, the [**GetKeyState()**](/uwp/api/windows.ui.core.corewindow.getkeystate) function of the [**CoreWindow**](/uwp/api/windows.ui.core.corewindow) (obtained through [**CoreWindow.GetForCurrentThread()**](/uwp/api/windows.ui.core.corewindow.getforcurrentthread)) can also be used to check modifier state when a non-modifier key is pressed. + +The following examples implement this second method while also including stub code for the first implementation. + +> [!NOTE] +> The Alt key is represented by the **VirtualKey.Menu** value. + +### Shortcut keys example + +The following example demonstrates how to implement a set of custom shortcut keys. In this example, users can control media playback using Play, Pause, and Stop buttons or Ctrl+P, Ctrl+A, and Ctrl+S keyboard shortcuts. The button XAML shows the shortcuts by using tooltips and [**AutomationProperties**](/uwp/api/Windows.UI.Xaml.Automation.AutomationProperties) properties in the button labels. This self-documentation is important to increase the usability and accessibility of your app. For more info, see [Keyboard accessibility](../../design/accessibility/keyboard-accessibility.md). + +Note also that the page sets input focus to itself when it is loaded. Without this step, no control has initial input focus, and the app does not raise input events until the user sets the input focus manually (for example, by tabbing to or clicking a control). + +```xaml + + + + + + + + + + + + + + + + + + + + +``` + +```c++ +//showing implementations but not header definitions +void MainPage::OnNavigatedTo(NavigationEventArgs^ e) +{ + (void) e; // Unused parameter + this->Loaded+=ref new RoutedEventHandler(this,&MainPage::ProgrammaticFocus); +} +void MainPage::ProgrammaticFocus(Object^ sender, RoutedEventArgs^ e) +{ + this->Focus(Windows::UI::Xaml::FocusState::Programmatic); +} + +void KeyboardSupport::MainPage::MediaButton_Click(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e) +{ + FrameworkElement^ fe = safe_cast(sender); + if (fe->Name == "PlayButton") {DemoMovie->Play();} + if (fe->Name == "PauseButton") {DemoMovie->Pause();} + if (fe->Name == "StopButton") {DemoMovie->Stop();} +} + + +bool KeyboardSupport::MainPage::IsCtrlKeyPressed() +{ + auto ctrlState = CoreWindow::GetForCurrentThread()->GetKeyState(VirtualKey::Control); + return (ctrlState & CoreVirtualKeyStates::Down) == CoreVirtualKeyStates::Down; +} + +void KeyboardSupport::MainPage::Grid_KeyDown(Platform::Object^ sender, Windows::UI::Xaml::Input::KeyRoutedEventArgs^ e) +{ + if (e->Key == VirtualKey::Control) isCtrlKeyPressed = true; +} + + +void KeyboardSupport::MainPage::Grid_KeyUp(Platform::Object^ sender, Windows::UI::Xaml::Input::KeyRoutedEventArgs^ e) +{ + if (IsCtrlKeyPressed()) + { + if (e->Key==VirtualKey::P) { DemoMovie->Play(); } + if (e->Key==VirtualKey::A) { DemoMovie->Pause(); } + if (e->Key==VirtualKey::S) { DemoMovie->Stop(); } + } +} +``` + +```csharp +protected override void OnNavigatedTo(NavigationEventArgs e) +{ + // Set the input focus to ensure that keyboard events are raised. + this.Loaded += delegate { this.Focus(FocusState.Programmatic); }; +} + +private void MediaButton_Click(object sender, RoutedEventArgs e) +{ + switch ((sender as Button).Name) + { + case "PlayButton": DemoMovie.Play(); break; + case "PauseButton": DemoMovie.Pause(); break; + case "StopButton": DemoMovie.Stop(); break; + } +} + +private static bool IsCtrlKeyPressed() +{ + var ctrlState = CoreWindow.GetForCurrentThread().GetKeyState(VirtualKey.Control); + return (ctrlState & CoreVirtualKeyStates.Down) == CoreVirtualKeyStates.Down; +} + +private void Grid_KeyDown(object sender, KeyRoutedEventArgs e) +{ + if (IsCtrlKeyPressed()) + { + switch (e.Key) + { + case VirtualKey.P: DemoMovie.Play(); break; + case VirtualKey.A: DemoMovie.Pause(); break; + case VirtualKey.S: DemoMovie.Stop(); break; + } + } +} +``` + +```VisualBasic +Private isCtrlKeyPressed As Boolean +Protected Overrides Sub OnNavigatedTo(e As Navigation.NavigationEventArgs) + +End Sub + +Private Function IsCtrlKeyPressed As Boolean + Dim ctrlState As CoreVirtualKeyStates = CoreWindow.GetForCurrentThread().GetKeyState(VirtualKey.Control); + Return (ctrlState & CoreVirtualKeyStates.Down) == CoreVirtualKeyStates.Down; +End Function + +Private Sub Grid_KeyDown(sender As Object, e As KeyRoutedEventArgs) + If IsCtrlKeyPressed() Then + Select Case e.Key + Case Windows.System.VirtualKey.P + DemoMovie.Play() + Case Windows.System.VirtualKey.A + DemoMovie.Pause() + Case Windows.System.VirtualKey.S + DemoMovie.Stop() + End Select + End If +End Sub + +Private Sub MediaButton_Click(sender As Object, e As RoutedEventArgs) + Dim fe As FrameworkElement = CType(sender, FrameworkElement) + Select Case fe.Name + Case "PlayButton" + DemoMovie.Play() + Case "PauseButton" + DemoMovie.Pause() + Case "StopButton" + DemoMovie.Stop() + End Select +End Sub +``` + +> [!NOTE] +> Setting [**AutomationProperties.AcceleratorKey**](/dotnet/api/system.windows.automation.automationproperties.acceleratorkey) or [**AutomationProperties.AccessKey**](/dotnet/api/system.windows.automation.automationproperties.accesskey) in XAML provides string information, which documents the shortcut key for invoking that particular action. The information is captured by Microsoft UI Automation clients such as Narrator, and is typically provided directly to the user. +> +> Setting **AutomationProperties.AcceleratorKey** or **AutomationProperties.AccessKey** does not have any action on its own. You will still need to attach handlers for [**KeyDown**](/uwp/api/windows.ui.xaml.uielement.keydown) or [**KeyUp**](/uwp/api/windows.ui.xaml.uielement.keyup) events in order to actually implement the keyboard shortcut behavior in your app. Also, the underline text decoration for an access key is not provided automatically. You must explicitly underline the text for the specific key in your mnemonic as inline [**Underline**](/uwp/api/Windows.UI.Xaml.Documents.Underline) formatting if you wish to show underlined text in the UI. + +  + +## Keyboard routed events + + +Certain events are routed events, including [**KeyDown**](/uwp/api/windows.ui.xaml.uielement.keydown) and [**KeyUp**](/uwp/api/windows.ui.xaml.uielement.keyup). Routed events use the bubbling routing strategy. The bubbling routing strategy means that an event originates from a child object and is then routed up to successive parent objects in the object tree. This presents another opportunity to handle the same event and interact with the same event data. + +Consider the following XAML example, which handles [**KeyUp**](/uwp/api/windows.ui.xaml.uielement.keyup) events for a [**Canvas**](/uwp/api/Windows.UI.Xaml.Controls.Canvas) and two [**Button**](/uwp/api/Windows.UI.Xaml.Controls.Button) objects. In this case, if you release a key while focus is held by either **Button** object, it raises the **KeyUp** event. The event is then bubbled up to the parent **Canvas**. + +```xaml + + + +``` + +> [!NOTE] +> We're just using [**Canvas.Left**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.controls.canvas.left) as an example attached property without fully explaining why you'd use it. If you want to know more about what **Canvas.Left** is for and how [**Canvas**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.controls.canvas) handles its layout children, see the [**Canvas**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.controls.canvas) reference topic or [Define layouts with XAML](/windows/apps/design/layout/layouts-with-xaml). + +## Why use attached properties? + +Attached properties are a way to escape the coding conventions that might prevent different objects in a relationship from communicating information to each other at run time. It's certainly possible to put properties on a common base class so that each object could just get and set that property. But eventually the sheer number of scenarios where you might want to do this will bloat your base classes with shareable properties. It might even introduce cases where there might just be two of hundreds of descendants trying to use a property. That's not good class design. To address this, the attached property concept enables an object to assign a value for a property that its own class structure doesn't define. The defining class can read the value from child objects at run time after the various objects are created in an object tree. + +For example, child elements can use attached properties to inform their parent element of how they are to be presented in the UI. This is the case with the [**Canvas.Left**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.controls.canvas.left) attached property. **Canvas.Left** is created as an attached property because it is set on elements that are contained within a [**Canvas**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.controls.canvas) element, rather than on the **Canvas** itself. Any possible child element then uses **Canvas.Left** and [**Canvas.Top**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.controls.canvas.top) to specify its layout offset within the **Canvas** layout container parent. Attached properties make it possible for this to work without cluttering the base element's object model with lots of properties that each apply to only one of the many possible layout containers. Instead, many of the layout containers implement their own attached property set. + +To implement the attached property, the [**Canvas**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.controls.canvas) class defines a static [**DependencyProperty**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.dependencyproperty) field named [**Canvas.LeftProperty**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.controls.canvas.leftproperty). Then, **Canvas** provides the [**SetLeft**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.controls.canvas.setleft) and [**GetLeft**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.controls.canvas.getleft) methods as public accessors for the attached property, to enable both XAML setting and run-time value access. For XAML and for the dependency property system, this set of APIs satisfies a pattern that enables a specific XAML syntax for attached properties, and stores the value in the dependency property store. + +## How the owning type uses attached properties + +Although attached properties can be set on any XAML element (or any underlying [**DependencyObject**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.dependencyobject)), that doesn't automatically mean that setting the property produces a tangible result, or that the value is ever accessed. The type that defines the attached property typically follows one of these scenarios: + +- The type that defines the attached property is the parent in a relationship of other objects. The child objects will set values for the attached property. The attached property owner type has some innate behavior that iterates through its child elements, obtains the values, and acts on those values at some point in object lifetime (a layout action, [**SizeChanged**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.frameworkelement.sizechanged), etc.) +- The type that defines the attached property is used as the child element for a variety of possible parent elements and content models, but the info isn't necessarily layout info. +- The attached property reports info to a service, not to another UI element. + +For more info on these scenarios and owning types, see the "More about Canvas.Left" section of [Custom attached properties](custom-attached-properties.md). + +## Attached properties in code + +Attached properties don't have the typical property wrappers for easy get and set access like other dependency properties do. This is because the attached property is not necessarily part of the code-centered object model for instances where the property is set. (It is permissible, though uncommon, to define a property that is both an attached property that other types can set on themselves, and that also has a conventional property usage on the owning type.) + +There are two ways to set an attached property in code: use the property-system APIs, or use the XAML pattern accessors. These techniques are pretty much equivalent in terms of their end result, so which one to use is mostly a matter of coding style. + +### Using the property system + +Attached properties for the Windows Runtime are implemented as dependency properties, so that the values can be stored in the shared dependency-property store by the property system. Therefore attached properties expose a dependency property identifier on the owning class. + +To set an attached property in code, you call the [**SetValue**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.dependencyobject.setvalue) method, and pass the [**DependencyProperty**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.dependencyproperty) field that serves as the identifier for that attached property. (You also pass the value to set.) + +To get the value of an attached property in code, you call the [**GetValue**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.dependencyobject.getvalue) method, again passing the [**DependencyProperty**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.dependencyproperty) field that serves as the identifier. + +### Using the XAML accessor pattern + +A XAML processor must be able to set attached property values when XAML is parsed into an object tree. The owner type of the attached property must implement dedicated accessor methods named in the form **Get**_PropertyName_ and **Set**_PropertyName_. These dedicated accessor methods are also one way to get or set the attached property in code. From a code perspective, an attached property is similar to a backing field that has method accessors instead of property accessors, and that backing field can exist on any object rather than having to be specifically defined. + +The next example shows how you can set an attached property in code via the XAML accessor API. In this example, `myCheckBox` is an instance of the [**CheckBox**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.Controls.CheckBox) class. The last line is the code that actually sets the value; the lines before that just establish the instances and their parent-child relationship. The uncommented last line is the syntax if you use the property system. The commented last line is the syntax if you use the XAML accessor pattern. + +```csharp + Canvas myC = new Canvas(); + CheckBox myCheckBox = new CheckBox(); + myCheckBox.Content = "Hello"; + myC.Children.Add(myCheckBox); + myCheckBox.SetValue(Canvas.TopProperty,75); + //Canvas.SetTop(myCheckBox, 75); +``` + +```vb + Dim myC As Canvas = New Canvas() + Dim myCheckBox As CheckBox= New CheckBox() + myCheckBox.Content = "Hello" + myC.Children.Add(myCheckBox) + myCheckBox.SetValue(Canvas.TopProperty,75) + ' Canvas.SetTop(myCheckBox, 75) +``` + +```cppwinrt +Canvas myC; +CheckBox myCheckBox; +myCheckBox.Content(winrt::box_value(L"Hello")); +myC.Children().Append(myCheckBox); +myCheckBox.SetValue(Canvas::TopProperty(), winrt::box_value(75)); +// Canvas::SetTop(myCheckBox, 75); +``` + +```cpp + Canvas^ myC = ref new Canvas(); + CheckBox^ myCheckBox = ref new CheckBox(); + myCheckBox->Content="Hello"; + myC->Children->Append(myCheckBox); + myCheckBox->SetValue(Canvas::TopProperty,75); + // Canvas::SetTop(myCheckBox, 75); +``` + +## Custom attached properties + +For code examples of how to define custom attached properties, and more info about the scenarios for using an attached property, see [Custom attached properties](custom-attached-properties.md). + +## Special syntax for attached property references + +The dot in an attached property name is a key part of the identification pattern. Sometimes there are ambiguities when a syntax or situation treats the dot as having some other meaning. For example, a dot is treated as an object-model traversal for a binding path. In most cases involving such ambiguity, there is a special syntax for an attached property that enables the inner dot still to be parsed as the _owner_**.**_property_ separator of an attached property. + +- To specify an attached property as part of a target path for an animation, enclose the attached property name in parentheses `()`—for example, `(Canvas.Left)`. For more info, see [Property-path syntax](property-path-syntax.md). + +> [!WARNING] +> An existing limitation of the Windows Runtime XAML implementation is that you cannot animate a custom attached property. + +- To specify an attached property as the target property for a resource reference from a resource file to **x:Uid**, use a special syntax that injects a code-style, fully qualified **using:** declaration inside square brackets ("\[\]"), to create a deliberate scope break. For example, assuming there exists an element ``, the resource key in the resource file that targets the **Canvas.Top** value on that instance is `Title.\[using:Microsoft.UI.Xaml.Controls\]Canvas.Top`. For more info on resource files and XAML, see [Localize strings in your UI](../../../windows-app-sdk/mrtcore/localize-strings.md). + +## Related topics + +- [Custom attached properties](custom-attached-properties.md) +- [Dependency properties overview](dependency-properties-overview.md) +- [Define layouts with XAML](../../../design/layout/layouts-with-xaml.md) +- [**SetValue**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.dependencyobject.setvalue) +- [**GetValue**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.dependencyobject.getvalue) diff --git a/hub/apps/develop/platform/xaml/binding-markup-extension.md b/hub/apps/develop/platform/xaml/binding-markup-extension.md new file mode 100644 index 0000000000..cd6b95289f --- /dev/null +++ b/hub/apps/develop/platform/xaml/binding-markup-extension.md @@ -0,0 +1,124 @@ +--- +description: The Binding markup extension is converted at XAML load time into an instance of the Binding class. +title: Binding markup extension' +ms.assetid: 3BAFE7B5-AF33-487F-9AD5-BEAFD65D04C3 +ms.date: 09/08/2025 +ms.topic: concept-article +keywords: windows 10, uwp +ms.localizationpriority: medium +ms.custom: RS5 +--- +# {Binding} markup extension + + +> [!NOTE] +> A new binding mechanism is available for Windows 10, which is optimized for performance and developer productivity. See [{x:Bind} markup extension](x-bind-markup-extension.md). + +> [!NOTE] +> For general info about using data binding in your app with **{Binding}** (and for an all-up comparison between **{x:Bind}** and **{Binding}**), see [Data binding in depth](../../data-binding/data-binding-in-depth.md). + +The **{Binding}** markup extension is used to data bind properties on controls to values coming from a data source such as code. The **{Binding}** markup extension is converted at XAML load time into an instance of the [**Binding**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.data.binding) class. This binding object gets a value from a property on a data source, and pushes it to the property on the control. The binding object can optionally be configured to observe changes in the value of the data source property and update itself based on those changes. It can also optionally be configured to push changes to the control value back to the source property. The property that is the target of a data binding must be a dependency property. For more info, see [Dependency properties overview](dependency-properties-overview.md). + +**{Binding}** has the same dependency property precedence as a local value, and setting a local value in imperative code removes the effect of any **{Binding}** set in markup. + +## XAML attribute usage + + +``` syntax + +-or- + +-or- + +-or- + +``` + +| Term | Description | +|------|-------------| +| *propertyPath* | A string that specifies the property path for the binding. More info is in the [Property path](#property-path) section below. | +| *bindingProperties* | *propName*=*value*\[, *propName*=*value*\]*
One or more binding properties that are specified using a name/value pair syntax. | +| *propName* | The string name of the property to set on the [**Binding**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.data.binding) object. For example, "Converter". | +| *value* | The value to set the property to. The syntax of the argument depends on the property of [Properties of the Binding class that can be set with {Binding}](#properties-of-the-binding-class-that-can-be-set-with-binding) section below. | + +## Property path + +[**Path**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.data.binding.path) describes the property that you're binding to (the source property). Path is a positional parameter, which means you can use the parameter name explicitly (`{Binding Path=EmployeeID}`), or you can specify it as the first unnamed parameter (`{Binding EmployeeID}`). + +The type of [**Path**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.data.binding.path) is a property path, which is a string that evaluates to a property or sub-property of either your custom type or a framework type. The type can be, but does not need to be, a [**DependencyObject**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.dependencyobject). Steps in a property path are delimited by dots (.), and you can include multiple delimiters to traverse successive sub-properties. Use the dot delimiter regardless of the programming language used to implement the object being bound to. + +For example, to bind UI to an employee object's first name property, your property path might be "Employee.FirstName". If you are binding an items control to a property that contains an employee's dependents, your property path might be "Employee.Dependents", and the item template of the items control would take care of displaying the items in "Dependents". + +If the data source is a collection, then a property path can specify items in the collection by their position or index. For example, "Teams\[0\].Players", where the literal "\[\]" encloses the "0" that specifies the first item in a collection. + +When using an [**ElementName**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.data.binding.elementname) binding to an existing [**DependencyObject**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.dependencyobject), you can use attached properties as part of the property path. To disambiguate an attached property so that the intermediate dot in the attached property name is not considered a step into a property path, put parentheses around the owner-qualified attached property name; for example, `(AutomationProperties.Name)`. + +A property path intermediate object is stored as a [**PropertyPath**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.propertypath) object in a run-time representation, but most scenarios won't need to interact with a **PropertyPath** object in code. You can usually specify the binding info you need using XAML. + +For more info about the string syntax for a property path, property paths in animation feature areas, and constructing a [**PropertyPath**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.propertypath) object, see [Property-path syntax](property-path-syntax.md). + +## Properties of the Binding class that can be set with {Binding} + +**{Binding}** is illustrated with the *bindingProperties* placeholder syntax because there are multiple read/write properties of a [**Binding**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.data.binding) that can be set in the markup extension. The properties can be set in any order with comma-separated *propName*=*value* pairs. Some of the properties require types that don't have a type conversion, so these require markup extensions of their own nested within the **{Binding}**. + +| Property | Description | +|----------|-------------| +| [**Path**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.data.binding.path) | See the [Property path](#property-path) section above. | +| [**Converter**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.data.binding.converter) | Specifies a converter object that is called by the binding engine. The converter can be set in markup using the [{StaticResource} markup extension](staticresource-markup-extension.md) to reference to that object from a resource dictionary. | +| [**ConverterLanguage**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.data.binding.converterlanguage) | Specifies the culture to be used by the converter. (If you're setting [**Converter**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.data.binding.converter).) The culture is set as a standards-based identifier. For more info, see [**ConverterLanguage**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.data.binding.converterlanguage) | +| [**ConverterParameter**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.data.binding.converterparameter) | Specifies a converter parameter that can be used in converter logic. (If you're setting [**Converter**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.data.binding.converter).) Most converters use simple logic that get all the info they need from the passed value to convert, and don't need a **ConverterParameter** value. The **ConverterParameter** parameter is for more complex converter implementations that have conditional logic that keys off what's passed in **ConverterParameter**. You can write a converter that uses values other than strings but this is uncommon, see Remarks in **ConverterParameter** for more info. | +| [**ElementName**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.data.binding.elementname) | Specifies a data source by referencing another element in the same XAML construct that has a **Name** property or [x:Name attribute](x-name-attribute.md). This is often use to share related values or use sub-properties of one UI element to provide a specific value for another element, for example in a XAML control template. | +| [**FallbackValue**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.data.binding.fallbackvalue) | Specifies a value to display when the source or path cannot be resolved. | +| [**Mode**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.data.binding.mode) | Specifies the binding mode, as one of these values: "OneTime", "OneWay", or "TwoWay". These correspond to the constant names of the [**BindingMode**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.data.bindingmode) enumeration. The default is "OneWay". Note that this differs from the default for **{x:Bind}**, which is "OneTime". | +| [**RelativeSource**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.data.binding.relativesource) | Specifies a data source by describing the position of the binding source relative to the position of the binding target. This is most often used in bindings within XAML control templates. Setting the [{RelativeSource} markup extension](relativesource-markup-extension.md). | +| [**Source**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.data.binding.source) | Specifies the object data source. Within the **Binding** markup extension, the [**Source**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.data.binding.source) property requires an object reference, such as a [{StaticResource} markup extension](staticresource-markup-extension.md) reference. If this property is not specified, the acting data context specifies the source. It's more typical to not specify a Source value in individual bindings, and instead to rely on the shared **DataContext** for multiple bindings. For more info see [**DataContext**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.frameworkelement.datacontext) or [Data binding in depth](../../data-binding/data-binding-in-depth.md). | +| [**TargetNullValue**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.data.binding.targetnullvalue) | Specifies a value to display when the source value resolves but is explicitly **null**. | +| [**UpdateSourceTrigger**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.data.binding.updatesourcetrigger) | Specifies the timing of binding source updates. If unspecified, the default is **Default**. | + +> [!NOTE] +> If you're converting markup from **{x:Bind}** to **{Binding}**, then be aware of the differences in default values for the **Mode** property. + +[**Converter**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.data.binding.converter), [**ConverterLanguage**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.data.binding.converterlanguage) and **ConverterLanguage** are all related to the scenario of converting a value or type from the binding source into a type or value that is compatible with the binding target property. For more info and examples, see the "Data conversions" section of [Data binding in depth](../../data-binding/data-binding-in-depth.md). + +> [!NOTE] +> Starting in Windows 10, version 1607, the XAML framework provides a built in Boolean to Visibility converter. The converter maps **true** to the **Visible** enumeration value and **false** to **Collapsed** so you can bind a Visibility property to a Boolean without creating a converter. To use the built in converter, your app's minimum target SDK version must be 14393 or later. You can't use it when your app targets earlier versions of Windows 10. For more info about target versions, see [Version adaptive code](/windows/uwp/debug-test-perf/version-adaptive-code). + +[**Source**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.data.binding.source), [**RelativeSource**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.data.binding.relativesource), and [**ElementName**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.data.binding.elementname) specify a binding source, so they are mutually exclusive. + +> [!TIP] +> If you need to specify a single curly brace for a value, such as in [**Path**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.data.binding.path) or [**ConverterParameter**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.data.binding.converterparameter), then precede it with a backslash: `\{`. Alternatively, enclose the entire string that contains the braces that need escaping in a secondary quotation set, for example `ConverterParameter='{Mix}'`. + +## Examples + +```XML + + + + + + + + +``` + +```XML + + + + + + + + + +``` + +The second example sets four different [**Binding**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.Data.Binding) properties: [**ElementName**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.data.binding.elementname), [**Path**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.data.binding.path), [**Mode**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.data.binding.mode) and [**Converter**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.data.binding.converter). **Path** in this case is shown explicitly named as a **Binding** property. The **Path** is evaluated to a data binding source that is another object in the same run-time object tree, a [**Slider**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.controls.slider) named `sliderValueConverter`. + +Note how the [**Converter**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.data.binding.converter) property value uses another markup extension, [{StaticResource} markup extension](staticresource-markup-extension.md), so there are two nested markup extension usages here. The inner one is evaluated first, so that once the resource is obtained there's a practical [**IValueConverter**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.data.ivalueconverter) (a custom class that's instantiated by the `local:S2Formatter` element in resources) that the binding can use. + +## Tools support + +Microsoft IntelliSense in Microsoft Visual Studio displays the properties of the data context while authoring **{Binding}** in the XAML markup editor. As soon as you type "{Binding", data context properties appropriate for [**Path**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.data.binding.path) are displayed in the dropdown. IntelliSense also helps with the other properties of [**Binding**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.data.binding). For this to work, you must have either the data context or the design-time data context set in the markup page. **Go To Definition** (F12) also works with **{Binding}**. Alternatively, you can use the data binding dialog. diff --git a/hub/apps/develop/platform/xaml/brushes.md b/hub/apps/develop/platform/xaml/brushes.md new file mode 100644 index 0000000000..f8f89b5400 --- /dev/null +++ b/hub/apps/develop/platform/xaml/brushes.md @@ -0,0 +1,236 @@ +--- +ms.assetid: 02141F86-355E-4046-86EA-2A89D615B7DB +title: Use brushes +description: Brush objects are used to paint the interiors or outlines of shapes, text, and parts of controls, so that the object being painted is visible in a UI. +ms.date: 10/31/2025 +ms.topic: how-to +ms.localizationpriority: medium +--- +# Using brushes to paint backgrounds, foregrounds, and outlines + +Use [**Brush**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.Media.Brush) objects to paint the interiors and outlines of XAML shapes, text, and controls, making them visible in your application UI. + +> [!div class="checklist"] +> +> - **Important APIs**: [Brush class](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.Media.Brush), [SolidColorBrush class](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.Media.SolidColorBrush), [RadialGradientBrush class](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.media.radialgradientbrush), [ImageBrush class](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.Media.ImageBrush) + +> [!div class="nextstepaction"] +> [Open the WinUI 3 Gallery app and see the RadialGradientBrush in action](winui3gallery://item/RadialGradientBrush) + +[!INCLUDE [winui-3-gallery](../../../../includes/winui-3-gallery.md)] + +## Introduction to brushes + +To paint a [**Shape**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.Shapes.Shape), text, or parts of a [**Control**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.Controls.Control) that is displayed on the app canvas, set the [**Fill**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.shapes.shape.fill) property of the **Shape** or the [**Background**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.controls.control.background) and [**Foreground**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.controls.control.foreground) properties of a **Control** to a **Brush** value. + +The different types of brushes are: + +- [**AcrylicBrush**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.media.acrylicbrush) +- [**SolidColorBrush**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.Media.SolidColorBrush) +- [**LinearGradientBrush**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.Media.LinearGradientBrush) +- [**RadialGradientBrush**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.media.radialgradientbrush) +- [**ImageBrush**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.Media.ImageBrush) +- [**XamlCompositionBrushBase**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.media.xamlcompositionbrushbase) + +## Solid color brushes + +A [**SolidColorBrush**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.Media.SolidColorBrush) paints an area with a single [**Color**](/uwp/api/windows.ui.color), such as red or blue. This is the most basic brush. In XAML, there are three ways to define a **SolidColorBrush** and the color it specifies: predefined color names, hexadecimal color values, or the property element syntax. + +### Predefined color names + +You can use a predefined color name, such as [**Yellow**](/windows/windows-app-sdk/api/winrt/microsoft.ui.colors.yellow) or [**Magenta**](/windows/windows-app-sdk/api/winrt/microsoft.ui.colors.magenta). There are 256 available named colors. The XAML parser converts the color name to a [**Color**](/uwp/api/windows.ui.color) structure with the correct color channels. The 256 named colors are based on the *X11* color names from the Cascading Style Sheets, Level 3 (CSS3) specification, so you may already be familiar with this list of named colors if you have previous experience with web development or design. + +Here's an example that sets the [**Fill**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.shapes.shape.fill) property of a [**Rectangle**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.Shapes.Rectangle) to the predefined color [**Red**](/windows/windows-app-sdk/api/winrt/microsoft.ui.colors.red). + +```xaml + +``` + +![A rendered SolidColorBrush](images/brushes-solidcolorbrush.jpg) + +*SolidColorBrush applied to a Rectangle* + +If you are defining a [**SolidColorBrush**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.Media.SolidColorBrush) using code rather than XAML, each named color is available as a static property value of the [**Colors**](/windows/windows-app-sdk/api/winrt/microsoft.ui.colors) class. For example, to declare a [**Color**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.media.solidcolorbrush.color) value of a **SolidColorBrush** to represent the named color "Orchid", set the **Color** value to the static value [**Colors.Orchid**](/windows/windows-app-sdk/api/winrt/microsoft.ui.colors.orchid). + +### Hexadecimal color values + +You can use a hexadecimal format string to declare precise 24-bit color values with 8-bit alpha channel for a [**SolidColorBrush**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.Media.SolidColorBrush). Two characters in the range 0 to F define each component value, and the component value order of the hexadecimal string is: alpha channel (opacity), red channel, green channel, and blue channel (**ARGB**). For example, the hexadecimal value "\#FFFF0000" defines fully opaque red (alpha="FF", red="FF", green="00", and blue="00"). + +This XAML example sets the [**Fill**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.shapes.shape.fill) property of a [**Rectangle**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.Shapes.Rectangle) to the hexadecimal value "\#FFFF0000", and gives an identical result to using the named color [**Colors.Red**](/windows/windows-app-sdk/api/winrt/microsoft.ui.colors.red). + +```xml + + + +``` + +### Property element syntax + +You can use property element syntax to define a [**SolidColorBrush**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.Media.SolidColorBrush). This syntax is more verbose than the previous methods, but you can specify additional property values on an element, such as the [**Opacity**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.media.brush.opacity). For more info on XAML syntax, including property element syntax, see the [XAML overview](/windows/apps/develop/platform/xaml/xaml-overview) and [XAML syntax guide](/windows/apps/develop/platform/xaml/xaml-syntax-guide). + +In the previous examples, the brush being created is created implicitly and automatically, as part of a deliberate XAML language shorthand that helps keep UI definitions simple for the most common cases. The next example creates a [**Rectangle**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.Shapes.Rectangle) and explicitly creates the [**SolidColorBrush**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.Media.SolidColorBrush) as an element value for a [**Rectangle.Fill**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.shapes.shape.fill) property. The [**Color**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.media.solidcolorbrush.color) of the **SolidColorBrush** is set to [**Blue**](/windows/windows-app-sdk/api/winrt/microsoft.ui.colors.blue) and the [**Opacity**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.media.brush.opacity) is set to 0.5. + +```xml + + + + + +``` + +## Linear gradient brushes + +A [**LinearGradientBrush**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.Media.LinearGradientBrush) paints an area with a gradient that's defined along a line. This line is called the *gradient axis*. You specify the gradient's colors and their locations along the gradient axis using [**GradientStop**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.Media.GradientStop) objects. By default, the gradient axis runs from the upper left corner to the lower right corner of the area that the brush paints, resulting in a diagonal shading. + +The [**GradientStop**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.Media.GradientStop) is the basic building block of a gradient brush. A gradient stop specifies what the [**Color**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.media.gradientstop.color) of the brush is at an [**Offset**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.media.gradientstop.offset) along the gradient axis, when the brush is applied to the area being painted. + +The gradient stop's [**Color**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.media.gradientstop.color) property specifies the color of the gradient stop. You can set the color by using a predefined color name or by specifying the hexadecimal **ARGB** values. + +The [**Offset**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.media.gradientstop.offset) property of a [**GradientStop**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.Media.GradientStop) specifies the position of each **GradientStop** along the gradient axis. The **Offset** is a **double** that ranges from 0 to 1. An **Offset** of 0 places the **GradientStop** at the start of the gradient axis, in other words near its [**StartPoint**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.media.lineargradientbrush.startpoint). An **Offset** of 1 places the **GradientStop** at the [**EndPoint**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.media.lineargradientbrush.endpoint). At a minimum, a useful [**LinearGradientBrush**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.Media.LinearGradientBrush) should have two **GradientStop** values, where each **GradientStop** should specify a different [**Color**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.media.gradientstop.color) and have a different **Offset** between 0 and 1. + +This example creates a linear gradient with four colors and uses it to paint a [**Rectangle**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.Shapes.Rectangle). + +```xml + + + + + + + + + + + +``` + +The color of each point between gradient stops is linearly interpolated as a combination of the color specified by the two bounding gradient stops. The following image highlights the gradient stops in the previous example. The circles mark the position of the gradient stops, and the dashed line shows the gradient axis. + +![Diagram depicting Gradient Stops 1 through 4 starting in the upper-left corner of the diagram and sloping down and to the right until it reaches the lower-right corner of the diagram.](images/linear-gradients-stops.png) + +*Combination of colors specified by the two bounding gradient stops* + +You can change the line at which the gradient stops are positioned by setting the [**StartPoint**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.media.lineargradientbrush.startpoint) and [**EndPoint**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.media.lineargradientbrush.endpoint) properties to be different values than the `(0,0)` and `(1,1)` starting defaults. By changing the **StartPoint** and **EndPoint** coordinate values, you can create horizontal or vertical gradients, reverse the gradient direction, or condense the gradient spread to apply to a smaller range than the full painted area. To condense the gradient, you set values of **StartPoint** and/or **EndPoint** to be something that is between the values 0 and 1. For example, if you want a horizontal gradient where the fade all happens on the left half of the brush and the right side is solid to your last [**GradientStop**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.Media.GradientStop) color, you specify a **StartPoint** of `(0,0)` and an **EndPoint** of `(0.5,0)`. + +## Radial gradient brushes + +A [**RadialGradientBrush**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.media.radialgradientbrush) is drawn within an ellipse that is defined by the [**Center**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.media.radialgradientbrush.center), [**RadiusX**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.media.radialgradientbrush.radiusx), and [**RadiusY**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.media.radialgradientbrush.radiusy) properties. Colors for the gradient start at the center of the ellipse and end at the radius. + +The colors for the radial gradient are defined by color stops added to the [**GradientStops**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.media.radialgradientbrush.gradientstops) collection property. Each gradient stop specifies a color and an offset along the gradient. + +The gradient origin defaults to center and can be offset using the [**GradientOrigin**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.media.radialgradientbrush.gradientorigin) property. + +[MappingMode](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.media.radialgradientbrush.mappingmode) defines whether [**Center**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.media.radialgradientbrush.center), [**RadiusX**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.media.radialgradientbrush.radiusx), [**RadiusY**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.media.radialgradientbrush.radiusy), and [**GradientOrigin**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.media.radialgradientbrush.gradientorigin) represent relative or absolute coordinates. + +When [**MappingMode**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.media.radialgradientbrush.mappingmode) is set to `RelativeToBoundingBox`, the X and Y values of the three properties are treated as relative to the element bounds, where `(0,0)` represents the top left and `(1,1)` represents the bottom right of the element bounds for the [**Center**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.media.radialgradientbrush.center), [**RadiusX**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.media.radialgradientbrush.radiusx), and [**RadiusY**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.media.radialgradientbrush.radiusy) properties and `(0,0)` represents the center for the [**GradientOrigin**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.media.radialgradientbrush.gradientorigin) property. + +When [**MappingMode**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.media.radialgradientbrush.mappingmode) is set to `Absolute`, the X and Y values of the three properties are treated as absolute coordinates within the element bounds. + +This example creates a linear gradient with four colors and uses it to paint a [**Rectangle**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.Shapes.Rectangle). + +```xml + + + + + + + + + + + + + +``` + +The color of each point between gradient stops is radially interpolated as a combination of the color specified by the two bounding gradient stops. The following image highlights the gradient stops in the previous example. + +![Screenshot of a radial gradient.](images/radial-gradient.png) + +*Gradient stops* + +## Image brushes + +An [**ImageBrush**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.Media.ImageBrush) paints an area with an image, with the image to paint coming from an image file source. You set the [**ImageSource**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.Media.ImageSource) property with the path of the image to load. Typically, the image source comes from a **Content** item that is part of your app's resources. + +By default, an [**ImageBrush**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.Media.ImageBrush) stretches its image to completely fill the painted area, possibly distorting the image if the painted area has a different aspect ratio than the image. You can change this behavior by changing the [**Stretch**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.media.tilebrush.stretch) property from its default value of **Fill** and setting it as **None**, **Uniform**, or **UniformToFill**. + +The next example creates an [**ImageBrush**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.Media.ImageBrush) and sets the [**ImageSource**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.Media.ImageSource) to an image named licorice.jpg, which you must include as a resource in the app. The **ImageBrush** then paints the area defined by an [**Ellipse**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.Shapes.Ellipse) shape. + +```xml + + + + + +``` + +![A rendered ImageBrush.](images/brushes-imagebrush.jpg) + +*A rendered ImageBrush* + +[**ImageBrush**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.Media.ImageBrush) and [**Image**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.Controls.Image) both reference an image source file by Uniform Resource Identifier (URI), where that image source file uses several possible image formats. These image source files are specified as URIs. For more info about specifying image sources, the usable image formats, and packaging them in an app, see [Image and ImageBrush](../../../design/controls/images-imagebrushes.md). + +## Brushes and text + +You can also use brushes to apply rendering characteristics to text elements. For example, the [**Foreground**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.controls.textblock.foreground) property of [**TextBlock**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.Controls.TextBlock) takes a [**Brush**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.Media.Brush). You can apply any of the brushes described here to text. However, be careful with brushes applied to text, as any background might make the text can be unreadable if you use brushes that bleed into the background. Use [**SolidColorBrush**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.Media.SolidColorBrush) for readability of text elements in most cases, unless you want the text element to be mostly decorative. + +Even when you use a solid color, make sure that the text color you choose has enough contrast against the background color of the text's layout container. The level of contrast between text foreground and text container background is an accessibility consideration. + +## XamlCompositionBrushBase + +[**XamlCompositionBrushBase**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.media.xamlcompositionbrushbase) is a base class used to create custom brushes that use [**CompositionBrush**](/windows/windows-app-sdk/api/winrt/microsoft.ui.Composition.CompositionBrush) to paint XAML UI elements. + +This enables "drop down" interoperation between the Windows.UI.Xaml and Windows.UI.Composition layers as described in the [**Visual Layer overview**](/windows/uwp/composition/visual-layer). + +To create a custom brush, create a new class that inherits from XamlCompositionBrushBase and implements the required methods. + +For example, this can be used to apply [**effects**](/windows/uwp/composition/composition-effects) to XAML UIElements using a [**CompositionEffectBrush**](/windows/windows-app-sdk/api/winrt/microsoft.ui.Composition.CompositionEffectBrush), such as a **GaussianBlurEffect** or a [**SceneLightingEffect**](/windows/windows-app-sdk/api/winrt/microsoft.ui.Composition.Effects.SceneLightingEffect) that controls the reflective properties of a XAML UIElement when being lit by a [**XamlLight**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.media.xamllight). + +For code examples, see [**XamlCompositionBrushBase**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.media.xamlcompositionbrushbase). + +## Brushes as XAML resources + +You can declare any brush to be a keyed XAML resource in a XAML resource dictionary. This makes it easy to replicate the same brush values as applied to multiple elements in a UI. The brush values are then shared and applied to any case where you reference the brush resource as a [{StaticResource}](/windows/apps/develop/platform/xaml/staticresource-markup-extension) usage in your XAML. This includes cases where you have a XAML control template that references the shared brush, and the control template is itself a keyed XAML resource. + +## Brushes in code + +It's much more typical to specify brushes using XAML than it is to use code to define brushes. This is because brushes are usually defined as XAML resources, and because brush values are often the output of design tools or otherwise as part of a XAML UI definition. Still, for the occasional case where you might want to define a brush using code, all the [**Brush**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.Media.Brush) types are available for code instantiation. + +To create a [**SolidColorBrush**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.Media.SolidColorBrush) in code, use the constructor that takes a [**Color**](/uwp/api/windows.ui.color) parameter. Pass a value that is a static property of the [**Colors**](/windows/windows-app-sdk/api/winrt/microsoft.ui.colors) class, like this: + +```cs +SolidColorBrush blueBrush = new SolidColorBrush(Colors.Blue); +``` + +```cppwinrt +Microsoft::UI::Xaml::Media::SolidColorBrush blueBrush{ Microsoft::UI::Colors::Blue() }; +``` + +For [**ImageBrush**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.Media.ImageBrush), use the default constructor and then call other APIs before you attempt to use that brush for a UI property. + +[**ImageSource**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.media.imagebrush.imagesourceproperty) requires a [**BitmapImage**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.Media.Imaging.BitmapImage) (not a URI) when you define an [**ImageBrush**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.Media.ImageBrush) using code. If your source is a stream , use the [**SetSourceAsync**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.media.imaging.bitmapsource.setsourceasync) method to initialize the value. If your source is a URI, which includes content in your app that uses the **ms-appx** or **ms-resource** schemes, use the [**BitmapImage**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.media.imaging.bitmapimage) constructor that takes a URI. You might also consider handling the [**ImageOpened**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.media.imagebrush.imageopened) event if there are any timing issues with retrieving or decoding the image source, where you might need alternate content to display until the image source is available. + +For code examples, see [**ImageBrush**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.Media.ImageBrush) and [**XamlCompositionBrushBase**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.media.xamlcompositionbrushbase). + +## UWP and WinUI 2 + +[!INCLUDE [uwp-winui2-note](../../../../includes/uwp-winui-2-note.md)] + +Brush APIs exist in the [Windows.UI.Xaml.Controls](/uwp/api/Windows.UI.Xaml.media) and [Windows.UI.Xaml.Controls](/uwp/api/windows.ui.xaml.controls) namespaces. + +> [!div class="checklist"] +> +> - **Platform APIs:** [Brush class](/uwp/api/windows.ui.xaml.media.brush) +> - [Open the WinUI 2 Gallery app and see RadialGradientBrush in action](winui2gallery:/item/RadialGradientBrush). [!INCLUDE [winui-2-gallery](../../../../includes/winui-2-gallery.md)] + +We recommend using the latest [WinUI 2](/windows/uwp/get-started/winui2/) to get the most current styles, templates, and features for all controls. + +### WebViewBrush (UWP only) + +A [**WebViewBrush**](/uwp/api/windows.ui.xaml.controls.webviewbrush) is a special type of brush that can access the content normally viewed in a [**WebView**](/uwp/api/windows.ui.xaml.controls.webview) control. Instead of rendering the content in the rectangular **WebView** control area, **WebViewBrush** paints that content onto another element that has a [**Brush**](/uwp/api/windows.ui.xaml.Media.Brush)-type property for a render surface. **WebViewBrush** isn't appropriate for every brush scenario, but is useful for transitions of a **WebView**. For more info, see [**WebViewBrush**](/uwp/api/windows.ui.xaml.controls.webviewbrush). + +If you create a [**WebViewBrush**](/uwp/api/windows.ui.xaml.controls.webviewbrush) in code, use the default constructor and then call other APIs before you attempt to use that brush for a UI property. You might need to call [**Redraw**](/uwp/api/windows.ui.xaml.controls.webviewbrush.redraw) if you've recently reset the [**SourceName**](/uwp/api/windows.ui.xaml.controls.webviewbrush.sourcename) property or if the content of the [**WebView**](/uwp/api/windows.ui.xaml.controls.webview) is also being changed with code. + +For code examples, see [**WebViewBrush**](/uwp/api/windows.ui.xaml.controls.webviewbrush). diff --git a/hub/apps/develop/platform/xaml/custom-attached-properties.md b/hub/apps/develop/platform/xaml/custom-attached-properties.md new file mode 100644 index 0000000000..fbf9b180a2 --- /dev/null +++ b/hub/apps/develop/platform/xaml/custom-attached-properties.md @@ -0,0 +1,299 @@ +--- +description: Explains how to implement a XAML attached property as a dependency property and how to define the accessor convention that is necessary for your attached property to be usable in XAML. +title: Custom attached properties +ms.assetid: E9C0C57E-6098-4875-AA3E-9D7B36E160E0 +ms.date: 07/18/2017 +ms.topic: article +keywords: windows 10, uwp +ms.localizationpriority: medium +no-loc: [Property] +dev_langs: + - csharp + - vb + - cppwinrt + - cpp +--- + +# Custom attached properties + +An _attached property_ is a XAML concept. Attached properties are typically defined as a specialized form of dependency property. This topic explains how to implement an attached property as a dependency property and how to define the accessor convention that is necessary for your attached property to be usable in XAML. + +## Prerequisites + +We assume that you understand dependency properties from the perspective of a consumer of existing dependency properties, and that you have read the [Dependency properties overview](dependency-properties-overview.md). You should also have read [Attached properties overview](attached-properties-overview.md). To follow the examples in this topic, you should also understand XAML and know how to write a basic Windows Runtime app using C++, C#, or Visual Basic. + +## Scenarios for attached properties + +You might create an attached property when there is a reason to have a property-setting mechanism available for classes other than the defining class. The most common scenarios for this are layout and services support. Examples of existing layout properties are [**Canvas.ZIndex**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.controls.canvas.zindex) and [**Canvas.Top**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.controls.canvas.top). In a layout scenario, elements that exist as child elements to layout-controlling elements can express layout requirements to their parent elements individually, each setting a property value that the parent defines as an attached property. An example of the services-support scenario in the Windows Runtime API is set of the attached properties of [**ScrollViewer**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.Controls.ScrollViewer), such as [**ScrollViewer.IsZoomChainingEnabled**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.controls.scrollviewer.iszoomchainingenabled). + +> [!WARNING] +> An existing limitation of the Windows Runtime XAML implementation is that you cannot animate your custom attached property. + +## Registering a custom attached property + +If you are defining the attached property strictly for use on other types, the class where the property is registered does not have to derive from [**DependencyObject**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.DependencyObject). But you do need to have the target parameter for accessors use **DependencyObject** if you follow the typical model of having your attached property also be a dependency property, so that you can use the backing property store. + +Define your attached property as a dependency property by declaring a **public** **static** **readonly** property of type [**DependencyProperty**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.DependencyProperty). You define this property by using the return value of the [**RegisterAttached**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.dependencyproperty.registerattached) method. The property name must match the attached property name you specify as the **RegisterAttached** _name_ parameter, with the string "Property" added to the end. This is the established convention for naming the identifiers of dependency properties in relation to the properties that they represent. + +The main area where defining a custom attached property differs from a custom dependency property is in how you define the accessors or wrappers. Instead of the using the wrapper technique described in [Custom dependency properties](custom-dependency-properties.md), you must also provide static **Get**_PropertyName_ and **Set**_PropertyName_ methods as accessors for the attached property. The accessors are used mostly by the XAML parser, although any other caller can also use them to set values in non-XAML scenarios. + +> [!IMPORTANT] +> If you don't define the accessors correctly, the XAML processor can't access your attached property and anyone who tries to use it will probably get a XAML parser error. Also, design and coding tools often rely on the "\*Property" conventions for naming identifiers when they encounter a custom dependency property in a referenced assembly. + +## Accessors + +The signature for the **Get**_PropertyName_ accessor must be this. + +`public static` _valueType_ **Get**_PropertyName_ `(DependencyObject target)` + +For Microsoft Visual Basic, it is this. + +`Public Shared Function Get`_PropertyName_`(ByVal target As DependencyObject) As `_valueType_`)` + +The _target_ object can be of a more specific type in your implementation, but must derive from [**DependencyObject**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.DependencyObject). The _ValueType_ return value can also be of a more specific type in your implementation. The basic **Object** type is acceptable, but often you'll want your attached property to enforce type safety. The use of typing in the getter and setter signatures is a recommended type-safety technique. + +The signature for the **Set**_PropertyName_ accessor must be this. + +`public static void Set`_PropertyName_` (DependencyObject target , `_valueType_` value)` + +For Visual Basic, it is this. + +`Public Shared Sub Set`_PropertyName_` (ByVal target As DependencyObject, ByVal value As `_valueType_`)` + +The _target_ object can be of a more specific type in your implementation, but must derive from [**DependencyObject**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.DependencyObject). The _value_ object and its _valueType_ can be of a more specific type in your implementation. Remember that the value for this method is the input that comes from the XAML processor when it encounters your attached property in markup. There must be type conversion or existing markup extension support for the type you use, so that the appropriate type can be created from an attribute value (which is ultimately just a string). The basic **Object** type is acceptable, but often you'll want further type safety. To accomplish that, put type enforcement in the accessors. + +> [!NOTE] +> It's also possible to define an attached property where the intended usage is through property element syntax. In that case you don't need type conversion for the values, but you do need to assure that the values you intend can be constructed in XAML. [**VisualStateManager.VisualStateGroups**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.visualstatemanager) is an example of an existing attached property that only supports property element usage. + +## Code example + +This example shows the dependency property registration (using the [**RegisterAttached**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.dependencyproperty.registerattached) method), as well as the **Get** and **Set** accessors, for a custom attached property. In the example, the attached property name is `IsMovable`. Therefore, the accessors must be named `GetIsMovable` and `SetIsMovable`. The owner of the attached property is a service class named `GameService` that doesn't have a UI of its own; its purpose is only to provide the attached property services when the **GameService.IsMovable** attached property is used. + +Defining the attached property in C++/CX is a bit more complex. You have to decide how to factor between the header and code file. Also, you should expose the identifier as a property with only a **get** accessor, for reasons discussed in [Custom dependency properties](custom-dependency-properties.md). In C++/CX you must define this property-field relationship explicitly rather than relying on .NET **readonly** keywording and implicit backing of simple properties. You also need to perform the registration of the attached property within a helper function that only gets run once, when the app first starts but before any XAML pages that need the attached property are loaded. The typical place to call your property registration helper functions for any and all dependency or attached properties is from within the **App** / [**Application**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.application.-ctor) constructor in the code for your app.xaml file. + +```csharp +public class GameService : DependencyObject +{ + public static readonly DependencyProperty IsMovableProperty = + DependencyProperty.RegisterAttached( + "IsMovable", + typeof(Boolean), + typeof(GameService), + new PropertyMetadata(false) + ); + public static void SetIsMovable(UIElement element, Boolean value) + { + element.SetValue(IsMovableProperty, value); + } + public static Boolean GetIsMovable(UIElement element) + { + return (Boolean)element.GetValue(IsMovableProperty); + } +} +``` + +```vb +Public Class GameService + Inherits DependencyObject + + Public Shared ReadOnly IsMovableProperty As DependencyProperty = + DependencyProperty.RegisterAttached("IsMovable", + GetType(Boolean), + GetType(GameService), + New PropertyMetadata(False)) + + Public Shared Sub SetIsMovable(ByRef element As UIElement, value As Boolean) + element.SetValue(IsMovableProperty, value) + End Sub + + Public Shared Function GetIsMovable(ByRef element As UIElement) As Boolean + GetIsMovable = CBool(element.GetValue(IsMovableProperty)) + End Function +End Class +``` + +```cppwinrt +// GameService.idl +namespace UserAndCustomControls +{ + [default_interface] + runtimeclass GameService : Windows.UI.Xaml.DependencyObject + { + GameService(); + static Windows.UI.Xaml.DependencyProperty IsMovableProperty{ get; }; + static Boolean GetIsMovable(Windows.UI.Xaml.DependencyObject target); + static void SetIsMovable(Windows.UI.Xaml.DependencyObject target, Boolean value); + } +} + +// GameService.h +... + static Windows::UI::Xaml::DependencyProperty IsMovableProperty() { return m_IsMovableProperty; } + static bool GetIsMovable(Windows::UI::Xaml::DependencyObject const& target) { return winrt::unbox_value(target.GetValue(m_IsMovableProperty)); } + static void SetIsMovable(Windows::UI::Xaml::DependencyObject const& target, bool value) { target.SetValue(m_IsMovableProperty, winrt::box_value(value)); } + +private: + static Windows::UI::Xaml::DependencyProperty m_IsMovableProperty; +... + +// GameService.cpp +... +Windows::UI::Xaml::DependencyProperty GameService::m_IsMovableProperty = + Windows::UI::Xaml::DependencyProperty::RegisterAttached( + L"IsMovable", + winrt::xaml_typename(), + winrt::xaml_typename(), + Windows::UI::Xaml::PropertyMetadata{ winrt::box_value(false) } +); +... +``` + +```cpp +// GameService.h +#pragma once + +#include "pch.h" +//namespace WUX = Windows::UI::Xaml; + +namespace UserAndCustomControls { + public ref class GameService sealed : public WUX::DependencyObject { + private: + static WUX::DependencyProperty^ _IsMovableProperty; + public: + GameService::GameService(); + void GameService::RegisterDependencyProperties(); + static property WUX::DependencyProperty^ IsMovableProperty + { + WUX::DependencyProperty^ get() { + return _IsMovableProperty; + } + }; + static bool GameService::GetIsMovable(WUX::UIElement^ element) { + return (bool)element->GetValue(_IsMovableProperty); + }; + static void GameService::SetIsMovable(WUX::UIElement^ element, bool value) { + element->SetValue(_IsMovableProperty,value); + } + }; +} + +// GameService.cpp +#include "pch.h" +#include "GameService.h" + +using namespace UserAndCustomControls; + +using namespace Platform; +using namespace Windows::Foundation; +using namespace Windows::Foundation::Collections; +using namespace Windows::UI::Xaml; +using namespace Windows::UI::Xaml::Controls; +using namespace Windows::UI::Xaml::Data; +using namespace Windows::UI::Xaml::Documents; +using namespace Windows::UI::Xaml::Input; +using namespace Windows::UI::Xaml::Interop; +using namespace Windows::UI::Xaml::Media; + +GameService::GameService() {}; + +GameService::RegisterDependencyProperties() { + DependencyProperty^ GameService::_IsMovableProperty = DependencyProperty::RegisterAttached( + "IsMovable", Platform::Boolean::typeid, GameService::typeid, ref new PropertyMetadata(false)); +} +``` + +## Setting your custom attached property from XAML markup + +After you have defined your attached property and included its support members as part of a custom type, you must then make the definitions available for XAML usage. To do this, you must map a XAML namespace that will reference the code namespace that contains the relevant class. In cases where you have defined the attached property as part of a library, you must include that library as part of the app package for the app. + +An XML namespace mapping for XAML is typically placed in the root element of a XAML page. For example, for the class named `GameService` in the namespace `UserAndCustomControls` that contains the attached property definitions shown in preceding snippets, the mapping might look like this. + +```xaml + +``` + +Using the mapping, you can set your `GameService.IsMovable` attached property on any element that matches your target definition, including an existing type that Windows Runtime defines. + +```xaml + +``` + +If you are setting the property on an element that is also within the same mapped XML namespace, you still must include the prefix on the attached property name. This is because the prefix qualifies the owner type. The attached property's attribute cannot be assumed to be within the same XML namespace as the element where the attribute is included, even though, by normal XML rules, attributes can inherit namespace from elements. For example, if you are setting `GameService.IsMovable` on a custom type of `ImageWithLabelControl` (definition not shown), and even if both were defined in the same code namespace mapped to same prefix, the XAML would still be this. + +```xaml + +``` + +> [!NOTE] +> If you are writing a XAML UI with C++/CX, then you must include the header for the custom type that defines the attached property, any time that a XAML page uses that type. Each XAML page has an associated code-behind header (.xaml.h). This is where you should include (using **\#include**) the header for the definition of the attached property's owner type. + +## Setting your custom attached property imperatively + +You can also access a custom attached property from imperative code. The code below shows how. + +```xaml + +``` + +```cppwinrt +// MainPage.h +... +#include "GameService.h" +... + +// MainPage.cpp +... +MainPage::MainPage() +{ + InitializeComponent(); + + GameService::SetIsMovable(gameServiceImage(), true); +} +... +``` + +## Value type of a custom attached property + +The type that is used as the value type of a custom attached property affects the usage, the definition, or both the usage and definition. The attached property's value type is declared in several places: in the signatures of both the **Get** and **Set** accessor methods, and also as the _propertyType_ parameter of the [**RegisterAttached**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.dependencyproperty.registerattached) call. + +The most common value type for attached properties (custom or otherwise) is a simple string. This is because attached properties are generally intended for XAML attribute usage, and using a string as the value type keeps the properties lightweight. Other primitives that have native conversion to string methods, such as integer, double, or an enumeration value, are also common as value types for attached properties. You can use other value types—ones that don't support native string conversion—as the attached property value. However, this entails making a choice about either the usage or the implementation: + +- You can leave the attached property as it is, but the attached property can support usage only where the attached property is a property element, and the value is declared as an object element. In this case, the property type does have to support XAML usage as an object element. For existing Windows Runtime reference classes, check the XAML syntax to make sure that the type supports XAML object element usage. +- You can leave the attached property as it is, but use it only in an attribute usage through a XAML reference technique such as a **Binding** or **StaticResource** that can be expressed as a string. + +## More about the **Canvas.Left** example + +In earlier examples of attached property usages we showed different ways to set the [**Canvas.Left**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.controls.canvas.left) attached property. But what does that change about how a [**Canvas**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.Controls.Canvas) interacts with your object, and when does that happen? We'll examine this particular example further, because if you implement an attached property, it's interesting to see what else a typical attached property owner class intends to do with its attached property values if it finds them on other objects. + +The main function of a [**Canvas**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.Controls.Canvas) is to be an absolute-positioned layout container in UI. The children of a **Canvas** are stored in a base-class defined property [**Children**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.controls.panel.children). Of all the panels **Canvas** is the only one that uses absolute positioning. It would've bloated the object model of the common [**UIElement**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.UIElement) type to add properties that might only be of concern to **Canvas** and those particular **UIElement** cases where they are child elements of a **UIElement**. Defining the layout control properties of a **Canvas** to be attached properties that any **UIElement** can use keeps the object model cleaner. + +In order to be a practical panel, [**Canvas**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.Controls.Canvas) has behavior that overrides the framework-level [**Measure**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.uielement.measure) and [**Arrange**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.uielement.arrange) methods. This is where **Canvas** actually checks for attached property values on its children. Part of both the **Measure** and **Arrange** patterns is a loop that iterates over any content, and a panel has the [**Children**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.controls.panel.children) property that makes it explicit what's supposed to be considered the child of a panel. So the **Canvas** layout behavior iterates through these children, and makes static [**Canvas.GetLeft**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.controls.canvas.getleft) and [**Canvas.GetTop**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.controls.canvas.gettop) calls on each child to see whether those attached properties contain a non-default value (default is 0). These values are then used to absolutely position each child in the **Canvas** available layout space according to the specific values provided by each child, and committed using **Arrange**. + +The code looks something like this pseudocode. + +```syntax +protected override Size ArrangeOverride(Size finalSize) +{ + foreach (UIElement child in Children) + { + double x = (double) Canvas.GetLeft(child); + double y = (double) Canvas.GetTop(child); + child.Arrange(new Rect(new Point(x, y), child.DesiredSize)); + } + return base.ArrangeOverride(finalSize); + // real Canvas has more sophisticated sizing +} +``` + +> [!NOTE] +> For more info on how panels work, see [XAML custom panels overview](/windows/apps/design/layout/custom-panels-overview). + +## Related topics + +- [**RegisterAttached**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.dependencyproperty.registerattached) +- [Attached properties overview](attached-properties-overview.md) +- [Custom dependency properties](custom-dependency-properties.md) +- [XAML overview](xaml-overview.md) diff --git a/hub/apps/develop/platform/xaml/custom-dependency-properties.md b/hub/apps/develop/platform/xaml/custom-dependency-properties.md new file mode 100644 index 0000000000..0e7c12d66f --- /dev/null +++ b/hub/apps/develop/platform/xaml/custom-dependency-properties.md @@ -0,0 +1,513 @@ +--- +description: Explains how to define and implement custom dependency properties for a Windows Runtime app using C++, C#, or Visual Basic. +title: Custom dependency properties +ms.assetid: 5ADF7935-F2CF-4BB6-B1A5-F535C2ED8EF8 +ms.date: 09/08/2025 +ms.topic: article +keywords: windows 10, uwp +ms.localizationpriority: medium +dev_langs: + - csharp + - vb + - cppwinrt + - cppcx +--- +# Custom dependency properties + +Here we explain how to define and implement your own dependency properties for a Windows Runtime app using C++, C#, or Visual Basic. We list reasons why app developers and component authors might want to create custom dependency properties. We describe the implementation steps for a custom dependency property, as well as some best practices that can improve performance, usability, or versatility of the dependency property. + +## Prerequisites + +We assume that you have read the [Dependency properties overview](dependency-properties-overview.md) and that you understand dependency properties from the perspective of a consumer of existing dependency properties. To follow the examples in this topic, you should also understand XAML and know how to write a basic Windows Runtime app using C++, C#, or Visual Basic. + +## What is a dependency property? + +To support styling, data binding, animations, and default values for a property, then it should be implemented as a dependency property. Dependency property values are not stored as fields on the class, they are stored by the xaml framework, and are referenced using a key, which is retrieved when the property is registered with the Windows Runtime property system by calling the [**DependencyProperty.Register**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.dependencyproperty.register) method. Dependency properties can be used only by types deriving from [**DependencyObject**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.DependencyObject). But **DependencyObject** is quite high in the class hierarchy, so the majority of classes that are intended for UI and presentation support can support dependency properties. For more information about dependency properties and some of the terminology and conventions used for describing them in this documentation, see [Dependency properties overview](dependency-properties-overview.md). + +Examples of dependency properties in the Windows Runtime are: [**Control.Background**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.controls.control.background), [**FrameworkElement.Width**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.FrameworkElement.Width), and [**TextBox.Text**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.controls.textbox.text), among many others. + +Convention is that each dependency property exposed by a class has a corresponding **public static readonly** property of type [**DependencyProperty**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.DependencyProperty) that is exposed on that same class the provides the identifier for the dependency property. The identifier's name follows this convention: the name of the dependency property, with the string "Property" added to the end of the name. For example, the corresponding **DependencyProperty** identifier for the **Control.Background** property is [**Control.BackgroundProperty**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.controls.control.backgroundproperty). The identifier stores the information about the dependency property as it was registered, and can then be used for other operations involving the dependency property, such as calling [**SetValue**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.dependencyobject.setvalue). + +## Property wrappers + +Dependency properties typically have a wrapper implementation. Without the wrapper, the only way to get or set the properties would be to use the dependency property utility methods [**GetValue**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.dependencyobject.getvalue) and [**SetValue**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.dependencyobject.setvalue) and to pass the identifier to them as a parameter. This is a rather unnatural usage for something that is ostensibly a property. But with the wrapper, your code and any other code that references the dependency property can use a straightforward object-property syntax that is natural for the language you're using. + +If you implement a custom dependency property yourself and want it to be public and easy to call, define the property wrappers too. The property wrappers are also useful for reporting basic information about the dependency property to reflection or static analysis processes. Specifically, the wrapper is where you place attributes such as [**ContentPropertyAttribute**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.Markup.ContentPropertyAttribute). + +## When to implement a property as a dependency property + +Whenever you implement a public read/write property on a class, as long as your class derives from [**DependencyObject**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.DependencyObject), you have the option to make your property work as a dependency property. Sometimes the typical technique of backing your property with a private field is adequate. Defining your custom property as a dependency property is not always necessary or appropriate. The choice will depend on the scenarios that you intend your property to support. + +You might consider implementing your property as a dependency property when you want it to support one or more of these features of the Windows Runtime or of Windows Runtime apps: + +- Setting the property through a [**Style**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.Style) +- Acting as valid target property for data binding with [**{Binding}**](binding-markup-extension.md) +- Supporting animated values through a [**Storyboard**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.Media.Animation.Storyboard) +- Reporting when the value of the property has been changed by: + - Actions taken by the property system itself + - The environment + - User actions + - Reading and writing styles + +## Checklist for defining a dependency property + +Defining a dependency property can be thought of as a set of concepts. These concepts are not necessarily procedural steps, because several concepts can be addressed in a single line of code in the implementation. This list gives just a quick overview. We'll explain each concept in more detail later in this topic, and we'll show you example code in several languages. + +- Register the property name with the property system (call [**Register**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.dependencyproperty.register)), specifying an owner type and the type of the property value. + - There's a required parameter for [**Register**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.dependencyproperty.register) that expects property metadata. Specify **null** for this, or if you want property-changed behavior, or a metadata-based default value that can be restored by calling [**ClearValue**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.dependencyobject.clearvalue), specify an instance of [**PropertyMetadata**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.propertymetadata). +- Define a [**DependencyProperty**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.DependencyProperty) identifier as a **public static readonly** property member on the owner type. +- Define a wrapper property, following the property accessor model that's used in the language you are implementing. The wrapper property name should match the *name* string that you used in [**Register**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.dependencyproperty.register). Implement the **get** and **set** accessors to connect the wrapper with the dependency property that it wraps, by calling [**GetValue**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.dependencyobject.getvalue) and [**SetValue**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.dependencyobject.setvalue) and passing your own property's identifier as a parameter. +- (Optional) Place attributes such as [**ContentPropertyAttribute**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.Markup.ContentPropertyAttribute) on the wrapper. + +> [!NOTE] +> If you are defining a custom attached property, you generally omit the wrapper. Instead, you write a different style of accessor that a XAML processor can use. See [Custom attached properties](custom-attached-properties.md). + +## Registering the property + +For your property to be a dependency property, you must register the property into a property store maintained by the Windows Runtime property system. To register the property, you call the [**Register**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.dependencyproperty.register) method. + +For Microsoft .NET languages (C# and Microsoft Visual Basic) you call [**Register**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.dependencyproperty.register) within the body of your class (inside the class, but outside any member definitions). The identifier is provided by the [**Register**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.dependencyproperty.register) method call, as the return value. The [**Register**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.dependencyproperty.register) call is typically made as a static constructor or as part of the initialization of a **public static readonly** property of type [**DependencyProperty**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.DependencyProperty) as part of your class. This property exposes the identifier for your dependency property. Here are examples of the [**Register**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.dependencyproperty.register) call. + +> [!NOTE] +> Registering the dependency property as part of the identifier property definition is the typical implementation, but you can also register a dependency property in the class static constructor. This approach may make sense if you need more than one line of code to initialize the dependency property. + +For C++/CX, you have options for how you split the implementation between the header and the code file. The typical split is to declare the identifier itself as **public static** property in the header, with a **get** implementation but no **set**. The **get** implementation refers to a private field, which is an uninitialized [**DependencyProperty**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.DependencyProperty) instance. You can also declare the wrappers and the **get** and **set** implementations of the wrapper. In this case the header includes some minimal implementation. If the wrapper needs Windows Runtime attribution, attribute in the header too. Put the [**Register**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.dependencyproperty.register) call in the code file, within a helper function that only gets run when the app initializes the first time. Use the return value of **Register** to fill the static but uninitialized identifiers that you declared in the header, which you initially set to **nullptr** at the root scope of the implementation file. + +```csharp +public static readonly DependencyProperty LabelProperty = DependencyProperty.Register( + nameof(Label), + typeof(String), + typeof(ImageWithLabelControl), + new PropertyMetadata(null) +); +``` + +```vb +Public Shared ReadOnly LabelProperty As DependencyProperty = + DependencyProperty.Register("Label", + GetType(String), + GetType(ImageWithLabelControl), + New PropertyMetadata(Nothing)) +``` + +```cppwinrt +// ImageWithLabelControl.idl +namespace ImageWithLabelControlApp +{ + runtimeclass ImageWithLabelControl : Windows.UI.Xaml.Controls.Control + { + ImageWithLabelControl(); + static Windows.UI.Xaml.DependencyProperty LabelProperty{ get; }; + String Label; + } +} + +// ImageWithLabelControl.h +... +struct ImageWithLabelControl : ImageWithLabelControlT +{ +... +public: + static Windows::UI::Xaml::DependencyProperty LabelProperty() + { + return m_labelProperty; + } + +private: + static Windows::UI::Xaml::DependencyProperty m_labelProperty; +... +}; + +// ImageWithLabelControl.cpp +... +Windows::UI::Xaml::DependencyProperty ImageWithLabelControl::m_labelProperty = + Windows::UI::Xaml::DependencyProperty::Register( + L"Label", + winrt::xaml_typename(), + winrt::xaml_typename(), + Windows::UI::Xaml::PropertyMetadata{ nullptr } +); +... +``` + +```cppcx +//.h file +//using namespace Windows::UI::Xaml::Controls; +//using namespace Windows::UI::Xaml::Interop; +//using namespace Windows::UI::Xaml; +//using namespace Platform; + +public ref class ImageWithLabelControl sealed : public Control +{ +private: + static DependencyProperty^ _LabelProperty; +... +public: + static void RegisterDependencyProperties(); + static property DependencyProperty^ LabelProperty + { + DependencyProperty^ get() {return _LabelProperty;} + } +... +}; + +//.cpp file +using namespace Windows::UI::Xaml; +using namespace Windows::UI::Xaml.Interop; + +DependencyProperty^ ImageWithLabelControl::_LabelProperty = nullptr; + +// This function is called from the App constructor in App.xaml.cpp +// to register the properties +void ImageWithLabelControl::RegisterDependencyProperties() +{ + if (_LabelProperty == nullptr) + { + _LabelProperty = DependencyProperty::Register( + "Label", Platform::String::typeid, ImageWithLabelControl::typeid, nullptr); + } +} +``` + +> [!NOTE] +> For the C++/CX code, the reason why you have a private field and a public read-only property that surfaces the [**DependencyProperty**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.DependencyProperty) is so that other callers who use your dependency property can also use property-system utility APIs that require the identifier to be public. If you keep the identifier private, people can't use these utility APIs. Examples of such API and scenarios include [**GetValue**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.dependencyobject.getvalue) or [**SetValue**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.dependencyobject.setvalue) by choice, [**ClearValue**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.dependencyobject.clearvalue), [**GetAnimationBaseValue**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.dependencyobject.getanimationbasevalue), [**SetBinding**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.frameworkelement.setbinding), and [**Setter.Property**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.setter.property). You can't use a public field for this, because Windows Runtime metadata rules don't allow for public fields. + +## Dependency property name conventions + +There are naming conventions for dependency properties; follow them in all but exceptional circumstances. The dependency property itself has a basic name ("Label" in the preceding example) that is given as the first parameter of [**Register**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.dependencyproperty.register). The name must be unique within each registering type, and the uniqueness requirement also applies to any inherited members. Dependency properties inherited through base types are considered to be part of the registering type already; names of inherited properties cannot be registered again. + +> [!WARNING] +> Although the name you provide here can be any string identifier that is valid in programming for your language of choice, you usually want to be able to set your dependency property in XAML too. To be set in XAML, the property name you choose must be a valid XAML name. For more info, see [XAML overview](xaml-overview.md). + +When you create the identifier property, combine the name of the property as you registered it with the suffix "Property" ("LabelProperty", for example). This property is your identifier for the dependency property, and it is used as an input for the [**SetValue**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.dependencyobject.setvalue) and [**GetValue**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.dependencyobject.getvalue) calls you make in your own property wrappers. It is also used by the property system and other XAML processors such as [**{x:Bind}**](x-bind-markup-extension.md) + +## Implementing the wrapper + +Your property wrapper should call [**GetValue**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.dependencyobject.getvalue) in the **get** implementation, and [**SetValue**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.dependencyobject.setvalue) in the **set** implementation. + +> [!WARNING] +> In all but exceptional circumstances, your wrapper implementations should perform only the [**GetValue**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.dependencyobject.getvalue) and [**SetValue**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.dependencyobject.setvalue) operations. Otherwise, you'll get different behavior when your property is set via XAML versus when it is set via code. For efficiency, the XAML parser bypasses wrappers when setting dependency properties; and talks to the backing store via **SetValue**. + +```csharp +public String Label +{ + get { return (String)GetValue(LabelProperty); } + set { SetValue(LabelProperty, value); } +} +``` + +```vb +Public Property Label() As String + Get + Return DirectCast(GetValue(LabelProperty), String) + End Get + Set(ByVal value As String) + SetValue(LabelProperty, value) + End Set +End Property +``` + +```cppwinrt +// ImageWithLabelControl.h +... +winrt::hstring Label() +{ + return winrt::unbox_value(GetValue(m_labelProperty)); +} + +void Label(winrt::hstring const& value) +{ + SetValue(m_labelProperty, winrt::box_value(value)); +} +... +``` + +```cppcx +//using namespace Platform; +public: +... + property String^ Label + { + String^ get() { + return (String^)GetValue(LabelProperty); + } + void set(String^ value) { + SetValue(LabelProperty, value); + } + } +``` + +## Property metadata for a custom dependency property + +When property metadata is assigned to a dependency property, the same metadata is applied to that property for every instance of the property-owner type or its subclasses. In property metadata, you can specify two behaviors: + +- A default value that the property system assigns to all cases of the property. +- A static callback method that is automatically invoked within the property system whenever a property value change is detected. + +### Calling Register with property metadata + +In the previous examples of calling [**DependencyProperty.Register**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.dependencyproperty.register), we passed a null value for the *propertyMetadata* parameter. To enable a dependency property to provide a default value or use a property-changed callback, you must define a [**PropertyMetadata**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.PropertyMetadata) instance that provides one or both of these capabilities. + +Typically you provide a [**PropertyMetadata**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.PropertyMetadata) as an inline-created instance, within the parameters for [**DependencyProperty.Register**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.dependencyproperty.register). + +> [!NOTE] +> If you are defining a [**CreateDefaultValueCallback**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.createdefaultvaluecallback) implementation, you must use the utility method [**PropertyMetadata.Create**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.propertymetadata.create) rather than calling a [**PropertyMetadata**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.PropertyMetadata) constructor to define the **PropertyMetadata** instance. + +This next example modifies the previously shown [**DependencyProperty.Register**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.dependencyproperty.register) examples by referencing a [**PropertyMetadata**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.PropertyMetadata) instance with a [**PropertyChangedCallback**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.propertychangedcallback) value. The implementation of the "OnLabelChanged" callback will be shown later in this section. + +```csharp +public static readonly DependencyProperty LabelProperty = DependencyProperty.Register( + nameof(Label), + typeof(String), + typeof(ImageWithLabelControl), + new PropertyMetadata(null,new PropertyChangedCallback(OnLabelChanged)) +); +``` + +```vb +Public Shared ReadOnly LabelProperty As DependencyProperty = + DependencyProperty.Register("Label", + GetType(String), + GetType(ImageWithLabelControl), + New PropertyMetadata( + Nothing, new PropertyChangedCallback(AddressOf OnLabelChanged))) +``` + +```cppwinrt +// ImageWithLabelControl.cpp +... +Windows::UI::Xaml::DependencyProperty ImageWithLabelControl::m_labelProperty = + Windows::UI::Xaml::DependencyProperty::Register( + L"Label", + winrt::xaml_typename(), + winrt::xaml_typename(), + Windows::UI::Xaml::PropertyMetadata{ nullptr, Windows::UI::Xaml::PropertyChangedCallback{ &ImageWithLabelControl::OnLabelChanged } } +); +... +``` + +```cppcx +DependencyProperty^ ImageWithLabelControl::_LabelProperty = + DependencyProperty::Register("Label", + Platform::String::typeid, + ImageWithLabelControl::typeid, + ref new PropertyMetadata(nullptr, + ref new PropertyChangedCallback(&ImageWithLabelControl::OnLabelChanged)) + ); +``` + +### Default value + +You can specify a default value for a dependency property such that the property always returns a particular default value when it is unset. This value can be different than the inherent default value for the type of that property. + +If a default value is not specified, the default value for a dependency property is null for a reference type, or the default of the type for a value type or language primitive (for example, 0 for an integer or an empty string for a string). The main reason for establishing a default value is that this value is restored when you call [**ClearValue**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.dependencyobject.clearvalue) on the property. Establishing a default value on a per-property basis might be more convenient than establishing default values in constructors, particularly for value types. However, for reference types, make sure that establishing a default value does not create an unintentional singleton pattern. For more info, see [Best practices](#best-practices) later in this topic + +```cppwinrt +// ImageWithLabelControl.cpp +... +Windows::UI::Xaml::DependencyProperty ImageWithLabelControl::m_labelProperty = + Windows::UI::Xaml::DependencyProperty::Register( + L"Label", + winrt::xaml_typename(), + winrt::xaml_typename(), + Windows::UI::Xaml::PropertyMetadata{ winrt::box_value(L"default label"), Windows::UI::Xaml::PropertyChangedCallback{ &ImageWithLabelControl::OnLabelChanged } } +); +... +``` + +> [!NOTE] +> Do not register with a default value of [**UnsetValue**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.dependencyproperty.unsetvalue). If you do, it will confuse property consumers and will have unintended consequences within the property system. + +### CreateDefaultValueCallback + +In some scenarios, you are defining dependency properties for objects that are used on more than one UI thread. This might be the case if you are defining a data object that is used by multiple apps, or a control that you use in more than one app. You can enable the exchange of the object between different UI threads by providing a [**CreateDefaultValueCallback**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.createdefaultvaluecallback) implementation rather than a default value instance, which is tied to the thread that registered the property. Basically a [**CreateDefaultValueCallback**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.createdefaultvaluecallback) defines a factory for default values. The value returned by **CreateDefaultValueCallback** is always associated with the current UI **CreateDefaultValueCallback** thread that is using the object. + +To define metadata that specifies a [**CreateDefaultValueCallback**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.createdefaultvaluecallback), you must call [**PropertyMetadata.Create**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.propertymetadata.create) to return a metadata instance; the [**PropertyMetadata**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.PropertyMetadata) constructors do not have a signature that includes a **CreateDefaultValueCallback** parameter. + +The typical implementation pattern for a [**CreateDefaultValueCallback**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.createdefaultvaluecallback) is to create a new [**DependencyObject**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.DependencyObject) class, set the specific property value of each property of the **DependencyObject** to the intended default, and then return the new class as an **Object** reference via the return value of the **CreateDefaultValueCallback** method. + +### Property-changed callback method + +You can define a property-changed callback method to define your property's interactions with other dependency properties, or to update an internal property or state of your object whenever the property changes. If your callback is invoked, the property system has determined that there is an effective property value change. Because the callback method is static, the *d* parameter of the callback is important because it tells you which instance of the class has reported a change. A typical implementation uses the [**NewValue**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.dependencypropertychangedeventargs.newvalue) property of the event data and processes that value in some manner, usually by performing some other change on the object passed as *d*. Additional responses to a property change are to reject the value reported by **NewValue**, to restore [**OldValue**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.dependencypropertychangedeventargs.oldvalue), or to set the value to a programmatic constraint applied to the **NewValue**. + +This next example shows a [**PropertyChangedCallback**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.propertychangedcallback) implementation. It implements the method you saw referenced in the previous [**Register**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.dependencyproperty.register) examples, as part of the construction arguments for the [**PropertyMetadata**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.PropertyMetadata). The scenario addressed by this callback is that the class also has a calculated read-only property named "HasLabelValue" (implementation not shown). Whenever the "Label" property gets reevaluated, this callback method is invoked, and the callback enables the dependent calculated value to remain in synchronization with changes to the dependency property. + +```csharp +private static void OnLabelChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { + ImageWithLabelControl iwlc = d as ImageWithLabelControl; //null checks omitted + String s = e.NewValue as String; //null checks omitted + if (s == String.Empty) + { + iwlc.HasLabelValue = false; + } else { + iwlc.HasLabelValue = true; + } +} +``` + +```vb + Private Shared Sub OnLabelChanged(d As DependencyObject, e As DependencyPropertyChangedEventArgs) + Dim iwlc As ImageWithLabelControl = CType(d, ImageWithLabelControl) ' null checks omitted + Dim s As String = CType(e.NewValue,String) ' null checks omitted + If s Is String.Empty Then + iwlc.HasLabelValue = False + Else + iwlc.HasLabelValue = True + End If + End Sub +``` + +```cppwinrt +void ImageWithLabelControl::OnLabelChanged(Windows::UI::Xaml::DependencyObject const& d, Windows::UI::Xaml::DependencyPropertyChangedEventArgs const& e) +{ + auto iwlc{ d.as() }; + auto s{ winrt::unbox_value(e.NewValue()) }; + iwlc.HasLabelValue(s.size() != 0); +} +``` + +```cppcx +static void OnLabelChanged(DependencyObject^ d, DependencyPropertyChangedEventArgs^ e) +{ + ImageWithLabelControl^ iwlc = (ImageWithLabelControl^)d; + Platform::String^ s = (Platform::String^)(e->NewValue); + if (s->IsEmpty()) { + iwlc->HasLabelValue=false; + } +} +``` + +### Property changed behavior for structures and enumerations + +If the type of a [**DependencyProperty**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.DependencyProperty) is an enumeration or a structure, the callback may be invoked even if the internal values of the structure or the enumeration value did not change. This is different from a system primitive such as a string where it only is invoked if the value changed. This is a side effect of box and unbox operations on these values that is done internally. If you have a [**PropertyChangedCallback**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.propertychangedcallback) method for a property where your value is an enumeration or structure, you need to compare the [**OldValue**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.dependencypropertychangedeventargs.oldvalue) and [**NewValue**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.dependencypropertychangedeventargs.newvalue) by casting the values yourself and using the overloaded comparison operators that are available to the now-cast values. Or, if no such operator is available (which might be the case for a custom structure), you may need to compare the individual values. You would typically choose to do nothing if the result is that the values have not changed. + +```csharp +private static void OnVisibilityValueChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { + if ((Visibility)e.NewValue != (Visibility)e.OldValue) + { + //value really changed, invoke your changed logic here + } // else this was invoked because of boxing, do nothing +} +``` + +```vb +Private Shared Sub OnVisibilityValueChanged(d As DependencyObject, e As DependencyPropertyChangedEventArgs) + If CType(e.NewValue,Visibility) != CType(e.OldValue,Visibility) Then + ' value really changed, invoke your changed logic here + End If + ' else this was invoked because of boxing, do nothing +End Sub +``` + +```cppwinrt +static void OnVisibilityValueChanged(Windows::UI::Xaml::DependencyObject const& d, Windows::UI::Xaml::DependencyPropertyChangedEventArgs const& e) +{ + auto oldVisibility{ winrt::unbox_value(e.OldValue()) }; + auto newVisibility{ winrt::unbox_value(e.NewValue()) }; + + if (newVisibility != oldVisibility) + { + // The value really changed; invoke your property-changed logic here. + } + // Otherwise, OnVisibilityValueChanged was invoked because of boxing; do nothing. +} +``` + +```cppcx +static void OnVisibilityValueChanged(DependencyObject^ d, DependencyPropertyChangedEventArgs^ e) +{ + if ((Visibility)e->NewValue != (Visibility)e->OldValue) + { + //value really changed, invoke your changed logic here + } + // else this was invoked because of boxing, do nothing + } +} +``` + +## Best practices + +Keep the following considerations in mind as best practices when as you define your custom dependency property. + +### DependencyObject and threading + +All [**DependencyObject**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.DependencyObject) instances must be created on the UI thread which is associated with the current [**Window**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.Window) that is shown by a Windows Runtime app. Although each **DependencyObject** must be created on the main UI thread, the objects can be accessed using a dispatcher reference from other threads, by calling [**Dispatcher**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.dependencyobject.dispatcher). + +The threading aspects of [**DependencyObject**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.DependencyObject) are relevant because it generally means that only code that runs on the UI thread can change or even read the value of a dependency property. Threading issues can usually be avoided in typical UI code that makes correct use of **async** patterns and background worker threads. You typically only run into **DependencyObject**-related threading issues if you are defining your own **DependencyObject** types and you attempt to use them for data sources or other scenarios where a **DependencyObject** isn't necessarily appropriate. + +### Avoiding unintentional singletons + +An unintentional singleton can happen if you are declaring a dependency property that takes a reference type, and you call a constructor for that reference type as part of the code that establishes your [**PropertyMetadata**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.PropertyMetadata). What happens is that all usages of the dependency property share just one instance of **PropertyMetadata** and thus try to share the single reference type you constructed. Any subproperties of that value type that you set through your dependency property then propagate to other objects in ways you may not have intended. + +You can use class constructors to set initial values for a reference-type dependency property if you want a non-null value, but be aware that this would be considered a local value for purposes of [Dependency properties overview](dependency-properties-overview.md). It might be more appropriate to use a template for this purpose, if your class supports templates. Another way to avoid a singleton pattern, but still provide a useful default, is to expose a static property on the reference type that provides a suitable default for the values of that class. + +### Collection-type dependency properties + +Collection-type dependency properties have some additional implementation issues to consider. + +Collection-type dependency properties are relatively rare in the Windows Runtime API. In most cases, you can use collections where the items are a [**DependencyObject**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.DependencyObject) subclass, but the collection property itself is implemented as a conventional CLR or C++ property. This is because collections do not necessarily suit some typical scenarios where dependency properties are involved. For example: + +- You do not typically animate a collection. +- You do not typically prepopulate the items in a collection with styles or a template. +- Although binding to collections is a major scenario, a collection does not need to be a dependency property to be a binding source. For binding targets, it is more typical to use subclasses of [**ItemsControl**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.Controls.ItemsControl) or [**DataTemplate**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.DataTemplate) to support collection items, or to use view-model patterns. For more info about binding to and from collections, see [Data binding in depth](../../data-binding/data-binding-in-depth.md). +- Notifications for collection changes are better addressed through interfaces such as **INotifyPropertyChanged** or **INotifyCollectionChanged**, or by deriving the collection type from [**ObservableCollection<T>**](/dotnet/api/system.collections.objectmodel.observablecollection-1). + +Nevertheless, scenarios for collection-type dependency properties do exist. The next three sections provide some guidance on how to implement a collection-type dependency property. + +### Initializing the collection + +When you create a dependency property, you can establish a default value by means of dependency property metadata. But be careful to not use a singleton static collection as the default value. Instead, you must deliberately set the collection value to a unique (instance) collection as part of class-constructor logic for the owner class of the collection property. + +```csharp +// WARNING - DO NOT DO THIS +public static readonly DependencyProperty ItemsProperty = DependencyProperty.Register( + nameof(Items), + typeof(IList), + typeof(ImageWithLabelControl), + new PropertyMetadata(new List()) +); + +// DO THIS Instead +public static readonly DependencyProperty ItemsProperty = DependencyProperty.Register( + nameof(Items), + typeof(IList), + typeof(ImageWithLabelControl), + new PropertyMetadata(null) +); + +public ImageWithLabelControl() +{ + // Need to initialize in constructor instead + Items = new List(); +} +``` + +A DependencyProperty and its PropertyMetadata's default value are part of the static definition of the DependencyProperty. By providing a default collection (or other instanced) value as the default value, it will be shared across all instances of your class instead of each class having its own collection, as would typically be desired. + +### Change notifications + +Defining the collection as a dependency property does not automatically provide change notification for the items in the collection by virtue of the property system invoking the "PropertyChanged" callback method. If you want notifications for collections or collection items—for example, for a data-binding scenario— implement the **INotifyPropertyChanged** or **INotifyCollectionChanged** interface. For more info, see [Data binding in depth](../../data-binding/data-binding-in-depth.md). + +### Dependency property security considerations + +Declare dependency properties as public properties. Declare dependency property identifiers as **public static readonly** members. Even if you attempt to declare other access levels permitted by a language (such as **protected**), a dependency property can always be accessed through the identifier in combination with the property-system APIs. Declaring the dependency property identifier as internal or private will not work, because then the property system cannot operate properly. + +Wrapper properties are really just for convenience, Security mechanisms applied to the wrappers can be bypassed by calling [**GetValue**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.dependencyobject.getvalue) or [**SetValue**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.dependencyobject.setvalue) instead. So keep wrapper properties public; otherwise you just make your property harder for legitimate callers to use without providing any real security benefit. + +The Windows Runtime does not provide a way to register a custom dependency property as read-only. + +### Dependency properties and class constructors + +There is a general principle that class constructors should not call virtual methods. This is because constructors can be called to accomplish base initialization of a derived class constructor, and entering the virtual method through the constructor might occur when the object instance being constructed is not yet completely initialized. When you derive from any class that already derives from [**DependencyObject**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.DependencyObject), remember that the property system itself calls and exposes virtual methods internally as part of its services. To avoid potential problems with run-time initialization, don't set dependency property values within constructors of classes. + +### Registering the dependency properties for C++/CX apps + +The implementation for registering a property in C++/CX is trickier than C#, both because of the separation into header and implementation file and also because initialization at the root scope of the implementation file is a bad practice. (Visual C++ component extensions (C++/CX) puts static initializer code from the root scope directly into **DllMain**, whereas C# compilers assign the static initializers to classes and thus avoid **DllMain** load lock issues.). The best practice here is to declare a helper function that does all your dependency property registration for a class, one function per class. Then for each custom class your app consumes, you'll have to reference the helper registration function that's exposed by each custom class you want to use. Call each helper registration function once as part of the [**Application constructor**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.application.-ctor) (`App::App()`), prior to `InitializeComponent`. That constructor only runs when the app is really referenced for the first time, it won't run again if a suspended app resumes, for example. Also, as seen in the previous C++ registration example, the **nullptr** check around each [**Register**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.dependencyproperty.register) call is important: it's insurance that no caller of the function can register the property twice. A second registration call would probably crash your app without such a check because the property name would be a duplicate. You can see this implementation pattern in the [XAML user and custom controls sample](https://github.com/microsoftarchive/msdn-code-gallery-microsoft/tree/master/Official%20Windows%20Platform%20Sample/XAML%20user%20and%20custom%20controls%20sample) if you look at the code for the C++/CX version of the sample. + +## Related topics + +- [**DependencyObject**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.DependencyObject) +- [**DependencyProperty.Register**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.dependencyproperty.register) +- [Dependency properties overview](dependency-properties-overview.md) +- [XAML user and custom controls sample](https://github.com/microsoftarchive/msdn-code-gallery-microsoft/tree/master/Official%20Windows%20Platform%20Sample/XAML%20user%20and%20custom%20controls%20sample) +  diff --git a/hub/apps/develop/platform/xaml/customresource-markup-extension.md b/hub/apps/develop/platform/xaml/customresource-markup-extension.md new file mode 100644 index 0000000000..ec92245d14 --- /dev/null +++ b/hub/apps/develop/platform/xaml/customresource-markup-extension.md @@ -0,0 +1,46 @@ +--- +description: Provides a value for any XAML attribute by evaluating a reference to a resource that comes from a custom resource-lookup implementation. Resource lookup is performed by a CustomXamlResourceLoader class implementation. +title: CustomResource markup extension +ms.assetid: 3A59A8DE-E805-4F04-B9D9-A91E053F3642 +ms.date: 09/08/2025 +ms.topic: article +keywords: windows 10, uwp +ms.localizationpriority: medium +--- +# {CustomResource} markup extension + +Provides a value for any XAML attribute by evaluating a reference to a resource that comes from a custom resource-lookup implementation. Resource lookup is performed by a [**CustomXamlResourceLoader**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.Resources.CustomXamlResourceLoader) class implementation. + +## XAML attribute usage + +``` syntax + +``` + +## XAML values + +| Term | Description | +|------|-------------| +| key | The key for the requested resource. How the key is initially assigned is specific to the implementation of the [**CustomXamlResourceLoader**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.Resources.CustomXamlResourceLoader) class that is currently registered for use. | + +## Remarks + +**CustomResource** is a technique for obtaining values that are defined elsewhere in a custom resource repository. This technique is relatively advanced and isn't used by most Windows Runtime app scenarios. + +How a **CustomResource** resolves to a resource dictionary is not described in this topic, because that can vary widely depending on how [**CustomXamlResourceLoader**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.Resources.CustomXamlResourceLoader) is implemented. + +The [**GetResource**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.resources.customxamlresourceloader.getresource) method of the [**CustomXamlResourceLoader**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.Resources.CustomXamlResourceLoader) implementation is called by the Windows Runtime XAML parser whenever it encounters a `{CustomResource}` usage in markup. The *resourceId* that is passed to **GetResource** comes from the *key* argument, and the other input parameters come from context, such as which property the usage is applied to. + +A `{CustomResource}` usage doesn't work by default (the base implementation of [**GetResource**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.resources.customxamlresourceloader.getresource) is incomplete). To make a valid `{CustomResource}` reference, you must perform each of these steps: + +1. Derive a custom class from [**CustomXamlResourceLoader**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.Resources.CustomXamlResourceLoader) and override [**GetResource**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.resources.customxamlresourceloader.getresource) method. Do not call base in the implementation. +1. Set [**CustomXamlResourceLoader.Current**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.resources.customxamlresourceloader.current) to reference your class in initialization logic. This must happen before any page-level XAML that includes the `{CustomResource}` extension usage is loaded. One place to set **CustomXamlResourceLoader.Current** is in the [**Application**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.Application) subclass constructor that's generated for you in the App.xaml code-behind templates. +1. Now you can use `{CustomResource}` extensions in the XAML that your app loads as pages, or from within XAML resource dictionaries. + +**CustomResource** is a markup extension. Markup extensions are typically implemented when there is a requirement to escape attribute values to be other than literal values or handler names, and the requirement is more global than just putting type converters on certain types or properties. All markup extensions in XAML use the "\{" and "\}" characters in their attribute syntax, which is the convention by which a XAML processor recognizes that a markup extension must process the attribute. + +## Related topics + +- [ResourceDictionary and XAML resource references](xaml-resource-dictionary.md) +- [**CustomXamlResourceLoader**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.Resources.CustomXamlResourceLoader) +- [**GetResource**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.resources.customxamlresourceloader.getresource) diff --git a/hub/apps/develop/platform/xaml/dependency-properties-overview.md b/hub/apps/develop/platform/xaml/dependency-properties-overview.md new file mode 100644 index 0000000000..234eb128ba --- /dev/null +++ b/hub/apps/develop/platform/xaml/dependency-properties-overview.md @@ -0,0 +1,210 @@ +--- +description: This topic explains the dependency property system that is available when you write a Windows Runtime app using C++, C#, or Visual Basic along with XAML definitions for UI. +title: Dependency properties overview +ms.assetid: AD649E66-F71C-4DAA-9994-617C886FDA7E +ms.date: 02/08/2017 +ms.topic: article +keywords: windows 10, uwp +ms.localizationpriority: medium +--- +# Dependency properties overview + +This topic explains the dependency property system that is available when you write a Windows Runtime app with XAML definitions for UI. + +## What is a dependency property? + +A dependency property is a specialized type of property. Specifically it's a property where the property's value is tracked and influenced by a dedicated property system that is part of the Windows Runtime. + +In order to support a dependency property, the object that defines the property must be a [**DependencyObject**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.dependencyobject) (in other words a class that has the **DependencyObject** base class somewhere in its inheritance). Many of the types you use for your UI definitions for a UWP app with XAML will be a **DependencyObject** subclass, and will support dependency properties. However, any type that comes from a Windows Runtime namespace that doesn't have "XAML" in its name won't support dependency properties; properties of such types are ordinary properties that won't have the property system's dependency behavior. + +The purpose of dependency properties is to provide a systemic way to compute the value of a property based on other inputs (other properties, events and states that occur within your app while it runs). These other inputs might include: + +- External input such as user preference +- Just-in-time property determination mechanisms such as data binding, animations and storyboards +- Multiple-use templating patterns such as resources and styles +- Values known through parent-child relationships with other elements in the object tree + +A dependency property represents or supports a specific feature of the programming model for defining a Windows Runtime app with XAML for UI. These features include: + +- Data binding +- Styles +- Storyboarded animations +- "PropertyChanged" behavior; a dependency property can be implemented to provide callbacks that can propagate changes to other dependency properties +- Using a default value that comes from property metadata +- General property system utility such as [**ClearValue**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.dependencyobject.clearvalue) and metadata lookup + +## Dependency properties and Windows Runtime properties + +Dependency properties extend basic Windows Runtime property functionality by providing a global, internal property store that backs all of the dependency properties in an app at run time. This is an alternative to the standard pattern of backing a property with a private field that's private in the property-definition class. You can think of this internal property store as being a set of property identifiers and values that exist for any particular object (so long as it's a [**DependencyObject**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.dependencyobject)). Rather than being identified by name, each property in the store is identified by a [**DependencyProperty**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.DependencyProperty) instance. However, the property system mostly hides this implementation detail: you can usually access dependency properties by using a simple name (the programmatic property name in the code language you're using, or an attribute name when you're writing XAML). + +The base type that provides the underpinnings of the dependency property system is [**DependencyObject**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.dependencyobject). **DependencyObject** defines methods that can access the dependency property, and instances of a **DependencyObject** derived class internally support the property store concept we mentioned earlier. + +Here is a summation of the terminology that we use in the documentation when discussing dependency properties: + +| Term | Description | +|------|-------------| +| Dependency property | A property that exists on a [**DependencyProperty**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.DependencyProperty) identifier (see below). Usually this identifier is available as a static member of the defining **DependencyObject** derived class. | +| Dependency property identifier | A constant value to identify the property, it is typically public and read-only. | +| Property wrapper | The callable **get** and **set** implementations for a Windows Runtime property. Or, the language-specific projection of the original definition. A **get** property wrapper implementation calls [**GetValue**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.dependencyobject.getvalue), passing the relevant dependency property identifier. | + +The property wrapper is not just convenience for callers, it also exposes the dependency property to any process, tool or projection that uses Windows Runtime definitions for properties. + +The following example defines a custom dependency property as defined for C#, and shows the relationship of the dependency property identifier to the property wrapper. + +```csharp +public static readonly DependencyProperty LabelProperty = DependencyProperty.Register( + "Label", + typeof(string), + typeof(ImageWithLabelControl), + new PropertyMetadata(null) +); + + +public string Label +{ + get { return (string)GetValue(LabelProperty); } + set { SetValue(LabelProperty, value); } +} +``` + +> [!NOTE] +> The preceding example is not intended as the complete example for how to create a custom dependency property. It is intended to show dependency property concepts for anyone that prefers learning concepts through code. For a more complete explanation of this example, see [Custom dependency properties](custom-dependency-properties.md). + +## Dependency property value precedence + +When you get the value of a dependency property, you are obtaining a value that was determined for that property through any one of the inputs that participate in the Windows Runtime property system. Dependency property value precedence exists so that the Windows Runtime property system can calculate values in a predictable way, and it's important that you be familiar with the basic precedence order too. Otherwise, you might find yourself in a situation where you're trying to set a property at one level of precedence but something else (the system, third-party callers, some of your own code) is setting it at another level, and you'll get frustrated trying to figure out which property value is used and where that value came from. + +For example, styles and templates are intended to be a shared starting point for establishing property values and thus appearances of a control. But on a particular control instance you might want to change its value versus the common templated value, such as giving that control a different background color or a different text string as content. The Windows Runtime property system considers local values at higher precedence than values provided by styles and templates. That enables the scenario of having app-specific values overwrite the templates so that the controls are useful for your own use of them in app UI. + +### Dependency property precedence list + +The following is the definitive order that the property system uses when assigning the run-time value for a dependency property. Highest precedence is listed first. You'll find more detailed explanations just past this list. + +1. **Animated values:** Active animations, visual state animations, or animations with a [**HoldEnd**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.media.animation.fillbehavior) behavior. To have any practical effect, an animation applied to a property must have precedence over the base (unanimated) value, even if that value was set locally. +1. **Local value:** A local value might be set through the convenience of the property wrapper, which also equates to setting as an attribute or property element in XAML, or by a call to the [**SetValue**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.dependencyobject.setvalue) method using a property of a specific instance. If you set a local value by using a binding or a static resource, these each act in the precedence as if a local value was set, and bindings or resource references are erased if a new local value is set. +1. **Templated properties:** An element has these if it was created as part of a template (from a [**ControlTemplate**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.controls.controltemplate) or [**DataTemplate**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.datatemplate)). +1. **Style setters:** Values from a [**Setter**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.setter) within styles from page or application resources. +1. **Default value:** A dependency property can have a default value as part of its metadata. + +### Templated properties + +Templated properties as a precedence item do not apply to any property of an element that you declare directly in XAML page markup. The templated property concept exists only for objects that are created when the Windows Runtime applies a XAML template to a UI element and thus defines its visuals. + +All the properties that are set from a control template have values of some kind. These values are almost like an extended set of default values for the control and are often associated with values you can reset later by setting the property values directly. Thus the template-set values must be distinguishable from a true local value, so that any new local value can overwrite it. + +> [!NOTE] +> In some cases the template might override even local values, if the template failed to expose [{TemplateBinding} markup extension](templatebinding-markup-extension.md) references for properties that should have been settable on instances. This is usually done only if the property is really not intended to be set on instances, for example if it's only relevant to visuals and template behavior and not to the intended function or runtime logic of the control that uses the template. + +### Bindings and precedence + +Binding operations have the appropriate precedence for whatever scope they're used for. For example, a [{Binding}](binding-markup-extension.md) applied to a local value acts as local value, and a [{TemplateBinding} markup extension](templatebinding-markup-extension.md) for a property setter applies as a style setter does. Because bindings must wait until run-time to obtain values from data sources, the process of determining the property value precedence for any property extends into run-time as well. + +Not only do bindings operate at the same precedence as a local value, they really are a local value, where the binding is the placeholder for a value that is deferred. If you have a binding in place for a property value, and you set a local value on it at run-time, that replaces the binding entirely. Similarly, if you call [**SetBinding**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.frameworkelement.setbinding) to define a binding that only comes into existence at run-time, you replace any local value you might have applied in XAML or with previously executed code. + +### Storyboarded animations and base value + +Storyboarded animations act on a concept of a *base value*. The base value is the value that's determined by the property system using its precedence, but omitting that last step of looking for animations. For example, a base value might come from a control's template, or it might come from setting a local value on an instance of a control. Either way, applying an animation will overwrite this base value and apply the animated value for as long as your animation continues to run. + +For an animated property, the base value can still have an effect on the animation's behavior, if that animation does not explicitly specify both **From** and **To**, or if the animation reverts the property to its base value when completed. In these cases, once an animation is no longer running, the rest of the precedence is used again. + +However, an animation that specifies a **To** with a [**HoldEnd**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.media.animation.fillbehavior) behavior can override a local value until the animation is removed, even when it visually appears to be stopped. Conceptually this is like an animation that's running forever even if there is not a visual animation in the UI. + +Multiple animations can be applied to a single property. Each of these animations might have been defined to replace base values that came from different points in the value precedence. However, these animations will all be running simultaneously at run time, and that often means that they must combine their values because each animation has equal influence on the value. This depends on exactly how the animations are defined, and the type of the value that is being animated. + +For more info, see [Storyboarded animations](/windows/apps/design/motion/storyboarded-animations). + +### Default values + +Establishing the default value for a dependency property with a [**PropertyMetadata**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.PropertyMetadata) value is explained in more detail in the [Custom dependency properties](custom-dependency-properties.md) topic. + +Dependency properties still have default values even if those default values weren't explicitly defined in that property's metadata. Unless they have been changed by metadata, default values for the Windows Runtime dependency properties are generally one of the following: + +- A property that uses a run-time object or the basic **Object** type (a *reference type*) has a default value of **null**. For example, [**DataContext**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.frameworkelement.datacontext) is **null** until it's deliberately set or is inherited. +- A property that uses a basic value such as numbers or a Boolean value (a *value type*) uses an expected default for that value. For example, 0 for integers and floating-point numbers, **false** for a Boolean. +- A property that uses a Windows Runtime structure has a default value that's obtained by calling that structure's implicit default constructor. This constructor uses the defaults for each of the basic value fields of the structure. For example, a default for a [**Point**](/uwp/api/Windows.Foundation.Point) value is initialized with its **X** and **Y** values as 0. +- A property that uses an enumeration has a default value of the first defined member in that enumeration. Check the reference for specific enumerations to see what the default value is. +- A property that uses a string ([**System.String**](/dotnet/api/system.string) for .NET, [**Platform::String**](/cpp/cppcx/platform-string-class) for C++/CX) has a default value of an empty string (**""**). +- Collection properties aren't typically implemented as dependency properties, for reasons discussed further on in this topic. But if you implement a custom collection property and you want it to be a dependency property, make sure to avoid an *unintentional singleton* as described near the end of [Custom dependency properties](custom-dependency-properties.md). + +## Property functionality provided by a dependency property + +### Data binding + +A dependency property can have its value set through applying a data binding. Data binding uses the [{Binding} markup extension](binding-markup-extension.md) syntax in XAML, [{x:Bind} markup extension](x-bind-markup-extension.md) or the [**Binding**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.Data.Binding) class in code. For a databound property, the final property value determination is deferred until run time. At that time the value is obtained from a data source. The role that the dependency property system plays here is enabling a placeholder behavior for operations like loading XAML when the value is not yet known, and then supplying the value at run time by interacting with the Windows Runtime data binding engine. + +The following example sets the [**Text**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.controls.textblock.text) value for a [**TextBlock**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.Controls.TextBlock) element, using a binding in XAML. The binding uses an inherited data context and an object data source. (Neither of these is shown in the shortened example; for a more complete sample that shows context and source, see [Data binding in depth](../../data-binding/data-binding-in-depth.md).) + +```xaml + + + +``` + +You can also establish bindings using code rather than XAML. See [**SetBinding**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.frameworkelement.setbinding). + +> [!NOTE] +> Bindings like this are treated as a local value for purposes of dependency property value precedence. If you set another local value for a property that originally held a [**Binding**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.Data.Binding) value, you will overwrite the binding entirely, not just the binding's run-time value. {x:Bind} Bindings are implemented using generated code that will set a local value for the property. If you set a local value for a property that is using {x:Bind}, then that value will be replaced the next time the binding is evaluated, such as when it observes a property change on its source object. + +### Binding sources, binding targets, the role of FrameworkElement + +To be the source of a binding, a property does not need to be a dependency property; you can generally use any property as a binding source, although this depends on your programming language and each has certain edge cases. However, to be the target of a [{Binding} markup extension](binding-markup-extension.md) or [**Binding**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.Data.Binding), that property must be a dependency property. {x:Bind} does not have this requirement as it uses generated code to apply its binding values. + +If you are creating a binding in code, note that the [**SetBinding**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.frameworkelement.setbinding) API is defined only for [**FrameworkElement**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.FrameworkElement). However, you can create a binding definition using [**BindingOperations**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.Data.BindingOperations) instead, and thus reference any [**DependencyObject**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.dependencyobject) property. + +For either code or XAML, remember that [**DataContext**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.frameworkelement.datacontext) is a [**FrameworkElement**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.FrameworkElement) property. By using a form of parent-child property inheritance (typically established in XAML markup), the binding system can resolve a **DataContext** that exists on a parent element. This inheritance can evaluate even if the child object (which has the target property) is not a **FrameworkElement** and therefore does not hold its own **DataContext** value. However, the parent element being inherited must be a **FrameworkElement** in order to set and hold the **DataContext**. Alternatively, you must define the binding such that it can function with a **null** value for **DataContext**. + +Wiring the binding is not the only thing that's needed for most data binding scenarios. For a one-way or two-way binding to be effective, the source property must support change notifications that propagate to the binding system and thus the target. For custom binding sources, this means that the property must be a dependency property, or the object must support [**INotifyPropertyChanged**](/dotnet/api/system.componentmodel.inotifypropertychanged). Collections should support [**INotifyCollectionChanged**](/dotnet/api/system.collections.specialized.inotifycollectionchanged). Certain classes support these interfaces in their implementations so that they are useful as base classes for data binding scenarios; an example of such a class is [**ObservableCollection<T>**](/dotnet/api/system.collections.objectmodel.observablecollection-1). For more information on data binding and how data binding relates to the property system, see [Data binding in depth](../../data-binding/data-binding-in-depth.md). + +> [!NOTE] +> The types listed here support Microsoft .NET data sources. C++/CX data sources use different interfaces for change notification or observable behavior, see [Data binding in depth](../../data-binding/data-binding-in-depth.md). + +### Styles and templates + +Styles and templates are two of the scenarios for properties being defined as dependency properties. Styles are useful for setting properties that define the app's UI. Styles are defined as resources in XAML, either as an entry in a [**Resources**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.frameworkelement.resources) collection, or in separate XAML files such as theme resource dictionaries. Styles interact with the property system because they contain setters for properties. The most important property here is the [**Control.Template**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.controls.control.template) property of a [**Control**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.Controls.Control): it defines most of the visual appearance and visual state for a **Control**. For more info on styles, and some example XAML that defines a [**Style**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.Style) and uses setters, see [Styling controls](xaml-styles.md). + +Values that come from styles or templates are deferred values, similar to bindings. This is so that control users can re-template controls or redefine styles. And that's why property setters in styles can only act on dependency properties, not ordinary properties. + +### Storyboarded animations + +You can animate a dependency property's value using a storyboarded animation. Storyboarded animations in the Windows Runtime are not merely visual decorations. It's more useful to think of animations as being a state machine technique that can set the values of individual properties or of all properties and visuals of a control, and change these values over time. + +To be animated, the animation's target property must be a dependency property. Also, to be animated, the target property's value type must be supported by one of the existing [**Timeline**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.Media.Animation.Timeline)-derived animation types. Values of [**Color**](/uwp/api/Windows.UI.Color), [**Double**](/dotnet/api/system.double) and [**Point**](/uwp/api/Windows.Foundation.Point) can be animated using either interpolation or keyframe techniques. Most other values can be animated using discrete **Object** key frames. + +When an animation is applied and running, the animated value operates at a higher precedence than any value (such as a local value) that the property otherwise has. Animations also have an optional [**HoldEnd**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.Media.Animation.FillBehavior) behavior that can cause animations to apply to property values even if the animation visually appears to be stopped. + +The state machine principle is embodied by the use of storyboarded animations as part of the [**VisualStateManager**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.VisualStateManager) state model for controls. For more info on storyboarded animations, see [Storyboarded animations](/windows/apps/design/motion/storyboarded-animations). For more info on **VisualStateManager** and defining visual states for controls, see [Storyboarded animations for visual states](/previous-versions/windows/apps/jj819808(v=win.10)) or [Control templates](xaml-control-templates.md). + +### Property-changed behavior + +Property-changed behavior is the origin of the "dependency" part of dependency property terminology. Maintaining valid values for a property when another property can influence the first property's value is a difficult development problem in many frameworks. In the Windows Runtime property system, each dependency property can specify a callback that is invoked whenever its property value changes. This callback can be used to notify or change related property values, in a generally synchronous manner. Many existing dependency properties have a property-changed behavior. You can also add similar callback behavior to custom dependency properties, and implement your own property-changed callbacks. See [Custom dependency properties](custom-dependency-properties.md) for an example. + +Windows 10 introduces the [**RegisterPropertyChangedCallback**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.dependencyobject.registerpropertychangedcallback) method. This enables application code to register for change notifications when the specified dependency property is changed on an instance of [**DependencyObject**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.dependencyobject). + +### Default value and **ClearValue** + +A dependency property can have a default value defined as part of its property metadata. For a dependency property, its default value doesn't become irrelevant after the property's been set the first time. The default value might apply again at run-time whenever some other determinant in value precedence disappears. (Dependency property value precedence is discussed in the next section.) For example, you might deliberately remove a style value or an animation that applies to a property, but you want the value to be a reasonable default after you do so. The dependency property default value can provide this value, without needing to specifically set each property's value as an extra step. + +You can deliberately set a property to the default value even after you have already set it with a local value. To reset a value to be the default again, and also to enable other participants in precedence that might override the default but not a local value, call the [**ClearValue**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.dependencyobject.clearvalue) method (reference the property to clear as a method parameter). You don't always want the property to literally use the default value, but clearing the local value and reverting to the default value might enable another item in precedence that you want to act now, such as using the value that came from a style setter in a control template. + +## **DependencyObject** and threading + +All [**DependencyObject**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.dependencyobject) instances must be created on the UI thread which is associated with the current [**Window**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.Window) that is shown by a Windows Runtime app. Although each **DependencyObject** must be created on the main UI thread, the objects can be accessed using a dispatcher reference from other threads, by accessing the [**DispatcherQueue**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.dependencyobject.dispatcherqueue) property. Then you can call methods such as [**TryEnqueue**](/windows/windows-app-sdk/api/winrt/microsoft.ui.dispatching.dispatcherqueue.tryenqueue) and execute your code within the rules of thread restrictions on the UI thread. + +> [!NOTE] +> For UWP apps, access the [**Dispatcher**](/uwp/api/windows.ui.xaml.dependencyobject.dispatcher) property. Then you can call methods such as [**RunAsync**](/uwp/api/windows.ui.core.coredispatcher.runasync) on the [**CoreDispatcher**](/uwp/api/Windows.UI.Core.CoreDispatcher) object, and execute your code within the rules of thread restrictions on the UI thread. For more info about differences between UWP and WinUI for the Windows App SDK, see [Threading functionality migration](../../../windows-app-sdk/migrate-to-windows-app-sdk/guides/threading.md). + +The threading aspects of [**DependencyObject**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.dependencyobject) are relevant because it generally means that only code that runs on the UI thread can change or even read the value of a dependency property. Threading issues can usually be avoided in typical UI code that makes correct use of **async** patterns and background worker threads. You typically only run into **DependencyObject**-related threading issues if you are defining your own **DependencyObject** types and you attempt to use them for data sources or other scenarios where a **DependencyObject** isn't necessarily appropriate. + +## Related topics + +### Conceptual material + +- [Custom dependency properties](custom-dependency-properties.md) +- [Attached properties overview](attached-properties-overview.md) +- [Data binding in depth](../../data-binding/data-binding-in-depth.md) +- [Storyboarded animations](/windows/apps/design/motion/storyboarded-animations) + +### APIs related to dependency properties + +- [**DependencyObject**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.dependencyobject) +- [**DependencyProperty**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.DependencyProperty) diff --git a/hub/apps/develop/platform/xaml/events-and-routed-events-overview.md b/hub/apps/develop/platform/xaml/events-and-routed-events-overview.md new file mode 100644 index 0000000000..406ecfa408 --- /dev/null +++ b/hub/apps/develop/platform/xaml/events-and-routed-events-overview.md @@ -0,0 +1,316 @@ +--- +description: We describe the programming concept of events in a Windows Runtime app, when using XAML for your UI definition. +title: Events and routed events overview +ms.assetid: 34C219E8-3EFB-45BC-8BBD-6FD937698832 +ms.date: 07/12/2018 +ms.topic: concept-article +keywords: windows 10, uwp +ms.localizationpriority: medium +--- +# Events and routed events overview + +**Important APIs** +- [**UIElement**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.UIElement) +- [**RoutedEventArgs**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.RoutedEventArgs) + +We describe the programming concept of events in a Windows Runtime app, when using XAML for your UI definition. You can assign handlers for events as part of the declarations for UI elements in XAML, or you can add the handlers in code. Windows Runtime supports *routed events*: certain input events and data events can be handled by objects beyond the object that fired the event. Routed events are useful when you define control templates, or use pages or layout containers. + +## Events as a programming concept + +Generally speaking, event concepts when programming a Windows Runtime app are similar to the event model in most popular programming languages. If you know how to work with Microsoft .NET or C++ events already, you have a head start. But you don't need to know that much about event model concepts to perform some basic tasks, such as attaching handlers. + +When you create a WinUI (or UWP) app, the UI is defined in markup (XAML). In XAML markup syntax, some of the principles of connecting events between markup elements and runtime code entities are similar to other Web technologies, such as ASP.NET, or HTML5. + +> [!NOTE] +> The code that provides the runtime logic for a XAML-defined UI is often referred to as *code-behind* or the code-behind file. In the Microsoft Visual Studio solution views, this relationship is shown graphically, with the code-behind file being a dependent and nested file versus the XAML page it refers to. + +## Button.Click: an introduction to events and XAML + +One of the most common programming tasks for a Windows Runtime app is to capture user input to the UI. For example, your UI might have a button that the user must click to submit info or to change state. + +You define the UI for your Windows Runtime app by generating XAML. This XAML is usually the output from a design surface in Visual Studio. You can also write the XAML in a plain-text editor or a third-party XAML editor. While generating that XAML, you can wire event handlers for individual UI elements at the same time that you define all the other XAML attributes that establish property values of that UI element. + +To wire the events in XAML, you specify the string-form name of the handler method that you've already defined or will define later in your code-behind. For example, this XAML defines a [**Button**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.Controls.Button) object with other properties ([x:Name attribute](x-name-attribute.md), [**Content**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.controls.contentcontrol.content)) assigned as attributes, and wires a handler for the button's [**Click**](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.controls.primitives.buttonbase.click) event by referencing a method named `ShowUpdatesButton_Click`: + +```xaml +