diff --git a/.vsconfig b/.vsconfig
index db0cb114cd..5002da7427 100644
--- a/.vsconfig
+++ b/.vsconfig
@@ -13,11 +13,9 @@
"Microsoft.VisualStudio.Component.CoreEditor",
"Microsoft.VisualStudio.Workload.CoreEditor",
"Microsoft.VisualStudio.Component.VC.CoreIde",
- "Microsoft.VisualStudio.Component.Windows10SDK",
"Microsoft.VisualStudio.Component.VC.Tools.x86.x64",
"Microsoft.VisualStudio.Component.Windows11SDK.22000",
- "Microsoft.VisualStudio.Component.Windows10SDK.19041",
- "Microsoft.VisualStudio.Component.Windows10SDK.18362",
+ "Microsoft.VisualStudio.Component.Windows11SDK.22621",
"Microsoft.VisualStudio.ComponentGroup.MSIX.Packaging",
"Microsoft.VisualStudio.Component.VC.Redist.14.Latest",
"Microsoft.VisualStudio.Component.VC.Tools.ARM64",
diff --git a/.vsconfig_buildtools b/.vsconfig_buildtools
index 47e081db07..da5ccf978f 100644
--- a/.vsconfig_buildtools
+++ b/.vsconfig_buildtools
@@ -19,10 +19,7 @@
"Microsoft.VisualStudio.Component.VC.Redist.14.Latest",
"Microsoft.VisualStudio.Component.VC.Tools.ARM64",
"Microsoft.VisualStudio.Component.VC.Tools.x86.x64",
- "Microsoft.VisualStudio.Component.Windows11SDK.22000",
- "Microsoft.VisualStudio.Component.Windows10SDK",
- "Microsoft.VisualStudio.Component.Windows10SDK.19041",
- "Microsoft.VisualStudio.Component.Windows10SDK.18362",
+ "Microsoft.VisualStudio.Component.Windows11SDK.22621",
"Microsoft.VisualStudio.ComponentGroup.NativeDesktop.Core",
"Microsoft.VisualStudio.ComponentGroup.UWP.BuildTools",
"Microsoft.VisualStudio.ComponentGroup.UWP.VC.BuildTools",
diff --git a/Directory.Build.targets b/Directory.Build.targets
index 31f92983e9..af0ed9eebf 100644
--- a/Directory.Build.targets
+++ b/Directory.Build.targets
@@ -9,7 +9,7 @@
-
+
@@ -21,4 +21,5 @@
+
\ No newline at end of file
diff --git a/controls/CppWinRT.props b/controls/CppWinRT.props
index c02591b457..afac58d387 100644
--- a/controls/CppWinRT.props
+++ b/controls/CppWinRT.props
@@ -6,25 +6,25 @@
false
true
true
-
- -ignore_velocity
true
true
true
true
-
+ false
+ false
-
-
-
-
-
-
-
+
+ $(CppWinRTParameters) -exclude Microsoft.UI.Xaml.Controls.ScrollViewer
+
+ $(CppWinRTParameters) -ignore_velocity
+
\ No newline at end of file
diff --git a/controls/FeatureAreas.props b/controls/FeatureAreas.props
index 6d0330a233..0a1b311acc 100644
--- a/controls/FeatureAreas.props
+++ b/controls/FeatureAreas.props
@@ -213,6 +213,12 @@
+
+
+
+
+
+
true
@@ -272,10 +278,12 @@
true
true
true
+ true
+ true
$(DefineConstants);FEATURE_SCROLLPRESENTER_ENABLED
$(DefineConstants);FEATURE_NAVIGATIONVIEW_ENABLED
$(DefineConstants);INNERLOOP_BUILD
-
+
\ No newline at end of file
diff --git a/controls/MUXControls.sln b/controls/MUXControls.sln
index 4ff7110ff3..0c08a0cfc8 100644
--- a/controls/MUXControls.sln
+++ b/controls/MUXControls.sln
@@ -644,6 +644,15 @@ Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "AnnotatedScrollBar_APITests
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.WinUI", "..\src\projection\Microsoft.WinUI.csproj", "{10F93BC6-DE0F-4B8D-A4C0-7A807935FD96}"
EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "MapControl", "MapControl", "{7E6C90B5-DD3F-4EFE-978B-E0BD4E031655}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "MapControl", "dev\MapControl\MapControl.vcxitems", "{7C60C2AE-6ABC-4762-A0EF-1F50CDD0BA1E}"
+EndProject
+Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "MapControl_APITests", "dev\MapControl\APITests\MapControl_APITests.shproj", "{F350D71A-A980-4D63-A38A-8A2035DC4EF2}"
+EndProject
+Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "MapControl_TestUI", "dev\MapControl\TestUI\MapControl_TestUI.shproj", "{8C2F2FA6-5639-4C01-84D0-06E037824689}"
+EndProject
+Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "MapControl_InteractionTests", "dev\MapControl\InteractionTests\MapControl_InteractionTests.shproj", "{189F0B87-4CA1-4F77-8195-FC6DC714157A}"
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "DesktopAcrylicBackdrop", "DesktopAcrylicBackdrop", "{0BEED10A-70BC-4103-8BC8-84D83A14EF75}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "MicaBackdrop", "MicaBackdrop", "{AAEE68EF-8CB5-40D2-8BC8-9A00FB0A1B6A}"
@@ -674,6 +683,16 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "private", "private", "{E3E0
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.WinUI", "..\src\projection\private\Microsoft.WinUI.csproj", "{DCDF77D5-B709-4052-B0D3-DD68BC9D3D5D}"
EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "SelectorBar", "SelectorBar", "{BC59C0F9-07AC-44B2-BDF1-6533A1371BB2}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "SelectorBar", "dev\SelectorBar\SelectorBar.vcxitems", "{4C34195D-5F31-40A3-92AF-4CB8E5A762E0}"
+EndProject
+Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "SelectorBar_InteractionTests", "dev\SelectorBar\InteractionTests\SelectorBar_InteractionTests.shproj", "{4BE74739-227A-4367-8DBA-AEC2769562C8}"
+EndProject
+Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "SelectorBar_TestUI", "dev\SelectorBar\TestUI\SelectorBar_TestUI.shproj", "{1C950F53-542E-4CC4-9281-D9E36072A743}"
+EndProject
+Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "SelectorBar_APITests", "dev\SelectorBar\APITests\SelectorBar_APITests.shproj", "{F778ACAE-150F-4D7D-83C1-5BF2E1ACB399}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug_test|Any CPU = Debug_test|Any CPU
@@ -1686,11 +1705,21 @@ Global
{A1434CF9-0E2E-4F32-AC6B-F82816BFB936} = {6B593C05-B992-4B19-8FCE-2E078E72528A}
{A1553559-5786-4B44-AB9E-94AB95C86D4D} = {6B593C05-B992-4B19-8FCE-2E078E72528A}
{8FC55E63-37E7-4656-89BD-E3D78B31E2D4} = {6B593C05-B992-4B19-8FCE-2E078E72528A}
- {10F93BC6-DE0F-4B8D-A4C0-7A807935FD96} = {3411D086-E07C-4C83-AEA7-930C51CB2518}
+ {10F93BC6-DE0F-4B8D-A4C0-7A807935FD96} = {67599AD5-51EC-44CB-85CE-B60CD8CBA270}
+ {7E6C90B5-DD3F-4EFE-978B-E0BD4E031655} = {67599AD5-51EC-44CB-85CE-B60CD8CBA270}
+ {7C60C2AE-6ABC-4762-A0EF-1F50CDD0BA1E} = {7E6C90B5-DD3F-4EFE-978B-E0BD4E031655}
+ {F350D71A-A980-4D63-A38A-8A2035DC4EF2} = {7E6C90B5-DD3F-4EFE-978B-E0BD4E031655}
+ {8C2F2FA6-5639-4C01-84D0-06E037824689} = {7E6C90B5-DD3F-4EFE-978B-E0BD4E031655}
+ {189F0B87-4CA1-4F77-8195-FC6DC714157A} = {7E6C90B5-DD3F-4EFE-978B-E0BD4E031655}
{0BEED10A-70BC-4103-8BC8-84D83A14EF75} = {414D2AE4-5B65-43E1-9C11-D94817835B3D}
{AAEE68EF-8CB5-40D2-8BC8-9A00FB0A1B6A} = {414D2AE4-5B65-43E1-9C11-D94817835B3D}
{E3E05AF9-A9DA-4777-B335-684664BC403E} = {3411D086-E07C-4C83-AEA7-930C51CB2518}
{DCDF77D5-B709-4052-B0D3-DD68BC9D3D5D} = {E3E05AF9-A9DA-4777-B335-684664BC403E}
+ {BC59C0F9-07AC-44B2-BDF1-6533A1371BB2} = {67599AD5-51EC-44CB-85CE-B60CD8CBA270}
+ {4C34195D-5F31-40A3-92AF-4CB8E5A762E0} = {BC59C0F9-07AC-44B2-BDF1-6533A1371BB2}
+ {4BE74739-227A-4367-8DBA-AEC2769562C8} = {BC59C0F9-07AC-44B2-BDF1-6533A1371BB2}
+ {1C950F53-542E-4CC4-9281-D9E36072A743} = {BC59C0F9-07AC-44B2-BDF1-6533A1371BB2}
+ {F778ACAE-150F-4D7D-83C1-5BF2E1ACB399} = {BC59C0F9-07AC-44B2-BDF1-6533A1371BB2}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {D93836AB-52D3-4DE2-AE25-23F26F55ECED}
@@ -1714,10 +1743,12 @@ Global
dev\MenuBar\MenuBar_InteractionTests\MenuBar_InteractionTests.projitems*{1440a7b7-d3ca-4390-8c85-e1e9a7df8542}*SharedItemsImports = 13
dev\Effects\Microsoft.UI.Private.Composition.Effects.vcxitems*{1522a856-17ce-4178-a6b3-0692f90d7c55}*SharedItemsImports = 9
dev\CommandBarFlyout\InteractionTests\CommandBarFlyout_InteractionTests.projitems*{16f32f80-a8b6-44e0-9d99-0e1c2c8e0579}*SharedItemsImports = 13
+ dev\MapControl\InteractionTests\MapControl_InteractionTests.projitems*{189f0b87-4ca1-4f77-8195-fc6dc714157a}*SharedItemsImports = 13
dev\TeachingTip\APITests\TeachingTip_APITests.projitems*{18f1db69-7457-461c-9d19-7f42bffc0803}*SharedItemsImports = 13
dev\IconSource\IconSource.vcxitems*{19ffff77-4814-4ad6-acd7-42c6a50ab0d8}*SharedItemsImports = 9
dev\ProgressBar\TestUI\ProgressBar_TestUI.projitems*{1a5321f3-b837-4eb6-9547-37cc70088ea9}*SharedItemsImports = 13
dev\NavigationView\NavigationView.vcxitems*{1b8ef049-a38e-43e4-b88e-f1ebfcef07d2}*SharedItemsImports = 9
+ dev\SelectorBar\TestUI\SelectorBar_TestUI.projitems*{1c950f53-542e-4cc4-9281-d9e36072a743}*SharedItemsImports = 13
dev\TabView\TestUI\TabView_TestUI.projitems*{1d87aac7-1e11-40fc-90a7-b6ce1c4567ae}*SharedItemsImports = 13
dev\Materials\Reveal\InteractionTests\Reveal_InteractionTests\Reveal_InteractionTests.projitems*{1f2872e7-28c9-4c01-88ed-73c43ee1c9a4}*SharedItemsImports = 13
dev\InfoBadge\TestUI\InfoBadge_TestUI.projitems*{1f30cac6-7efb-4ce9-b119-64821c117cb9}*SharedItemsImports = 13
@@ -1762,6 +1793,8 @@ Global
dev\Materials\Reveal\RevealBrush.vcxitems*{4993a99d-57ae-4ee7-a3c1-0840ed127608}*SharedItemsImports = 9
dev\TeachingTip\TeachingTip.vcxitems*{499b8bf7-bca1-4c23-baa7-59e2c551be4b}*SharedItemsImports = 9
dev\ColorPicker\TestUI\ColorPicker_TestUI.projitems*{4a87b4f1-4b6f-435a-950e-b2bb32a16001}*SharedItemsImports = 13
+ dev\SelectorBar\InteractionTests\SelectorBar_InteractionTests.projitems*{4be74739-227a-4367-8dba-aec2769562c8}*SharedItemsImports = 13
+ dev\SelectorBar\SelectorBar.vcxitems*{4c34195d-5f31-40a3-92af-4cb8e5a762e0}*SharedItemsImports = 9
dev\AnimatedVisualPlayer\InteractionTests\AnimatedVisualPlayer_InteractionTests.projitems*{4d8c5d1b-f982-44a1-b744-dd0e51651bf2}*SharedItemsImports = 5
dev\AnnotatedScrollBar\InteractionTests\AnnotatedScrollBar_InteractionTests.projitems*{4d8c5d1b-f982-44a1-b744-dd0e51651bf2}*SharedItemsImports = 5
dev\AutoSuggestBox\InteractionTests\AutoSuggestBox_InteractionTests.projitems*{4d8c5d1b-f982-44a1-b744-dd0e51651bf2}*SharedItemsImports = 5
@@ -1778,6 +1811,8 @@ Global
dev\Interactions\SliderInteraction\InteractionTests\SliderInteraction_InteractionTests.projitems*{4d8c5d1b-f982-44a1-b744-dd0e51651bf2}*SharedItemsImports = 5
dev\ItemContainer\InteractionTests\ItemContainer_InteractionTests.projitems*{4d8c5d1b-f982-44a1-b744-dd0e51651bf2}*SharedItemsImports = 5
dev\ItemsView\InteractionTests\ItemsView_InteractionTests.projitems*{4d8c5d1b-f982-44a1-b744-dd0e51651bf2}*SharedItemsImports = 5
+ dev\MapControl\InteractionTests\MapControl_InteractionTests.projitems*{4d8c5d1b-f982-44a1-b744-dd0e51651bf2}*SharedItemsImports = 5
+ dev\SelectorBar\InteractionTests\SelectorBar_InteractionTests.projitems*{4d8c5d1b-f982-44a1-b744-dd0e51651bf2}*SharedItemsImports = 5
dev\Materials\Acrylic\InteractionTests\AcrylicBrush_InteractionTests.projitems*{4d8c5d1b-f982-44a1-b744-dd0e51651bf2}*SharedItemsImports = 5
dev\Materials\Reveal\InteractionTests\Reveal_InteractionTests\Reveal_InteractionTests.projitems*{4d8c5d1b-f982-44a1-b744-dd0e51651bf2}*SharedItemsImports = 5
dev\MenuBar\MenuBar_InteractionTests\MenuBar_InteractionTests.projitems*{4d8c5d1b-f982-44a1-b744-dd0e51651bf2}*SharedItemsImports = 5
@@ -1837,6 +1872,10 @@ Global
dev\ItemsView\APITests\ItemsView_APITests.projitems*{4e6f8103-9e20-40dd-8fe0-1e73964bb800}*SharedItemsImports = 5
dev\ItemsView\TestUI\ItemsView_TestUI.projitems*{4e6f8103-9e20-40dd-8fe0-1e73964bb800}*SharedItemsImports = 5
dev\LayoutPanel\APITests\LayoutPanel_APITests.projitems*{4e6f8103-9e20-40dd-8fe0-1e73964bb800}*SharedItemsImports = 5
+ dev\MapControl\APITests\MapControl_APITests.projitems*{4e6f8103-9e20-40dd-8fe0-1e73964bb800}*SharedItemsImports = 5
+ dev\MapControl\TestUI\MapControl_TestUI.projitems*{4e6f8103-9e20-40dd-8fe0-1e73964bb800}*SharedItemsImports = 5
+ dev\SelectorBar\APITests\SelectorBar_APITests.projitems*{4e6f8103-9e20-40dd-8fe0-1e73964bb800}*SharedItemsImports = 5
+ dev\SelectorBar\TestUI\SelectorBar_TestUI.projitems*{4e6f8103-9e20-40dd-8fe0-1e73964bb800}*SharedItemsImports = 5
dev\Materials\Acrylic\APITests\AcrylicBrush_ApiTests.projitems*{4e6f8103-9e20-40dd-8fe0-1e73964bb800}*SharedItemsImports = 5
dev\Materials\Acrylic\TestUI\AcrylicBrush_TestUI.projitems*{4e6f8103-9e20-40dd-8fe0-1e73964bb800}*SharedItemsImports = 5
dev\Materials\Reveal\APITests\Reveal_APITests.projitems*{4e6f8103-9e20-40dd-8fe0-1e73964bb800}*SharedItemsImports = 5
@@ -1916,6 +1955,7 @@ Global
dev\NumberBox\InteractionTests\NumberBox_InteractionTests.projitems*{773f7592-e7b3-42fc-a14a-e815afd6a0cb}*SharedItemsImports = 13
dev\PullToRefresh\ScrollViewerIRefreshInfoProviderAdapter\InteractionTests\ScrollViewerAdapter_InteractionTests.projitems*{79863454-1dbf-45bb-b3d3-420b8f5e8705}*SharedItemsImports = 13
dev\ItemsView\ItemsView.vcxitems*{7b5f5ca3-084c-58a0-97da-b8c488cc3e30}*SharedItemsImports = 9
+ dev\MapControl\MapControl.vcxitems*{7c60c2ae-6abc-4762-a0ef-1f50cdd0ba1e}*SharedItemsImports = 9
dev\PullToRefresh\ScrollViewerIRefreshInfoProviderAdapter\TestUI\ScrollViewerAdapter_TestUI.projitems*{7dc019ed-239f-4a84-b623-3e377db02a70}*SharedItemsImports = 13
dev\NavigationView\TestUI\NavigationView_TestUI.projitems*{7ee5e585-090a-44bf-a950-80636e242327}*SharedItemsImports = 13
dev\Common\Common.vcxitems*{80ad7f51-8997-47b9-bb41-078b81cff9b0}*SharedItemsImports = 9
@@ -1933,6 +1973,7 @@ Global
dev\RadialGradientBrush\RadialGradientBrush.vcxitems*{8b056b8f-c1ab-4a80-bd17-deace9897e6a}*SharedItemsImports = 9
dev\MenuBar\MenuBar.vcxitems*{8bc9ceb8-8b4a-11d0-8d11-00a0c91bc942}*SharedItemsImports = 9
dev\ProgressRing\InteractionTests\ProgressRing_InteractionTests.projitems*{8c2d60af-44bc-47da-8e44-d62e639bfc0a}*SharedItemsImports = 13
+ dev\MapControl\TestUI\MapControl_TestUI.projitems*{8c2f2fa6-5639-4c01-84d0-06e037824689}*SharedItemsImports = 13
dev\TwoPaneView\TwoPaneView.vcxitems*{8d0e4610-b51d-45c1-8b82-240bd2f73a92}*SharedItemsImports = 9
dev\Repeater\APITests\Repeater_APITests.projitems*{8d2da979-6313-49e2-8cf3-b568436d2944}*SharedItemsImports = 13
dev\Interactions\ButtonInteraction\APITests\ButtonInteraction_APITests.projitems*{8dc0ea14-d850-4c6e-8918-beeb89e877bd}*SharedItemsImports = 13
@@ -2016,10 +2057,12 @@ Global
dev\ImageIcon\InteractionTests\ImageIcon_InteractionTests.projitems*{f14fb632-e705-44bc-9415-75b539f483e1}*SharedItemsImports = 13
dev\AnimatedIcon\AnimatedIcon.vcxitems*{f1c8a5a1-b1b0-4095-8849-e550fcf2ebf6}*SharedItemsImports = 9
dev\PullToRefresh\RefreshContainer\InteractionTests\RefreshContainer_InteractionTests.projitems*{f30fe0d3-2e44-405e-8519-ec3ab098c41f}*SharedItemsImports = 13
+ dev\MapControl\APITests\MapControl_APITests.projitems*{f350d71a-a980-4d63-a38a-8a2035dc4ef2}*SharedItemsImports = 13
dev\InfoBar\InteractionTests\InfoBar_InteractionTests.projitems*{f470a64e-780e-45aa-abb7-73a8734e51d7}*SharedItemsImports = 13
dev\InfoBadge\InteractionTests\InfoBadge_InteractionTests.projitems*{f55ab8bf-f828-4a2e-bcdf-68f22aed35c3}*SharedItemsImports = 13
dev\SplitView\SplitView.vcxitems*{f567d0a2-9c61-4793-ae79-12da915ac11f}*SharedItemsImports = 9
dev\Materials\Acrylic\InteractionTests\AcrylicBrush_InteractionTests.projitems*{f601284a-00c1-49f9-99b3-70d45585f784}*SharedItemsImports = 13
+ dev\SelectorBar\APITests\SelectorBar_APITests.projitems*{f778acae-150f-4d7d-83c1-5bf2e1acb399}*SharedItemsImports = 13
dev\SplitButton\SplitButton.vcxitems*{faf114dd-af1f-4d9f-a511-354c19912aad}*SharedItemsImports = 9
test\TestAppUtils\TestAppUtils.projitems*{fb0d3053-3135-403f-b542-977f3b781673}*SharedItemsImports = 13
dev\CommonManaged\CommonManaged.projitems*{fcc396f5-26dd-4ca3-981e-c7bc9fea4546}*SharedItemsImports = 4
diff --git a/controls/MUXControlsInnerLoop.sln b/controls/MUXControlsInnerLoop.sln
index 3895905047..22ed0344a4 100644
--- a/controls/MUXControlsInnerLoop.sln
+++ b/controls/MUXControlsInnerLoop.sln
@@ -1,7 +1,6 @@
-
Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio Version 16
-VisualStudioVersion = 16.0.29009.5
+# Visual Studio Version 17
+VisualStudioVersion = 17.6.33815.320
MinimumVisualStudioVersion = 10.0.40219.1
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "dev", "dev", "{67599AD5-51EC-44CB-85CE-B60CD8CBA270}"
EndProject
@@ -120,7 +119,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Materials", "Materials", "{
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Acrylic", "Acrylic", "{96707BBD-8D2A-4715-8DDA-3A60E4AF9914}"
EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "AcrylicBrush", "dev\Materials\Acrylic\AcrylicBrush.vcxitems", "{3AFFD0CE-C682-4E59-A9D4-BE8EC3F485DA}"
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "AcrylicBrush", "dev\Materials\Acrylic\AcrylicBrush.vcxitems", "{76353825-06F5-4EA2-BB96-D6A9BB8B6545}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "DesktopAcrylicBackdrop", "dev\Materials\DesktopAcrylicBackdrop\DesktopAcrylicBackdrop.vcxitems", "{CC231572-D8DB-4D9D-A687-1690F9E8B169}"
EndProject
@@ -460,11 +459,11 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Breadcrumb", "Breadcrumb",
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "BreadcrumbBar", "dev\Breadcrumb\Breadcrumb.vcxitems", "{563FE343-C6B0-447B-831A-B0CE3AA7A688}"
EndProject
-Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "Breadcrumb_APITests", "dev\Breadcrumb\APITests\BreadcrumbBar_APITests.shproj", "{48DF0143-C6A7-4184-BCC4-E59EAC5D49F1}"
+Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "BreadcrumbBar_APITests", "dev\Breadcrumb\APITests\BreadcrumbBar_APITests.shproj", "{48DF0143-C6A7-4184-BCC4-E59EAC5D49F1}"
EndProject
-Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "Breadcrumb_TestUI", "dev\Breadcrumb\TestUI\BreadcrumbBar_TestUI.shproj", "{657121B7-3E4F-4C76-ABE2-0221A7997929}"
+Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "BreadcrumbBar_TestUI", "dev\Breadcrumb\TestUI\BreadcrumbBar_TestUI.shproj", "{657121B7-3E4F-4C76-ABE2-0221A7997929}"
EndProject
-Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "Breadcrumb_InteractionTests", "dev\Breadcrumb\InteractionTests\BreadcrumbBar_InteractionTests.shproj", "{C1477378-4A7A-43E5-8499-98A23544CC8A}"
+Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "BreadcrumbBar_InteractionTests", "dev\Breadcrumb\InteractionTests\BreadcrumbBar_InteractionTests.shproj", "{C1477378-4A7A-43E5-8499-98A23544CC8A}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "PipsPager", "PipsPager", "{AA960C72-877F-4F3C-92D2-7ADD34D643F4}"
EndProject
@@ -520,215 +519,17 @@ Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "InfoBadge_InteractionTests"
EndProject
Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "ProgressRing_APITests", "dev\ProgressRing\APITests\ProgressRing_APITests.shproj", "{222EF6F6-0845-49E7-81F2-9686CEF85C67}"
EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "MapControl", "MapControl", "{1CEADA92-1E59-4265-B3A3-0A0490F1360A}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "MapControl", "dev\MapControl\MapControl.vcxitems", "{7C60C2AE-6ABC-4762-A0EF-1F50CDD0BA1E}"
+EndProject
+Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "MapControl_APITests", "dev\MapControl\APITests\MapControl_APITests.shproj", "{F350D71A-A980-4D63-A38A-8A2035DC4EF2}"
+EndProject
+Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "MapControl_TestUI", "dev\MapControl\TestUI\MapControl_TestUI.shproj", "{8C2F2FA6-5639-4C01-84D0-06E037824689}"
+EndProject
+Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "MapControl_InteractionTests", "dev\MapControl\InteractionTests\MapControl_InteractionTests.shproj", "{189F0B87-4CA1-4F77-8195-FC6DC714157A}"
+EndProject
Global
- GlobalSection(SharedMSBuildProjectFiles) = preSolution
- dev\ComboBox\ComboBox.vcxitems*{00523caf-422a-4185-9392-d374b72a019a}*SharedItemsImports = 9
- dev\ParallaxView\TestUI\ParallaxView_TestUI.projitems*{00c52fd5-42fd-33b4-84a0-795c9b5a014d}*SharedItemsImports = 13
- dev\lights\ApiTests\Lights_ApiTests\Lights_ApiTests.projitems*{02ed27be-97e4-4327-bb96-8b3fa6869c48}*SharedItemsImports = 13
- dev\RadioButtons\APITests\RadioButtons_APITests.projitems*{0352711a-d79a-4d82-8255-916d29522ae0}*SharedItemsImports = 13
- dev\SampleControl\TestUI\SampleControl_TestUI.projitems*{05361409-7fbb-4296-996f-2e591857d84a}*SharedItemsImports = 13
- dev\Telemetry\Telemetry.vcxitems*{0db22ba9-6053-459b-baf5-e82ea1c78ab3}*SharedItemsImports = 9
- dev\ScrollPresenter\TestUI\ScrollPresenter_TestUI.projitems*{0ec52fd5-42fe-3eb4-84e0-79ec9b5a014e}*SharedItemsImports = 13
- dev\ProgressBar\ProgressBar.vcxitems*{0f61c8bd-d066-4812-a02b-e95ce18a985d}*SharedItemsImports = 9
- test\testinfra\MUXTestInfra\MUXTestInfra.Shared.projitems*{107794d7-4be0-407e-a76c-efa46d1e9f93}*SharedItemsImports = 13
- dev\RatingControl\TestUI\RatingControl_TestUI.projitems*{10c52fd4-52fc-43b3-94af-895c9b5a014c}*SharedItemsImports = 13
- dev\Interactions\ButtonInteraction\TestUI\ButtonInteraction_TestUI.projitems*{11b35f24-72b2-4228-9960-0d1ea283e1af}*SharedItemsImports = 13
- dev\CommandBarFlyout\CommandBarFlyout.vcxitems*{11c085ff-8f68-48ee-9949-6eecbd0cbe6c}*SharedItemsImports = 9
- dev\TwoPaneView\InteractionTests\TwoPaneView_InteractionTests.projitems*{1294409d-9bad-40cc-a74d-9ab29b343071}*SharedItemsImports = 13
- dev\NumberBox\TestUI\NumberBox_TestUI.projitems*{13da8235-d04f-46d4-b5b4-f5ae774eeede}*SharedItemsImports = 13
- dev\MenuBar\MenuBar_InteractionTests\MenuBar_InteractionTests.projitems*{1440a7b7-d3ca-4390-8c85-e1e9a7df8542}*SharedItemsImports = 13
- dev\Effects\Microsoft.UI.Private.Composition.Effects.vcxitems*{1522a856-17ce-4178-a6b3-0692f90d7c55}*SharedItemsImports = 9
- dev\CommandBarFlyout\InteractionTests\CommandBarFlyout_InteractionTests.projitems*{16f32f80-a8b6-44e0-9d99-0e1c2c8e0579}*SharedItemsImports = 13
- dev\TeachingTip\APITests\TeachingTip_APITests.projitems*{18f1db69-7457-461c-9d19-7f42bffc0803}*SharedItemsImports = 13
- dev\IconSource\IconSource.vcxitems*{19ffff77-4814-4ad6-acd7-42c6a50ab0d8}*SharedItemsImports = 9
- dev\ProgressBar\TestUI\ProgressBar_TestUI.projitems*{1a5321f3-b837-4eb6-9547-37cc70088ea9}*SharedItemsImports = 13
- dev\NavigationView\NavigationView.vcxitems*{1b8ef049-a38e-43e4-b88e-f1ebfcef07d2}*SharedItemsImports = 9
- dev\TabView\TestUI\TabView_TestUI.projitems*{1d87aac7-1e11-40fc-90a7-b6ce1c4567ae}*SharedItemsImports = 13
- dev\Materials\Reveal\InteractionTests\Reveal_InteractionTests\Reveal_InteractionTests.projitems*{1f2872e7-28c9-4c01-88ed-73c43ee1c9a4}*SharedItemsImports = 13
- dev\InfoBadge\TestUI\InfoBadge_TestUI.projitems*{1f30cac6-7efb-4ce9-b119-64821c117cb9}*SharedItemsImports = 13
- dev\ScrollView\TestUI\ScrollView_TestUI.projitems*{20c52fd5-62fd-53b4-a4a0-995c9b5a014d}*SharedItemsImports = 13
- dev\ItemsView\TestUI\ItemsView_TestUI.projitems*{30c62ff5-72fe-52b6-a2a1-a95b9b8a0241}*SharedItemsImports = 13
- dev\ProgressRing\APITests\ProgressRing_APITests.projitems*{222ef6f6-0845-49e7-81f2-9686cef85c67}*SharedItemsImports = 13
- dev\PagerControl\TestUI\PagerControl_TestUI.projitems*{225c4174-3141-49b8-ade2-c7d3408d5103}*SharedItemsImports = 13
- dev\PullToRefresh\ScrollViewerIRefreshInfoProviderAdapter\ScrollViewerIRefreshInfoProviderAdapter.vcxitems*{22a3d1c4-4d1c-4b04-b695-8fec39bfed86}*SharedItemsImports = 9
- dev\Interactions\ButtonInteraction\ButtonInteraction.vcxitems*{2459bc06-2ae5-4c65-ba73-ab28090b6fab}*SharedItemsImports = 9
- dev\ColorPicker\ColorPicker.vcxitems*{248cc96d-67a2-4359-a4e3-ab0dad110a1e}*SharedItemsImports = 9
- dev\RatingControl\APITests\RatingControl_APITests.projitems*{274b93f7-cd18-4ed9-b569-0640529d187b}*SharedItemsImports = 13
- dev\ImageIcon\APITests\ImageIcon_APITests.projitems*{27aae2e5-9687-4120-822f-cdb68b9a65b7}*SharedItemsImports = 13
- dev\SplitButton\TestUI\SplitButton_TestUI.projitems*{280c91f4-96b5-4bde-9e02-e573e1def583}*SharedItemsImports = 13
- dev\Repeater\TestUI\Repeater_TestUI.projitems*{2ed883f5-20db-4445-8c96-517a21e5e657}*SharedItemsImports = 13
- dev\TabView\APITests\TabView_APITests.projitems*{2f4e95e9-f729-481c-b9aa-c9bec91ae395}*SharedItemsImports = 13
- dev\SampleControl\InteractionTests\SampleControl_InteractionTests.projitems*{30120040-3eb8-404d-9344-5e99e34b6090}*SharedItemsImports = 13
- dev\MenuFlyout\TestUI\MenuFlyout_TestUI.projitems*{2ef860e2-8766-41fc-bde2-e6b18bb8c206}*SharedItemsImports = 13
- dev\TabView\APITests\TabView_APITests.projitems*{2f4e95e9-f729-481c-b9aa-c9bec91ae395}*SharedItemsImports = 13
- dev\ParallaxView\ParallaxView.vcxitems*{3095445a-afcd-5154-ac36-9770e6ec1aa5}*SharedItemsImports = 9
- dev\InfoBar\TestUI\InfoBar_TestUI.projitems*{32dfaf1e-c2ec-4c52-a4d8-b3a3946242b4}*SharedItemsImports = 13
- dev\RadioMenuFlyoutItem\RadioMenuFlyoutItem.vcxitems*{3353a4a7-87b3-4e43-8f8d-43c7380d1d56}*SharedItemsImports = 9
- dev\Lights\Lights.vcxitems*{3479a3ae-2854-4bec-80ab-eab0772cb90a}*SharedItemsImports = 9
- dev\ScrollPresenter\ScrollPresenter.vcxitems*{359544aa-a8cd-715c-cc36-f770e6e81aa0}*SharedItemsImports = 9
- dev\ParallaxView\APITests\ParallaxView_APITests.projitems*{374b93f7-cd18-4ed9-b569-0640529d187c}*SharedItemsImports = 13
- dev\ScrollView\APITests\ScrollView_APITests.projitems*{374b93f8-dd19-5eda-c56a-1640529d187c}*SharedItemsImports = 13
- dev\ItemsView\APITests\ItemsView_APITests.projitems*{283c02a7-ce19-5fd9-c66b-2640029d9876}*SharedItemsImports = 13
- dev\Collections\Collections.vcxitems*{395a71a1-4327-477b-85d4-af0851732ccb}*SharedItemsImports = 9
- dev\CommonStyles\CommonStyles.vcxitems*{3a07fa59-c5c1-4b46-8b31-043f9ca91226}*SharedItemsImports = 9
- dev\Materials\Acrylic\AcrylicBrush.vcxitems*{3affd0ce-c682-4e59-a9d4-be8ec3f485da}*SharedItemsImports = 9
- dev\ProgressBar\InteractionTests\ProgressBar_InteractionTests.projitems*{3d044ec1-c9d3-4745-b79e-e7bed66e93f8}*SharedItemsImports = 13
- dev\AutoSuggestBox\AutoSuggestBox.vcxitems*{417000d9-2641-4629-99f2-8f6033a6ac52}*SharedItemsImports = 9
- dev\TeachingTip\TestUI\TeachingTip_TestUI.projitems*{42a51d3e-f06a-41a0-be4c-f94cddb80678}*SharedItemsImports = 13
- dev\RadioButtons\InteractionTests\RadioButtons_InteractionTests.projitems*{42d6e8f9-59fe-4ca5-83eb-69a7622f5742}*SharedItemsImports = 13
- dev\TwoPaneView\APITests\TwoPaneView_APITests.projitems*{44deafbc-bb7a-4b02-aeab-29df2c2f8587}*SharedItemsImports = 13
- dev\PipsPager\TestUI\PipsPager_TestUI.projitems*{44f0e6bc-6222-4f16-8050-bb31dd804c4a}*SharedItemsImports = 13
- dev\ResourceHelper\ResourceHelper.vcxitems*{45d41acc-2c3c-43d2-bc10-02aa73ffc7c7}*SharedItemsImports = 9
- dev\ScrollPresenter\APITests\ScrollPresenter_APITests.projitems*{474b92f7-cd58-fed9-8569-9640529d1871}*SharedItemsImports = 13
- dev\NavigationView\NavigationView_InteractionTests\NavigationView_InteractionTests.projitems*{475c3a33-637a-44dc-b789-6c2d78a75283}*SharedItemsImports = 13
- dev\AutoSuggestBox\TestUI\AutoSuggestBox_TestUI.projitems*{48bf2dab-82b5-4705-a880-f5310fb697f9}*SharedItemsImports = 13
- dev\Breadcrumb\APITests\Breadcrumb_APITests.projitems*{48df0143-c6a7-4184-bcc4-e59eac5d49f1}*SharedItemsImports = 13
- dev\Interactions\SliderInteraction\APITests\SliderInteraction_APITests.projitems*{48f7b68b-8050-4523-8374-963aa3b2834f}*SharedItemsImports = 13
- dev\Materials\Reveal\RevealBrush.vcxitems*{4993a99d-57ae-4ee7-a3c1-0840ed127608}*SharedItemsImports = 9
- dev\TeachingTip\TeachingTip.vcxitems*{499b8bf7-bca1-4c23-baa7-59e2c551be4b}*SharedItemsImports = 9
- dev\ColorPicker\TestUI\ColorPicker_TestUI.projitems*{4a87b4f1-4b6f-435a-950e-b2bb32a16001}*SharedItemsImports = 13
- dev\PagerControl\InteractionTests\PagerControl_InteractionTests.projitems*{4f64c819-664f-436a-bcdb-8ab3019b9dd5}*SharedItemsImports = 13
- dev\Materials\Reveal\APITests\Reveal_APITests.projitems*{5049ea6c-88ce-4ed5-8692-947eec9e52bc}*SharedItemsImports = 13
- dev\Expander\TestUI\Expander_TestUI.projitems*{50c1f1d3-20aa-49a8-9e4c-cf4e5811a1d8}*SharedItemsImports = 13
- dev\RadioMenuFlyoutItem\TestUI\RadioMenuFlyoutItem_TestUI.projitems*{50e838a2-a886-46c9-ab0b-a57f510ce643}*SharedItemsImports = 13
- dev\PersonPicture\APITests\PersonPicture_APITests.projitems*{5243ef2c-f250-48bd-b633-39cc2a0a38aa}*SharedItemsImports = 13
- dev\MonochromaticOverlayPresenter\TestUI\MonochromaticOverlayPresenter_TestUI.projitems*{52aaa6ed-e5a0-41bb-8858-66249333a8d4}*SharedItemsImports = 13
- dev\PullToRefresh\TestUI\PTR_TestUI.projitems*{549c8eb7-e099-4eab-a1f6-faa3fa79b9e0}*SharedItemsImports = 13
- dev\MenuBar\MenuBar_TestUI\MenuBar_TestUI.projitems*{55cb08ca-19fe-4db9-8160-a4ec47984b95}*SharedItemsImports = 13
- dev\Breadcrumb\Breadcrumb.vcxitems*{563fe343-c6b0-447b-831a-b0ce3aa7a688}*SharedItemsImports = 9
- dev\Materials\Acrylic\APITests\AcrylicBrush_ApiTests.projitems*{593e15d8-f6f9-4aba-ba65-c6927c178dbd}*SharedItemsImports = 13
- dev\Materials\Reveal\TestUI\Reveal_TestUI.projitems*{5bf80ae9-29df-4be9-858a-f095c8073473}*SharedItemsImports = 13
- dev\PersonPicture\PersonPicture.vcxitems*{5fdf2501-aa3d-4082-ad45-d1f2a94c1213}*SharedItemsImports = 9
- dev\ProgressRing\ProgressRing.vcxitems*{64447efa-19b4-4bf2-9d63-618635c483ec}*SharedItemsImports = 9
- dev\SampleControl\APITests\SampleControl_APITests.projitems*{65521a02-7166-48be-b524-8f8f0ecc3a76}*SharedItemsImports = 13
- dev\RatingControl\RatingControl.vcxitems*{655f5da8-f87b-45af-88d1-a884881c3edf}*SharedItemsImports = 9
- dev\Breadcrumb\TestUI\Breadcrumb_TestUI.projitems*{657121b7-3e4f-4c76-abe2-0221a7997929}*SharedItemsImports = 13
- test\MUXControlsTestApp\MUXControlsTestApp.Shared.projitems*{6aa772a6-cbf7-4ff3-8864-bc9366015dc2}*SharedItemsImports = 13
- dev\RadialGradientBrush\InteractionTests\RadialGradientBrush_InteractionTests.projitems*{74d18b1b-5f6b-4534-945b-131e8e3206fb}*SharedItemsImports = 13
- dev\ScrollView\ScrollView.vcxitems*{755f5da9-087c-55a0-98d2-b884881c3ed0}*SharedItemsImports = 9
- dev\ItemsView\ItemsView.vcxitems*{7b5f5ca3-084c-58a0-97da-b8c488cc3e30}*SharedItemsImports = 9
- dev\NumberBox\InteractionTests\NumberBox_InteractionTests.projitems*{773f7592-e7b3-42fc-a14a-e815afd6a0cb}*SharedItemsImports = 13
- dev\PullToRefresh\ScrollViewerIRefreshInfoProviderAdapter\InteractionTests\ScrollViewerAdapter_InteractionTests.projitems*{79863454-1dbf-45bb-b3d3-420b8f5e8705}*SharedItemsImports = 13
- dev\NavigationView\TestUI\NavigationView_TestUI.projitems*{7ee5e585-090a-44bf-a950-80636e242327}*SharedItemsImports = 13
- dev\Common\Common.vcxitems*{80ad7f51-8997-47b9-bb41-078b81cff9b0}*SharedItemsImports = 9
- dev\NumberBox\APITests\NumberBox_APITests.projitems*{80af98ca-bc1d-4011-8460-5671799ec419}*SharedItemsImports = 13
- dev\Interactions\SliderInteraction\TestUI\SliderInteraction_TestUI.projitems*{80f1f883-d49b-407d-9e77-c9b0e62b61a9}*SharedItemsImports = 13
- dev\RadioButtons\TestUI\RadioButtons_TestUI.projitems*{833a6892-a079-469a-81c7-54d4cd88029b}*SharedItemsImports = 13
- dev\AnimatedIcon\TestUI\AnimatedIcon_TestUI.projitems*{83fd36c0-189f-4e95-8002-9b73905ca301}*SharedItemsImports = 13
- dev\TestHooks\TestHooks.vcxitems*{848448d5-f717-4f88-8f99-311cd60587fa}*SharedItemsImports = 9
- dev\CommonManaged\CommonManaged.projitems*{85a134e5-c83f-44a4-80df-59f6ebf6c60d}*SharedItemsImports = 13
- dev\DropDownButton\DropDownButton.vcxitems*{8613ed91-ade3-4c5c-a09a-041187841eb3}*SharedItemsImports = 9
- dev\PullToRefresh\PTRTracing\PTRTracing.vcxitems*{890a5548-0515-4099-b526-0539fe9a0376}*SharedItemsImports = 9
- dev\RadioMenuFlyoutItem\InteractionTests\RadioMenuFlyoutItem_InteractionTests.projitems*{89ec8d06-ca59-49a9-aefe-32dcc9dd8020}*SharedItemsImports = 13
- dev\PersonPicture\TestUI\PersonPicture_TestUI.projitems*{8a1690fb-aa8c-461a-840c-89cdbb44bdba}*SharedItemsImports = 13
- dev\RadialGradientBrush\RadialGradientBrush.vcxitems*{8b056b8f-c1ab-4a80-bd17-deace9897e6a}*SharedItemsImports = 9
- dev\MenuBar\MenuBar.vcxitems*{8bc9ceb8-8b4a-11d0-8d11-00a0c91bc942}*SharedItemsImports = 9
- dev\ProgressRing\InteractionTests\ProgressRing_InteractionTests.projitems*{8c2d60af-44bc-47da-8e44-d62e639bfc0a}*SharedItemsImports = 13
- dev\TwoPaneView\TwoPaneView.vcxitems*{8d0e4610-b51d-45c1-8b82-240bd2f73a92}*SharedItemsImports = 9
- dev\Repeater\APITests\Repeater_APITests.projitems*{8d2da979-6313-49e2-8cf3-b568436d2944}*SharedItemsImports = 13
- dev\Interactions\ButtonInteraction\APITests\ButtonInteraction_APITests.projitems*{8dc0ea14-d850-4c6e-8918-beeb89e877bd}*SharedItemsImports = 13
- dev\CommandBarFlyout\APITests\CommandBarFlyout_APITests.projitems*{8f6f9336-c45c-40c1-abda-3679a20434b1}*SharedItemsImports = 13
- dev\ScrollPresenter\InteractionTests\ScrollPresenter_InteractionTests.projitems*{8faad013-139c-8d2a-2285-45f717d9e64a}*SharedItemsImports = 13
- dev\PullToRefresh\RefreshContainer\RefreshContainer.vcxitems*{94aaadf1-80ca-45a7-9bd8-c6d00d58334d}*SharedItemsImports = 9
- dev\DropDownButton\TestUI\DropDownButton_TestUI.projitems*{954d7000-c06f-49eb-a7d2-0df83de6ca35}*SharedItemsImports = 13
- dev\PullToRefresh\ScrollViewerIRefreshInfoProviderAdapter\APITests\APITests.projitems*{999c289e-5ad6-4700-a44e-e85b696e508a}*SharedItemsImports = 13
- dev\Repeater\InteractionTests\Repeater_InteractionTests.projitems*{999e00c9-0e58-402a-8e0e-cbafb0adc7e3}*SharedItemsImports = 13
- dev\SwipeControl\SwipeControl_InteractionTests\SwipeControl_InteractionTests.projitems*{9a8da438-193c-4950-a046-2952de2d3b0b}*SharedItemsImports = 13
- dev\TwoPaneView\TestUI\TwoPaneView_TestUI.projitems*{9c533ec3-f8fa-4b0e-ba1b-3323932cdfcb}*SharedItemsImports = 13
- dev\PipsPager\APITests\PipsPager_APITests.projitems*{9cf0d73a-e435-4c17-a41c-11e9fa3eea2f}*SharedItemsImports = 13
- dev\NumberBox\NumberBox.vcxitems*{9d23c997-1f46-444a-8c07-4a4bff7e4e63}*SharedItemsImports = 9
- dev\ImageIcon\ImageIcon.vcxitems*{9fb38577-696e-47ba-8ae2-f48a3c84a7ca}*SharedItemsImports = 9
- dev\Repeater\Repeater.vcxitems*{a0aa8919-2140-42db-beb1-b2c3ace594f4}*SharedItemsImports = 9
- dev\CommonStyles\InteractionTests\CommonStyles_InteractionTests.projitems*{a25ae312-7c11-4e30-ae35-2e31c744a250}*SharedItemsImports = 13
- dev\SampleControl\SampleControl.vcxitems*{a329fb8a-3093-4050-83d3-4d9f5847f3b8}*SharedItemsImports = 9
- dev\ColorPicker\InteractionTests\ColorPicker_InteractionTests.projitems*{a4d2fae8-e7fc-4100-91ff-2202fac91c70}*SharedItemsImports = 13
- dev\CommonStyles\TestUI\CommonStyles_TestUI.projitems*{a7f6d6c4-a5a9-43eb-930c-b766417a5e5c}*SharedItemsImports = 13
- dev\Materials\Acrylic\TestUI\AcrylicBrush_TestUI.projitems*{a800e818-7212-4fd7-ae3a-1dcab539db87}*SharedItemsImports = 13
- dev\PagerControl\PagerControl.vcxitems*{ab3261a7-9a8d-4a27-aea2-3aac0419c889}*SharedItemsImports = 9
- dev\AnimatedIcon\AnimatedIcon.vcxitems*{ad0c90b0-4845-4d4b-88f1-86f653f8171b}*SharedItemsImports = 4
- dev\AnimatedVisualPlayer\AnimatedVisualPlayer.vcxitems*{ad0c90b0-4845-4d4b-88f1-86f653f8171b}*SharedItemsImports = 4
- dev\Collections\Collections.vcxitems*{ad0c90b0-4845-4d4b-88f1-86f653f8171b}*SharedItemsImports = 4
- dev\CommonStyles\CommonStyles.vcxitems*{ad0c90b0-4845-4d4b-88f1-86f653f8171b}*SharedItemsImports = 4
- dev\Common\Common.vcxitems*{ad0c90b0-4845-4d4b-88f1-86f653f8171b}*SharedItemsImports = 4
- dev\DropDownButton\DropDownButton.vcxitems*{ad0c90b0-4845-4d4b-88f1-86f653f8171b}*SharedItemsImports = 4
- dev\Effects\Microsoft.UI.Private.Composition.Effects.vcxitems*{ad0c90b0-4845-4d4b-88f1-86f653f8171b}*SharedItemsImports = 4
- dev\IconSource\IconSource.vcxitems*{ad0c90b0-4845-4d4b-88f1-86f653f8171b}*SharedItemsImports = 4
- dev\ImageIcon\ImageIcon.vcxitems*{ad0c90b0-4845-4d4b-88f1-86f653f8171b}*SharedItemsImports = 4
- dev\Lights\Lights.vcxitems*{ad0c90b0-4845-4d4b-88f1-86f653f8171b}*SharedItemsImports = 4
- dev\Materials\Acrylic\AcrylicBrush.vcxitems*{ad0c90b0-4845-4d4b-88f1-86f653f8171b}*SharedItemsImports = 4
- dev\Materials\Reveal\RevealBrush.vcxitems*{ad0c90b0-4845-4d4b-88f1-86f653f8171b}*SharedItemsImports = 4
- dev\MonochromaticOverlayPresenter\MonochromaticOverlayPresenter.vcxitems*{ad0c90b0-4845-4d4b-88f1-86f653f8171b}*SharedItemsImports = 4
- dev\ResourceHelper\ResourceHelper.vcxitems*{ad0c90b0-4845-4d4b-88f1-86f653f8171b}*SharedItemsImports = 4
- dev\SplitButton\SplitButton.vcxitems*{ad0c90b0-4845-4d4b-88f1-86f653f8171b}*SharedItemsImports = 4
- dev\Telemetry\Telemetry.vcxitems*{ad0c90b0-4845-4d4b-88f1-86f653f8171b}*SharedItemsImports = 4
- dev\TestHooks\TestHooks.vcxitems*{ad0c90b0-4845-4d4b-88f1-86f653f8171b}*SharedItemsImports = 4
- dev\RadialGradientBrush\TestUI\RadialGradientBrush_TestUI.projitems*{ae308818-af18-48ba-bf33-89779083d297}*SharedItemsImports = 13
- dev\TreeView\InteractionTests\TreeView_InteractionTests.projitems*{ae638a24-2bc6-4d4f-a51e-715d198f01fd}*SharedItemsImports = 13
- dev\RatingControl\InteractionTests\RatingControl_InteractionTests.projitems*{afaad014-132c-4d2a-a28e-4ef717d3e647}*SharedItemsImports = 13
- dev\PersonPicture\InteractionTests\PersonPicture_InteractionTests.projitems*{b0c15318-1f57-4914-b860-ebf248841511}*SharedItemsImports = 13
- dev\PipsPager\InteractionTests\PipsPager_InteractionTests.projitems*{b1d8e6a2-3fe6-4d80-9685-26df2c9f4331}*SharedItemsImports = 13
- dev\TreeView\TestUI\TreeView_TestUI.projitems*{b2c714dd-9c6b-400c-9cef-13a2d48378bd}*SharedItemsImports = 13
- dev\AnimatedVisualPlayer\AnimatedVisualPlayer.vcxitems*{b39300d2-4510-44ea-aa7b-eda9118f830e}*SharedItemsImports = 9
- dev\ProgressRing\TestUI\ProgressRing_TestUI.projitems*{b58ec806-9951-4e5e-af29-a700a088770e}*SharedItemsImports = 13
- dev\SwipeControl\SwipeControl_APITests\SwipeControl_APITests.projitems*{b75d5d7e-6986-4500-972e-2c10a9b7cc10}*SharedItemsImports = 13
- dev\TabView\TabView.vcxitems*{b9f81fef-1e8d-4fe1-a46b-7002d4c109d2}*SharedItemsImports = 9
- dev\CommonStyles\APITests\CommonStyles_ApiTests.projitems*{ba914f48-e924-4fd2-aee1-264f67db6c9f}*SharedItemsImports = 13
- dev\Interactions\SliderInteraction\InteractionTests\SliderInteraction_InteractionTests.projitems*{bbbb0add-4e05-430c-9ffd-08a299fd1b06}*SharedItemsImports = 13
- dev\SwipeControl\SwipeControl_TestUI\SwipeControl_TestUI.projitems*{bc75c32b-f63a-4f2d-902c-8142db31a2e7}*SharedItemsImports = 13
- dev\ComboBox\TestUI\ComboBox_TestUI.projitems*{bcdf880a-41eb-4943-aae2-54a1a1159600}*SharedItemsImports = 13
- dev\PullToRefresh\RefreshVisualizer\TestUI\RefreshVisualizer_TestUI.projitems*{bf236ee7-b31d-4150-a777-2b91492a84e2}*SharedItemsImports = 13
- dev\ParallaxView\InteractionTests\ParallaxView_InteractionTests.projitems*{bfaad014-132c-4d2a-a28e-4ef717d3e648}*SharedItemsImports = 13
- dev\ScrollView\InteractionTests\ScrollView_InteractionTests.projitems*{bfaad015-232d-5d2b-b28f-5ef717d3e648}*SharedItemsImports = 13
- dev\ItemsView\InteractionTests\ItemsView_InteractionTests.projitems*{8f4cd019-252a-542b-1f85-ae3716dbe04b}*SharedItemsImports = 13
- dev\PullToRefresh\RefreshVisualizer\APITests\RefreshVisualizer_APITests.projitems*{c0d77e37-d2d0-4e37-b6a1-8e6eae28945d}*SharedItemsImports = 13
- dev\Breadcrumb\InteractionTests\Breadcrumb_InteractionTests.projitems*{c1477378-4a7a-43e5-8499-98a23544cc8a}*SharedItemsImports = 13
- dev\Interactions\ButtonInteraction\InteractionTests\ButtonInteraction_InteractionTests.projitems*{c332ceaf-68b6-4980-b6f3-b15e350cdce0}*SharedItemsImports = 13
- dev\TeachingTip\InteractionTests\TeachingTip_InteractionTests.projitems*{c4421632-51bc-469d-bc49-f1cbd9269d49}*SharedItemsImports = 13
- dev\PagerControl\APITests\PagerControl_APITests.projitems*{cb2352e2-d633-41a3-8cdc-b28731a4c490}*SharedItemsImports = 13
- dev\AnimatedVisualPlayer\InteractionTests\AnimatedVisualPlayer_InteractionTests.projitems*{cbaaccf6-a27d-40b3-980b-adf51a2ebb89}*SharedItemsImports = 13
- dev\InfoBar\InfoBar.vcxitems*{ccc102b7-f5ef-479d-94f1-008d189448b1}*SharedItemsImports = 9
- dev\LayoutPanel\APITests\LayoutPanel_APITests.projitems*{cddf46ef-aa2d-4bb3-b33e-98b3dbb3c41b}*SharedItemsImports = 13
- dev\MonochromaticOverlayPresenter\MonochromaticOverlayPresenter.vcxitems*{d03847c1-7ee7-4423-82fd-3cb31daf98d1}*SharedItemsImports = 9
- dev\Interactions\SliderInteraction\SliderInteraction.vcxitems*{d097a4d5-6b61-424d-99f0-f335eff41665}*SharedItemsImports = 9
- dev\TabView\InteractionTests\TabView_InteractionTests.projitems*{d1e297b4-5e5b-4807-8624-4141c817a98a}*SharedItemsImports = 13
- dev\PipsPager\PipsPager.vcxitems*{d1eb61d8-c689-4ad1-bd61-fdaa50362563}*SharedItemsImports = 9
- dev\Expander\InteractionTests\Expander_InteractionTests.projitems*{d6df4ab9-facc-4e51-8c57-6b1f96919365}*SharedItemsImports = 13
- dev\IconSource\APITests\IconSource_APITests.projitems*{d73627e9-564c-4a72-a12d-f6c82f17ad0d}*SharedItemsImports = 13
- dev\InfoBadge\APITests\InfoBadge_APITests.projitems*{d83f60a3-eb44-46f2-8ee7-b28c90004e5f}*SharedItemsImports = 13
- dev\DropDownButton\InteractionTests\DropDownButton_InteractionTests.projitems*{d9ac3716-5608-40d0-999f-26f4b544be33}*SharedItemsImports = 13
- dev\AnimatedVisualPlayer\TestUI\AnimatedVisualPlayer_TestUI.projitems*{dbec0be4-ba3f-41c9-a303-af98201be6dc}*SharedItemsImports = 13
- dev\PullToRefresh\RefreshContainer\TestUI\RefreshContainer_TestUI.projitems*{ddb468e4-7b64-4301-8fcb-1bebbb1e689f}*SharedItemsImports = 13
- dev\ImageIcon\TestUI\ImageIcon_TestUI.projitems*{dde1c022-6f9a-4067-89c2-81f2eeaf249f}*SharedItemsImports = 13
- dev\TreeView\APITests\TreeView_APITests.projitems*{de885c66-929c-464e-bac4-3e076ec46483}*SharedItemsImports = 13
- dev\AnimatedVisualPlayer\TestUI\AnimatedVisualPlayer_TestUI.projitems*{dedc1e4f-cfa5-4443-83eb-e79d425df7e7}*SharedItemsImports = 4
- dev\CommonManaged\CommonManaged.projitems*{dedc1e4f-cfa5-4443-83eb-e79d425df7e7}*SharedItemsImports = 4
- test\TestAppUtils\TestAppUtils.projitems*{dedc1e4f-cfa5-4443-83eb-e79d425df7e7}*SharedItemsImports = 4
- dev\SplitButton\InteractionTests\SplitButton_InteractionTests.projitems*{e1c861e2-c4d9-41e1-aed7-5e203451bd4d}*SharedItemsImports = 13
- dev\CommandBarFlyout\TestUI\CommandBarFlyout_TestUI.projitems*{e63f1c1d-f06d-46a0-b5c2-184184e44f29}*SharedItemsImports = 13
- dev\SplitButton\APITests\SplitButton_APITests.projitems*{e687c158-4c66-4ac5-8a1b-d095a82f1549}*SharedItemsImports = 13
- dev\RadioButtons\RadioButtons.vcxitems*{e770a6d3-7252-4e8a-bd10-fa8524df8c83}*SharedItemsImports = 9
- dev\InfoBadge\InfoBadge.vcxitems*{e7dea84c-ccce-4458-8499-5182f67bc7ba}*SharedItemsImports = 9
- dev\NavigationView\NavigationView_ApiTests\NavigationView_ApiTests.projitems*{e98f3da3-3c00-4f2e-bf3b-2d2ad9d176bc}*SharedItemsImports = 13
- dev\ColorPicker\APITests\ColorPicker_APITests.projitems*{e9ac4938-ec2a-46d3-85bf-27316db8cc4d}*SharedItemsImports = 13
- test\MUXControls.Test\MUXControls.Test.Shared.projitems*{e9fc52cd-519a-41bb-8092-523ffa9d5617}*SharedItemsImports = 13
- dev\Expander\Expander.vcxitems*{ec3b6f65-32c6-4bc8-8902-ee0b397e2787}*SharedItemsImports = 9
- dev\PullToRefresh\RefreshVisualizer\RefreshVisualizer.vcxitems*{ed7dba65-8f09-44f3-8d25-7bb5a7a89609}*SharedItemsImports = 9
- dev\TreeView\TreeView.vcxitems*{eeb38379-3a5c-439f-bb5e-535d75f2b6c1}*SharedItemsImports = 9
- dev\ImageIcon\InteractionTests\ImageIcon_InteractionTests.projitems*{f14fb632-e705-44bc-9415-75b539f483e1}*SharedItemsImports = 13
- dev\AnimatedIcon\AnimatedIcon.vcxitems*{f1c8a5a1-b1b0-4095-8849-e550fcf2ebf6}*SharedItemsImports = 9
- dev\PullToRefresh\RefreshContainer\InteractionTests\RefreshContainer_InteractionTests.projitems*{f30fe0d3-2e44-405e-8519-ec3ab098c41f}*SharedItemsImports = 13
- dev\InfoBar\InteractionTests\InfoBar_InteractionTests.projitems*{f470a64e-780e-45aa-abb7-73a8734e51d7}*SharedItemsImports = 13
- dev\InfoBadge\InteractionTests\InfoBadge_InteractionTests.projitems*{f55ab8bf-f828-4a2e-bcdf-68f22aed35c3}*SharedItemsImports = 13
- dev\Materials\Acrylic\InteractionTests\AcrylicBrush_InteractionTests.projitems*{f601284a-00c1-49f9-99b3-70d45585f784}*SharedItemsImports = 13
- dev\SplitButton\SplitButton.vcxitems*{faf114dd-af1f-4d9f-a511-354c19912aad}*SharedItemsImports = 9
- dev\AnimatedVisualPlayer\TestUI\AnimatedVisualPlayer_TestUI.projitems*{fbc396f5-26dd-4ca3-981e-c7bc9fea4546}*SharedItemsImports = 4
- dev\CommonManaged\CommonManaged.projitems*{fbc396f5-26dd-4ca3-981e-c7bc9fea4546}*SharedItemsImports = 4
- dev\SplitButton\APITests\SplitButton_APITests.projitems*{fbc396f5-26dd-4ca3-981e-c7bc9fea4546}*SharedItemsImports = 4
- dev\SplitButton\TestUI\SplitButton_TestUI.projitems*{fbc396f5-26dd-4ca3-981e-c7bc9fea4546}*SharedItemsImports = 4
- test\TestAppUtils\TestAppUtils.projitems*{fbc396f5-26dd-4ca3-981e-c7bc9fea4546}*SharedItemsImports = 4
- dev\LayoutPanel\LayoutPanel.vcxitems*{fd3c1a00-0d07-4849-a3b9-646f0ff21d7b}*SharedItemsImports = 9
- dev\SwipeControl\SwipeControl.vcxitems*{fd63f767-bd98-45d9-8a63-3cd4a148d527}*SharedItemsImports = 9
- EndGlobalSection
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug_test|ARM64 = Debug_test|ARM64
Debug_test|x64 = Debug_test|x64
@@ -943,7 +744,7 @@ Global
{B0C15318-1F57-4914-B860-EBF248841511} = {813C1EA5-ADC1-4C14-B3DC-B873098D7AAA}
{414D2AE4-5B65-43E1-9C11-D94817835B3D} = {67599AD5-51EC-44CB-85CE-B60CD8CBA270}
{96707BBD-8D2A-4715-8DDA-3A60E4AF9914} = {414D2AE4-5B65-43E1-9C11-D94817835B3D}
- {3AFFD0CE-C682-4E59-A9D4-BE8EC3F485DA} = {96707BBD-8D2A-4715-8DDA-3A60E4AF9914}
+ {76353825-06F5-4EA2-BB96-D6A9BB8B6545} = {96707BBD-8D2A-4715-8DDA-3A60E4AF9914}
{CE762527-4CC8-4604-A0DD-9EA4CB29C4A9} = {414D2AE4-5B65-43E1-9C11-D94817835B3D}
{4993A99D-57AE-4EE7-A3C1-0840ED127608} = {CE762527-4CC8-4604-A0DD-9EA4CB29C4A9}
{73E823BC-5485-4F26-9B09-8B83C133EE6B} = {67599AD5-51EC-44CB-85CE-B60CD8CBA270}
@@ -1135,8 +936,225 @@ Global
{1F30CAC6-7EFB-4CE9-B119-64821C117CB9} = {FFCAAB60-C938-40C5-90E4-115584B22CDF}
{F55AB8BF-F828-4A2E-BCDF-68F22AED35C3} = {FFCAAB60-C938-40C5-90E4-115584B22CDF}
{222EF6F6-0845-49E7-81F2-9686CEF85C67} = {5A911304-2863-4A73-8023-26EFCB4E01DA}
+ {1CEADA92-1E59-4265-B3A3-0A0490F1360A} = {67599AD5-51EC-44CB-85CE-B60CD8CBA270}
+ {7C60C2AE-6ABC-4762-A0EF-1F50CDD0BA1E} = {1CEADA92-1E59-4265-B3A3-0A0490F1360A}
+ {F350D71A-A980-4D63-A38A-8A2035DC4EF2} = {1CEADA92-1E59-4265-B3A3-0A0490F1360A}
+ {8C2F2FA6-5639-4C01-84D0-06E037824689} = {1CEADA92-1E59-4265-B3A3-0A0490F1360A}
+ {189F0B87-4CA1-4F77-8195-FC6DC714157A} = {1CEADA92-1E59-4265-B3A3-0A0490F1360A}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {D93836AB-52D3-4DE2-AE25-23F26F55ECED}
EndGlobalSection
+ GlobalSection(SharedMSBuildProjectFiles) = preSolution
+ dev\ComboBox\ComboBox.vcxitems*{00523caf-422a-4185-9392-d374b72a019a}*SharedItemsImports = 9
+ dev\ParallaxView\TestUI\ParallaxView_TestUI.projitems*{00c52fd5-42fd-33b4-84a0-795c9b5a014d}*SharedItemsImports = 13
+ dev\lights\ApiTests\Lights_ApiTests\Lights_ApiTests.projitems*{02ed27be-97e4-4327-bb96-8b3fa6869c48}*SharedItemsImports = 13
+ dev\RadioButtons\APITests\RadioButtons_APITests.projitems*{0352711a-d79a-4d82-8255-916d29522ae0}*SharedItemsImports = 13
+ dev\SampleControl\TestUI\SampleControl_TestUI.projitems*{05361409-7fbb-4296-996f-2e591857d84a}*SharedItemsImports = 13
+ dev\Telemetry\Telemetry.vcxitems*{0db22ba9-6053-459b-baf5-e82ea1c78ab3}*SharedItemsImports = 9
+ dev\ScrollPresenter\TestUI\ScrollPresenter_TestUI.projitems*{0ec52fd5-42fe-3eb4-84e0-79ec9b5a014e}*SharedItemsImports = 13
+ dev\ProgressBar\ProgressBar.vcxitems*{0f61c8bd-d066-4812-a02b-e95ce18a985d}*SharedItemsImports = 9
+ test\testinfra\MUXTestInfra\MUXTestInfra.Shared.projitems*{107794d7-4be0-407e-a76c-efa46d1e9f93}*SharedItemsImports = 13
+ dev\RatingControl\TestUI\RatingControl_TestUI.projitems*{10c52fd4-52fc-43b3-94af-895c9b5a014c}*SharedItemsImports = 13
+ dev\Interactions\ButtonInteraction\TestUI\ButtonInteraction_TestUI.projitems*{11b35f24-72b2-4228-9960-0d1ea283e1af}*SharedItemsImports = 13
+ dev\CommandBarFlyout\CommandBarFlyout.vcxitems*{11c085ff-8f68-48ee-9949-6eecbd0cbe6c}*SharedItemsImports = 9
+ dev\TwoPaneView\InteractionTests\TwoPaneView_InteractionTests.projitems*{1294409d-9bad-40cc-a74d-9ab29b343071}*SharedItemsImports = 13
+ dev\NumberBox\TestUI\NumberBox_TestUI.projitems*{13da8235-d04f-46d4-b5b4-f5ae774eeede}*SharedItemsImports = 13
+ dev\MenuBar\MenuBar_InteractionTests\MenuBar_InteractionTests.projitems*{1440a7b7-d3ca-4390-8c85-e1e9a7df8542}*SharedItemsImports = 13
+ dev\Effects\Microsoft.UI.Private.Composition.Effects.vcxitems*{1522a856-17ce-4178-a6b3-0692f90d7c55}*SharedItemsImports = 9
+ dev\CommandBarFlyout\InteractionTests\CommandBarFlyout_InteractionTests.projitems*{16f32f80-a8b6-44e0-9d99-0e1c2c8e0579}*SharedItemsImports = 13
+ dev\MapControl\InteractionTests\MapControl_InteractionTests.projitems*{189f0b87-4ca1-4f77-8195-fc6dc714157a}*SharedItemsImports = 13
+ dev\TeachingTip\APITests\TeachingTip_APITests.projitems*{18f1db69-7457-461c-9d19-7f42bffc0803}*SharedItemsImports = 13
+ dev\IconSource\IconSource.vcxitems*{19ffff77-4814-4ad6-acd7-42c6a50ab0d8}*SharedItemsImports = 9
+ dev\ProgressBar\TestUI\ProgressBar_TestUI.projitems*{1a5321f3-b837-4eb6-9547-37cc70088ea9}*SharedItemsImports = 13
+ dev\NavigationView\NavigationView.vcxitems*{1b8ef049-a38e-43e4-b88e-f1ebfcef07d2}*SharedItemsImports = 9
+ dev\TabView\TestUI\TabView_TestUI.projitems*{1d87aac7-1e11-40fc-90a7-b6ce1c4567ae}*SharedItemsImports = 13
+ dev\Materials\Reveal\InteractionTests\Reveal_InteractionTests\Reveal_InteractionTests.projitems*{1f2872e7-28c9-4c01-88ed-73c43ee1c9a4}*SharedItemsImports = 13
+ dev\InfoBadge\TestUI\InfoBadge_TestUI.projitems*{1f30cac6-7efb-4ce9-b119-64821c117cb9}*SharedItemsImports = 13
+ dev\ScrollView\TestUI\ScrollView_TestUI.projitems*{20c52fd5-62fd-53b4-a4a0-995c9b5a014d}*SharedItemsImports = 13
+ dev\ProgressRing\APITests\ProgressRing_APITests.projitems*{222ef6f6-0845-49e7-81f2-9686cef85c67}*SharedItemsImports = 13
+ dev\PagerControl\TestUI\PagerControl_TestUI.projitems*{225c4174-3141-49b8-ade2-c7d3408d5103}*SharedItemsImports = 13
+ dev\PullToRefresh\ScrollViewerIRefreshInfoProviderAdapter\ScrollViewerIRefreshInfoProviderAdapter.vcxitems*{22a3d1c4-4d1c-4b04-b695-8fec39bfed86}*SharedItemsImports = 9
+ dev\Interactions\ButtonInteraction\ButtonInteraction.vcxitems*{2459bc06-2ae5-4c65-ba73-ab28090b6fab}*SharedItemsImports = 9
+ dev\ColorPicker\ColorPicker.vcxitems*{248cc96d-67a2-4359-a4e3-ab0dad110a1e}*SharedItemsImports = 9
+ dev\RatingControl\APITests\RatingControl_APITests.projitems*{274b93f7-cd18-4ed9-b569-0640529d187b}*SharedItemsImports = 13
+ dev\ImageIcon\APITests\ImageIcon_APITests.projitems*{27aae2e5-9687-4120-822f-cdb68b9a65b7}*SharedItemsImports = 13
+ dev\SplitButton\TestUI\SplitButton_TestUI.projitems*{280c91f4-96b5-4bde-9e02-e573e1def583}*SharedItemsImports = 13
+ dev\ItemsView\APITests\ItemsView_APITests.projitems*{283c02a7-ce19-5fd9-c66b-2640029d9876}*SharedItemsImports = 13
+ dev\Repeater\TestUI\Repeater_TestUI.projitems*{2ed883f5-20db-4445-8c96-517a21e5e657}*SharedItemsImports = 13
+ dev\TabView\APITests\TabView_APITests.projitems*{2f4e95e9-f729-481c-b9aa-c9bec91ae395}*SharedItemsImports = 13
+ dev\SampleControl\InteractionTests\SampleControl_InteractionTests.projitems*{30120040-3eb8-404d-9344-5e99e34b6090}*SharedItemsImports = 13
+ dev\ParallaxView\ParallaxView.vcxitems*{3095445a-afcd-5154-ac36-9770e6ec1aa5}*SharedItemsImports = 9
+ dev\ItemsView\TestUI\ItemsView_TestUI.projitems*{30c62ff5-72fe-52b6-a2a1-a95b9b8a0241}*SharedItemsImports = 13
+ dev\InfoBar\TestUI\InfoBar_TestUI.projitems*{32dfaf1e-c2ec-4c52-a4d8-b3a3946242b4}*SharedItemsImports = 13
+ dev\RadioMenuFlyoutItem\RadioMenuFlyoutItem.vcxitems*{3353a4a7-87b3-4e43-8f8d-43c7380d1d56}*SharedItemsImports = 9
+ dev\Lights\Lights.vcxitems*{3479a3ae-2854-4bec-80ab-eab0772cb90a}*SharedItemsImports = 9
+ dev\ScrollPresenter\ScrollPresenter.vcxitems*{359544aa-a8cd-715c-cc36-f770e6e81aa0}*SharedItemsImports = 9
+ dev\ParallaxView\APITests\ParallaxView_APITests.projitems*{374b93f7-cd18-4ed9-b569-0640529d187c}*SharedItemsImports = 13
+ dev\ScrollView\APITests\ScrollView_APITests.projitems*{374b93f8-dd19-5eda-c56a-1640529d187c}*SharedItemsImports = 13
+ dev\Collections\Collections.vcxitems*{395a71a1-4327-477b-85d4-af0851732ccb}*SharedItemsImports = 9
+ dev\CommonStyles\CommonStyles.vcxitems*{3a07fa59-c5c1-4b46-8b31-043f9ca91226}*SharedItemsImports = 9
+ dev\ProgressBar\InteractionTests\ProgressBar_InteractionTests.projitems*{3d044ec1-c9d3-4745-b79e-e7bed66e93f8}*SharedItemsImports = 13
+ dev\AutoSuggestBox\AutoSuggestBox.vcxitems*{417000d9-2641-4629-99f2-8f6033a6ac52}*SharedItemsImports = 9
+ dev\TeachingTip\TestUI\TeachingTip_TestUI.projitems*{42a51d3e-f06a-41a0-be4c-f94cddb80678}*SharedItemsImports = 13
+ dev\RadioButtons\InteractionTests\RadioButtons_InteractionTests.projitems*{42d6e8f9-59fe-4ca5-83eb-69a7622f5742}*SharedItemsImports = 13
+ dev\TwoPaneView\APITests\TwoPaneView_APITests.projitems*{44deafbc-bb7a-4b02-aeab-29df2c2f8587}*SharedItemsImports = 13
+ dev\PipsPager\TestUI\PipsPager_TestUI.projitems*{44f0e6bc-6222-4f16-8050-bb31dd804c4a}*SharedItemsImports = 13
+ dev\ResourceHelper\ResourceHelper.vcxitems*{45d41acc-2c3c-43d2-bc10-02aa73ffc7c7}*SharedItemsImports = 9
+ dev\ScrollPresenter\APITests\ScrollPresenter_APITests.projitems*{474b92f7-cd58-fed9-8569-9640529d1871}*SharedItemsImports = 13
+ dev\NavigationView\NavigationView_InteractionTests\NavigationView_InteractionTests.projitems*{475c3a33-637a-44dc-b789-6c2d78a75283}*SharedItemsImports = 13
+ dev\AutoSuggestBox\TestUI\AutoSuggestBox_TestUI.projitems*{48bf2dab-82b5-4705-a880-f5310fb697f9}*SharedItemsImports = 13
+ dev\Breadcrumb\APITests\Breadcrumb_APITests.projitems*{48df0143-c6a7-4184-bcc4-e59eac5d49f1}*SharedItemsImports = 13
+ dev\Interactions\SliderInteraction\APITests\SliderInteraction_APITests.projitems*{48f7b68b-8050-4523-8374-963aa3b2834f}*SharedItemsImports = 13
+ dev\Materials\Reveal\RevealBrush.vcxitems*{4993a99d-57ae-4ee7-a3c1-0840ed127608}*SharedItemsImports = 9
+ dev\TeachingTip\TeachingTip.vcxitems*{499b8bf7-bca1-4c23-baa7-59e2c551be4b}*SharedItemsImports = 9
+ dev\ColorPicker\TestUI\ColorPicker_TestUI.projitems*{4a87b4f1-4b6f-435a-950e-b2bb32a16001}*SharedItemsImports = 13
+ dev\PagerControl\InteractionTests\PagerControl_InteractionTests.projitems*{4f64c819-664f-436a-bcdb-8ab3019b9dd5}*SharedItemsImports = 13
+ dev\Materials\Reveal\APITests\Reveal_APITests.projitems*{5049ea6c-88ce-4ed5-8692-947eec9e52bc}*SharedItemsImports = 13
+ dev\Expander\TestUI\Expander_TestUI.projitems*{50c1f1d3-20aa-49a8-9e4c-cf4e5811a1d8}*SharedItemsImports = 13
+ dev\RadioMenuFlyoutItem\TestUI\RadioMenuFlyoutItem_TestUI.projitems*{50e838a2-a886-46c9-ab0b-a57f510ce643}*SharedItemsImports = 13
+ dev\PersonPicture\APITests\PersonPicture_APITests.projitems*{5243ef2c-f250-48bd-b633-39cc2a0a38aa}*SharedItemsImports = 13
+ dev\MonochromaticOverlayPresenter\TestUI\MonochromaticOverlayPresenter_TestUI.projitems*{52aaa6ed-e5a0-41bb-8858-66249333a8d4}*SharedItemsImports = 13
+ dev\PullToRefresh\TestUI\PTR_TestUI.projitems*{549c8eb7-e099-4eab-a1f6-faa3fa79b9e0}*SharedItemsImports = 13
+ dev\MenuBar\MenuBar_TestUI\MenuBar_TestUI.projitems*{55cb08ca-19fe-4db9-8160-a4ec47984b95}*SharedItemsImports = 13
+ dev\Breadcrumb\Breadcrumb.vcxitems*{563fe343-c6b0-447b-831a-b0ce3aa7a688}*SharedItemsImports = 9
+ dev\Materials\Acrylic\APITests\AcrylicBrush_ApiTests.projitems*{593e15d8-f6f9-4aba-ba65-c6927c178dbd}*SharedItemsImports = 13
+ dev\Materials\Reveal\TestUI\Reveal_TestUI.projitems*{5bf80ae9-29df-4be9-858a-f095c8073473}*SharedItemsImports = 13
+ dev\PersonPicture\PersonPicture.vcxitems*{5fdf2501-aa3d-4082-ad45-d1f2a94c1213}*SharedItemsImports = 9
+ dev\ProgressRing\ProgressRing.vcxitems*{64447efa-19b4-4bf2-9d63-618635c483ec}*SharedItemsImports = 9
+ dev\SampleControl\APITests\SampleControl_APITests.projitems*{65521a02-7166-48be-b524-8f8f0ecc3a76}*SharedItemsImports = 13
+ dev\RatingControl\RatingControl.vcxitems*{655f5da8-f87b-45af-88d1-a884881c3edf}*SharedItemsImports = 9
+ dev\Breadcrumb\TestUI\Breadcrumb_TestUI.projitems*{657121b7-3e4f-4c76-abe2-0221a7997929}*SharedItemsImports = 13
+ test\MUXControlsTestApp\MUXControlsTestApp.Shared.projitems*{6aa772a6-cbf7-4ff3-8864-bc9366015dc2}*SharedItemsImports = 13
+ dev\Materials\MicaBackdrop\MicaBackdrop.vcxitems*{71abd2f5-1ae8-45e9-814c-f8362fe1ad33}*SharedItemsImports = 9
+ dev\RadialGradientBrush\InteractionTests\RadialGradientBrush_InteractionTests.projitems*{74d18b1b-5f6b-4534-945b-131e8e3206fb}*SharedItemsImports = 13
+ dev\ScrollView\ScrollView.vcxitems*{755f5da9-087c-55a0-98d2-b884881c3ed0}*SharedItemsImports = 9
+ dev\Materials\Acrylic\AcrylicBrush.vcxitems*{76353825-06f5-4ea2-bb96-d6a9bb8b6545}*SharedItemsImports = 9
+ dev\NumberBox\InteractionTests\NumberBox_InteractionTests.projitems*{773f7592-e7b3-42fc-a14a-e815afd6a0cb}*SharedItemsImports = 13
+ dev\PullToRefresh\ScrollViewerIRefreshInfoProviderAdapter\InteractionTests\ScrollViewerAdapter_InteractionTests.projitems*{79863454-1dbf-45bb-b3d3-420b8f5e8705}*SharedItemsImports = 13
+ dev\ItemsView\ItemsView.vcxitems*{7b5f5ca3-084c-58a0-97da-b8c488cc3e30}*SharedItemsImports = 9
+ dev\MapControl\MapControl.vcxitems*{7c60c2ae-6abc-4762-a0ef-1f50cdd0ba1e}*SharedItemsImports = 9
+ dev\NavigationView\TestUI\NavigationView_TestUI.projitems*{7ee5e585-090a-44bf-a950-80636e242327}*SharedItemsImports = 13
+ dev\Common\Common.vcxitems*{80ad7f51-8997-47b9-bb41-078b81cff9b0}*SharedItemsImports = 9
+ dev\NumberBox\APITests\NumberBox_APITests.projitems*{80af98ca-bc1d-4011-8460-5671799ec419}*SharedItemsImports = 13
+ dev\Interactions\SliderInteraction\TestUI\SliderInteraction_TestUI.projitems*{80f1f883-d49b-407d-9e77-c9b0e62b61a9}*SharedItemsImports = 13
+ dev\RadioButtons\TestUI\RadioButtons_TestUI.projitems*{833a6892-a079-469a-81c7-54d4cd88029b}*SharedItemsImports = 13
+ dev\AnimatedIcon\TestUI\AnimatedIcon_TestUI.projitems*{83fd36c0-189f-4e95-8002-9b73905ca301}*SharedItemsImports = 13
+ dev\TestHooks\TestHooks.vcxitems*{848448d5-f717-4f88-8f99-311cd60587fa}*SharedItemsImports = 9
+ dev\CommonManaged\CommonManaged.projitems*{85a134e5-c83f-44a4-80df-59f6ebf6c60d}*SharedItemsImports = 13
+ dev\DropDownButton\DropDownButton.vcxitems*{8613ed91-ade3-4c5c-a09a-041187841eb3}*SharedItemsImports = 9
+ dev\PullToRefresh\PTRTracing\PTRTracing.vcxitems*{890a5548-0515-4099-b526-0539fe9a0376}*SharedItemsImports = 9
+ dev\RadioMenuFlyoutItem\InteractionTests\RadioMenuFlyoutItem_InteractionTests.projitems*{89ec8d06-ca59-49a9-aefe-32dcc9dd8020}*SharedItemsImports = 13
+ dev\PersonPicture\TestUI\PersonPicture_TestUI.projitems*{8a1690fb-aa8c-461a-840c-89cdbb44bdba}*SharedItemsImports = 13
+ dev\RadialGradientBrush\RadialGradientBrush.vcxitems*{8b056b8f-c1ab-4a80-bd17-deace9897e6a}*SharedItemsImports = 9
+ dev\MenuBar\MenuBar.vcxitems*{8bc9ceb8-8b4a-11d0-8d11-00a0c91bc942}*SharedItemsImports = 9
+ dev\ProgressRing\InteractionTests\ProgressRing_InteractionTests.projitems*{8c2d60af-44bc-47da-8e44-d62e639bfc0a}*SharedItemsImports = 13
+ dev\MapControl\TestUI\MapControl_TestUI.projitems*{8c2f2fa6-5639-4c01-84d0-06e037824689}*SharedItemsImports = 13
+ dev\TwoPaneView\TwoPaneView.vcxitems*{8d0e4610-b51d-45c1-8b82-240bd2f73a92}*SharedItemsImports = 9
+ dev\Repeater\APITests\Repeater_APITests.projitems*{8d2da979-6313-49e2-8cf3-b568436d2944}*SharedItemsImports = 13
+ dev\Interactions\ButtonInteraction\APITests\ButtonInteraction_APITests.projitems*{8dc0ea14-d850-4c6e-8918-beeb89e877bd}*SharedItemsImports = 13
+ dev\ItemsView\InteractionTests\ItemsView_InteractionTests.projitems*{8f4cd019-252a-542b-1f85-ae3716dbe04b}*SharedItemsImports = 13
+ dev\CommandBarFlyout\APITests\CommandBarFlyout_APITests.projitems*{8f6f9336-c45c-40c1-abda-3679a20434b1}*SharedItemsImports = 13
+ dev\ScrollPresenter\InteractionTests\ScrollPresenter_InteractionTests.projitems*{8faad013-139c-8d2a-2285-45f717d9e64a}*SharedItemsImports = 13
+ dev\PullToRefresh\RefreshContainer\RefreshContainer.vcxitems*{94aaadf1-80ca-45a7-9bd8-c6d00d58334d}*SharedItemsImports = 9
+ dev\DropDownButton\TestUI\DropDownButton_TestUI.projitems*{954d7000-c06f-49eb-a7d2-0df83de6ca35}*SharedItemsImports = 13
+ dev\PullToRefresh\ScrollViewerIRefreshInfoProviderAdapter\APITests\APITests.projitems*{999c289e-5ad6-4700-a44e-e85b696e508a}*SharedItemsImports = 13
+ dev\Repeater\InteractionTests\Repeater_InteractionTests.projitems*{999e00c9-0e58-402a-8e0e-cbafb0adc7e3}*SharedItemsImports = 13
+ dev\SwipeControl\SwipeControl_InteractionTests\SwipeControl_InteractionTests.projitems*{9a8da438-193c-4950-a046-2952de2d3b0b}*SharedItemsImports = 13
+ dev\TwoPaneView\TestUI\TwoPaneView_TestUI.projitems*{9c533ec3-f8fa-4b0e-ba1b-3323932cdfcb}*SharedItemsImports = 13
+ dev\PipsPager\APITests\PipsPager_APITests.projitems*{9cf0d73a-e435-4c17-a41c-11e9fa3eea2f}*SharedItemsImports = 13
+ dev\NumberBox\NumberBox.vcxitems*{9d23c997-1f46-444a-8c07-4a4bff7e4e63}*SharedItemsImports = 9
+ dev\ImageIcon\ImageIcon.vcxitems*{9fb38577-696e-47ba-8ae2-f48a3c84a7ca}*SharedItemsImports = 9
+ dev\Repeater\Repeater.vcxitems*{a0aa8919-2140-42db-beb1-b2c3ace594f4}*SharedItemsImports = 9
+ dev\CommonStyles\InteractionTests\CommonStyles_InteractionTests.projitems*{a25ae312-7c11-4e30-ae35-2e31c744a250}*SharedItemsImports = 13
+ dev\SampleControl\SampleControl.vcxitems*{a329fb8a-3093-4050-83d3-4d9f5847f3b8}*SharedItemsImports = 9
+ dev\ColorPicker\InteractionTests\ColorPicker_InteractionTests.projitems*{a4d2fae8-e7fc-4100-91ff-2202fac91c70}*SharedItemsImports = 13
+ dev\CommonStyles\TestUI\CommonStyles_TestUI.projitems*{a7f6d6c4-a5a9-43eb-930c-b766417a5e5c}*SharedItemsImports = 13
+ dev\Materials\Acrylic\TestUI\AcrylicBrush_TestUI.projitems*{a800e818-7212-4fd7-ae3a-1dcab539db87}*SharedItemsImports = 13
+ dev\PagerControl\PagerControl.vcxitems*{ab3261a7-9a8d-4a27-aea2-3aac0419c889}*SharedItemsImports = 9
+ dev\AnimatedIcon\AnimatedIcon.vcxitems*{ad0c90b0-4845-4d4b-88f1-86f653f8171b}*SharedItemsImports = 4
+ dev\AnimatedVisualPlayer\AnimatedVisualPlayer.vcxitems*{ad0c90b0-4845-4d4b-88f1-86f653f8171b}*SharedItemsImports = 4
+ dev\Collections\Collections.vcxitems*{ad0c90b0-4845-4d4b-88f1-86f653f8171b}*SharedItemsImports = 4
+ dev\CommonStyles\CommonStyles.vcxitems*{ad0c90b0-4845-4d4b-88f1-86f653f8171b}*SharedItemsImports = 4
+ dev\Common\Common.vcxitems*{ad0c90b0-4845-4d4b-88f1-86f653f8171b}*SharedItemsImports = 4
+ dev\DropDownButton\DropDownButton.vcxitems*{ad0c90b0-4845-4d4b-88f1-86f653f8171b}*SharedItemsImports = 4
+ dev\Effects\Microsoft.UI.Private.Composition.Effects.vcxitems*{ad0c90b0-4845-4d4b-88f1-86f653f8171b}*SharedItemsImports = 4
+ dev\IconSource\IconSource.vcxitems*{ad0c90b0-4845-4d4b-88f1-86f653f8171b}*SharedItemsImports = 4
+ dev\ImageIcon\ImageIcon.vcxitems*{ad0c90b0-4845-4d4b-88f1-86f653f8171b}*SharedItemsImports = 4
+ dev\Lights\Lights.vcxitems*{ad0c90b0-4845-4d4b-88f1-86f653f8171b}*SharedItemsImports = 4
+ dev\Materials\Acrylic\AcrylicBrush.vcxitems*{ad0c90b0-4845-4d4b-88f1-86f653f8171b}*SharedItemsImports = 4
+ dev\Materials\Reveal\RevealBrush.vcxitems*{ad0c90b0-4845-4d4b-88f1-86f653f8171b}*SharedItemsImports = 4
+ dev\MonochromaticOverlayPresenter\MonochromaticOverlayPresenter.vcxitems*{ad0c90b0-4845-4d4b-88f1-86f653f8171b}*SharedItemsImports = 4
+ dev\ResourceHelper\ResourceHelper.vcxitems*{ad0c90b0-4845-4d4b-88f1-86f653f8171b}*SharedItemsImports = 4
+ dev\SplitButton\SplitButton.vcxitems*{ad0c90b0-4845-4d4b-88f1-86f653f8171b}*SharedItemsImports = 4
+ dev\Telemetry\Telemetry.vcxitems*{ad0c90b0-4845-4d4b-88f1-86f653f8171b}*SharedItemsImports = 4
+ dev\TestHooks\TestHooks.vcxitems*{ad0c90b0-4845-4d4b-88f1-86f653f8171b}*SharedItemsImports = 4
+ dev\RadialGradientBrush\TestUI\RadialGradientBrush_TestUI.projitems*{ae308818-af18-48ba-bf33-89779083d297}*SharedItemsImports = 13
+ dev\TreeView\InteractionTests\TreeView_InteractionTests.projitems*{ae638a24-2bc6-4d4f-a51e-715d198f01fd}*SharedItemsImports = 13
+ dev\RatingControl\InteractionTests\RatingControl_InteractionTests.projitems*{afaad014-132c-4d2a-a28e-4ef717d3e647}*SharedItemsImports = 13
+ dev\PersonPicture\InteractionTests\PersonPicture_InteractionTests.projitems*{b0c15318-1f57-4914-b860-ebf248841511}*SharedItemsImports = 13
+ dev\PipsPager\InteractionTests\PipsPager_InteractionTests.projitems*{b1d8e6a2-3fe6-4d80-9685-26df2c9f4331}*SharedItemsImports = 13
+ dev\TreeView\TestUI\TreeView_TestUI.projitems*{b2c714dd-9c6b-400c-9cef-13a2d48378bd}*SharedItemsImports = 13
+ dev\AnimatedVisualPlayer\AnimatedVisualPlayer.vcxitems*{b39300d2-4510-44ea-aa7b-eda9118f830e}*SharedItemsImports = 9
+ dev\ProgressRing\TestUI\ProgressRing_TestUI.projitems*{b58ec806-9951-4e5e-af29-a700a088770e}*SharedItemsImports = 13
+ dev\SwipeControl\SwipeControl_APITests\SwipeControl_APITests.projitems*{b75d5d7e-6986-4500-972e-2c10a9b7cc10}*SharedItemsImports = 13
+ dev\TabView\TabView.vcxitems*{b9f81fef-1e8d-4fe1-a46b-7002d4c109d2}*SharedItemsImports = 9
+ dev\CommonStyles\APITests\CommonStyles_ApiTests.projitems*{ba914f48-e924-4fd2-aee1-264f67db6c9f}*SharedItemsImports = 13
+ dev\Interactions\SliderInteraction\InteractionTests\SliderInteraction_InteractionTests.projitems*{bbbb0add-4e05-430c-9ffd-08a299fd1b06}*SharedItemsImports = 13
+ dev\SwipeControl\SwipeControl_TestUI\SwipeControl_TestUI.projitems*{bc75c32b-f63a-4f2d-902c-8142db31a2e7}*SharedItemsImports = 13
+ dev\ComboBox\TestUI\ComboBox_TestUI.projitems*{bcdf880a-41eb-4943-aae2-54a1a1159600}*SharedItemsImports = 13
+ dev\PullToRefresh\RefreshVisualizer\TestUI\RefreshVisualizer_TestUI.projitems*{bf236ee7-b31d-4150-a777-2b91492a84e2}*SharedItemsImports = 13
+ dev\ParallaxView\InteractionTests\ParallaxView_InteractionTests.projitems*{bfaad014-132c-4d2a-a28e-4ef717d3e648}*SharedItemsImports = 13
+ dev\ScrollView\InteractionTests\ScrollView_InteractionTests.projitems*{bfaad015-232d-5d2b-b28f-5ef717d3e648}*SharedItemsImports = 13
+ dev\PullToRefresh\RefreshVisualizer\APITests\RefreshVisualizer_APITests.projitems*{c0d77e37-d2d0-4e37-b6a1-8e6eae28945d}*SharedItemsImports = 13
+ dev\Breadcrumb\InteractionTests\Breadcrumb_InteractionTests.projitems*{c1477378-4a7a-43e5-8499-98a23544cc8a}*SharedItemsImports = 13
+ dev\Interactions\ButtonInteraction\InteractionTests\ButtonInteraction_InteractionTests.projitems*{c332ceaf-68b6-4980-b6f3-b15e350cdce0}*SharedItemsImports = 13
+ dev\TeachingTip\InteractionTests\TeachingTip_InteractionTests.projitems*{c4421632-51bc-469d-bc49-f1cbd9269d49}*SharedItemsImports = 13
+ dev\PagerControl\APITests\PagerControl_APITests.projitems*{cb2352e2-d633-41a3-8cdc-b28731a4c490}*SharedItemsImports = 13
+ dev\AnimatedVisualPlayer\InteractionTests\AnimatedVisualPlayer_InteractionTests.projitems*{cbaaccf6-a27d-40b3-980b-adf51a2ebb89}*SharedItemsImports = 13
+ dev\Materials\DesktopAcrylicBackdrop\DesktopAcrylicBackdrop.vcxitems*{cc231572-d8db-4d9d-a687-1690f9e8b169}*SharedItemsImports = 9
+ dev\InfoBar\InfoBar.vcxitems*{ccc102b7-f5ef-479d-94f1-008d189448b1}*SharedItemsImports = 9
+ dev\LayoutPanel\APITests\LayoutPanel_APITests.projitems*{cddf46ef-aa2d-4bb3-b33e-98b3dbb3c41b}*SharedItemsImports = 13
+ dev\MonochromaticOverlayPresenter\MonochromaticOverlayPresenter.vcxitems*{d03847c1-7ee7-4423-82fd-3cb31daf98d1}*SharedItemsImports = 9
+ dev\Interactions\SliderInteraction\SliderInteraction.vcxitems*{d097a4d5-6b61-424d-99f0-f335eff41665}*SharedItemsImports = 9
+ dev\TabView\InteractionTests\TabView_InteractionTests.projitems*{d1e297b4-5e5b-4807-8624-4141c817a98a}*SharedItemsImports = 13
+ dev\PipsPager\PipsPager.vcxitems*{d1eb61d8-c689-4ad1-bd61-fdaa50362563}*SharedItemsImports = 9
+ dev\Expander\InteractionTests\Expander_InteractionTests.projitems*{d6df4ab9-facc-4e51-8c57-6b1f96919365}*SharedItemsImports = 13
+ dev\IconSource\APITests\IconSource_APITests.projitems*{d73627e9-564c-4a72-a12d-f6c82f17ad0d}*SharedItemsImports = 13
+ dev\InfoBadge\APITests\InfoBadge_APITests.projitems*{d83f60a3-eb44-46f2-8ee7-b28c90004e5f}*SharedItemsImports = 13
+ dev\DropDownButton\InteractionTests\DropDownButton_InteractionTests.projitems*{d9ac3716-5608-40d0-999f-26f4b544be33}*SharedItemsImports = 13
+ dev\AnimatedVisualPlayer\TestUI\AnimatedVisualPlayer_TestUI.projitems*{dbec0be4-ba3f-41c9-a303-af98201be6dc}*SharedItemsImports = 13
+ dev\PullToRefresh\RefreshContainer\TestUI\RefreshContainer_TestUI.projitems*{ddb468e4-7b64-4301-8fcb-1bebbb1e689f}*SharedItemsImports = 13
+ dev\ImageIcon\TestUI\ImageIcon_TestUI.projitems*{dde1c022-6f9a-4067-89c2-81f2eeaf249f}*SharedItemsImports = 13
+ dev\TreeView\APITests\TreeView_APITests.projitems*{de885c66-929c-464e-bac4-3e076ec46483}*SharedItemsImports = 13
+ dev\AnimatedVisualPlayer\TestUI\AnimatedVisualPlayer_TestUI.projitems*{dedc1e4f-cfa5-4443-83eb-e79d425df7e7}*SharedItemsImports = 4
+ dev\CommonManaged\CommonManaged.projitems*{dedc1e4f-cfa5-4443-83eb-e79d425df7e7}*SharedItemsImports = 4
+ test\TestAppUtils\TestAppUtils.projitems*{dedc1e4f-cfa5-4443-83eb-e79d425df7e7}*SharedItemsImports = 4
+ dev\SplitButton\InteractionTests\SplitButton_InteractionTests.projitems*{e1c861e2-c4d9-41e1-aed7-5e203451bd4d}*SharedItemsImports = 13
+ dev\CommandBarFlyout\TestUI\CommandBarFlyout_TestUI.projitems*{e63f1c1d-f06d-46a0-b5c2-184184e44f29}*SharedItemsImports = 13
+ dev\SplitButton\APITests\SplitButton_APITests.projitems*{e687c158-4c66-4ac5-8a1b-d095a82f1549}*SharedItemsImports = 13
+ dev\RadioButtons\RadioButtons.vcxitems*{e770a6d3-7252-4e8a-bd10-fa8524df8c83}*SharedItemsImports = 9
+ dev\InfoBadge\InfoBadge.vcxitems*{e7dea84c-ccce-4458-8499-5182f67bc7ba}*SharedItemsImports = 9
+ dev\NavigationView\NavigationView_ApiTests\NavigationView_ApiTests.projitems*{e98f3da3-3c00-4f2e-bf3b-2d2ad9d176bc}*SharedItemsImports = 13
+ dev\ColorPicker\APITests\ColorPicker_APITests.projitems*{e9ac4938-ec2a-46d3-85bf-27316db8cc4d}*SharedItemsImports = 13
+ test\MUXControls.Test\MUXControls.Test.Shared.projitems*{e9fc52cd-519a-41bb-8092-523ffa9d5617}*SharedItemsImports = 13
+ dev\Expander\Expander.vcxitems*{ec3b6f65-32c6-4bc8-8902-ee0b397e2787}*SharedItemsImports = 9
+ dev\PullToRefresh\RefreshVisualizer\RefreshVisualizer.vcxitems*{ed7dba65-8f09-44f3-8d25-7bb5a7a89609}*SharedItemsImports = 9
+ dev\TreeView\TreeView.vcxitems*{eeb38379-3a5c-439f-bb5e-535d75f2b6c1}*SharedItemsImports = 9
+ dev\ImageIcon\InteractionTests\ImageIcon_InteractionTests.projitems*{f14fb632-e705-44bc-9415-75b539f483e1}*SharedItemsImports = 13
+ dev\AnimatedIcon\AnimatedIcon.vcxitems*{f1c8a5a1-b1b0-4095-8849-e550fcf2ebf6}*SharedItemsImports = 9
+ dev\PullToRefresh\RefreshContainer\InteractionTests\RefreshContainer_InteractionTests.projitems*{f30fe0d3-2e44-405e-8519-ec3ab098c41f}*SharedItemsImports = 13
+ dev\MapControl\APITests\MapControl_APITests.projitems*{f350d71a-a980-4d63-a38a-8a2035dc4ef2}*SharedItemsImports = 13
+ dev\InfoBar\InteractionTests\InfoBar_InteractionTests.projitems*{f470a64e-780e-45aa-abb7-73a8734e51d7}*SharedItemsImports = 13
+ dev\InfoBadge\InteractionTests\InfoBadge_InteractionTests.projitems*{f55ab8bf-f828-4a2e-bcdf-68f22aed35c3}*SharedItemsImports = 13
+ dev\Materials\Acrylic\InteractionTests\AcrylicBrush_InteractionTests.projitems*{f601284a-00c1-49f9-99b3-70d45585f784}*SharedItemsImports = 13
+ dev\SplitButton\SplitButton.vcxitems*{faf114dd-af1f-4d9f-a511-354c19912aad}*SharedItemsImports = 9
+ dev\AnimatedVisualPlayer\TestUI\AnimatedVisualPlayer_TestUI.projitems*{fbc396f5-26dd-4ca3-981e-c7bc9fea4546}*SharedItemsImports = 4
+ dev\CommonManaged\CommonManaged.projitems*{fbc396f5-26dd-4ca3-981e-c7bc9fea4546}*SharedItemsImports = 4
+ dev\SplitButton\APITests\SplitButton_APITests.projitems*{fbc396f5-26dd-4ca3-981e-c7bc9fea4546}*SharedItemsImports = 4
+ dev\SplitButton\TestUI\SplitButton_TestUI.projitems*{fbc396f5-26dd-4ca3-981e-c7bc9fea4546}*SharedItemsImports = 4
+ test\TestAppUtils\TestAppUtils.projitems*{fbc396f5-26dd-4ca3-981e-c7bc9fea4546}*SharedItemsImports = 4
+ dev\LayoutPanel\LayoutPanel.vcxitems*{fd3c1a00-0d07-4849-a3b9-646f0ff21d7b}*SharedItemsImports = 9
+ dev\SwipeControl\SwipeControl.vcxitems*{fd63f767-bd98-45d9-8a63-3cd4a148d527}*SharedItemsImports = 9
+ EndGlobalSection
EndGlobal
diff --git a/controls/ProjectImports.targets b/controls/ProjectImports.targets
index 41f16fa53d..03211020f2 100644
--- a/controls/ProjectImports.targets
+++ b/controls/ProjectImports.targets
@@ -1,4 +1,4 @@
-
+
@@ -62,5 +62,7 @@
+
+
-
+
\ No newline at end of file
diff --git a/controls/SdkVersion.props b/controls/SdkVersion.props
index b99ffa4e0c..8e675310bf 100644
--- a/controls/SdkVersion.props
+++ b/controls/SdkVersion.props
@@ -8,11 +8,12 @@
10.0.17763.0
10.0.18362.0
10.0.22000.0
- 10.0.22000.0
+ 10.0.22621.0
+ 10.0.22621.0
-
- $(SDKVersion21H1)
+
+ $(SDKVersion22H2)
-
-
-
+
+
+
-
+
-
+
-
+
@@ -260,4 +338,4 @@
-
\ No newline at end of file
+
diff --git a/controls/dev/Breadcrumb/BreadcrumbBarItem.cpp b/controls/dev/Breadcrumb/BreadcrumbBarItem.cpp
index 52e0ad3fae..eddccd5245 100644
--- a/controls/dev/Breadcrumb/BreadcrumbBarItem.cpp
+++ b/controls/dev/Breadcrumb/BreadcrumbBarItem.cpp
@@ -149,7 +149,7 @@ void BreadcrumbBarItem::SetParentBreadcrumb(const winrt::BreadcrumbBar& parent)
{
MUX_ASSERT(!m_isEllipsisDropDownItem);
- m_parentBreadcrumb.set(parent);
+ m_parentBreadcrumb = winrt::make_weak(parent);
}
void BreadcrumbBarItem::SetEllipsisDropDownItemDataTemplate(const winrt::IInspectable& newDataTemplate)
@@ -286,11 +286,13 @@ winrt::IInspectable BreadcrumbBarItem::CloneEllipsisItemSource(const winrt::Coll
// The new list contains all the elements in reverse order
const int itemsSourceSize = ellipsisItemsSource.Size();
-
- for (int i = itemsSourceSize - 1; i >= 0; --i)
+ if(itemsSourceSize > 0)
{
- const auto& item = ellipsisItemsSource.GetAt(i);
- newItemsSource.Append(item);
+ for (int i = itemsSourceSize - 1; i >= 0; --i)
+ {
+ const auto& item = ellipsisItemsSource.GetAt(i);
+ newItemsSource.Append(item);
+ }
}
return newItemsSource;
@@ -493,7 +495,7 @@ void BreadcrumbBarItem::InstantiateFlyout()
{
if (const auto& ellipsisFlyout = m_ellipsisFlyout.get())
{
- // Create ItemsRepeater and set the DataTemplate
+ // Create ItemsRepeater and set the DataTemplate
const auto& ellipsisItemsRepeater = winrt::ItemsRepeater();
ellipsisItemsRepeater.Name(s_ellipsisItemsRepeaterPartName);
winrt::AutomationProperties::SetName(ellipsisItemsRepeater, s_ellipsisItemsRepeaterAutomationName);
diff --git a/controls/dev/Breadcrumb/BreadcrumbBarItem.h b/controls/dev/Breadcrumb/BreadcrumbBarItem.h
index 67d9ca6ff1..7ce05ecb71 100644
--- a/controls/dev/Breadcrumb/BreadcrumbBarItem.h
+++ b/controls/dev/Breadcrumb/BreadcrumbBarItem.h
@@ -96,7 +96,7 @@ class BreadcrumbBarItem :
// BreadcrumbBarItem visual representation
tracker_ref m_button{ this };
// Parent BreadcrumbBarItem to ask for hidden elements
- tracker_ref m_parentBreadcrumb{ this };
+ winrt::weak_ref m_parentBreadcrumb{ nullptr };
// Flyout content for ellipsis item
tracker_ref m_ellipsisFlyout{ this };
diff --git a/controls/dev/Breadcrumb/BreadcrumbLayout.cpp b/controls/dev/Breadcrumb/BreadcrumbLayout.cpp
index da55d17523..e9bcb9f1fe 100644
--- a/controls/dev/Breadcrumb/BreadcrumbLayout.cpp
+++ b/controls/dev/Breadcrumb/BreadcrumbLayout.cpp
@@ -13,7 +13,7 @@ BreadcrumbLayout::BreadcrumbLayout()
BreadcrumbLayout::BreadcrumbLayout(const winrt::BreadcrumbBar& breadcrumb)
{
- m_breadcrumb = breadcrumb;
+ m_breadcrumb = winrt::make_weak(breadcrumb);
}
BreadcrumbLayout::~BreadcrumbLayout()
@@ -61,7 +61,7 @@ winrt::Size BreadcrumbLayout::MeasureOverride(winrt::NonVirtualizingLayoutContex
if (accumulatedCrumbsSize.Width > availableSize.Width)
{
- m_ellipsisIsRendered = true;
+ m_ellipsisIsRendered = true;
}
else
{
@@ -185,9 +185,10 @@ winrt::Size BreadcrumbLayout::ArrangeOverride(winrt::NonVirtualizingLayoutContex
}
}
- if (const auto& breadcrumb = m_breadcrumb.try_as())
+ if (const auto& breadcrumb = m_breadcrumb.get())
{
- breadcrumb->ReIndexVisibleElementsForAccessibility();
+ auto breadcrumbImpl = winrt::get_self(breadcrumb);
+ breadcrumbImpl->ReIndexVisibleElementsForAccessibility();
}
return finalSize;
diff --git a/controls/dev/Breadcrumb/BreadcrumbLayout.h b/controls/dev/Breadcrumb/BreadcrumbLayout.h
index 4c62e1cd98..4e2496ea08 100644
--- a/controls/dev/Breadcrumb/BreadcrumbLayout.h
+++ b/controls/dev/Breadcrumb/BreadcrumbLayout.h
@@ -41,7 +41,7 @@ class BreadcrumbLayout :
winrt::Size m_availableSize{};
winrt::BreadcrumbBarItem m_ellipsisButton{nullptr};
- winrt::BreadcrumbBar m_breadcrumb{ nullptr };
+ winrt::weak_ref m_breadcrumb{ nullptr }; // weak_ref because the BreadcrumbBar already points to us via m_itemsRepeaterLayout
bool m_ellipsisIsRendered{};
uint32_t m_firstRenderedItemIndexAfterEllipsis{};
diff --git a/controls/dev/Breadcrumb/TestUI/BreadcrumbBarPage.xaml b/controls/dev/Breadcrumb/TestUI/BreadcrumbBarPage.xaml
index e5ecfce47b..5aad267f5f 100644
--- a/controls/dev/Breadcrumb/TestUI/BreadcrumbBarPage.xaml
+++ b/controls/dev/Breadcrumb/TestUI/BreadcrumbBarPage.xaml
@@ -7,20 +7,14 @@
xmlns:local="using:MUXControlsTestApp"
xmlns:local2="using:Breadcrumb_TestUI"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
- xmlns:controls="using:Microsoft.UI.Xaml.Controls"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d">
-
+
-
-
-
-
-
-
-
-
+
+
@@ -29,9 +23,9 @@
-
+ MinWidth="250">
@@ -39,7 +33,7 @@
-
+
@@ -48,34 +42,34 @@
-
-
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
-
+
-
-
+
+
-
-
-
-
-
-
-
-
+
+
-
+ ItemClicked="BreadcrumbControl_ItemClicked">
+
-
-
+
+
-
-
+
+
-
-
+
+
diff --git a/controls/dev/Breadcrumb/TestUI/TreeStructure.cs b/controls/dev/Breadcrumb/TestUI/TreeStructure.cs
index c2bcd8d522..f267e87e52 100644
--- a/controls/dev/Breadcrumb/TestUI/TreeStructure.cs
+++ b/controls/dev/Breadcrumb/TestUI/TreeStructure.cs
@@ -55,5 +55,13 @@ public override string ToString()
{
return Name;
}
+
+ public string CustomAutomationName
+ {
+ get
+ {
+ return "Custom automation name " + Name;
+ }
+ }
}
}
diff --git a/controls/dev/CommandBarFlyout/APITests/CommandBarFlyoutTests.cs b/controls/dev/CommandBarFlyout/APITests/CommandBarFlyoutTests.cs
index 2d9bdce068..2184b55977 100644
--- a/controls/dev/CommandBarFlyout/APITests/CommandBarFlyoutTests.cs
+++ b/controls/dev/CommandBarFlyout/APITests/CommandBarFlyoutTests.cs
@@ -3,6 +3,7 @@
using Common;
using MUXControlsTestApp.Utilities;
+using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
@@ -216,26 +217,26 @@ public void VerifyPrimaryCommandsCanOverflowToSecondaryItemsControl()
{
flyout = new CommandBarFlyout() { Placement = FlyoutPlacementMode.Right };
- flyout.PrimaryCommands.Add(new AppBarButton() { Label = "Item 1" });
- flyout.PrimaryCommands.Add(new AppBarButton() { Label = "Item 2" });
- flyout.PrimaryCommands.Add(new AppBarButton() { Label = "Item 3" });
- flyout.PrimaryCommands.Add(new AppBarButton() { Label = "Item 4" });
- flyout.PrimaryCommands.Add(new AppBarButton() { Label = "Item 5" });
- flyout.PrimaryCommands.Add(new AppBarButton() { Label = "Item 6" });
- flyout.PrimaryCommands.Add(new AppBarButton() { Label = "Item 7" });
- flyout.PrimaryCommands.Add(new AppBarButton() { Label = "Item 8" });
- flyout.PrimaryCommands.Add(new AppBarButton() { Label = "Item 9" });
- flyout.PrimaryCommands.Add(new AppBarButton() { Label = "Item 10" });
- flyout.PrimaryCommands.Add(new AppBarButton() { Label = "Item 11" });
- flyout.PrimaryCommands.Add(new AppBarButton() { Label = "Item 12" });
- flyout.PrimaryCommands.Add(new AppBarButton() { Label = "Item 13" });
- flyout.PrimaryCommands.Add(new AppBarButton() { Label = "Item 14" });
- flyout.PrimaryCommands.Add(new AppBarButton() { Label = "Item 15" });
- flyout.PrimaryCommands.Add(new AppBarButton() { Label = "Item 16" });
- flyout.PrimaryCommands.Add(new AppBarButton() { Label = "Item 17" });
- flyout.PrimaryCommands.Add(new AppBarButton() { Label = "Item 18" });
- flyout.PrimaryCommands.Add(new AppBarButton() { Label = "Item 19" });
- flyout.PrimaryCommands.Add(new AppBarButton() { Label = "Item 20" });
+ flyout.PrimaryCommands.Add(new AppBarButton());
+ flyout.PrimaryCommands.Add(new AppBarButton());
+ flyout.PrimaryCommands.Add(new AppBarButton());
+ flyout.PrimaryCommands.Add(new AppBarButton());
+ flyout.PrimaryCommands.Add(new AppBarButton());
+ flyout.PrimaryCommands.Add(new AppBarButton());
+ flyout.PrimaryCommands.Add(new AppBarButton());
+ flyout.PrimaryCommands.Add(new AppBarButton());
+ flyout.PrimaryCommands.Add(new AppBarButton());
+ flyout.PrimaryCommands.Add(new AppBarButton());
+ flyout.PrimaryCommands.Add(new AppBarButton());
+ flyout.PrimaryCommands.Add(new AppBarButton());
+ flyout.PrimaryCommands.Add(new AppBarButton());
+ flyout.PrimaryCommands.Add(new AppBarButton());
+ flyout.PrimaryCommands.Add(new AppBarButton());
+ flyout.PrimaryCommands.Add(new AppBarButton());
+ flyout.PrimaryCommands.Add(new AppBarButton());
+ flyout.PrimaryCommands.Add(new AppBarButton());
+ flyout.PrimaryCommands.Add(new AppBarButton());
+ flyout.PrimaryCommands.Add(new AppBarButton());
flyout.SecondaryCommands.Add(new AppBarButton() { Label = "Item 21" });
flyout.SecondaryCommands.Add(new AppBarButton() { Label = "Item 22" });
@@ -272,6 +273,100 @@ public void VerifyPrimaryCommandsCanOverflowToSecondaryItemsControl()
CloseFlyout(flyout);
}
+ [TestMethod]
+ [TestProperty("Description", "Verifies that labels cause primary commmands to be wider than without, and to have their labels be visible.")]
+ public void VerifyPrimaryCommandLabelsAffectLayout()
+ {
+ CommandBarFlyout flyout = null;
+ Button flyoutTarget = null;
+ AppBarButton button1 = null;
+ AppBarButton button2 = null;
+
+ RunOnUIThread.Execute(() =>
+ {
+ flyout = new CommandBarFlyout() { Placement = FlyoutPlacementMode.Right };
+
+ button1 = new AppBarButton();
+ button2 = new AppBarButton();
+
+ flyout.PrimaryCommands.Add(button1);
+ flyout.PrimaryCommands.Add(button2);
+
+ flyoutTarget = new Button() { Content = "Click for flyout" };
+ Content = flyoutTarget;
+ Content.UpdateLayout();
+ });
+
+ OpenFlyout(flyout, flyoutTarget);
+
+ double originalWidth = 0;
+ double originalHeight = 0;
+
+ CommandBar commandBar = null;
+ TextBlock button1TextLabel = null;
+ TextBlock button2TextLabel = null;
+
+ RunOnUIThread.Execute(() =>
+ {
+ button1TextLabel = TestUtilities.FindDescendents(button1).Where(textBlock => textBlock.Name == "TextLabel").Single();
+ button2TextLabel = TestUtilities.FindDescendents(button2).Where(textBlock => textBlock.Name == "TextLabel").Single();
+
+ Log.Comment("We expect the TextLabel template parts to be collapsed when the Label property is empty.");
+ Verify.AreEqual(Visibility.Collapsed, button1TextLabel.Visibility);
+ Verify.AreEqual(Visibility.Collapsed, button2TextLabel.Visibility);
+
+ Popup flyoutPopup = VisualTreeHelper.GetOpenPopupsForXamlRoot(flyoutTarget.XamlRoot).Last();
+ commandBar = TestUtilities.FindDescendents(flyoutPopup).Single();
+
+ originalWidth = commandBar.ActualWidth;
+ originalHeight = commandBar.ActualHeight;
+ });
+
+ CloseFlyout(flyout);
+
+ RunOnUIThread.Execute(() =>
+ {
+ button1.Label = "Item 1";
+ });
+
+ OpenFlyout(flyout, flyoutTarget);
+
+ double finalWidth = 0;
+ double finalHeight = 0;
+
+ RunOnUIThread.Execute(() =>
+ {
+ Log.Comment("We expect the TextLabel template parts to be visible when the Label property is set.");
+ Verify.AreEqual(Visibility.Visible, button1TextLabel.Visibility);
+ Verify.AreEqual(Visibility.Visible, button2TextLabel.Visibility);
+
+ finalWidth = commandBar.ActualWidth;
+ finalHeight = commandBar.ActualHeight;
+
+ Log.Comment("We also expect the width and height of the AppBarButtons to be larger when the Label property is set on at least one primary command.");
+ Verify.IsGreaterThan(finalWidth, originalWidth);
+ Verify.IsGreaterThan(finalHeight, originalHeight);
+ });
+
+ CloseFlyout(flyout);
+
+ RunOnUIThread.Execute(() =>
+ {
+ button2.Label = "Item 2";
+ });
+
+ OpenFlyout(flyout, flyoutTarget);
+
+ RunOnUIThread.Execute(() =>
+ {
+ Log.Comment("Having all labels set should not make things any wider or taller than only some labels set.");
+ Verify.AreEqual(Math.Round(finalWidth), Math.Round(commandBar.ActualWidth));
+ Verify.AreEqual(Math.Round(finalHeight), Math.Round(commandBar.ActualHeight));
+ });
+
+ CloseFlyout(flyout);
+ }
+
private void SetupCommandBarFlyoutTest(out CommandBarFlyout flyout, out Button flyoutTarget)
{
CommandBarFlyout commandBarFlyout = null;
diff --git a/controls/dev/CommandBarFlyout/CommandBarFlyoutCommandBar.cpp b/controls/dev/CommandBarFlyout/CommandBarFlyoutCommandBar.cpp
index cbb8de53ec..6cc8c92f33 100644
--- a/controls/dev/CommandBarFlyout/CommandBarFlyoutCommandBar.cpp
+++ b/controls/dev/CommandBarFlyout/CommandBarFlyoutCommandBar.cpp
@@ -676,6 +676,45 @@ void CommandBarFlyoutCommandBar::UpdateVisualState(
rectangleClip.BottomRightRadius({static_cast(cornerRadius.BottomRight), static_cast(cornerRadius.BottomRight)});
placementVisual.Clip(rectangleClip);
}
+
+ auto hasVisibleLabel = [](TCommand const& command)
+ {
+ return command &&
+ command.Label().size() > 0 &&
+ command.Visibility() == winrt::Visibility::Visible &&
+ command.LabelPosition() == winrt::CommandBarLabelPosition::Default;
+ };
+
+ // If no primary command has labels, then we'll shrink down the size of primary commands since the extra space to accommodate labels is unnecessary.
+ bool hasPrimaryCommandLabels = false;
+ for (auto const& primaryCommand : PrimaryCommands())
+ {
+ if (hasVisibleLabel(primaryCommand.try_as()) ||
+ hasVisibleLabel(primaryCommand.try_as()))
+ {
+ hasPrimaryCommandLabels = true;
+ break;
+ }
+ }
+
+ for (auto const& command : PrimaryCommands())
+ {
+ if (auto commandControl = command.try_as())
+ {
+ winrt::VisualStateManager::GoToState(commandControl, hasPrimaryCommandLabels ? L"HasPrimaryLabels" : L"NoPrimaryLabels", useTransitions);
+ }
+ }
+
+ // Secondary commands by definition will not have any primary commands that they need to accommodate, so we'll set all of them to that state.
+ for (auto const& command : SecondaryCommands())
+ {
+ if (auto commandControl = command.try_as())
+ {
+ winrt::VisualStateManager::GoToState(commandControl, L"NoPrimaryLabels", useTransitions);
+ }
+ }
+
+ winrt::VisualStateManager::GoToState(*this, hasPrimaryCommandLabels ? L"HasPrimaryLabels" : L"NoPrimaryLabels", useTransitions);
}
void CommandBarFlyoutCommandBar::UpdateTemplateSettings()
@@ -799,7 +838,11 @@ void CommandBarFlyoutCommandBar::UpdateTemplateSettings()
if (PrimaryCommands().Size() > 0)
{
- flyoutTemplateSettings->ExpandDownOverflowVerticalPosition(Height());
+ // This needs to be calculated like these other properties, but because this property needs to be set on the CommandBarFlyoutCommandBar itself,
+ // we can't use a template setting. So we'll just set the property itself here.
+ Height(primaryItemsRootDesiredSize.Height);
+
+ flyoutTemplateSettings->ExpandDownOverflowVerticalPosition(primaryItemsRootDesiredSize.Height);
}
else
{
@@ -1092,15 +1135,14 @@ void CommandBarFlyoutCommandBar::OnKeyDown(
}
}
- if (FocusControl(
+ FocusControl(
accessibleControls.GetAt(i) /*newFocus*/,
focusedControl /*oldFocus*/,
winrt::FocusState::Keyboard /*focusState*/,
- true /*updateTabStop*/))
- {
- args.Handled(true);
- break;
- }
+ true /*updateTabStop*/);
+
+ args.Handled(true);
+ break;
}
}
@@ -1142,10 +1184,10 @@ winrt::Control CommandBarFlyoutCommandBar::GetFirstTabStopControl(
return nullptr;
}
-bool CommandBarFlyoutCommandBar::FocusControl(
- winrt::Control const& newFocus,
- winrt::Control const& oldFocus,
- winrt::FocusState const& focusState,
+winrt::IAsyncOperation CommandBarFlyoutCommandBar::FocusControl(
+ winrt::Control newFocus,
+ winrt::Control oldFocus,
+ winrt::FocusState focusState,
bool updateTabStop)
{
MUX_ASSERT(newFocus);
@@ -1155,21 +1197,29 @@ bool CommandBarFlyoutCommandBar::FocusControl(
newFocus.IsTabStop(true);
}
+ // Setting focus can cause us to enter the window message handler loop, which is bad if
+ // CXcpDispatcher::OnReentrancyProtectedWindowMessage is on the callstack, since that can lead to reentry.
+ // Switching to a background thread and then back to the UI thread ensures that this call to Control.Focus()
+ // occurs outside that callstack.
+ winrt::apartment_context uiThread;
+ co_await winrt::resume_background();
+ co_await uiThread;
+
if (newFocus.Focus(focusState))
{
if (oldFocus && updateTabStop)
{
oldFocus.IsTabStop(false);
}
- return true;
+ co_return true;
}
- return false;
+ co_return false;
}
-bool CommandBarFlyoutCommandBar::FocusCommand(
- winrt::IObservableVector const& commands,
- winrt::Control const& moreButton,
- winrt::FocusState const& focusState,
+winrt::IAsyncOperation CommandBarFlyoutCommandBar::FocusCommand(
+ winrt::IObservableVector commands,
+ winrt::Control moreButton,
+ winrt::FocusState focusState,
bool firstCommand,
bool ensureTabStopUniqueness)
{
@@ -1200,11 +1250,11 @@ bool CommandBarFlyoutCommandBar::FocusCommand(
{
if (!focusedControl)
{
- if (FocusControl(
- commandAsControl /*newFocus*/,
- nullptr /*oldFocus*/,
- focusState /*focusState*/,
- ensureTabStopUniqueness /*updateTabStop*/))
+ if (co_await FocusControl(
+ commandAsControl /*newFocus*/,
+ nullptr /*oldFocus*/,
+ focusState /*focusState*/,
+ ensureTabStopUniqueness /*updateTabStop*/))
{
if (ensureTabStopUniqueness && moreButton && moreButton.IsTabStop())
{
@@ -1227,7 +1277,7 @@ bool CommandBarFlyoutCommandBar::FocusCommand(
}
}
- return focusedControl != nullptr;
+ co_return focusedControl != nullptr;
}
void CommandBarFlyoutCommandBar::EnsureTabStopUniqueness(
diff --git a/controls/dev/CommandBarFlyout/CommandBarFlyoutCommandBar.h b/controls/dev/CommandBarFlyout/CommandBarFlyoutCommandBar.h
index dd2085a19d..2989abc1b7 100644
--- a/controls/dev/CommandBarFlyout/CommandBarFlyoutCommandBar.h
+++ b/controls/dev/CommandBarFlyout/CommandBarFlyoutCommandBar.h
@@ -70,15 +70,15 @@ class CommandBarFlyoutCommandBar :
bool checkTabStop);
static winrt::Control GetFirstTabStopControl(
winrt::IObservableVector const& commands);
- static bool FocusControl(
- winrt::Control const& newFocus,
- winrt::Control const& oldFocus,
- winrt::FocusState const& focusState,
+ static winrt::IAsyncOperation FocusControl(
+ winrt::Control newFocus,
+ winrt::Control oldFocus,
+ winrt::FocusState focusState,
bool updateTabStop);
- static bool FocusCommand(
- winrt::IObservableVector const& commands,
- winrt::Control const& moreButton,
- winrt::FocusState const& focusState,
+ static winrt::IAsyncOperation FocusCommand(
+ winrt::IObservableVector commands,
+ winrt::Control moreButton,
+ winrt::FocusState focusState,
bool firstCommand,
bool ensureTabStopUniqueness);
static void EnsureTabStopUniqueness(
diff --git a/controls/dev/CommandBarFlyout/CommandBarFlyoutTrace.h b/controls/dev/CommandBarFlyout/CommandBarFlyoutTrace.h
index 163842d222..0fe81ae333 100644
--- a/controls/dev/CommandBarFlyout/CommandBarFlyoutTrace.h
+++ b/controls/dev/CommandBarFlyout/CommandBarFlyoutTrace.h
@@ -4,7 +4,7 @@
#pragma once
#include "common.h"
-#include "TraceLogging.h"
+#include "MuxcTraceLogging.h"
#include "Utils.h"
#include "MUXControlsTestHooks.h"
diff --git a/controls/dev/CommandBarFlyout/CommandBarFlyout_themeresources.xaml b/controls/dev/CommandBarFlyout/CommandBarFlyout_themeresources.xaml
index 6df3631cef..7117e4e27f 100644
--- a/controls/dev/CommandBarFlyout/CommandBarFlyout_themeresources.xaml
+++ b/controls/dev/CommandBarFlyout/CommandBarFlyout_themeresources.xaml
@@ -140,6 +140,7 @@
+
@@ -148,6 +149,7 @@
+
@@ -161,6 +163,7 @@
+
@@ -174,6 +177,7 @@
+
@@ -185,18 +189,21 @@
+
+
+
@@ -260,21 +267,39 @@
+
+
+
+
+
+
+
+
+
+
+
-
+
-
-
-
+
+
+
+
+
+
+
+
+
+
@@ -340,18 +365,21 @@
+
+
+
@@ -360,23 +388,27 @@
+
+
+
+
@@ -449,21 +481,39 @@
+
+
+
+
+
+
+
+
+
+
+
-
+
-
-
-
+
+
+
+
+
+
+
+
+
+
@@ -517,7 +567,7 @@
-
+
@@ -588,7 +638,6 @@
-
@@ -960,6 +1009,15 @@
+
+
+
+
+
+
+
+
+
@@ -983,7 +1041,7 @@
-
+
@@ -1040,4 +1098,4 @@
-
\ No newline at end of file
+
diff --git a/controls/dev/CommandBarFlyout/InteractionTests/CommandBarFlyoutTests.cs b/controls/dev/CommandBarFlyout/InteractionTests/CommandBarFlyoutTests.cs
index 1f89fabba7..205a42ee30 100644
--- a/controls/dev/CommandBarFlyout/InteractionTests/CommandBarFlyoutTests.cs
+++ b/controls/dev/CommandBarFlyout/InteractionTests/CommandBarFlyoutTests.cs
@@ -1110,7 +1110,7 @@ public void VerifyAddPrimaryCommandsDynamically()
Wait.ForIdle();
Log.Comment("Invoke FlyoutTarget 6 to Show CommandBarFlyout with no primary commands");
- showCommandBarFlyoutButton.Click();
+ showCommandBarFlyoutButton.InvokeAndWait();
Log.Comment("Waiting for SecondaryCommandDynamicLabelChangedCheckBox becoming checked indicating the asynchronous Label property change occurred");
primaryCommandDynamicallyAddedCheckBox.GetToggledWaiter().Wait();
diff --git a/controls/dev/CommandBarFlyout/TestUI/CommandBarFlyoutPage.xaml b/controls/dev/CommandBarFlyout/TestUI/CommandBarFlyoutPage.xaml
index 4a5f9d07cb..fafbfe5315 100644
--- a/controls/dev/CommandBarFlyout/TestUI/CommandBarFlyoutPage.xaml
+++ b/controls/dev/CommandBarFlyout/TestUI/CommandBarFlyoutPage.xaml
@@ -230,6 +230,54 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -247,6 +295,10 @@
+
+
+
+
diff --git a/controls/dev/CommandBarFlyout/TestUI/CommandBarFlyoutPage.xaml.cs b/controls/dev/CommandBarFlyout/TestUI/CommandBarFlyoutPage.xaml.cs
index 5ba4cca682..f0386a78be 100644
--- a/controls/dev/CommandBarFlyout/TestUI/CommandBarFlyoutPage.xaml.cs
+++ b/controls/dev/CommandBarFlyout/TestUI/CommandBarFlyoutPage.xaml.cs
@@ -65,6 +65,10 @@ public CommandBarFlyoutPage()
UndoButton6.KeyboardAccelerators.Add(new KeyboardAccelerator() { Key = VirtualKey.Z, Modifiers = VirtualKeyModifiers.Control });
UndoButton7.KeyboardAccelerators.Add(new KeyboardAccelerator() { Key = VirtualKey.Z, Modifiers = VirtualKeyModifiers.Control });
UndoButton11.KeyboardAccelerators.Add(new KeyboardAccelerator() { Key = VirtualKey.Z, Modifiers = VirtualKeyModifiers.Control });
+ UndoButton12.KeyboardAccelerators.Add(new KeyboardAccelerator() { Key = VirtualKey.Z, Modifiers = VirtualKeyModifiers.Control });
+ UndoButton13.KeyboardAccelerators.Add(new KeyboardAccelerator() { Key = VirtualKey.Z, Modifiers = VirtualKeyModifiers.Control });
+ UndoButton14.KeyboardAccelerators.Add(new KeyboardAccelerator() { Key = VirtualKey.Z, Modifiers = VirtualKeyModifiers.Control });
+ UndoButton15.KeyboardAccelerators.Add(new KeyboardAccelerator() { Key = VirtualKey.Z, Modifiers = VirtualKeyModifiers.Control });
RedoButton1.KeyboardAccelerators.Add(new KeyboardAccelerator() { Key = VirtualKey.Y, Modifiers = VirtualKeyModifiers.Control });
RedoButton2.KeyboardAccelerators.Add(new KeyboardAccelerator() { Key = VirtualKey.Y, Modifiers = VirtualKeyModifiers.Control });
@@ -74,6 +78,10 @@ public CommandBarFlyoutPage()
RedoButton6.KeyboardAccelerators.Add(new KeyboardAccelerator() { Key = VirtualKey.Y, Modifiers = VirtualKeyModifiers.Control });
RedoButton7.KeyboardAccelerators.Add(new KeyboardAccelerator() { Key = VirtualKey.Y, Modifiers = VirtualKeyModifiers.Control });
RedoButton11.KeyboardAccelerators.Add(new KeyboardAccelerator() { Key = VirtualKey.Y, Modifiers = VirtualKeyModifiers.Control });
+ RedoButton12.KeyboardAccelerators.Add(new KeyboardAccelerator() { Key = VirtualKey.Y, Modifiers = VirtualKeyModifiers.Control });
+ RedoButton13.KeyboardAccelerators.Add(new KeyboardAccelerator() { Key = VirtualKey.Y, Modifiers = VirtualKeyModifiers.Control });
+ RedoButton14.KeyboardAccelerators.Add(new KeyboardAccelerator() { Key = VirtualKey.Y, Modifiers = VirtualKeyModifiers.Control });
+ RedoButton15.KeyboardAccelerators.Add(new KeyboardAccelerator() { Key = VirtualKey.Y, Modifiers = VirtualKeyModifiers.Control });
SelectAllButton1.KeyboardAccelerators.Add(new KeyboardAccelerator() { Key = VirtualKey.A, Modifiers = VirtualKeyModifiers.Control });
SelectAllButton2.KeyboardAccelerators.Add(new KeyboardAccelerator() { Key = VirtualKey.A, Modifiers = VirtualKeyModifiers.Control });
@@ -83,6 +91,10 @@ public CommandBarFlyoutPage()
SelectAllButton6.KeyboardAccelerators.Add(new KeyboardAccelerator() { Key = VirtualKey.A, Modifiers = VirtualKeyModifiers.Control });
SelectAllButton7.KeyboardAccelerators.Add(new KeyboardAccelerator() { Key = VirtualKey.A, Modifiers = VirtualKeyModifiers.Control });
SelectAllButton11.KeyboardAccelerators.Add(new KeyboardAccelerator() { Key = VirtualKey.A, Modifiers = VirtualKeyModifiers.Control });
+ SelectAllButton12.KeyboardAccelerators.Add(new KeyboardAccelerator() { Key = VirtualKey.A, Modifiers = VirtualKeyModifiers.Control });
+ SelectAllButton13.KeyboardAccelerators.Add(new KeyboardAccelerator() { Key = VirtualKey.A, Modifiers = VirtualKeyModifiers.Control });
+ SelectAllButton14.KeyboardAccelerators.Add(new KeyboardAccelerator() { Key = VirtualKey.A, Modifiers = VirtualKeyModifiers.Control });
+ SelectAllButton15.KeyboardAccelerators.Add(new KeyboardAccelerator() { Key = VirtualKey.A, Modifiers = VirtualKeyModifiers.Control });
FlyoutTarget1.ContextFlyout = Flyout1;
FlyoutTarget2.ContextFlyout = Flyout2;
@@ -92,6 +104,10 @@ public CommandBarFlyoutPage()
FlyoutTarget6.ContextFlyout = Flyout6;
FlyoutTarget7.ContextFlyout = Flyout7;
FlyoutTarget11.ContextFlyout = Flyout11;
+ FlyoutTarget12.ContextFlyout = Flyout12;
+ FlyoutTarget13.ContextFlyout = Flyout13;
+ FlyoutTarget14.ContextFlyout = Flyout14;
+ FlyoutTarget15.ContextFlyout = Flyout15;
Flyout1.Placement = FlyoutPlacementMode.TopEdgeAlignedLeft;
Flyout2.Placement = FlyoutPlacementMode.TopEdgeAlignedLeft;
@@ -101,6 +117,10 @@ public CommandBarFlyoutPage()
Flyout6.Placement = FlyoutPlacementMode.TopEdgeAlignedLeft;
Flyout7.Placement = FlyoutPlacementMode.TopEdgeAlignedLeft;
Flyout11.Placement = FlyoutPlacementMode.TopEdgeAlignedLeft;
+ Flyout12.Placement = FlyoutPlacementMode.TopEdgeAlignedLeft;
+ Flyout13.Placement = FlyoutPlacementMode.TopEdgeAlignedLeft;
+ Flyout14.Placement = FlyoutPlacementMode.TopEdgeAlignedLeft;
+ Flyout15.Placement = FlyoutPlacementMode.TopEdgeAlignedLeft;
}
public void OnElementClicked(object sender, object args)
@@ -258,6 +278,33 @@ private void OnFlyoutTarget11Click(object sender, RoutedEventArgs e)
ShowFlyoutAt(Flyout11, FlyoutTarget11, FlyoutShowMode.Standard);
}
+ private void OnFlyoutTarget12Click(object sender, RoutedEventArgs e)
+ {
+ DispatcherTimer showFlyoutTimer = new();
+ showFlyoutTimer.Interval = TimeSpan.FromSeconds(5);
+ showFlyoutTimer.Tick += (object sender, object args) =>
+ {
+ ShowFlyoutAt(Flyout12, FlyoutTarget12, FlyoutShowMode.Standard);
+ showFlyoutTimer.Stop();
+ };
+ showFlyoutTimer.Start();
+ }
+
+ private void OnFlyoutTarget13Click(object sender, RoutedEventArgs e)
+ {
+ ShowFlyoutAt(Flyout13, FlyoutTarget13);
+ }
+
+ private void OnFlyoutTarget14Click(object sender, RoutedEventArgs e)
+ {
+ ShowFlyoutAt(Flyout14, FlyoutTarget14);
+ }
+
+ private void OnFlyoutTarget15Click(object sender, RoutedEventArgs e)
+ {
+ ShowFlyoutAt(Flyout15, FlyoutTarget15);
+ }
+
private void ShowFlyoutAt(FlyoutBase flyout, FrameworkElement targetElement, FlyoutShowMode showMode = FlyoutShowMode.Transient)
{
bool useSecondaryCommandDynamicLabel = (bool)UseSecondaryCommandDynamicLabelCheckBox.IsChecked;
diff --git a/controls/dev/CommonStyles/APITests/CommonStylesTests.cs b/controls/dev/CommonStyles/APITests/CommonStylesTests.cs
index 3d385a9625..f62bfd54b3 100644
--- a/controls/dev/CommonStyles/APITests/CommonStylesTests.cs
+++ b/controls/dev/CommonStyles/APITests/CommonStylesTests.cs
@@ -52,6 +52,9 @@ public void VerifyAllThemesContainSameResourceKeys()
Log.Comment("Comparing against " + dictionaryName.ToString());
var themeDictionary = resourceDictionaries.ThemeDictionaries[dictionaryName] as ResourceDictionary;
+ Log.Comment("Keys count in Default: " + defaultThemeDictionary.Keys.Count);
+ Log.Comment("Keys count in " + dictionaryName + ": " + themeDictionary.Keys.Count);
+
bool allKeysInDefaultExistInDictionary = AreKeysFromExpectedInActualDictionary(defaultThemeDictionary, "Default", themeDictionary, dictionaryName.ToString());
bool allKeysInDictionaryExistInDefault = AreKeysFromExpectedInActualDictionary(themeDictionary, dictionaryName.ToString(), defaultThemeDictionary, "Default");
diff --git a/controls/dev/CommonStyles/CommandBar_themeresources.xaml b/controls/dev/CommonStyles/CommandBar_themeresources.xaml
index dbe56ac5f5..14de7a5d84 100644
--- a/controls/dev/CommonStyles/CommandBar_themeresources.xaml
+++ b/controls/dev/CommonStyles/CommandBar_themeresources.xaml
@@ -807,7 +807,17 @@
-
+
@@ -816,7 +826,16 @@
-
+
+ Designer
+ MSBuild:Compile
+ false
+
+
+ Designer
+ MSBuild:Compile
+ false
+
Designer
MSBuild:Compile
@@ -20,6 +30,16 @@
MSBuild:Compile
false
+
+ Designer
+ MSBuild:Compile
+ false
+
+
+ Designer
+ MSBuild:Compile
+ false
+
Designer
MSBuild:Compile
@@ -64,14 +84,26 @@
Designer
MSBuild:Compile
+
+ Designer
+ MSBuild:Compile
+
Designer
MSBuild:Compile
+
+ Designer
+ MSBuild:Compile
+
Designer
MSBuild:Compile
+
+ Designer
+ MSBuild:Compile
+
Designer
MSBuild:Compile
@@ -80,6 +112,10 @@
Designer
MSBuild:Compile
+
+ Designer
+ MSBuild:Compile
+
Designer
MSBuild:Compile
@@ -128,12 +164,24 @@
+
+ AppBarPage.xaml
+
+
+ BlankPage.xaml
+
BorderThicknessPage.xaml
CommandBarPage.xaml
+
+ CommandBarCenterPage.xaml
+
+
+ CommandBarSummaryPage.xaml
+
CommonStylesPage.xaml
@@ -161,24 +209,36 @@
DatePickerPage.xaml
+
+ FlatItemsControlPage.xaml
+
FlipViewPage.xaml
GridViewPage.xaml
+
+ ItemsControlPage.xaml
+
ListViewPage.xaml
ListViewBasePage.xaml
+
+ GroupedItemsControlPage.xaml
+
GroupedListViewBasePage.xaml
NestedGridViewsPage.xaml
+
+ NestedItemsControlsPage.xaml
+
NestedListViewsPage.xaml
diff --git a/controls/dev/CommonStyles/TestUI/FlatItemsControlPage.xaml b/controls/dev/CommonStyles/TestUI/FlatItemsControlPage.xaml
new file mode 100644
index 0000000000..3d53392a12
--- /dev/null
+++ b/controls/dev/CommonStyles/TestUI/FlatItemsControlPage.xaml
@@ -0,0 +1,233 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ModernPanel
+ VirtualizingStackPanel
+ StackPanel
+
+
+
+
+ None
+ No TabStop
+ Single TabStop
+ Nested TabStops
+
+
+
+
+
+
+
+ Local
+ Cycle
+ Once
+
+
+
+
+
+
+ Auto
+ Enabled
+ Disabled
+
+
+
+
+
+
+
+
+ None
+ No TabStop
+ Single TabStop
+ Nested TabStops
+
+
+
+
+ None
+ No TabStop
+ Single TabStop
+ Nested TabStops
+
+
+
+
+
+
+ Vertical
+ Horizontal
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/controls/dev/CommonStyles/TestUI/FlatItemsControlPage.xaml.cs b/controls/dev/CommonStyles/TestUI/FlatItemsControlPage.xaml.cs
new file mode 100644
index 0000000000..a221385c08
--- /dev/null
+++ b/controls/dev/CommonStyles/TestUI/FlatItemsControlPage.xaml.cs
@@ -0,0 +1,847 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License. See LICENSE in the project root for license information.
+
+using Microsoft.UI.Xaml;
+using Microsoft.UI.Xaml.Controls;
+using Microsoft.UI.Xaml.Controls.Primitives;
+using Microsoft.UI.Xaml.Input;
+using Microsoft.UI.Xaml.Media;
+using Microsoft.UI.Xaml.Media.Imaging;
+using Microsoft.UI.Xaml.Navigation;
+using MUXControlsTestApp.Samples.Model;
+using System;
+using System.Collections.Generic;
+using System.Collections.ObjectModel;
+using System.Linq;
+
+namespace MUXControlsTestApp
+{
+ public sealed partial class FlatItemsControlPage : TestPage
+ {
+ private ObservableCollection _colRecipes = null;
+ private ItemsPanelTemplate _modernPanelTemplate = null;
+ private DataTemplate[] _itemTemplates = new DataTemplate[3];
+
+ public FlatItemsControlPage()
+ {
+ this.InitializeComponent();
+
+ Loaded += FlatItemsControlPage_Loaded;
+ }
+
+ private void FlatItemsControlPage_Loaded(object sender, RoutedEventArgs e)
+ {
+ _colRecipes = new ObservableCollection();
+
+ for (int itemIndex = 0; itemIndex < 250; itemIndex++)
+ {
+ BitmapImage bitmapImage = GetBitmapImage(itemIndex % 126 + 1);
+
+ _colRecipes.Add(new Recipe()
+ {
+ BitmapImage = bitmapImage,
+ Id = itemIndex
+ });
+ }
+
+ UpdateItemsControlIsTabStop();
+ UpdateItemsControlItemTemplate();
+ UpdateItemsControlTabNavigation();
+ UpdateItemsControlXYFocusKeyboardNavigation();
+ UpdateItemsPanelType();
+
+ itemsControl.ItemsSource = _colRecipes;
+ }
+
+ private void UpdateItemsPanelType()
+ {
+ try
+ {
+ if (itemsControl != null && cmbItemsControlItemsPanelType != null)
+ {
+ switch (cmbItemsControlItemsPanelType.SelectedIndex)
+ {
+ case 0:
+ if (_modernPanelTemplate == null)
+ {
+ _modernPanelTemplate = itemsControl.ItemsPanel;
+ }
+ else
+ {
+ itemsControl.ItemsPanel = _modernPanelTemplate;
+ }
+ break;
+ case 1: // Use the virtualizingStackPanelItemsPanelTemplate resource
+ itemsControl.ItemsPanel = Resources["virtualizingStackPanelItemsPanelTemplate"] as ItemsPanelTemplate;
+ break;
+ case 2: // Use the stackPanelItemsPanelTemplate resource
+ itemsControl.ItemsPanel = Resources["stackPanelItemsPanelTemplate"] as ItemsPanelTemplate;
+ break;
+ }
+
+ // itemsControl.ItemsPanelRoot is only updated asynchronously.
+ _ = this.DispatcherQueue.TryEnqueue(Microsoft.UI.Dispatching.DispatcherQueuePriority.Low, UpdateModernPanelUIVisibility);
+ _ = this.DispatcherQueue.TryEnqueue(Microsoft.UI.Dispatching.DispatcherQueuePriority.Low, UpdateItemsPanelProperties);
+ }
+ }
+ catch (Exception ex)
+ {
+ txtExceptionReport.Text = ex.ToString();
+ AppendEventMessage(ex.ToString());
+ }
+ }
+
+ private void UpdateItemsPanelProperties()
+ {
+ UpdateItemsPanelOrientation();
+ UpdateItemsPanelMargin();
+
+ if (itemsControl.ItemsPanelRoot is ItemsWrapGrid)
+ {
+ UpdateItemsWrapGridMaximumRowsOrColumns();
+ }
+ }
+
+ private void UpdateItemsControlIsTabStop()
+ {
+ if (itemsControl != null && chkItemsControlIsTabStop != null)
+ {
+ chkItemsControlIsTabStop.IsChecked = itemsControl.IsTabStop;
+ }
+ }
+
+ private void UpdateItemsControlItemTemplate()
+ {
+ try
+ {
+ if (itemsControl != null && cmbItemsControlItemTemplate != null)
+ {
+ if (cmbItemsControlItemTemplate.SelectedIndex == 0)
+ {
+ itemsControl.ItemTemplate = null;
+ }
+ else
+ {
+ int templateIndex = cmbItemsControlItemTemplate.SelectedIndex - 1;
+
+ if (_itemTemplates[templateIndex] == null)
+ {
+ _itemTemplates[templateIndex] = Resources["itemTemplate" + cmbItemsControlItemTemplate.SelectedIndex.ToString()] as DataTemplate;
+ }
+
+ itemsControl.ItemTemplate = _itemTemplates[templateIndex];
+ }
+ }
+ }
+ catch (Exception ex)
+ {
+ txtExceptionReport.Text = ex.ToString();
+ AppendEventMessage(ex.ToString());
+ }
+ }
+
+ private void UpdateItemsControlTabNavigation()
+ {
+ if (itemsControl != null && cmbItemsControlTabNavigation != null)
+ {
+ cmbItemsControlTabNavigation.SelectedIndex = (int)itemsControl.TabNavigation;
+ }
+ }
+
+ private void UpdateItemsControlXYFocusKeyboardNavigation()
+ {
+ if (itemsControl != null && cmbItemsControlXYFocusKeyboardNavigation != null)
+ {
+ cmbItemsControlXYFocusKeyboardNavigation.SelectedIndex = (int)itemsControl.XYFocusKeyboardNavigation;
+ }
+ }
+
+ private void UpdateItemsPanelOrientation()
+ {
+ if (itemsControl != null && cmbItemsPanelOrientation != null)
+ {
+ ItemsWrapGrid itemsWrapGrid = itemsControl.ItemsPanelRoot as ItemsWrapGrid;
+
+ if (itemsWrapGrid != null)
+ {
+ cmbItemsPanelOrientation.SelectedIndex = (int)itemsWrapGrid.Orientation;
+ }
+ else
+ {
+ ItemsStackPanel itemsStackPanel = itemsControl.ItemsPanelRoot as ItemsStackPanel;
+
+ if (itemsStackPanel != null)
+ {
+ cmbItemsPanelOrientation.SelectedIndex = (int)itemsStackPanel.Orientation;
+ }
+ else
+ {
+ VirtualizingStackPanel virtualizingStackPanel = itemsControl.ItemsPanelRoot as VirtualizingStackPanel;
+
+ if (virtualizingStackPanel != null)
+ {
+ cmbItemsPanelOrientation.SelectedIndex = (int)virtualizingStackPanel.Orientation;
+ }
+ else
+ {
+ StackPanel stackPanel = itemsControl.ItemsPanelRoot as StackPanel;
+
+ if (stackPanel != null)
+ {
+ cmbItemsPanelOrientation.SelectedIndex = (int)stackPanel.Orientation;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ private void UpdateItemsWrapGridMaximumRowsOrColumns()
+ {
+ try
+ {
+ if (itemsControl != null && nbItemsWrapGridMaximumRowsOrColumns != null)
+ {
+ ItemsWrapGrid itemsWrapGrid = itemsControl.ItemsPanelRoot as ItemsWrapGrid;
+
+ if (itemsWrapGrid != null && itemsWrapGrid.MaximumRowsOrColumns != -1)
+ {
+ nbItemsWrapGridMaximumRowsOrColumns.Value = itemsWrapGrid.MaximumRowsOrColumns;
+ }
+ }
+ }
+ catch (Exception ex)
+ {
+ txtExceptionReport.Text = ex.ToString();
+ AppendEventMessage(ex.ToString());
+ }
+ }
+
+ private void UpdateItemsPanelMargin()
+ {
+ try
+ {
+ if (itemsControl != null && txtItemsPanelMargin != null)
+ {
+ Panel itemsPanel = itemsControl.ItemsPanelRoot;
+
+ if (itemsPanel != null)
+ {
+ txtItemsPanelMargin.Text = itemsPanel.Margin.ToString();
+ }
+ }
+ }
+ catch (Exception ex)
+ {
+ txtExceptionReport.Text = ex.ToString();
+ AppendEventMessage(ex.ToString());
+ }
+ }
+
+ private void UpdateModernPanelUIVisibility()
+ {
+ if (itemsControl.ItemsPanelRoot is ItemsWrapGrid)
+ {
+ tblItemsWrapGridMaximumRowsOrColumns.Visibility = Visibility.Visible;
+ nbItemsWrapGridMaximumRowsOrColumns.Visibility = Visibility.Visible;
+ }
+ else
+ {
+ tblItemsWrapGridMaximumRowsOrColumns.Visibility = Visibility.Collapsed;
+ nbItemsWrapGridMaximumRowsOrColumns.Visibility = Visibility.Collapsed;
+ }
+ }
+
+ private void UpdateDataSourceItemCount()
+ {
+ if (itemsControl != null && txtDataSourceItemCount != null)
+ {
+ if (itemsControl.ItemsSource == null)
+ {
+ txtDataSourceItemCount.Text = "0";
+ }
+ else if (itemsControl.ItemsSource == _colRecipes)
+ {
+ txtDataSourceItemCount.Text = _colRecipes.Count.ToString();
+ }
+ }
+ }
+
+ private BitmapImage GetBitmapImage(int index)
+ {
+ Uri uri = new Uri(string.Format("ms-appx:///Images/vette{0}.jpg", index));
+ BitmapImage bitmapImage = new BitmapImage();
+ bitmapImage.DecodePixelWidth = 120;
+ bitmapImage.DecodePixelHeight = 120;
+ bitmapImage.UriSource = uri;
+ return bitmapImage;
+ }
+
+ private void DataSourceAddItem()
+ {
+ try
+ {
+ if (itemsControl != null && itemsControl.ItemsSource != null)
+ {
+ if (itemsControl.ItemsSource == _colRecipes)
+ {
+ BitmapImage bitmapImage = GetBitmapImage(_colRecipes.Count % 126 + 1);
+
+ var recipe = new Recipe()
+ {
+ BitmapImage = bitmapImage,
+ Id = _colRecipes.Count
+ };
+
+ _colRecipes.Add(recipe);
+ }
+ }
+ }
+ catch (Exception ex)
+ {
+ txtExceptionReport.Text = ex.ToString();
+ AppendEventMessage(ex.ToString());
+ }
+ }
+
+ private void DataSourceInsertItem(int newItemIndex)
+ {
+ try
+ {
+ if (itemsControl != null && itemsControl.ItemsSource != null)
+ {
+ if (itemsControl.ItemsSource == _colRecipes)
+ {
+ BitmapImage bitmapImage = GetBitmapImage(_colRecipes.Count % 126 + 1);
+
+ var recipe = new Recipe()
+ {
+ BitmapImage = bitmapImage,
+ Id = _colRecipes.Count
+ };
+
+ _colRecipes.Insert(newItemIndex, recipe);
+ }
+ }
+ }
+ catch (Exception ex)
+ {
+ txtExceptionReport.Text = ex.ToString();
+ AppendEventMessage(ex.ToString());
+ }
+ }
+
+ private void DataSourceRemoveAllItems()
+ {
+ try
+ {
+ if (itemsControl != null && itemsControl.ItemsSource != null)
+ {
+ if (itemsControl.ItemsSource == _colRecipes)
+ {
+ _colRecipes.Clear();
+ }
+ }
+ }
+ catch (Exception ex)
+ {
+ txtExceptionReport.Text = ex.ToString();
+ AppendEventMessage(ex.ToString());
+ }
+ }
+
+ private void DataSourceRemoveItem(int oldItemIndex)
+ {
+ try
+ {
+ if (itemsControl != null && itemsControl.ItemsSource != null)
+ {
+ if (itemsControl.ItemsSource == _colRecipes)
+ {
+ _colRecipes.RemoveAt(oldItemIndex);
+ }
+ }
+ }
+ catch (Exception ex)
+ {
+ txtExceptionReport.Text = ex.ToString();
+ AppendEventMessage(ex.ToString());
+ }
+ }
+
+ private void DataSourceReplaceItem(int itemIndex)
+ {
+ try
+ {
+ if (itemsControl != null && itemsControl.ItemsSource != null)
+ {
+ if (itemsControl.ItemsSource == _colRecipes)
+ {
+ BitmapImage bitmapImage = GetBitmapImage(_colRecipes.Count % 126 + 1);
+
+ var recipe = new Recipe()
+ {
+ BitmapImage = bitmapImage,
+ Id = _colRecipes.Count
+ };
+
+ _colRecipes[itemIndex] = recipe;
+ }
+ }
+ }
+ catch (Exception ex)
+ {
+ txtExceptionReport.Text = ex.ToString();
+ AppendEventMessage(ex.ToString());
+ }
+ }
+
+ private void BtnGetItemsControlTabNavigation_Click(object sender, RoutedEventArgs e)
+ {
+ UpdateItemsControlTabNavigation();
+ }
+
+ private void BtnSetItemsControlTabNavigation_Click(object sender, RoutedEventArgs e)
+ {
+ if (itemsControl != null && cmbItemsControlTabNavigation != null)
+ {
+ itemsControl.TabNavigation = (KeyboardNavigationMode)cmbItemsControlTabNavigation.SelectedIndex;
+ }
+ }
+
+ private void BtnGetItemsControlXYFocusKeyboardNavigation_Click(object sender, RoutedEventArgs e)
+ {
+ UpdateItemsControlXYFocusKeyboardNavigation();
+ }
+
+ private void BtnSetItemsControlXYFocusKeyboardNavigation_Click(object sender, RoutedEventArgs e)
+ {
+ if (itemsControl != null && cmbItemsControlXYFocusKeyboardNavigation != null)
+ {
+ itemsControl.XYFocusKeyboardNavigation = (XYFocusKeyboardNavigationMode)cmbItemsControlXYFocusKeyboardNavigation.SelectedIndex;
+ }
+ }
+
+ private void CmbItemsPresenterHeader_SelectionChanged(object sender, SelectionChangedEventArgs e)
+ {
+ try
+ {
+ if (itemsControl != null && cmbItemsPresenterHeader != null)
+ {
+ ItemsPresenter itemsPresenter = FindElementOfTypeInSubtree(itemsControl);
+
+ if (itemsPresenter != null)
+ {
+ switch (cmbItemsPresenterHeader.SelectedIndex)
+ {
+ case 0: /*None*/
+ itemsPresenter.Header = null;
+ break;
+ case 1: /*No TabStop*/
+ itemsPresenter.Header = new TextBlock()
+ {
+ FontSize = 18.0,
+ Margin = new Thickness(10.0),
+ Text = "ItemsPresenter Header"
+ };
+ break;
+ case 2: /*Single TabStop*/
+ itemsPresenter.Header = new Button()
+ {
+ Content = "ItemsPresenter Header",
+ FontSize = 18.0,
+ Margin = new Thickness(10.0)
+ };
+ break;
+ case 3: /*Nested TabStops*/
+ itemsPresenter.Header = new Button()
+ {
+ Content = new Button()
+ {
+ Content = "ItemsPresenter Header",
+ Margin = new Thickness(10.0)
+ },
+ FontSize = 18.0,
+ Margin = new Thickness(10.0)
+ };
+ break;
+ }
+ }
+ }
+ }
+ catch (Exception ex)
+ {
+ txtExceptionReport.Text = ex.ToString();
+ AppendEventMessage(ex.ToString());
+ }
+ }
+
+ private void CmbItemsPresenterFooter_SelectionChanged(object sender, SelectionChangedEventArgs e)
+ {
+ try
+ {
+ if (itemsControl != null && cmbItemsPresenterFooter != null)
+ {
+ ItemsPresenter itemsPresenter = FindElementOfTypeInSubtree(itemsControl);
+
+ if (itemsPresenter != null)
+ {
+ switch (cmbItemsPresenterFooter.SelectedIndex)
+ {
+ case 0: /*None*/
+ itemsPresenter.Footer = null;
+ break;
+ case 1: /*No TabStop*/
+ itemsPresenter.Footer = new TextBlock()
+ {
+ FontSize = 18.0,
+ Margin = new Thickness(10.0),
+ Text = "ItemsPresenter Footer"
+ };
+ break;
+ case 2: /*Single TabStop*/
+ itemsPresenter.Footer = new Button()
+ {
+ Content = "ItemsPresenter Footer",
+ FontSize = 18.0,
+ Margin = new Thickness(10.0)
+ };
+ break;
+ case 3: /*Nested TabStops*/
+ itemsPresenter.Footer = new Button()
+ {
+ Content = new Button()
+ {
+ Content = "ItemsPresenter Footer",
+ Margin = new Thickness(10.0)
+ },
+ FontSize = 18.0,
+ Margin = new Thickness(10.0)
+ };
+ break;
+ }
+ }
+ }
+ }
+ catch (Exception ex)
+ {
+ txtExceptionReport.Text = ex.ToString();
+ AppendEventMessage(ex.ToString());
+ }
+ }
+
+ private void CmbItemsControlItemTemplate_SelectionChanged(object sender, SelectionChangedEventArgs e)
+ {
+ UpdateItemsControlItemTemplate();
+ }
+
+ private void CmbItemsControlItemsPanelType_SelectionChanged(object sender, SelectionChangedEventArgs e)
+ {
+ UpdateItemsPanelType();
+ }
+
+ private void ChkItemsControlIsTabStop_IsCheckedChanged(object sender, RoutedEventArgs e)
+ {
+ if (itemsControl != null && chkItemsControlIsTabStop != null)
+ {
+ itemsControl.IsTabStop = (bool)chkItemsControlIsTabStop.IsChecked;
+ }
+ }
+
+ private void BtnGetItemsPanelOrientation_Click(object sender, RoutedEventArgs e)
+ {
+ UpdateItemsPanelOrientation();
+ }
+
+ private void BtnSetItemsPanelOrientation_Click(object sender, RoutedEventArgs e)
+ {
+ if (itemsControl != null && cmbItemsPanelOrientation != null)
+ {
+ ItemsWrapGrid itemsWrapGrid = itemsControl.ItemsPanelRoot as ItemsWrapGrid;
+
+ if (itemsWrapGrid != null)
+ {
+ itemsControl.ItemsSource = null;
+
+ itemsWrapGrid.Orientation = (Orientation)cmbItemsPanelOrientation.SelectedIndex;
+ }
+ else
+ {
+ ItemsStackPanel itemsStackPanel = itemsControl.ItemsPanelRoot as ItemsStackPanel;
+
+ if (itemsStackPanel != null)
+ {
+ itemsControl.ItemsSource = null;
+
+ itemsStackPanel.Orientation = (Orientation)cmbItemsPanelOrientation.SelectedIndex;
+ }
+ else
+ {
+ VirtualizingStackPanel virtualizingStackPanel = itemsControl.ItemsPanelRoot as VirtualizingStackPanel;
+
+ if (virtualizingStackPanel != null)
+ {
+ virtualizingStackPanel.Orientation = (Orientation)cmbItemsPanelOrientation.SelectedIndex;
+ }
+ else
+ {
+ StackPanel stackPanel = itemsControl.ItemsPanelRoot as StackPanel;
+
+ if (stackPanel != null)
+ {
+ stackPanel.Orientation = (Orientation)cmbItemsPanelOrientation.SelectedIndex;
+ }
+ }
+ }
+ }
+
+ itemsControl.ItemsSource = _colRecipes;
+ }
+ }
+
+ private void BtnGetItemsPanelMargin_Click(object sender, RoutedEventArgs e)
+ {
+ UpdateItemsPanelMargin();
+ }
+
+ private void BtnSetItemsPanelMargin_Click(object sender, RoutedEventArgs e)
+ {
+ try
+ {
+ if (itemsControl != null && txtItemsPanelMargin != null)
+ {
+ Panel itemsPanel = itemsControl.ItemsPanelRoot;
+
+ if (itemsPanel != null)
+ {
+ itemsPanel.Margin = GetThicknessFromString(txtItemsPanelMargin.Text);
+ }
+ }
+ }
+ catch (Exception ex)
+ {
+ txtExceptionReport.Text = ex.ToString();
+ AppendEventMessage(ex.ToString());
+ }
+ }
+
+ private void NbItemsWrapGridMaximumRowsOrColumns_ValueChanged(object sender, object e)
+ {
+ try
+ {
+ if (itemsControl != null && nbItemsWrapGridMaximumRowsOrColumns != null)
+ {
+ ItemsWrapGrid itemsWrapGrid = itemsControl.ItemsPanelRoot as ItemsWrapGrid;
+
+ if (itemsWrapGrid != null)
+ {
+ itemsWrapGrid.MaximumRowsOrColumns = (int)nbItemsWrapGridMaximumRowsOrColumns.Value;
+ }
+ }
+ }
+ catch (Exception ex)
+ {
+ txtExceptionReport.Text = ex.ToString();
+ AppendEventMessage(ex.ToString());
+ }
+ }
+
+ private void BtnDataSourceGetItemCount_Click(object sender, RoutedEventArgs e)
+ {
+ UpdateDataSourceItemCount();
+ }
+
+ private void BtnDataSourceSetItemCount_Click(object sender, RoutedEventArgs e)
+ {
+ try
+ {
+ if (itemsControl != null && itemsControl.ItemsSource != null && txtDataSourceItemCount != null)
+ {
+ int newItemCount = int.Parse(txtDataSourceItemCount.Text);
+
+ if (itemsControl.ItemsSource == _colRecipes)
+ {
+ if (_colRecipes.Count < newItemCount)
+ {
+ var colRecipesEnd = new List();
+
+ for (int itemIndex = 0; itemIndex < newItemCount - _colRecipes.Count; itemIndex++)
+ {
+ BitmapImage bitmapImage = GetBitmapImage(itemIndex % 126 + 1);
+
+ colRecipesEnd.Add(new Recipe()
+ {
+ BitmapImage = bitmapImage,
+ Id = itemIndex
+ });
+ }
+
+ _colRecipes = new ObservableCollection(_colRecipes.Concat(colRecipesEnd));
+ }
+ else if (_colRecipes.Count > newItemCount)
+ {
+ _colRecipes = new ObservableCollection(_colRecipes.Take(newItemCount));
+ }
+
+ itemsControl.ItemsSource = _colRecipes;
+ }
+ }
+ }
+ catch (Exception ex)
+ {
+ txtExceptionReport.Text = ex.ToString();
+ AppendEventMessage(ex.ToString());
+ }
+ }
+
+ private void BtnDataSourceAddItem_Click(object sender, RoutedEventArgs e)
+ {
+ AppendEventMessage("DataSourceAdd");
+ DataSourceAddItem();
+ }
+
+ private void BtnDataSourceInsertItem_Click(object sender, RoutedEventArgs e)
+ {
+ try
+ {
+ if (txtDataSourceItemIndex != null)
+ {
+ int newItemIndex = int.Parse(txtDataSourceItemIndex.Text);
+
+ AppendEventMessage("DataSourceInsert " + newItemIndex);
+ DataSourceInsertItem(newItemIndex);
+ }
+ }
+ catch (Exception ex)
+ {
+ txtExceptionReport.Text = ex.ToString();
+ AppendEventMessage(ex.ToString());
+ }
+ }
+
+ private void BtnDataSourceRemoveAllItems_Click(object sender, RoutedEventArgs e)
+ {
+ AppendEventMessage("DataSourceRemoveAll");
+ DataSourceRemoveAllItems();
+ }
+
+ private void BtnDataSourceRemoveItem_Click(object sender, RoutedEventArgs e)
+ {
+ try
+ {
+ if (txtDataSourceItemIndex != null)
+ {
+ int oldItemIndex = int.Parse(txtDataSourceItemIndex.Text);
+
+ AppendEventMessage("DataSourceRemove " + oldItemIndex);
+ DataSourceRemoveItem(oldItemIndex);
+ }
+ }
+ catch (Exception ex)
+ {
+ txtExceptionReport.Text = ex.ToString();
+ AppendEventMessage(ex.ToString());
+ }
+ }
+
+ private void BtnDataSourceReplaceItem_Click(object sender, RoutedEventArgs e)
+ {
+ try
+ {
+ if (txtDataSourceItemIndex != null)
+ {
+ int itemIndex = int.Parse(txtDataSourceItemIndex.Text);
+
+ AppendEventMessage("DataSourceReplace " + itemIndex);
+ DataSourceReplaceItem(itemIndex);
+ }
+ }
+ catch (Exception ex)
+ {
+ txtExceptionReport.Text = ex.ToString();
+ AppendEventMessage(ex.ToString());
+ }
+ }
+
+ private void ChkItemsControlProperties_Checked(object sender, RoutedEventArgs e)
+ {
+ if (svItemsControlProperties != null)
+ svItemsControlProperties.Visibility = Visibility.Visible;
+ }
+
+ private void ChkItemsControlProperties_Unchecked(object sender, RoutedEventArgs e)
+ {
+ if (svItemsControlProperties != null)
+ svItemsControlProperties.Visibility = Visibility.Collapsed;
+ }
+
+ private void ChkDataSource_Checked(object sender, RoutedEventArgs e)
+ {
+ if (svDataSource != null)
+ svDataSource.Visibility = Visibility.Visible;
+ }
+
+ private void ChkDataSource_Unchecked(object sender, RoutedEventArgs e)
+ {
+ if (svDataSource != null)
+ svDataSource.Visibility = Visibility.Collapsed;
+ }
+
+ private void ChkLogs_Checked(object sender, RoutedEventArgs e)
+ {
+ if (grdLogs != null)
+ grdLogs.Visibility = Visibility.Visible;
+ }
+
+ private void ChkLogs_Unchecked(object sender, RoutedEventArgs e)
+ {
+ if (grdLogs != null)
+ grdLogs.Visibility = Visibility.Collapsed;
+ }
+
+ private void AppendEventMessage(string eventMessage)
+ {
+ lstLogs.Items.Add(eventMessage);
+ }
+
+ private void BtnClearExceptionReport_Click(object sender, RoutedEventArgs e)
+ {
+ txtExceptionReport.Text = string.Empty;
+ }
+
+ private void BtnClearLogs_Click(object sender, RoutedEventArgs e)
+ {
+ lstLogs.Items.Clear();
+ }
+
+ private Thickness GetThicknessFromString(string thickness)
+ {
+ string[] lengths = thickness.Split(',');
+ if (lengths.Length < 4)
+ return new Thickness(
+ Convert.ToDouble(lengths[0]));
+ else
+ return new Thickness(
+ Convert.ToDouble(lengths[0]), Convert.ToDouble(lengths[1]), Convert.ToDouble(lengths[2]), Convert.ToDouble(lengths[3]));
+ }
+
+ private static T FindElementOfTypeInSubtree(DependencyObject element) where T : DependencyObject
+ {
+ if (element == null)
+ return null;
+
+ if (element is T)
+ return (T)element;
+
+ int childrenCount = VisualTreeHelper.GetChildrenCount(element);
+ for (int i = 0; i < childrenCount; i++)
+ {
+ var result = FindElementOfTypeInSubtree(VisualTreeHelper.GetChild(element, i));
+ if (result != null)
+ return result;
+ }
+
+ return null;
+ }
+ }
+}
diff --git a/controls/dev/CommonStyles/TestUI/GroupedItemsControlPage.xaml b/controls/dev/CommonStyles/TestUI/GroupedItemsControlPage.xaml
new file mode 100644
index 0000000000..507c622d64
--- /dev/null
+++ b/controls/dev/CommonStyles/TestUI/GroupedItemsControlPage.xaml
@@ -0,0 +1,296 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ItemsWrapGrid
+ ItemsStackPanel
+ VirtualizingStackPanel
+
+
+
+
+ None
+ No TabStop
+ Single TabStop
+ Nested TabStops
+
+
+
+
+ None
+ No TabStop
+ Single TabStop
+ Nested TabStops
+
+
+
+
+
+
+
+ Local
+ Cycle
+ Once
+
+
+
+
+
+
+ Auto
+ Enabled
+ Disabled
+
+
+
+
+
+
+
+
+ None
+ No TabStop
+ Single TabStop
+ Nested TabStops
+
+
+
+
+ None
+ No TabStop
+ Single TabStop
+ Nested TabStops
+
+
+
+
+
+
+ Vertical
+ Horizontal
+
+
+
+
+
+
+ Top
+ Left
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/controls/dev/CommonStyles/TestUI/GroupedItemsControlPage.xaml.cs b/controls/dev/CommonStyles/TestUI/GroupedItemsControlPage.xaml.cs
new file mode 100644
index 0000000000..8874ae04f7
--- /dev/null
+++ b/controls/dev/CommonStyles/TestUI/GroupedItemsControlPage.xaml.cs
@@ -0,0 +1,1162 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License. See LICENSE in the project root for license information.
+
+using Microsoft.UI.Text;
+using Microsoft.UI.Xaml;
+using Microsoft.UI.Xaml.Controls;
+using Microsoft.UI.Xaml.Controls.Primitives;
+using Microsoft.UI.Xaml.Data;
+using Microsoft.UI.Xaml.Input;
+using Microsoft.UI.Xaml.Media;
+using Microsoft.UI.Xaml.Media.Imaging;
+using Microsoft.UI.Xaml.Navigation;
+using MUXControlsTestApp.Samples.Model;
+using System;
+using System.Collections.Generic;
+using System.Collections.ObjectModel;
+using System.Linq;
+
+namespace MUXControlsTestApp
+{
+ public sealed partial class GroupedItemsControlPage : TestPage
+ {
+ private GroupedItemsControlViewModel _groupedItemsControlViewModel = new GroupedItemsControlViewModel();
+ private CollectionViewSource _cvs = new CollectionViewSource();
+ private DataTemplate[] _headerTemplates = new DataTemplate[3];
+ private DataTemplate[] _itemTemplates = new DataTemplate[3];
+
+ public GroupedItemsControlPage()
+ {
+ this.InitializeComponent();
+
+ _cvs.Source = _groupedItemsControlViewModel.Items;
+ _cvs.IsSourceGrouped = true;
+ _cvs.ItemsPath = new PropertyPath("Items");
+
+ Loaded += GroupedItemsControlPage_Loaded;
+ }
+
+ protected override void OnNavigatedTo(NavigationEventArgs e)
+ {
+ itemsControl.ItemsSource = _cvs.View;
+
+ if (cmbItemsControlItemsPanelType != null)
+ {
+ cmbItemsControlItemsPanelType.SelectedIndex = 0;
+ }
+
+ base.OnNavigatedTo(e);
+ }
+
+ private void GroupedItemsControlPage_Loaded(object sender, RoutedEventArgs e)
+ {
+ UpdateItemsPanelType();
+ UpdateItemsControlProperties();
+ }
+
+ private void UpdateItemsWrapGridUIVisibility(Visibility visibility)
+ {
+ tblItemsWrapGridProperties.Visibility = visibility;
+ tblItemsWrapGridMaximumRowsOrColumns.Visibility = visibility;
+ nbItemsWrapGridMaximumRowsOrColumns.Visibility = visibility;
+ tblItemsWrapGridItemWidth.Visibility = visibility;
+ txtItemsWrapGridItemWidth.Visibility = visibility;
+ btnGetItemsWrapGridItemWidth.Visibility = visibility;
+ btnSetItemsWrapGridItemWidth.Visibility = visibility;
+ tblItemsWrapGridItemHeight.Visibility = visibility;
+ txtItemsWrapGridItemHeight.Visibility = visibility;
+ btnGetItemsWrapGridItemHeight.Visibility = visibility;
+ btnSetItemsWrapGridItemHeight.Visibility = visibility;
+ }
+
+ private void UpdateItemsPanelType()
+ {
+ try
+ {
+ if (itemsControl != null && cmbItemsControlItemsPanelType != null)
+ {
+ switch (cmbItemsControlItemsPanelType.SelectedIndex)
+ {
+ case 0: // Use the wrapGridItemsPanelTemplate resource
+ itemsControl.ItemsPanel = Resources["itemsWrapGridItemsPanelTemplate"] as ItemsPanelTemplate;
+ UpdateItemsWrapGridUIVisibility(Visibility.Visible);
+ break;
+ case 1: // Use the stackPanelItemsPanelTemplate resource
+ itemsControl.ItemsPanel = Resources["itemsStackPanelItemsPanelTemplate"] as ItemsPanelTemplate;
+ UpdateItemsWrapGridUIVisibility(Visibility.Collapsed);
+ break;
+ case 2: // Use the virtualizingStackPanelItemsPanelTemplate resource
+ itemsControl.ItemsPanel = Resources["virtualizingStackPanelItemsPanelTemplate"] as ItemsPanelTemplate;
+ UpdateItemsWrapGridUIVisibility(Visibility.Collapsed);
+ break;
+ }
+
+ // itemsControl.ItemsPanelRoot is only updated asynchronously.
+ _ = this.DispatcherQueue.TryEnqueue(Microsoft.UI.Dispatching.DispatcherQueuePriority.Low, UpdateItemsPanelProperties);
+ }
+ }
+ catch (Exception ex)
+ {
+ txtExceptionReport.Text = ex.ToString();
+ AppendEventMessage(ex.ToString());
+ }
+ }
+
+ private void UpdateItemsPanelProperties()
+ {
+ UpdateItemsPanelOrientation();
+ UpdateItemsPanelGroupHeaderPlacement();
+ UpdateItemsPanelMargin();
+ UpdateItemsPanelGroupPadding();
+ UpdateItemsPanelAreStickyGroupHeadersEnabled();
+ UpdateItemsWrapGridCacheLength();
+ UpdateItemsWrapGridItemWidth();
+ UpdateItemsWrapGridItemHeight();
+ }
+
+ private void UpdateItemsControlProperties()
+ {
+ UpdateItemsControlIsTabStop();
+ UpdateItemsControlHeaderTemplate();
+ UpdateItemsControlItemTemplate();
+ UpdateItemsControlTabNavigation();
+ UpdateItemsControlXYFocusKeyboardNavigation();
+ }
+
+ private void UpdateItemsControlIsTabStop()
+ {
+ if (itemsControl != null && chkItemsControlIsTabStop != null)
+ {
+ chkItemsControlIsTabStop.IsChecked = itemsControl.IsTabStop;
+ }
+ }
+
+ private void UpdateItemsControlTabNavigation()
+ {
+ if (itemsControl != null && cmbItemsControlTabNavigation != null)
+ {
+ cmbItemsControlTabNavigation.SelectedIndex = (int)itemsControl.TabNavigation;
+ }
+ }
+
+ private void UpdateItemsControlXYFocusKeyboardNavigation()
+ {
+ if (itemsControl != null && cmbItemsControlXYFocusKeyboardNavigation != null)
+ {
+ cmbItemsControlXYFocusKeyboardNavigation.SelectedIndex = (int)itemsControl.XYFocusKeyboardNavigation;
+ }
+ }
+
+ private void UpdateItemsControlHeaderTemplate()
+ {
+ try
+ {
+ if (itemsControl != null && cmbItemsControlHeaderTemplate != null)
+ {
+ if (cmbItemsControlHeaderTemplate.SelectedIndex == 0)
+ {
+ if (itemsControl.GroupStyle.Count > 0)
+ {
+ itemsControl.GroupStyle[0].HeaderTemplate = null;
+ }
+ }
+ else
+ {
+ int templateIndex = cmbItemsControlHeaderTemplate.SelectedIndex - 1;
+
+ if (_headerTemplates[templateIndex] == null)
+ {
+ _headerTemplates[templateIndex] = Resources["headerTemplate" + cmbItemsControlHeaderTemplate.SelectedIndex.ToString()] as DataTemplate;
+ }
+
+ if (itemsControl.GroupStyle.Count == 0)
+ {
+ itemsControl.GroupStyle.Add(new GroupStyle());
+ }
+
+ itemsControl.GroupStyle[0].HeaderTemplate = _headerTemplates[templateIndex];
+ }
+ }
+ }
+ catch (Exception ex)
+ {
+ txtExceptionReport.Text = ex.ToString();
+ AppendEventMessage(ex.ToString());
+ }
+ }
+
+ private void UpdateItemsControlItemTemplate()
+ {
+ try
+ {
+ if (itemsControl != null && cmbItemsControlItemTemplate != null)
+ {
+ if (cmbItemsControlItemTemplate.SelectedIndex == 0)
+ {
+ itemsControl.ItemTemplate = null;
+ }
+ else
+ {
+ int templateIndex = cmbItemsControlItemTemplate.SelectedIndex - 1;
+
+ if (_itemTemplates[templateIndex] == null)
+ {
+ _itemTemplates[templateIndex] = Resources["itemTemplate" + cmbItemsControlItemTemplate.SelectedIndex.ToString()] as DataTemplate;
+ }
+
+ itemsControl.ItemTemplate = _itemTemplates[templateIndex];
+ }
+ }
+ }
+ catch (Exception ex)
+ {
+ txtExceptionReport.Text = ex.ToString();
+ AppendEventMessage(ex.ToString());
+ }
+ }
+
+ private void UpdateItemsPanelOrientation()
+ {
+ try
+ {
+ if (itemsControl != null && cmbItemsPanelOrientation != null)
+ {
+ ItemsWrapGrid itemsWrapGrid = itemsControl.ItemsPanelRoot as ItemsWrapGrid;
+
+ if (itemsWrapGrid != null)
+ {
+ cmbItemsPanelOrientation.SelectedIndex = (int)itemsWrapGrid.Orientation;
+ }
+ else
+ {
+ ItemsStackPanel itemsStackPanel = itemsControl.ItemsPanelRoot as ItemsStackPanel;
+
+ if (itemsStackPanel != null)
+ {
+ cmbItemsPanelOrientation.SelectedIndex = (int)itemsStackPanel.Orientation;
+ }
+ else
+ {
+ VirtualizingStackPanel virtualizingStackPanel = itemsControl.ItemsPanelRoot as VirtualizingStackPanel;
+
+ if (virtualizingStackPanel != null)
+ {
+ cmbItemsPanelOrientation.SelectedIndex = (int)virtualizingStackPanel.Orientation;
+ }
+ }
+ }
+ }
+ }
+ catch (Exception ex)
+ {
+ txtExceptionReport.Text = ex.ToString();
+ AppendEventMessage(ex.ToString());
+ }
+ }
+
+ private void UpdateItemsPanelGroupHeaderPlacement()
+ {
+ try
+ {
+ if (itemsControl != null && cmbItemsPanelGroupHeaderPlacement != null)
+ {
+ ItemsWrapGrid itemsWrapGrid = itemsControl.ItemsPanelRoot as ItemsWrapGrid;
+
+ if (itemsWrapGrid != null)
+ {
+ cmbItemsPanelGroupHeaderPlacement.SelectedIndex = (int)itemsWrapGrid.GroupHeaderPlacement;
+ }
+ else
+ {
+ ItemsStackPanel itemsStackPanel = itemsControl.ItemsPanelRoot as ItemsStackPanel;
+
+ if (itemsStackPanel != null)
+ {
+ cmbItemsPanelGroupHeaderPlacement.SelectedIndex = (int)itemsStackPanel.GroupHeaderPlacement;
+ }
+ }
+ }
+ }
+ catch (Exception ex)
+ {
+ txtExceptionReport.Text = ex.ToString();
+ AppendEventMessage(ex.ToString());
+ }
+ }
+
+ private void UpdateItemsPanelMargin()
+ {
+ try
+ {
+ if (itemsControl != null && txtItemsPanelMargin != null)
+ {
+ Panel itemsPanel = itemsControl.ItemsPanelRoot;
+
+ if (itemsPanel != null)
+ {
+ txtItemsPanelMargin.Text = itemsPanel.Margin.ToString();
+ }
+ }
+ }
+ catch (Exception ex)
+ {
+ txtExceptionReport.Text = ex.ToString();
+ AppendEventMessage(ex.ToString());
+ }
+ }
+
+ private void UpdateItemsPanelGroupPadding()
+ {
+ try
+ {
+ if (itemsControl != null && txtItemsPanelGroupPadding != null)
+ {
+ ItemsWrapGrid itemsWrapGrid = itemsControl.ItemsPanelRoot as ItemsWrapGrid;
+
+ if (itemsWrapGrid != null)
+ {
+ txtItemsPanelGroupPadding.Text = itemsWrapGrid.GroupPadding.ToString();
+ }
+ else
+ {
+ ItemsStackPanel itemsStackPanel = itemsControl.ItemsPanelRoot as ItemsStackPanel;
+
+ if (itemsStackPanel != null)
+ {
+ txtItemsPanelGroupPadding.Text = itemsStackPanel.GroupPadding.ToString();
+ }
+ }
+ }
+ }
+ catch (Exception ex)
+ {
+ txtExceptionReport.Text = ex.ToString();
+ AppendEventMessage(ex.ToString());
+ }
+ }
+
+ private void UpdateItemsPanelAreStickyGroupHeadersEnabled()
+ {
+ try
+ {
+ if (itemsControl != null && chkItemsPanelAreStickyGroupHeadersEnabled != null)
+ {
+ ItemsWrapGrid itemsWrapGrid = itemsControl.ItemsPanelRoot as ItemsWrapGrid;
+
+ if (itemsWrapGrid != null)
+ {
+ chkItemsPanelAreStickyGroupHeadersEnabled.IsChecked = itemsWrapGrid.AreStickyGroupHeadersEnabled;
+ }
+ else
+ {
+ ItemsStackPanel itemsStackPanel = itemsControl.ItemsPanelRoot as ItemsStackPanel;
+
+ if (itemsStackPanel != null)
+ {
+ chkItemsPanelAreStickyGroupHeadersEnabled.IsChecked = itemsStackPanel.AreStickyGroupHeadersEnabled;
+ }
+ }
+ }
+ }
+ catch (Exception ex)
+ {
+ txtExceptionReport.Text = ex.ToString();
+ AppendEventMessage(ex.ToString());
+ }
+ }
+
+ private void UpdateItemsWrapGridCacheLength()
+ {
+ try
+ {
+ if (itemsControl != null && txtItemsWrapGridCacheLength != null)
+ {
+ ItemsWrapGrid itemsWrapGrid = itemsControl.ItemsPanelRoot as ItemsWrapGrid;
+
+ if (itemsWrapGrid != null)
+ {
+ txtItemsWrapGridCacheLength.Text = itemsWrapGrid.CacheLength.ToString();
+ }
+ }
+ }
+ catch (Exception ex)
+ {
+ txtExceptionReport.Text = ex.ToString();
+ AppendEventMessage(ex.ToString());
+ }
+ }
+
+ private void UpdateItemsWrapGridItemWidth()
+ {
+ try
+ {
+ if (itemsControl != null && txtItemsWrapGridItemWidth != null)
+ {
+ ItemsWrapGrid itemsWrapGrid = itemsControl.ItemsPanelRoot as ItemsWrapGrid;
+
+ if (itemsWrapGrid != null)
+ {
+ txtItemsWrapGridItemWidth.Text = itemsWrapGrid.ItemWidth.ToString();
+ }
+ }
+ }
+ catch (Exception ex)
+ {
+ txtExceptionReport.Text = ex.ToString();
+ AppendEventMessage(ex.ToString());
+ }
+ }
+
+ private void UpdateItemsWrapGridItemHeight()
+ {
+ try
+ {
+ if (itemsControl != null && txtItemsWrapGridItemHeight != null)
+ {
+ ItemsWrapGrid itemsWrapGrid = itemsControl.ItemsPanelRoot as ItemsWrapGrid;
+
+ if (itemsWrapGrid != null)
+ {
+ txtItemsWrapGridItemHeight.Text = itemsWrapGrid.ItemHeight.ToString();
+ }
+ }
+ }
+ catch (Exception ex)
+ {
+ txtExceptionReport.Text = ex.ToString();
+ AppendEventMessage(ex.ToString());
+ }
+ }
+
+ private void BtnGetItemsControlTabNavigation_Click(object sender, RoutedEventArgs e)
+ {
+ UpdateItemsControlTabNavigation();
+ }
+
+ private void BtnSetItemsControlTabNavigation_Click(object sender, RoutedEventArgs e)
+ {
+ if (itemsControl != null && cmbItemsControlTabNavigation != null)
+ {
+ itemsControl.TabNavigation = (KeyboardNavigationMode)cmbItemsControlTabNavigation.SelectedIndex;
+ }
+ }
+
+ private void BtnGetItemsControlXYFocusKeyboardNavigation_Click(object sender, RoutedEventArgs e)
+ {
+ UpdateItemsControlXYFocusKeyboardNavigation();
+ }
+
+ private void BtnSetItemsControlXYFocusKeyboardNavigation_Click(object sender, RoutedEventArgs e)
+ {
+ if (itemsControl != null && cmbItemsControlXYFocusKeyboardNavigation != null)
+ {
+ itemsControl.XYFocusKeyboardNavigation = (XYFocusKeyboardNavigationMode)cmbItemsControlXYFocusKeyboardNavigation.SelectedIndex;
+ }
+ }
+
+ private void CmbItemsControlHeaderTemplate_SelectionChanged(object sender, SelectionChangedEventArgs e)
+ {
+ UpdateItemsControlHeaderTemplate();
+ }
+
+ private void CmbItemsControlItemTemplate_SelectionChanged(object sender, SelectionChangedEventArgs e)
+ {
+ UpdateItemsControlItemTemplate();
+ }
+
+ private void CmbItemsControlItemsPanelType_SelectionChanged(object sender, SelectionChangedEventArgs e)
+ {
+ UpdateItemsPanelType();
+ }
+
+ private void ChkItemsControlIsTabStop_IsCheckedChanged(object sender, RoutedEventArgs e)
+ {
+ if (itemsControl != null && chkItemsControlIsTabStop != null)
+ {
+ itemsControl.IsTabStop = (bool)chkItemsControlIsTabStop.IsChecked;
+ }
+ }
+
+ private void CmbItemsPresenterHeader_SelectionChanged(object sender, SelectionChangedEventArgs e)
+ {
+ try
+ {
+ if (itemsControl != null && cmbItemsPresenterHeader != null)
+ {
+ ItemsPresenter itemsPresenter = FindElementOfTypeInSubtree(itemsControl);
+
+ if (itemsPresenter != null)
+ {
+ switch (cmbItemsPresenterHeader.SelectedIndex)
+ {
+ case 0: /*None*/
+ itemsPresenter.Header = null;
+ break;
+ case 1: /*No TabStop*/
+ itemsPresenter.Header = new TextBlock()
+ {
+ FontSize = 22.0,
+ FontWeight = FontWeights.Bold,
+ Margin = new Thickness(10.0),
+ Text = "ItemsPresenter Header"
+ };
+ break;
+ case 2: /*Single TabStop*/
+ itemsPresenter.Header = new Button()
+ {
+ Content = "ItemsPresenter Header",
+ FontSize = 22.0,
+ Margin = new Thickness(10.0)
+ };
+ break;
+ case 3: /*Nested TabStops*/
+ itemsPresenter.Header = new Button()
+ {
+ Content = new Button()
+ {
+ Content = "ItemsPresenter Header",
+ Margin = new Thickness(10.0)
+ },
+ FontSize = 18.0,
+ Margin = new Thickness(10.0)
+ };
+ break;
+ }
+ }
+ }
+ }
+ catch (Exception ex)
+ {
+ txtExceptionReport.Text = ex.ToString();
+ AppendEventMessage(ex.ToString());
+ }
+ }
+
+ private void CmbItemsPresenterFooter_SelectionChanged(object sender, SelectionChangedEventArgs e)
+ {
+ try
+ {
+ if (itemsControl != null && cmbItemsPresenterFooter != null)
+ {
+ ItemsPresenter itemsPresenter = FindElementOfTypeInSubtree(itemsControl);
+
+ if (itemsPresenter != null)
+ {
+ switch (cmbItemsPresenterFooter.SelectedIndex)
+ {
+ case 0: /*None*/
+ itemsPresenter.Footer = null;
+ break;
+ case 1: /*No TabStop*/
+ itemsPresenter.Footer = new TextBlock()
+ {
+ FontSize = 22.0,
+ FontWeight = FontWeights.Bold,
+ Margin = new Thickness(10.0),
+ Text = "ItemsPresenter Footer"
+ };
+ break;
+ case 2: /*Single TabStop*/
+ itemsPresenter.Footer = new Button()
+ {
+ Content = "ItemsPresenter Footer",
+ FontSize = 22.0,
+ Margin = new Thickness(10.0)
+ };
+ break;
+ case 3: /*Nested TabStops*/
+ itemsPresenter.Footer = new Button()
+ {
+ Content = new Button()
+ {
+ Content = "ItemsPresenter Footer",
+ Margin = new Thickness(10.0)
+ },
+ FontSize = 18.0,
+ Margin = new Thickness(10.0)
+ };
+ break;
+ }
+ }
+ }
+ }
+ catch (Exception ex)
+ {
+ txtExceptionReport.Text = ex.ToString();
+ AppendEventMessage(ex.ToString());
+ }
+ }
+
+ private void ChkItemsPanelAreStickyGroupHeadersEnabled_IsCheckedChanged(object sender, RoutedEventArgs e)
+ {
+ try
+ {
+ if (itemsControl != null)
+ {
+ ItemsWrapGrid itemsWrapGrid = itemsControl.ItemsPanelRoot as ItemsWrapGrid;
+
+ if (itemsWrapGrid != null)
+ {
+ itemsWrapGrid.AreStickyGroupHeadersEnabled = (bool)chkItemsPanelAreStickyGroupHeadersEnabled.IsChecked;
+ }
+ else
+ {
+ ItemsStackPanel itemsStackPanel = itemsControl.ItemsPanelRoot as ItemsStackPanel;
+
+ if (itemsStackPanel != null)
+ {
+ itemsStackPanel.AreStickyGroupHeadersEnabled = (bool)chkItemsPanelAreStickyGroupHeadersEnabled.IsChecked;
+ }
+ }
+ }
+ }
+ catch (Exception ex)
+ {
+ txtExceptionReport.Text = ex.ToString();
+ AppendEventMessage(ex.ToString());
+ }
+ }
+
+ private void BtnGetItemsPanelOrientation_Click(object sender, RoutedEventArgs e)
+ {
+ UpdateItemsPanelOrientation();
+ }
+
+ private void BtnSetItemsPanelOrientation_Click(object sender, RoutedEventArgs e)
+ {
+ try
+ {
+ if (itemsControl != null && cmbItemsPanelOrientation != null)
+ {
+ ItemsWrapGrid itemsWrapGrid = itemsControl.ItemsPanelRoot as ItemsWrapGrid;
+
+ if (itemsWrapGrid != null)
+ {
+ if (itemsWrapGrid != null && itemsWrapGrid.Orientation != (Orientation)cmbItemsPanelOrientation.SelectedIndex)
+ {
+ itemsControl.ItemsSource = null;
+
+ itemsWrapGrid.Orientation = (Orientation)cmbItemsPanelOrientation.SelectedIndex;
+ }
+ }
+ else
+ {
+ ItemsStackPanel itemsStackPanel = itemsControl.ItemsPanelRoot as ItemsStackPanel;
+
+ if (itemsStackPanel != null)
+ {
+ if (itemsStackPanel != null && itemsStackPanel.Orientation != (Orientation)cmbItemsPanelOrientation.SelectedIndex)
+ {
+ itemsControl.ItemsSource = null;
+
+ itemsStackPanel.Orientation = (Orientation)cmbItemsPanelOrientation.SelectedIndex;
+ }
+ }
+ else
+ {
+ VirtualizingStackPanel virtualizingStackPanel = itemsControl.ItemsPanelRoot as VirtualizingStackPanel;
+
+ if (virtualizingStackPanel != null && virtualizingStackPanel.Orientation != (Orientation)cmbItemsPanelOrientation.SelectedIndex)
+ {
+ itemsControl.ItemsSource = null;
+
+ virtualizingStackPanel.Orientation = (Orientation)cmbItemsPanelOrientation.SelectedIndex;
+ }
+ }
+ }
+
+ if (itemsControl.ItemsSource != _cvs.View)
+ {
+ itemsControl.ItemsSource = _cvs.View;
+ }
+ }
+ }
+ catch (Exception ex)
+ {
+ txtExceptionReport.Text = ex.ToString();
+ AppendEventMessage(ex.ToString());
+ }
+ }
+
+ private void BtnGetItemsPanelGroupHeaderPlacement_Click(object sender, RoutedEventArgs e)
+ {
+ UpdateItemsPanelGroupHeaderPlacement();
+ }
+
+ private void BtnSetItemsPanelGroupHeaderPlacement_Click(object sender, RoutedEventArgs e)
+ {
+ try
+ {
+ if (itemsControl != null && cmbItemsPanelGroupHeaderPlacement != null)
+ {
+ ItemsWrapGrid itemsWrapGrid = itemsControl.ItemsPanelRoot as ItemsWrapGrid;
+
+ if (itemsWrapGrid != null)
+ {
+ itemsWrapGrid.GroupHeaderPlacement = (GroupHeaderPlacement)cmbItemsPanelGroupHeaderPlacement.SelectedIndex;
+ }
+ else
+ {
+ ItemsStackPanel itemsStackPanel = itemsControl.ItemsPanelRoot as ItemsStackPanel;
+
+ if (itemsStackPanel != null)
+ {
+ itemsStackPanel.GroupHeaderPlacement = (GroupHeaderPlacement)cmbItemsPanelGroupHeaderPlacement.SelectedIndex;
+ }
+ }
+ }
+ }
+ catch (Exception ex)
+ {
+ txtExceptionReport.Text = ex.ToString();
+ AppendEventMessage(ex.ToString());
+ }
+ }
+
+ private void BtnGetItemsPanelMargin_Click(object sender, RoutedEventArgs e)
+ {
+ UpdateItemsPanelMargin();
+ }
+
+ private void BtnSetItemsPanelMargin_Click(object sender, RoutedEventArgs e)
+ {
+ try
+ {
+ if (itemsControl != null && txtItemsPanelMargin != null)
+ {
+ Panel itemsPanel = itemsControl.ItemsPanelRoot;
+
+ if (itemsPanel != null)
+ {
+ itemsPanel.Margin = GetThicknessFromString(txtItemsPanelMargin.Text);
+ }
+ }
+ }
+ catch (Exception ex)
+ {
+ txtExceptionReport.Text = ex.ToString();
+ AppendEventMessage(ex.ToString());
+ }
+ }
+
+ private void BtnGetItemsPanelGroupPadding_Click(object sender, RoutedEventArgs e)
+ {
+ UpdateItemsPanelGroupPadding();
+ }
+
+ private void BtnSetItemsPanelGroupPadding_Click(object sender, RoutedEventArgs e)
+ {
+ try
+ {
+ if (itemsControl != null && txtItemsPanelGroupPadding != null)
+ {
+ ItemsWrapGrid itemsWrapGrid = itemsControl.ItemsPanelRoot as ItemsWrapGrid;
+
+ if (itemsWrapGrid != null)
+ {
+ itemsWrapGrid.GroupPadding = GetThicknessFromString(txtItemsPanelGroupPadding.Text);
+ }
+ else
+ {
+ ItemsStackPanel itemsStackPanel = itemsControl.ItemsPanelRoot as ItemsStackPanel;
+
+ if (itemsStackPanel != null)
+ {
+ itemsStackPanel.GroupPadding = GetThicknessFromString(txtItemsPanelGroupPadding.Text);
+ }
+ }
+ }
+ }
+ catch (Exception ex)
+ {
+ txtExceptionReport.Text = ex.ToString();
+ AppendEventMessage(ex.ToString());
+ }
+ }
+
+ private void BtnGetItemsWrapGridCacheLength_Click(object sender, RoutedEventArgs e)
+ {
+ UpdateItemsWrapGridCacheLength();
+ }
+
+ private void BtnSetItemsWrapGridCacheLength_Click(object sender, RoutedEventArgs e)
+ {
+ try
+ {
+ if (itemsControl != null && txtItemsWrapGridCacheLength != null)
+ {
+ ItemsWrapGrid itemsWrapGrid = itemsControl.ItemsPanelRoot as ItemsWrapGrid;
+
+ if (itemsWrapGrid != null)
+ {
+ itemsWrapGrid.CacheLength = double.Parse(txtItemsWrapGridCacheLength.Text);
+ }
+ }
+ }
+ catch (Exception ex)
+ {
+ txtExceptionReport.Text = ex.ToString();
+ AppendEventMessage(ex.ToString());
+ }
+ }
+
+ private void BtnGetItemsWrapGridItemWidth_Click(object sender, RoutedEventArgs e)
+ {
+ UpdateItemsWrapGridItemWidth();
+ }
+
+ private void BtnSetItemsWrapGridItemWidth_Click(object sender, RoutedEventArgs e)
+ {
+ try
+ {
+ if (itemsControl != null && txtItemsWrapGridItemWidth != null)
+ {
+ ItemsWrapGrid itemsWrapGrid = itemsControl.ItemsPanelRoot as ItemsWrapGrid;
+
+ if (itemsWrapGrid != null)
+ {
+ itemsWrapGrid.ItemWidth = double.Parse(txtItemsWrapGridItemWidth.Text);
+ }
+ }
+ }
+ catch (Exception ex)
+ {
+ txtExceptionReport.Text = ex.ToString();
+ AppendEventMessage(ex.ToString());
+ }
+ }
+
+ private void BtnGetItemsWrapGridItemHeight_Click(object sender, RoutedEventArgs e)
+ {
+ UpdateItemsWrapGridItemHeight();
+ }
+
+ private void BtnSetItemsWrapGridItemHeight_Click(object sender, RoutedEventArgs e)
+ {
+ try
+ {
+ if (itemsControl != null && txtItemsWrapGridItemHeight != null)
+ {
+ ItemsWrapGrid itemsWrapGrid = itemsControl.ItemsPanelRoot as ItemsWrapGrid;
+
+ if (itemsWrapGrid != null)
+ {
+ itemsWrapGrid.ItemHeight = double.Parse(txtItemsWrapGridItemHeight.Text);
+ }
+ }
+ }
+ catch (Exception ex)
+ {
+ txtExceptionReport.Text = ex.ToString();
+ AppendEventMessage(ex.ToString());
+ }
+ }
+
+ private void BtnResetItemsSource_Click(object sender, RoutedEventArgs e)
+ {
+ if (itemsControl != null && itemsControl.ItemsSource != null)
+ {
+ itemsControl.ItemsSource = null;
+ }
+ }
+
+ private void BtnSetItemsSource_Click(object sender, RoutedEventArgs e)
+ {
+ if (itemsControl != null && itemsControl.ItemsSource != _cvs.View)
+ {
+ itemsControl.ItemsSource = _cvs.View;
+ }
+ }
+
+ private void NbItemsWrapGridMaximumRowsOrColumns_ValueChanged(object sender, object e)
+ {
+ try
+ {
+ if (itemsControl != null && nbItemsWrapGridMaximumRowsOrColumns != null)
+ {
+ ItemsWrapGrid itemsWrapGrid = itemsControl.ItemsPanelRoot as ItemsWrapGrid;
+
+ if (itemsWrapGrid != null)
+ {
+ itemsWrapGrid.MaximumRowsOrColumns = (int)nbItemsWrapGridMaximumRowsOrColumns.Value;
+ }
+ }
+ }
+ catch (Exception ex)
+ {
+ txtExceptionReport.Text = ex.ToString();
+ AppendEventMessage(ex.ToString());
+ }
+ }
+
+ private void ChkProperties_Checked(object sender, RoutedEventArgs e)
+ {
+ if (svProperties != null)
+ svProperties.Visibility = Visibility.Visible;
+ }
+
+ private void ChkProperties_Unchecked(object sender, RoutedEventArgs e)
+ {
+ if (svProperties != null)
+ svProperties.Visibility = Visibility.Collapsed;
+ }
+
+ private void ChkDataSource_Checked(object sender, RoutedEventArgs e)
+ {
+ if (svDataSource != null)
+ svDataSource.Visibility = Visibility.Visible;
+ }
+
+ private void ChkDataSource_Unchecked(object sender, RoutedEventArgs e)
+ {
+ if (svDataSource != null)
+ svDataSource.Visibility = Visibility.Collapsed;
+ }
+
+ private void ChkLogs_Checked(object sender, RoutedEventArgs e)
+ {
+ if (grdLogs != null)
+ grdLogs.Visibility = Visibility.Visible;
+ }
+
+ private void ChkLogs_Unchecked(object sender, RoutedEventArgs e)
+ {
+ if (grdLogs != null)
+ grdLogs.Visibility = Visibility.Collapsed;
+ }
+
+ private void AppendEventMessage(string eventMessage)
+ {
+ lstLogs.Items.Add(eventMessage);
+ }
+
+ private void BtnClearExceptionReport_Click(object sender, RoutedEventArgs e)
+ {
+ txtExceptionReport.Text = string.Empty;
+ }
+
+ private void BtnClearLogs_Click(object sender, RoutedEventArgs e)
+ {
+ lstLogs.Items.Clear();
+ }
+
+ private Thickness GetThicknessFromString(string thickness)
+ {
+ string[] lengths = thickness.Split(',');
+ if (lengths.Length < 4)
+ return new Thickness(
+ Convert.ToDouble(lengths[0]));
+ else
+ return new Thickness(
+ Convert.ToDouble(lengths[0]), Convert.ToDouble(lengths[1]), Convert.ToDouble(lengths[2]), Convert.ToDouble(lengths[3]));
+ }
+
+ private static T FindElementOfTypeInSubtree(DependencyObject element) where T : DependencyObject
+ {
+ if (element == null)
+ return null;
+
+ if (element is T)
+ return (T)element;
+
+ int childrenCount = VisualTreeHelper.GetChildrenCount(element);
+ for (int i = 0; i < childrenCount; i++)
+ {
+ var result = FindElementOfTypeInSubtree(VisualTreeHelper.GetChild(element, i));
+ if (result != null)
+ return result;
+ }
+
+ return null;
+ }
+ }
+
+ public class GroupedItemsControlItem
+ {
+ public GroupedItemsControlItem() : this(">EmptyId<") { }
+
+ public GroupedItemsControlItem(string id)
+ {
+ Id = id;
+ }
+
+ public string Id
+ {
+ get;
+ set;
+ }
+ }
+
+ public class GroupedItemsControlGroupItem
+ {
+ public GroupedItemsControlGroupItem() : this(">EmptyName<") { }
+
+ public GroupedItemsControlGroupItem(string name)
+ {
+ Name = name;
+ Items = new ObservableCollection();
+ }
+
+ public string Name
+ {
+ get;
+ set;
+ }
+
+ public ObservableCollection Items
+ {
+ get;
+ set;
+ }
+ }
+
+ public class GroupedItemsControlViewModel
+ {
+ public GroupedItemsControlViewModel()
+ {
+ Items = new ObservableCollection();
+
+ GroupedItemsControlGroupItem groupA = new GroupedItemsControlGroupItem("Group A");
+ groupA.Items.Add(new GroupedItemsControlItem("idA1"));
+ groupA.Items.Add(new GroupedItemsControlItem("idA2"));
+ groupA.Items.Add(new GroupedItemsControlItem("idA3"));
+ groupA.Items.Add(new GroupedItemsControlItem("idA4"));
+ groupA.Items.Add(new GroupedItemsControlItem("idA5"));
+ groupA.Items.Add(new GroupedItemsControlItem("idA6"));
+ Items.Add(groupA);
+
+ GroupedItemsControlGroupItem groupB = new GroupedItemsControlGroupItem("Group B");
+ groupB.Items.Add(new GroupedItemsControlItem("idB1"));
+ groupB.Items.Add(new GroupedItemsControlItem("idB2"));
+ groupB.Items.Add(new GroupedItemsControlItem("idB3"));
+ groupB.Items.Add(new GroupedItemsControlItem("idB4"));
+ groupB.Items.Add(new GroupedItemsControlItem("idB5"));
+ groupB.Items.Add(new GroupedItemsControlItem("idB6"));
+ groupB.Items.Add(new GroupedItemsControlItem("idB7"));
+ groupB.Items.Add(new GroupedItemsControlItem("idB8"));
+ Items.Add(groupB);
+
+ GroupedItemsControlGroupItem groupC = new GroupedItemsControlGroupItem("Group C");
+ groupC.Items.Add(new GroupedItemsControlItem("idC1"));
+ groupC.Items.Add(new GroupedItemsControlItem("idC2"));
+ groupC.Items.Add(new GroupedItemsControlItem("idC3"));
+ groupC.Items.Add(new GroupedItemsControlItem("idC4"));
+ groupC.Items.Add(new GroupedItemsControlItem("idC5"));
+ groupC.Items.Add(new GroupedItemsControlItem("idC6"));
+ groupC.Items.Add(new GroupedItemsControlItem("idC7"));
+ groupC.Items.Add(new GroupedItemsControlItem("idC8"));
+ groupC.Items.Add(new GroupedItemsControlItem("idC9"));
+ Items.Add(groupC);
+
+ GroupedItemsControlGroupItem groupD = new GroupedItemsControlGroupItem("Group D");
+ groupD.Items.Add(new GroupedItemsControlItem("idD1"));
+ groupD.Items.Add(new GroupedItemsControlItem("idD2"));
+ groupD.Items.Add(new GroupedItemsControlItem("idD3"));
+ groupD.Items.Add(new GroupedItemsControlItem("idD4"));
+ groupD.Items.Add(new GroupedItemsControlItem("idD5"));
+ groupD.Items.Add(new GroupedItemsControlItem("idD6"));
+ Items.Add(groupD);
+
+ GroupedItemsControlGroupItem groupE = new GroupedItemsControlGroupItem("Group E");
+ groupE.Items.Add(new GroupedItemsControlItem("idE1"));
+ groupE.Items.Add(new GroupedItemsControlItem("idE2"));
+ groupE.Items.Add(new GroupedItemsControlItem("idE3"));
+ groupE.Items.Add(new GroupedItemsControlItem("idE4"));
+ groupE.Items.Add(new GroupedItemsControlItem("idE5"));
+ groupE.Items.Add(new GroupedItemsControlItem("idE6"));
+ groupE.Items.Add(new GroupedItemsControlItem("idE7"));
+ groupE.Items.Add(new GroupedItemsControlItem("idE8"));
+ groupE.Items.Add(new GroupedItemsControlItem("idE9"));
+ groupE.Items.Add(new GroupedItemsControlItem("idEA"));
+ groupE.Items.Add(new GroupedItemsControlItem("idEB"));
+ groupE.Items.Add(new GroupedItemsControlItem("idEC"));
+ groupE.Items.Add(new GroupedItemsControlItem("idED"));
+ groupE.Items.Add(new GroupedItemsControlItem("idEE"));
+ groupE.Items.Add(new GroupedItemsControlItem("idEF"));
+ Items.Add(groupE);
+
+ GroupedItemsControlGroupItem groupF = new GroupedItemsControlGroupItem("Group F");
+ groupF.Items.Add(new GroupedItemsControlItem("idF1"));
+ groupF.Items.Add(new GroupedItemsControlItem("idF2"));
+ groupF.Items.Add(new GroupedItemsControlItem("idF3"));
+ Items.Add(groupF);
+
+ GroupedItemsControlGroupItem groupG = new GroupedItemsControlGroupItem("Group G");
+ groupG.Items.Add(new GroupedItemsControlItem("idG1"));
+ groupG.Items.Add(new GroupedItemsControlItem("idG2"));
+ groupG.Items.Add(new GroupedItemsControlItem("idG3"));
+ groupG.Items.Add(new GroupedItemsControlItem("idG4"));
+ groupG.Items.Add(new GroupedItemsControlItem("idG5"));
+ groupG.Items.Add(new GroupedItemsControlItem("idG6"));
+ groupG.Items.Add(new GroupedItemsControlItem("idG7"));
+ groupG.Items.Add(new GroupedItemsControlItem("idG8"));
+ groupG.Items.Add(new GroupedItemsControlItem("idG9"));
+ groupG.Items.Add(new GroupedItemsControlItem("idGA"));
+ groupG.Items.Add(new GroupedItemsControlItem("idGB"));
+ groupG.Items.Add(new GroupedItemsControlItem("idGC"));
+ groupG.Items.Add(new GroupedItemsControlItem("idGD"));
+ groupG.Items.Add(new GroupedItemsControlItem("idGE"));
+ groupG.Items.Add(new GroupedItemsControlItem("idGF"));
+ groupG.Items.Add(new GroupedItemsControlItem("idGG"));
+ groupG.Items.Add(new GroupedItemsControlItem("idGH"));
+ groupG.Items.Add(new GroupedItemsControlItem("idGI"));
+ groupG.Items.Add(new GroupedItemsControlItem("idGJ"));
+ groupG.Items.Add(new GroupedItemsControlItem("idGK"));
+ groupG.Items.Add(new GroupedItemsControlItem("idGL"));
+ groupG.Items.Add(new GroupedItemsControlItem("idGM"));
+ groupG.Items.Add(new GroupedItemsControlItem("idGN"));
+ groupG.Items.Add(new GroupedItemsControlItem("idGO"));
+ Items.Add(groupG);
+
+ GroupedItemsControlGroupItem groupH = new GroupedItemsControlGroupItem("Group H");
+ groupH.Items.Add(new GroupedItemsControlItem("idH1"));
+ groupH.Items.Add(new GroupedItemsControlItem("idH2"));
+ groupH.Items.Add(new GroupedItemsControlItem("idH3"));
+ groupH.Items.Add(new GroupedItemsControlItem("idH4"));
+ groupH.Items.Add(new GroupedItemsControlItem("idH5"));
+ groupH.Items.Add(new GroupedItemsControlItem("idH6"));
+ groupH.Items.Add(new GroupedItemsControlItem("idH7"));
+ groupH.Items.Add(new GroupedItemsControlItem("idH8"));
+ groupH.Items.Add(new GroupedItemsControlItem("idH9"));
+ groupH.Items.Add(new GroupedItemsControlItem("idhA"));
+ groupH.Items.Add(new GroupedItemsControlItem("idHB"));
+ groupH.Items.Add(new GroupedItemsControlItem("idHC"));
+ groupH.Items.Add(new GroupedItemsControlItem("idHD"));
+ groupH.Items.Add(new GroupedItemsControlItem("idHE"));
+ groupH.Items.Add(new GroupedItemsControlItem("idHF"));
+ groupH.Items.Add(new GroupedItemsControlItem("idHG"));
+ groupH.Items.Add(new GroupedItemsControlItem("idHH"));
+ groupH.Items.Add(new GroupedItemsControlItem("idHI"));
+ groupH.Items.Add(new GroupedItemsControlItem("idHJ"));
+ groupH.Items.Add(new GroupedItemsControlItem("idHK"));
+ groupH.Items.Add(new GroupedItemsControlItem("idHL"));
+ groupH.Items.Add(new GroupedItemsControlItem("idHM"));
+ groupH.Items.Add(new GroupedItemsControlItem("idHN"));
+ groupH.Items.Add(new GroupedItemsControlItem("idHO"));
+ groupH.Items.Add(new GroupedItemsControlItem("idhP"));
+ groupH.Items.Add(new GroupedItemsControlItem("idHQ"));
+ groupH.Items.Add(new GroupedItemsControlItem("idHR"));
+ groupH.Items.Add(new GroupedItemsControlItem("idHS"));
+ groupH.Items.Add(new GroupedItemsControlItem("idHT"));
+ groupH.Items.Add(new GroupedItemsControlItem("idHU"));
+ groupH.Items.Add(new GroupedItemsControlItem("idHV"));
+ groupH.Items.Add(new GroupedItemsControlItem("idHW"));
+ groupH.Items.Add(new GroupedItemsControlItem("idHX"));
+ groupH.Items.Add(new GroupedItemsControlItem("idHY"));
+ groupH.Items.Add(new GroupedItemsControlItem("idHZ"));
+ Items.Add(groupH);
+
+ GroupedItemsControlGroupItem groupI = new GroupedItemsControlGroupItem("Group I");
+ groupI.Items.Add(new GroupedItemsControlItem("idI1"));
+ groupI.Items.Add(new GroupedItemsControlItem("idI2"));
+ groupI.Items.Add(new GroupedItemsControlItem("idI3"));
+ Items.Add(groupI);
+ }
+
+ public ObservableCollection Items
+ {
+ get;
+ set;
+ }
+ }
+}
diff --git a/controls/dev/CommonStyles/TestUI/ItemsControlPage.xaml b/controls/dev/CommonStyles/TestUI/ItemsControlPage.xaml
new file mode 100644
index 0000000000..dbe5174362
--- /dev/null
+++ b/controls/dev/CommonStyles/TestUI/ItemsControlPage.xaml
@@ -0,0 +1,16 @@
+
+
+
+
+ ItemsControl
+ Grouped ItemsControl
+ Nested ItemsControls
+
+
diff --git a/controls/dev/CommonStyles/TestUI/ItemsControlPage.xaml.cs b/controls/dev/CommonStyles/TestUI/ItemsControlPage.xaml.cs
new file mode 100644
index 0000000000..8f0b346b01
--- /dev/null
+++ b/controls/dev/CommonStyles/TestUI/ItemsControlPage.xaml.cs
@@ -0,0 +1,20 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License. See LICENSE in the project root for license information.
+
+using Microsoft.UI.Xaml.Controls;
+
+namespace MUXControlsTestApp
+{
+ [TopLevelTestPage(Name="ItemsControl", Icon="ListView.png")]
+ public sealed partial class ItemsControlPage : TestPage
+ {
+ public ItemsControlPage()
+ {
+ this.InitializeComponent();
+
+ navigateToFlatItemsControl.Click += delegate { Frame.NavigateWithoutAnimation(typeof(FlatItemsControlPage)); };
+ navigateToGroupedItemsControl.Click += delegate { Frame.NavigateWithoutAnimation(typeof(GroupedItemsControlPage)); };
+ navigateToNestedItemsControls.Click += delegate { Frame.NavigateWithoutAnimation(typeof(NestedItemsControlsPage)); };
+ }
+ }
+}
diff --git a/controls/dev/CommonStyles/TestUI/NestedGridViewsPage.xaml b/controls/dev/CommonStyles/TestUI/NestedGridViewsPage.xaml
index ae06b3ae87..001805e8af 100644
--- a/controls/dev/CommonStyles/TestUI/NestedGridViewsPage.xaml
+++ b/controls/dev/CommonStyles/TestUI/NestedGridViewsPage.xaml
@@ -9,6 +9,10 @@
mc:Ignorable="d"
Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
+
+
+
+
@@ -126,11 +130,15 @@
-
+
+
diff --git a/controls/dev/CommonStyles/TestUI/NestedGridViewsPage.xaml.cs b/controls/dev/CommonStyles/TestUI/NestedGridViewsPage.xaml.cs
index e6b72637af..c071bbf535 100644
--- a/controls/dev/CommonStyles/TestUI/NestedGridViewsPage.xaml.cs
+++ b/controls/dev/CommonStyles/TestUI/NestedGridViewsPage.xaml.cs
@@ -4,6 +4,7 @@
using System;
using Microsoft.UI.Xaml;
using Microsoft.UI.Xaml.Controls;
+using Microsoft.UI.Xaml.Data;
using Microsoft.UI.Xaml.Input;
namespace MUXControlsTestApp
@@ -94,4 +95,19 @@ private void BtnSetItemsStackPanelCacheLength_Click(object sender, RoutedEventAr
}
}
}
+
+ public class PrefixConverter : IValueConverter
+ {
+ public object Convert(object value, Type targetType, object parameter, string language)
+ {
+ string prefix = parameter as string;
+
+ return prefix + " " + (value as string);
+ }
+
+ public object ConvertBack(object value, Type targetType, object parameter, string language)
+ {
+ throw new NotImplementedException();
+ }
+ }
}
diff --git a/controls/dev/CommonStyles/TestUI/NestedItemsControlsPage.xaml b/controls/dev/CommonStyles/TestUI/NestedItemsControlsPage.xaml
new file mode 100644
index 0000000000..f7b867a303
--- /dev/null
+++ b/controls/dev/CommonStyles/TestUI/NestedItemsControlsPage.xaml
@@ -0,0 +1,422 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Local
+ Cycle
+ Once
+
+
+
+
+
+
+ Auto
+ Enabled
+ Disabled
+
+
+
+
+
+
+
+
+ None
+ No TabStop
+ Single TabStop
+ Nested TabStops
+
+
+
+
+
+
+ None
+ No TabStop
+ Single TabStop
+ Nested TabStops
+
+
+
+
+
+
+
+
+ outerItemsControl1
+ outerItemsControl2
+ outerItemsControl3
+ outerItemsControl4
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ one
+ two
+ three
+
+
+
+
+
+ First Nested ItemsControl
+ Second Nested ItemsControl
+ Third Nested ItemsControl
+ Fourth Nested ItemsControl
+ Fifth Nested ItemsControl
+ Sixth Nested ItemsControl
+ Seventh Nested ItemsControl
+ Eighth Nested ItemsControl
+ Ninth Nested ItemsControl
+ Tenth Nested ItemsControl
+ Eleventh Nested ItemsControl
+ Twelfth Nested ItemsControl
+ Thirteenth Nested ItemsControl
+ Fourteenth Nested ItemsControl
+ Fifteenth Nested ItemsControl
+ Sixteenth Nested ItemsControl
+ Seventeenth Nested ItemsControl
+ Eighteenth Nested ItemsControl
+ Nineteenth Nested ItemsControl
+ Twentieth Nested ItemsControl
+ Twenty-first Nested ItemsControl
+ Twenty-second Nested ItemsControl
+ Twenty-third Nested ItemsControl
+ Twenty-fourth Nested ItemsControl
+ Twenty-fifth Nested ItemsControl
+ Twenty-sixth Nested ItemsControl
+ Twenty-seventh Nested ItemsControl
+ Twenty-eighth Nested ItemsControl
+ Twenty-ninth Nested ItemsControl
+ Thirtieth Nested ItemsControl
+ Thirty-first Nested ItemsControl
+ Thirty-second Nested ItemsControl
+ Thirty-third Nested ItemsControl
+ Thirty-fourth Nested ItemsControl
+ Thirty-fifth Nested ItemsControl
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ one
+ two
+ three
+ four
+
+
+
+
+
+ First Nested ItemsControl
+ Second Nested ItemsControl
+ Third Nested ItemsControl
+ Fourth Nested ItemsControl
+ Fifth Nested ItemsControl
+ Sixth Nested ItemsControl
+ Seventh Nested ItemsControl
+ Eighth Nested ItemsControl
+ Ninth Nested ItemsControl
+ Tenth Nested ItemsControl
+ Eleventh Nested ItemsControl
+ Twelfth Nested ItemsControl
+ Thirteenth Nested ItemsControl
+ Fourteenth Nested ItemsControl
+ Fifteenth Nested ItemsControl
+ Sixteenth Nested ItemsControl
+ Seventeenth Nested ItemsControl
+ Eighteenth Nested ItemsControl
+ Nineteenth Nested ItemsControl
+ Twentieth Nested ItemsControl
+ Twenty-first Nested ItemsControl
+ Twenty-second Nested ItemsControl
+ Twenty-third Nested ItemsControl
+ Twenty-fourth Nested ItemsControl
+ Twenty-fifth Nested ItemsControl
+ Twenty-sixth Nested ItemsControl
+ Twenty-seventh Nested ItemsControl
+ Twenty-eighth Nested ItemsControl
+ Twenty-ninth Nested ItemsControl
+ Thirtieth Nested ItemsControl
+ Thirty-first Nested ItemsControl
+ Thirty-second Nested ItemsControl
+ Thirty-third Nested ItemsControl
+ Thirty-fourth Nested ItemsControl
+ Thirty-fifth Nested ItemsControl
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ one
+ two
+ three
+ four
+ five
+
+
+
+
+
+ First Nested ItemsControl
+ Second Nested ItemsControl
+ Third Nested ItemsControl
+ Fourth Nested ItemsControl
+ Fifth Nested ItemsControl
+ Sixth Nested ItemsControl
+ Seventh Nested ItemsControl
+ Eighth Nested ItemsControl
+ Ninth Nested ItemsControl
+ Tenth Nested ItemsControl
+ Eleventh Nested ItemsControl
+ Twelfth Nested ItemsControl
+ Thirteenth Nested ItemsControl
+ Fourteenth Nested ItemsControl
+ Fifteenth Nested ItemsControl
+ Sixteenth Nested ItemsControl
+ Seventeenth Nested ItemsControl
+ Eighteenth Nested ItemsControl
+ Nineteenth Nested ItemsControl
+ Twentieth Nested ItemsControl
+ Twenty-first Nested ItemsControl
+ Twenty-second Nested ItemsControl
+ Twenty-third Nested ItemsControl
+ Twenty-fourth Nested ItemsControl
+ Twenty-fifth Nested ItemsControl
+ Twenty-sixth Nested ItemsControl
+ Twenty-seventh Nested ItemsControl
+ Twenty-eighth Nested ItemsControl
+ Twenty-ninth Nested ItemsControl
+ Thirtieth Nested ItemsControl
+ Thirty-first Nested ItemsControl
+ Thirty-second Nested ItemsControl
+ Thirty-third Nested ItemsControl
+ Thirty-fourth Nested ItemsControl
+ Thirty-fifth Nested ItemsControl
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ one
+ two
+ three
+ four
+ five
+ six
+
+
+
+
+
+ First Nested ItemsControl
+ Second Nested ItemsControl
+ Third Nested ItemsControl
+ Fourth Nested ItemsControl
+ Fifth Nested ItemsControl
+ Sixth Nested ItemsControl
+ Seventh Nested ItemsControl
+ Eighth Nested ItemsControl
+ Ninth Nested ItemsControl
+ Tenth Nested ItemsControl
+ Eleventh Nested ItemsControl
+ Twelfth Nested ItemsControl
+ Thirteenth Nested ItemsControl
+ Fourteenth Nested ItemsControl
+ Fifteenth Nested ItemsControl
+ Sixteenth Nested ItemsControl
+ Seventeenth Nested ItemsControl
+ Eighteenth Nested ItemsControl
+ Nineteenth Nested ItemsControl
+ Twentieth Nested ItemsControl
+ Twenty-first Nested ItemsControl
+ Twenty-second Nested ItemsControl
+ Twenty-third Nested ItemsControl
+ Twenty-fourth Nested ItemsControl
+ Twenty-fifth Nested ItemsControl
+ Twenty-sixth Nested ItemsControl
+ Twenty-seventh Nested ItemsControl
+ Twenty-eighth Nested ItemsControl
+ Twenty-ninth Nested ItemsControl
+ Thirtieth Nested ItemsControl
+ Thirty-first Nested ItemsControl
+ Thirty-second Nested ItemsControl
+ Thirty-third Nested ItemsControl
+ Thirty-fourth Nested ItemsControl
+ Thirty-fifth Nested ItemsControl
+
+
+
+
+
+
diff --git a/controls/dev/CommonStyles/TestUI/NestedItemsControlsPage.xaml.cs b/controls/dev/CommonStyles/TestUI/NestedItemsControlsPage.xaml.cs
new file mode 100644
index 0000000000..3affd222df
--- /dev/null
+++ b/controls/dev/CommonStyles/TestUI/NestedItemsControlsPage.xaml.cs
@@ -0,0 +1,211 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License. See LICENSE in the project root for license information.
+
+using Microsoft.UI.Xaml;
+using Microsoft.UI.Xaml.Controls;
+using Microsoft.UI.Xaml.Input;
+using Microsoft.UI.Xaml.Media;
+
+namespace MUXControlsTestApp
+{
+ public sealed partial class NestedItemsControlsPage : TestPage
+ {
+ private ItemsControl _outerItemsControl = null;
+
+ public NestedItemsControlsPage()
+ {
+ this.InitializeComponent();
+
+ Loaded += NestedItemsControlsPage_Loaded;
+ }
+
+ private void UpdateOuterItemsControl()
+ {
+ if (cmbUseOuterItemsControl != null)
+ {
+ if (_outerItemsControl != null)
+ {
+ _outerItemsControl.Visibility = Visibility.Collapsed;
+ }
+
+ switch (cmbUseOuterItemsControl.SelectedIndex)
+ {
+ case 0:
+ {
+ _outerItemsControl = outerItemsControl1;
+ break;
+ }
+ case 1:
+ {
+ _outerItemsControl = outerItemsControl2;
+ break;
+ }
+ case 2:
+ {
+ _outerItemsControl = outerItemsControl3;
+ break;
+ }
+ case 3:
+ {
+ _outerItemsControl = outerItemsControl4;
+ break;
+ }
+ }
+
+ if (_outerItemsControl != null)
+ {
+ _outerItemsControl.Visibility = Visibility.Visible;
+
+ ChkOuterItemsControlIsTabStop_IsCheckedChanged(null, null);
+ CmbOuterItemsControlTabNavigation_SelectionChanged(null, null);
+ CmbOuterItemsControlXYFocusKeyboardNavigation_SelectionChanged(null, null);
+ }
+ }
+ }
+
+ private void NestedItemsControlsPage_Loaded(object sender, RoutedEventArgs e)
+ {
+ UpdateOuterItemsControl();
+ }
+
+ private void CmbUseOuterItemsControl_SelectionChanged(object sender, SelectionChangedEventArgs e)
+ {
+ UpdateOuterItemsControl();
+ }
+
+ private void ChkOuterItemsControlIsTabStop_IsCheckedChanged(object sender, RoutedEventArgs e)
+ {
+ if (_outerItemsControl != null && chkOuterItemsControlIsTabStop != null)
+ {
+ _outerItemsControl.IsTabStop = (bool)chkOuterItemsControlIsTabStop.IsChecked;
+ }
+ }
+
+ private void CmbOuterItemsControlTabNavigation_SelectionChanged(object sender, SelectionChangedEventArgs e)
+ {
+ if (_outerItemsControl != null && cmbOuterItemsControlTabNavigation != null)
+ {
+ _outerItemsControl.TabNavigation = (KeyboardNavigationMode)cmbOuterItemsControlTabNavigation.SelectedIndex;
+ }
+ }
+
+ private void CmbOuterItemsControlXYFocusKeyboardNavigation_SelectionChanged(object sender, SelectionChangedEventArgs e)
+ {
+ if (_outerItemsControl != null && cmbOuterItemsControlXYFocusKeyboardNavigation != null)
+ {
+ _outerItemsControl.XYFocusKeyboardNavigation = (XYFocusKeyboardNavigationMode)cmbOuterItemsControlXYFocusKeyboardNavigation.SelectedIndex;
+ }
+ }
+
+ private void CmbOuterItemsPresenterHeader_SelectionChanged(object sender, SelectionChangedEventArgs e)
+ {
+ if (_outerItemsControl != null && cmbOuterItemsPresenterHeader != null)
+ {
+ ItemsPresenter outerItemsPresenter = FindElementOfTypeInSubtree(_outerItemsControl);
+
+ if (outerItemsPresenter != null)
+ {
+ switch (cmbOuterItemsPresenterHeader.SelectedIndex)
+ {
+ case 0: /*None*/
+ outerItemsPresenter.Header = null;
+ break;
+ case 1: /*No TabStop*/
+ outerItemsPresenter.Header = new TextBlock()
+ {
+ FontSize = 18.0,
+ Margin = new Thickness(10.0),
+ Text = "ItemsPresenter Header"
+ };
+ break;
+ case 2: /*Single TabStop*/
+ outerItemsPresenter.Header = new Button()
+ {
+ Content = "ItemsPresenter Header",
+ FontSize = 18.0,
+ Margin = new Thickness(10.0)
+ };
+ break;
+ case 3: /*Nested TabStops*/
+ outerItemsPresenter.Header = new Button()
+ {
+ Content = new Button()
+ {
+ Content = "ItemsPresenter Header",
+ Margin = new Thickness(10.0)
+ },
+ FontSize = 18.0,
+ Margin = new Thickness(10.0)
+ };
+ break;
+ }
+ }
+ }
+ }
+
+ private void CmbOuterItemsPresenterFooter_SelectionChanged(object sender, SelectionChangedEventArgs e)
+ {
+ if (_outerItemsControl != null && cmbOuterItemsPresenterFooter != null)
+ {
+ ItemsPresenter outerItemsPresenter = FindElementOfTypeInSubtree(_outerItemsControl);
+
+ if (outerItemsPresenter != null)
+ {
+ switch (cmbOuterItemsPresenterFooter.SelectedIndex)
+ {
+ case 0: /*None*/
+ outerItemsPresenter.Footer = null;
+ break;
+ case 1: /*No TabStop*/
+ outerItemsPresenter.Footer = new TextBlock()
+ {
+ FontSize = 18.0,
+ Margin = new Thickness(10.0),
+ Text = "ItemsPresenter Footer"
+ };
+ break;
+ case 2: /*Single TabStop*/
+ outerItemsPresenter.Footer = new Button()
+ {
+ Content = "ItemsPresenter Footer",
+ FontSize = 18.0,
+ Margin = new Thickness(10.0)
+ };
+ break;
+ case 3: /*Nested TabStops*/
+ outerItemsPresenter.Footer = new Button()
+ {
+ Content = new Button()
+ {
+ Content = "ItemsPresenter Footer",
+ Margin = new Thickness(10.0)
+ },
+ FontSize = 18.0,
+ Margin = new Thickness(10.0)
+ };
+ break;
+ }
+ }
+ }
+ }
+
+ private static T FindElementOfTypeInSubtree(DependencyObject element) where T : DependencyObject
+ {
+ if (element == null)
+ return null;
+
+ if (element is T)
+ return (T)element;
+
+ int childrenCount = VisualTreeHelper.GetChildrenCount(element);
+ for (int i = 0; i < childrenCount; i++)
+ {
+ var result = FindElementOfTypeInSubtree(VisualTreeHelper.GetChild(element, i));
+ if (result != null)
+ return result;
+ }
+
+ return null;
+ }
+ }
+}
diff --git a/controls/dev/CommonStyles/TextBox_themeresources.xaml b/controls/dev/CommonStyles/TextBox_themeresources.xaml
index ba1bebf587..ad99bb5d1a 100644
--- a/controls/dev/CommonStyles/TextBox_themeresources.xaml
+++ b/controls/dev/CommonStyles/TextBox_themeresources.xaml
@@ -34,7 +34,7 @@
-
+
@@ -141,7 +141,7 @@
-
+
@@ -343,4 +343,4 @@
-
\ No newline at end of file
+
diff --git a/controls/dev/Generated/MapControl.properties.cpp b/controls/dev/Generated/MapControl.properties.cpp
new file mode 100644
index 0000000000..f34fb1c484
--- /dev/null
+++ b/controls/dev/Generated/MapControl.properties.cpp
@@ -0,0 +1,220 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License. See LICENSE in the project root for license information.
+
+// DO NOT EDIT! This file was generated by CustomTasks.DependencyPropertyCodeGen
+#include "pch.h"
+#include "common.h"
+#include "MapControl.h"
+
+namespace winrt::Microsoft::UI::Xaml::Controls
+{
+ CppWinRTActivatableClassWithDPFactory(MapControl)
+}
+
+#include "MapControl.g.cpp"
+
+GlobalDependencyProperty MapControlProperties::s_CenterProperty{ nullptr };
+GlobalDependencyProperty MapControlProperties::s_InteractiveControlsVisibleProperty{ nullptr };
+GlobalDependencyProperty MapControlProperties::s_LayersProperty{ nullptr };
+GlobalDependencyProperty MapControlProperties::s_MapServiceTokenProperty{ nullptr };
+GlobalDependencyProperty MapControlProperties::s_ZoomLevelProperty{ nullptr };
+
+MapControlProperties::MapControlProperties()
+ : m_mapElementClickEventSource{static_cast(this)}
+ , m_mapServiceErrorOccurredEventSource{static_cast(this)}
+{
+ EnsureProperties();
+}
+
+void MapControlProperties::EnsureProperties()
+{
+ if (!s_CenterProperty)
+ {
+ s_CenterProperty =
+ InitializeDependencyProperty(
+ L"Center",
+ winrt::name_of(),
+ winrt::name_of(),
+ false /* isAttached */,
+ ValueHelper::BoxedDefaultValue(),
+ winrt::PropertyChangedCallback(&OnCenterPropertyChanged));
+ }
+ if (!s_InteractiveControlsVisibleProperty)
+ {
+ s_InteractiveControlsVisibleProperty =
+ InitializeDependencyProperty(
+ L"InteractiveControlsVisible",
+ winrt::name_of(),
+ winrt::name_of(),
+ false /* isAttached */,
+ ValueHelper::BoxedDefaultValue(),
+ winrt::PropertyChangedCallback(&OnInteractiveControlsVisiblePropertyChanged));
+ }
+ if (!s_LayersProperty)
+ {
+ s_LayersProperty =
+ InitializeDependencyProperty(
+ L"Layers",
+ winrt::name_of>(),
+ winrt::name_of(),
+ false /* isAttached */,
+ ValueHelper>::BoxedDefaultValue(),
+ winrt::PropertyChangedCallback(&OnLayersPropertyChanged));
+ }
+ if (!s_MapServiceTokenProperty)
+ {
+ s_MapServiceTokenProperty =
+ InitializeDependencyProperty(
+ L"MapServiceToken",
+ winrt::name_of(),
+ winrt::name_of(),
+ false /* isAttached */,
+ ValueHelper::BoxedDefaultValue(),
+ winrt::PropertyChangedCallback(&OnMapServiceTokenPropertyChanged));
+ }
+ if (!s_ZoomLevelProperty)
+ {
+ s_ZoomLevelProperty =
+ InitializeDependencyProperty(
+ L"ZoomLevel",
+ winrt::name_of(),
+ winrt::name_of(),
+ false /* isAttached */,
+ ValueHelper::BoxedDefaultValue(),
+ winrt::PropertyChangedCallback(&OnZoomLevelPropertyChanged));
+ }
+}
+
+void MapControlProperties::ClearProperties()
+{
+ s_CenterProperty = nullptr;
+ s_InteractiveControlsVisibleProperty = nullptr;
+ s_LayersProperty = nullptr;
+ s_MapServiceTokenProperty = nullptr;
+ s_ZoomLevelProperty = nullptr;
+}
+
+void MapControlProperties::OnCenterPropertyChanged(
+ winrt::DependencyObject const& sender,
+ winrt::DependencyPropertyChangedEventArgs const& args)
+{
+ auto owner = sender.as();
+ winrt::get_self(owner)->OnPropertyChanged(args);
+}
+
+void MapControlProperties::OnInteractiveControlsVisiblePropertyChanged(
+ winrt::DependencyObject const& sender,
+ winrt::DependencyPropertyChangedEventArgs const& args)
+{
+ auto owner = sender.as();
+ winrt::get_self(owner)->OnPropertyChanged(args);
+}
+
+void MapControlProperties::OnLayersPropertyChanged(
+ winrt::DependencyObject const& sender,
+ winrt::DependencyPropertyChangedEventArgs const& args)
+{
+ auto owner = sender.as();
+ winrt::get_self(owner)->OnPropertyChanged(args);
+}
+
+void MapControlProperties::OnMapServiceTokenPropertyChanged(
+ winrt::DependencyObject const& sender,
+ winrt::DependencyPropertyChangedEventArgs const& args)
+{
+ auto owner = sender.as();
+ winrt::get_self(owner)->OnPropertyChanged(args);
+}
+
+void MapControlProperties::OnZoomLevelPropertyChanged(
+ winrt::DependencyObject const& sender,
+ winrt::DependencyPropertyChangedEventArgs const& args)
+{
+ auto owner = sender.as();
+ winrt::get_self(owner)->OnPropertyChanged(args);
+}
+
+void MapControlProperties::Center(winrt::Geopoint const& value)
+{
+ [[gsl::suppress(con)]]
+ {
+ static_cast(this)->SetValue(s_CenterProperty, ValueHelper::BoxValueIfNecessary(value));
+ }
+}
+
+winrt::Geopoint MapControlProperties::Center()
+{
+ return ValueHelper::CastOrUnbox(static_cast(this)->GetValue(s_CenterProperty));
+}
+
+void MapControlProperties::InteractiveControlsVisible(bool value)
+{
+ [[gsl::suppress(con)]]
+ {
+ static_cast(this)->SetValue(s_InteractiveControlsVisibleProperty, ValueHelper::BoxValueIfNecessary(value));
+ }
+}
+
+bool MapControlProperties::InteractiveControlsVisible()
+{
+ return ValueHelper::CastOrUnbox(static_cast(this)->GetValue(s_InteractiveControlsVisibleProperty));
+}
+
+void MapControlProperties::Layers(winrt::IVector const& value)
+{
+ [[gsl::suppress(con)]]
+ {
+ static_cast(this)->SetValue(s_LayersProperty, ValueHelper>::BoxValueIfNecessary(value));
+ }
+}
+
+winrt::IVector MapControlProperties::Layers()
+{
+ return ValueHelper>::CastOrUnbox(static_cast(this)->GetValue(s_LayersProperty));
+}
+
+void MapControlProperties::MapServiceToken(winrt::hstring const& value)
+{
+ [[gsl::suppress(con)]]
+ {
+ static_cast(this)->SetValue(s_MapServiceTokenProperty, ValueHelper::BoxValueIfNecessary(value));
+ }
+}
+
+winrt::hstring MapControlProperties::MapServiceToken()
+{
+ return ValueHelper::CastOrUnbox(static_cast(this)->GetValue(s_MapServiceTokenProperty));
+}
+
+void MapControlProperties::ZoomLevel(double value)
+{
+ [[gsl::suppress(con)]]
+ {
+ static_cast(this)->SetValue(s_ZoomLevelProperty, ValueHelper::BoxValueIfNecessary(value));
+ }
+}
+
+double MapControlProperties::ZoomLevel()
+{
+ return ValueHelper::CastOrUnbox(static_cast(this)->GetValue(s_ZoomLevelProperty));
+}
+
+winrt::event_token MapControlProperties::MapElementClick(winrt::TypedEventHandler const& value)
+{
+ return m_mapElementClickEventSource.add(value);
+}
+
+void MapControlProperties::MapElementClick(winrt::event_token const& token)
+{
+ m_mapElementClickEventSource.remove(token);
+}
+
+winrt::event_token MapControlProperties::MapServiceErrorOccurred(winrt::TypedEventHandler const& value)
+{
+ return m_mapServiceErrorOccurredEventSource.add(value);
+}
+
+void MapControlProperties::MapServiceErrorOccurred(winrt::event_token const& token)
+{
+ m_mapServiceErrorOccurredEventSource.remove(token);
+}
diff --git a/controls/dev/Generated/MapControl.properties.h b/controls/dev/Generated/MapControl.properties.h
new file mode 100644
index 0000000000..5dfc1a4300
--- /dev/null
+++ b/controls/dev/Generated/MapControl.properties.h
@@ -0,0 +1,69 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License. See LICENSE in the project root for license information.
+
+// DO NOT EDIT! This file was generated by CustomTasks.DependencyPropertyCodeGen
+#pragma once
+
+class MapControlProperties
+{
+public:
+ MapControlProperties();
+
+ void Center(winrt::Geopoint const& value);
+ winrt::Geopoint Center();
+
+ void InteractiveControlsVisible(bool value);
+ bool InteractiveControlsVisible();
+
+ void Layers(winrt::IVector const& value);
+ winrt::IVector Layers();
+
+ void MapServiceToken(winrt::hstring const& value);
+ winrt::hstring MapServiceToken();
+
+ void ZoomLevel(double value);
+ double ZoomLevel();
+
+ static winrt::DependencyProperty CenterProperty() { return s_CenterProperty; }
+ static winrt::DependencyProperty InteractiveControlsVisibleProperty() { return s_InteractiveControlsVisibleProperty; }
+ static winrt::DependencyProperty LayersProperty() { return s_LayersProperty; }
+ static winrt::DependencyProperty MapServiceTokenProperty() { return s_MapServiceTokenProperty; }
+ static winrt::DependencyProperty ZoomLevelProperty() { return s_ZoomLevelProperty; }
+
+ static GlobalDependencyProperty s_CenterProperty;
+ static GlobalDependencyProperty s_InteractiveControlsVisibleProperty;
+ static GlobalDependencyProperty s_LayersProperty;
+ static GlobalDependencyProperty s_MapServiceTokenProperty;
+ static GlobalDependencyProperty s_ZoomLevelProperty;
+
+ winrt::event_token MapElementClick(winrt::TypedEventHandler const& value);
+ void MapElementClick(winrt::event_token const& token);
+ winrt::event_token MapServiceErrorOccurred(winrt::TypedEventHandler const& value);
+ void MapServiceErrorOccurred(winrt::event_token const& token);
+
+ event_source> m_mapElementClickEventSource;
+ event_source> m_mapServiceErrorOccurredEventSource;
+
+ static void EnsureProperties();
+ static void ClearProperties();
+
+ static void OnCenterPropertyChanged(
+ winrt::DependencyObject const& sender,
+ winrt::DependencyPropertyChangedEventArgs const& args);
+
+ static void OnInteractiveControlsVisiblePropertyChanged(
+ winrt::DependencyObject const& sender,
+ winrt::DependencyPropertyChangedEventArgs const& args);
+
+ static void OnLayersPropertyChanged(
+ winrt::DependencyObject const& sender,
+ winrt::DependencyPropertyChangedEventArgs const& args);
+
+ static void OnMapServiceTokenPropertyChanged(
+ winrt::DependencyObject const& sender,
+ winrt::DependencyPropertyChangedEventArgs const& args);
+
+ static void OnZoomLevelPropertyChanged(
+ winrt::DependencyObject const& sender,
+ winrt::DependencyPropertyChangedEventArgs const& args);
+};
diff --git a/controls/dev/Generated/MapElement.properties.cpp b/controls/dev/Generated/MapElement.properties.cpp
new file mode 100644
index 0000000000..b6fd14f34b
--- /dev/null
+++ b/controls/dev/Generated/MapElement.properties.cpp
@@ -0,0 +1,16 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License. See LICENSE in the project root for license information.
+
+// DO NOT EDIT! This file was generated by CustomTasks.DependencyPropertyCodeGen
+#include "pch.h"
+#include "common.h"
+#include "MapElement.h"
+
+namespace winrt::Microsoft::UI::Xaml::Controls
+{
+ CppWinRTActivatableClassWithBasicFactory(MapElement)
+}
+
+#include "MapElement.g.cpp"
+
+
diff --git a/controls/dev/Generated/MapElementClickEventArgs.properties.cpp b/controls/dev/Generated/MapElementClickEventArgs.properties.cpp
new file mode 100644
index 0000000000..379ccb96b4
--- /dev/null
+++ b/controls/dev/Generated/MapElementClickEventArgs.properties.cpp
@@ -0,0 +1,16 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License. See LICENSE in the project root for license information.
+
+// DO NOT EDIT! This file was generated by CustomTasks.DependencyPropertyCodeGen
+#include "pch.h"
+#include "common.h"
+#include "MapElementClickEventArgs.h"
+
+namespace winrt::Microsoft::UI::Xaml::Controls
+{
+ CppWinRTActivatableClassWithBasicFactory(MapElementClickEventArgs)
+}
+
+#include "MapElementClickEventArgs.g.cpp"
+
+
diff --git a/controls/dev/Generated/MapElementsLayer.properties.cpp b/controls/dev/Generated/MapElementsLayer.properties.cpp
new file mode 100644
index 0000000000..8549fbb547
--- /dev/null
+++ b/controls/dev/Generated/MapElementsLayer.properties.cpp
@@ -0,0 +1,73 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License. See LICENSE in the project root for license information.
+
+// DO NOT EDIT! This file was generated by CustomTasks.DependencyPropertyCodeGen
+#include "pch.h"
+#include "common.h"
+#include "MapElementsLayer.h"
+
+namespace winrt::Microsoft::UI::Xaml::Controls
+{
+ CppWinRTActivatableClassWithDPFactory(MapElementsLayer)
+}
+
+#include "MapElementsLayer.g.cpp"
+
+GlobalDependencyProperty MapElementsLayerProperties::s_MapElementsProperty{ nullptr };
+
+MapElementsLayerProperties::MapElementsLayerProperties()
+ : m_mapElementClickEventSource{static_cast(this)}
+{
+ EnsureProperties();
+}
+
+void MapElementsLayerProperties::EnsureProperties()
+{
+ if (!s_MapElementsProperty)
+ {
+ s_MapElementsProperty =
+ InitializeDependencyProperty(
+ L"MapElements",
+ winrt::name_of>(),
+ winrt::name_of(),
+ false /* isAttached */,
+ ValueHelper>::BoxedDefaultValue(),
+ winrt::PropertyChangedCallback(&OnMapElementsPropertyChanged));
+ }
+}
+
+void MapElementsLayerProperties::ClearProperties()
+{
+ s_MapElementsProperty = nullptr;
+}
+
+void MapElementsLayerProperties::OnMapElementsPropertyChanged(
+ winrt::DependencyObject const& sender,
+ winrt::DependencyPropertyChangedEventArgs const& args)
+{
+ auto owner = sender.as();
+ winrt::get_self(owner)->OnPropertyChanged(args);
+}
+
+void MapElementsLayerProperties::MapElements(winrt::IVector const& value)
+{
+ [[gsl::suppress(con)]]
+ {
+ static_cast(this)->SetValue(s_MapElementsProperty, ValueHelper>::BoxValueIfNecessary(value));
+ }
+}
+
+winrt::IVector MapElementsLayerProperties::MapElements()
+{
+ return ValueHelper>::CastOrUnbox(static_cast(this)->GetValue(s_MapElementsProperty));
+}
+
+winrt::event_token MapElementsLayerProperties::MapElementClick(winrt::TypedEventHandler const& value)
+{
+ return m_mapElementClickEventSource.add(value);
+}
+
+void MapElementsLayerProperties::MapElementClick(winrt::event_token const& token)
+{
+ m_mapElementClickEventSource.remove(token);
+}
diff --git a/controls/dev/Generated/MapElementsLayer.properties.h b/controls/dev/Generated/MapElementsLayer.properties.h
new file mode 100644
index 0000000000..5b853ea7d0
--- /dev/null
+++ b/controls/dev/Generated/MapElementsLayer.properties.h
@@ -0,0 +1,30 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License. See LICENSE in the project root for license information.
+
+// DO NOT EDIT! This file was generated by CustomTasks.DependencyPropertyCodeGen
+#pragma once
+
+class MapElementsLayerProperties
+{
+public:
+ MapElementsLayerProperties();
+
+ void MapElements(winrt::IVector const& value);
+ winrt::IVector MapElements();
+
+ static winrt::DependencyProperty MapElementsProperty() { return s_MapElementsProperty; }
+
+ static GlobalDependencyProperty s_MapElementsProperty;
+
+ winrt::event_token MapElementClick(winrt::TypedEventHandler const& value);
+ void MapElementClick(winrt::event_token const& token);
+
+ event_source> m_mapElementClickEventSource;
+
+ static void EnsureProperties();
+ static void ClearProperties();
+
+ static void OnMapElementsPropertyChanged(
+ winrt::DependencyObject const& sender,
+ winrt::DependencyPropertyChangedEventArgs const& args);
+};
diff --git a/controls/dev/Generated/MapIcon.properties.cpp b/controls/dev/Generated/MapIcon.properties.cpp
new file mode 100644
index 0000000000..cec0013a39
--- /dev/null
+++ b/controls/dev/Generated/MapIcon.properties.cpp
@@ -0,0 +1,62 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License. See LICENSE in the project root for license information.
+
+// DO NOT EDIT! This file was generated by CustomTasks.DependencyPropertyCodeGen
+#include "pch.h"
+#include "common.h"
+#include "MapIcon.h"
+
+namespace winrt::Microsoft::UI::Xaml::Controls
+{
+ CppWinRTActivatableClassWithDPFactory(MapIcon)
+}
+
+#include "MapIcon.g.cpp"
+
+GlobalDependencyProperty MapIconProperties::s_LocationProperty{ nullptr };
+
+MapIconProperties::MapIconProperties()
+{
+ EnsureProperties();
+}
+
+void MapIconProperties::EnsureProperties()
+{
+ if (!s_LocationProperty)
+ {
+ s_LocationProperty =
+ InitializeDependencyProperty(
+ L"Location",
+ winrt::name_of(),
+ winrt::name_of(),
+ false /* isAttached */,
+ ValueHelper::BoxedDefaultValue(),
+ winrt::PropertyChangedCallback(&OnLocationPropertyChanged));
+ }
+}
+
+void MapIconProperties::ClearProperties()
+{
+ s_LocationProperty = nullptr;
+}
+
+void MapIconProperties::OnLocationPropertyChanged(
+ winrt::DependencyObject const& sender,
+ winrt::DependencyPropertyChangedEventArgs const& args)
+{
+ auto owner = sender.as();
+ winrt::get_self(owner)->OnPropertyChanged(args);
+}
+
+void MapIconProperties::Location(winrt::Geopoint const& value)
+{
+ [[gsl::suppress(con)]]
+ {
+ static_cast(this)->SetValue(s_LocationProperty, ValueHelper::BoxValueIfNecessary(value));
+ }
+}
+
+winrt::Geopoint MapIconProperties::Location()
+{
+ return ValueHelper::CastOrUnbox(static_cast(this)->GetValue(s_LocationProperty));
+}
diff --git a/controls/dev/Generated/MapIcon.properties.h b/controls/dev/Generated/MapIcon.properties.h
new file mode 100644
index 0000000000..92d908dc5e
--- /dev/null
+++ b/controls/dev/Generated/MapIcon.properties.h
@@ -0,0 +1,25 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License. See LICENSE in the project root for license information.
+
+// DO NOT EDIT! This file was generated by CustomTasks.DependencyPropertyCodeGen
+#pragma once
+
+class MapIconProperties
+{
+public:
+ MapIconProperties();
+
+ void Location(winrt::Geopoint const& value);
+ winrt::Geopoint Location();
+
+ static winrt::DependencyProperty LocationProperty() { return s_LocationProperty; }
+
+ static GlobalDependencyProperty s_LocationProperty;
+
+ static void EnsureProperties();
+ static void ClearProperties();
+
+ static void OnLocationPropertyChanged(
+ winrt::DependencyObject const& sender,
+ winrt::DependencyPropertyChangedEventArgs const& args);
+};
diff --git a/controls/dev/Generated/MapLayer.properties.cpp b/controls/dev/Generated/MapLayer.properties.cpp
new file mode 100644
index 0000000000..06a8f102b0
--- /dev/null
+++ b/controls/dev/Generated/MapLayer.properties.cpp
@@ -0,0 +1,16 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License. See LICENSE in the project root for license information.
+
+// DO NOT EDIT! This file was generated by CustomTasks.DependencyPropertyCodeGen
+#include "pch.h"
+#include "common.h"
+#include "MapLayer.h"
+
+namespace winrt::Microsoft::UI::Xaml::Controls
+{
+ CppWinRTActivatableClassWithBasicFactory(MapLayer)
+}
+
+#include "MapLayer.g.cpp"
+
+
diff --git a/controls/dev/Generated/SelectorBar.properties.cpp b/controls/dev/Generated/SelectorBar.properties.cpp
new file mode 100644
index 0000000000..4072e99bee
--- /dev/null
+++ b/controls/dev/Generated/SelectorBar.properties.cpp
@@ -0,0 +1,107 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License. See LICENSE in the project root for license information.
+
+// DO NOT EDIT! This file was generated by CustomTasks.DependencyPropertyCodeGen
+#include "pch.h"
+#include "common.h"
+#include "SelectorBar.h"
+
+namespace winrt::Microsoft::UI::Xaml::Controls
+{
+ CppWinRTActivatableClassWithDPFactory(SelectorBar)
+}
+
+#include "SelectorBar.g.cpp"
+
+GlobalDependencyProperty SelectorBarProperties::s_ItemsProperty{ nullptr };
+GlobalDependencyProperty SelectorBarProperties::s_SelectedItemProperty{ nullptr };
+
+SelectorBarProperties::SelectorBarProperties()
+ : m_selectionChangedEventSource{static_cast(this)}
+{
+ EnsureProperties();
+}
+
+void SelectorBarProperties::EnsureProperties()
+{
+ if (!s_ItemsProperty)
+ {
+ s_ItemsProperty =
+ InitializeDependencyProperty(
+ L"Items",
+ winrt::name_of>(),
+ winrt::name_of(),
+ false /* isAttached */,
+ ValueHelper>::BoxedDefaultValue(),
+ winrt::PropertyChangedCallback(&OnItemsPropertyChanged));
+ }
+ if (!s_SelectedItemProperty)
+ {
+ s_SelectedItemProperty =
+ InitializeDependencyProperty(
+ L"SelectedItem",
+ winrt::name_of(),
+ winrt::name_of(),
+ false /* isAttached */,
+ ValueHelper::BoxedDefaultValue(),
+ winrt::PropertyChangedCallback(&OnSelectedItemPropertyChanged));
+ }
+}
+
+void SelectorBarProperties::ClearProperties()
+{
+ s_ItemsProperty = nullptr;
+ s_SelectedItemProperty = nullptr;
+}
+
+void SelectorBarProperties::OnItemsPropertyChanged(
+ winrt::DependencyObject const& sender,
+ winrt::DependencyPropertyChangedEventArgs const& args)
+{
+ auto owner = sender.as();
+ winrt::get_self(owner)->OnPropertyChanged(args);
+}
+
+void SelectorBarProperties::OnSelectedItemPropertyChanged(
+ winrt::DependencyObject const& sender,
+ winrt::DependencyPropertyChangedEventArgs const& args)
+{
+ auto owner = sender.as();
+ winrt::get_self(owner)->OnPropertyChanged(args);
+}
+
+void SelectorBarProperties::Items(winrt::IVector const& value)
+{
+ [[gsl::suppress(con)]]
+ {
+ static_cast(this)->SetValue(s_ItemsProperty, ValueHelper>::BoxValueIfNecessary(value));
+ }
+}
+
+winrt::IVector SelectorBarProperties::Items()
+{
+ return ValueHelper>::CastOrUnbox(static_cast(this)->GetValue(s_ItemsProperty));
+}
+
+void SelectorBarProperties::SelectedItem(winrt::SelectorBarItem const& value)
+{
+ [[gsl::suppress(con)]]
+ {
+ static_cast(this)->SetValue(s_SelectedItemProperty, ValueHelper::BoxValueIfNecessary(value));
+ }
+}
+
+winrt::SelectorBarItem SelectorBarProperties::SelectedItem()
+{
+ return ValueHelper::CastOrUnbox(static_cast(this)->GetValue(s_SelectedItemProperty));
+}
+
+winrt::event_token SelectorBarProperties::SelectionChanged(winrt::TypedEventHandler const& value)
+{
+ return m_selectionChangedEventSource.add(value);
+}
+
+void SelectorBarProperties::SelectionChanged(winrt::event_token const& token)
+{
+ m_selectionChangedEventSource.remove(token);
+}
diff --git a/controls/dev/Generated/SelectorBar.properties.h b/controls/dev/Generated/SelectorBar.properties.h
new file mode 100644
index 0000000000..ad5b6999f8
--- /dev/null
+++ b/controls/dev/Generated/SelectorBar.properties.h
@@ -0,0 +1,39 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License. See LICENSE in the project root for license information.
+
+// DO NOT EDIT! This file was generated by CustomTasks.DependencyPropertyCodeGen
+#pragma once
+
+class SelectorBarProperties
+{
+public:
+ SelectorBarProperties();
+
+ void Items(winrt::IVector const& value);
+ winrt::IVector Items();
+
+ void SelectedItem(winrt::SelectorBarItem const& value);
+ winrt::SelectorBarItem SelectedItem();
+
+ static winrt::DependencyProperty ItemsProperty() { return s_ItemsProperty; }
+ static winrt::DependencyProperty SelectedItemProperty() { return s_SelectedItemProperty; }
+
+ static GlobalDependencyProperty s_ItemsProperty;
+ static GlobalDependencyProperty s_SelectedItemProperty;
+
+ winrt::event_token SelectionChanged(winrt::TypedEventHandler const& value);
+ void SelectionChanged(winrt::event_token const& token);
+
+ event_source> m_selectionChangedEventSource;
+
+ static void EnsureProperties();
+ static void ClearProperties();
+
+ static void OnItemsPropertyChanged(
+ winrt::DependencyObject const& sender,
+ winrt::DependencyPropertyChangedEventArgs const& args);
+
+ static void OnSelectedItemPropertyChanged(
+ winrt::DependencyObject const& sender,
+ winrt::DependencyPropertyChangedEventArgs const& args);
+};
diff --git a/controls/dev/Generated/SelectorBarItem.properties.cpp b/controls/dev/Generated/SelectorBarItem.properties.cpp
new file mode 100644
index 0000000000..7bba12c1c6
--- /dev/null
+++ b/controls/dev/Generated/SelectorBarItem.properties.cpp
@@ -0,0 +1,98 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License. See LICENSE in the project root for license information.
+
+// DO NOT EDIT! This file was generated by CustomTasks.DependencyPropertyCodeGen
+#include "pch.h"
+#include "common.h"
+#include "SelectorBarItem.h"
+
+namespace winrt::Microsoft::UI::Xaml::Controls
+{
+ CppWinRTActivatableClassWithDPFactory(SelectorBarItem)
+}
+
+#include "SelectorBarItem.g.cpp"
+
+GlobalDependencyProperty SelectorBarItemProperties::s_IconProperty{ nullptr };
+GlobalDependencyProperty SelectorBarItemProperties::s_TextProperty{ nullptr };
+
+SelectorBarItemProperties::SelectorBarItemProperties()
+{
+ EnsureProperties();
+}
+
+void SelectorBarItemProperties::EnsureProperties()
+{
+ ItemContainer::EnsureProperties();
+ if (!s_IconProperty)
+ {
+ s_IconProperty =
+ InitializeDependencyProperty(
+ L"Icon",
+ winrt::name_of(),
+ winrt::name_of(),
+ false /* isAttached */,
+ ValueHelper::BoxedDefaultValue(),
+ winrt::PropertyChangedCallback(&OnIconPropertyChanged));
+ }
+ if (!s_TextProperty)
+ {
+ s_TextProperty =
+ InitializeDependencyProperty(
+ L"Text",
+ winrt::name_of(),
+ winrt::name_of(),
+ false /* isAttached */,
+ ValueHelper::BoxedDefaultValue(),
+ winrt::PropertyChangedCallback(&OnTextPropertyChanged));
+ }
+}
+
+void SelectorBarItemProperties::ClearProperties()
+{
+ s_IconProperty = nullptr;
+ s_TextProperty = nullptr;
+ ItemContainer::ClearProperties();
+}
+
+void SelectorBarItemProperties::OnIconPropertyChanged(
+ winrt::DependencyObject const& sender,
+ winrt::DependencyPropertyChangedEventArgs const& args)
+{
+ auto owner = sender.as();
+ winrt::get_self(owner)->OnPropertyChanged(args);
+}
+
+void SelectorBarItemProperties::OnTextPropertyChanged(
+ winrt::DependencyObject const& sender,
+ winrt::DependencyPropertyChangedEventArgs const& args)
+{
+ auto owner = sender.as();
+ winrt::get_self(owner)->OnPropertyChanged(args);
+}
+
+void SelectorBarItemProperties::Icon(winrt::IconElement const& value)
+{
+ [[gsl::suppress(con)]]
+ {
+ static_cast(this)->SetValue(s_IconProperty, ValueHelper::BoxValueIfNecessary(value));
+ }
+}
+
+winrt::IconElement SelectorBarItemProperties::Icon()
+{
+ return ValueHelper::CastOrUnbox(static_cast(this)->GetValue(s_IconProperty));
+}
+
+void SelectorBarItemProperties::Text(winrt::hstring const& value)
+{
+ [[gsl::suppress(con)]]
+ {
+ static_cast(this)->SetValue(s_TextProperty, ValueHelper::BoxValueIfNecessary(value));
+ }
+}
+
+winrt::hstring SelectorBarItemProperties::Text()
+{
+ return ValueHelper::CastOrUnbox(static_cast(this)->GetValue(s_TextProperty));
+}
diff --git a/controls/dev/Generated/SelectorBarItem.properties.h b/controls/dev/Generated/SelectorBarItem.properties.h
new file mode 100644
index 0000000000..c4821e005d
--- /dev/null
+++ b/controls/dev/Generated/SelectorBarItem.properties.h
@@ -0,0 +1,34 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License. See LICENSE in the project root for license information.
+
+// DO NOT EDIT! This file was generated by CustomTasks.DependencyPropertyCodeGen
+#pragma once
+
+class SelectorBarItemProperties
+{
+public:
+ SelectorBarItemProperties();
+
+ void Icon(winrt::IconElement const& value);
+ winrt::IconElement Icon();
+
+ void Text(winrt::hstring const& value);
+ winrt::hstring Text();
+
+ static winrt::DependencyProperty IconProperty() { return s_IconProperty; }
+ static winrt::DependencyProperty TextProperty() { return s_TextProperty; }
+
+ static GlobalDependencyProperty s_IconProperty;
+ static GlobalDependencyProperty s_TextProperty;
+
+ static void EnsureProperties();
+ static void ClearProperties();
+
+ static void OnIconPropertyChanged(
+ winrt::DependencyObject const& sender,
+ winrt::DependencyPropertyChangedEventArgs const& args);
+
+ static void OnTextPropertyChanged(
+ winrt::DependencyObject const& sender,
+ winrt::DependencyPropertyChangedEventArgs const& args);
+};
diff --git a/controls/dev/Generated/SelectorBarItemAutomationPeer.properties.cpp b/controls/dev/Generated/SelectorBarItemAutomationPeer.properties.cpp
new file mode 100644
index 0000000000..bc29854f7c
--- /dev/null
+++ b/controls/dev/Generated/SelectorBarItemAutomationPeer.properties.cpp
@@ -0,0 +1,16 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License. See LICENSE in the project root for license information.
+
+// DO NOT EDIT! This file was generated by CustomTasks.DependencyPropertyCodeGen
+#include "pch.h"
+#include "common.h"
+#include "SelectorBarItemAutomationPeer.h"
+
+namespace winrt::Microsoft::UI::Xaml::Automation::Peers
+{
+ CppWinRTActivatableClassWithBasicFactory(SelectorBarItemAutomationPeer)
+}
+
+#include "SelectorBarItemAutomationPeer.g.cpp"
+
+
diff --git a/controls/dev/Generated/SelectorBarTestHooks.properties.cpp b/controls/dev/Generated/SelectorBarTestHooks.properties.cpp
new file mode 100644
index 0000000000..f991405ebc
--- /dev/null
+++ b/controls/dev/Generated/SelectorBarTestHooks.properties.cpp
@@ -0,0 +1,16 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License. See LICENSE in the project root for license information.
+
+// DO NOT EDIT! This file was generated by CustomTasks.DependencyPropertyCodeGen
+#include "pch.h"
+#include "common.h"
+#include "SelectorBarTestHooks.h"
+
+namespace winrt::Microsoft::UI::Private::Controls
+{
+ CppWinRTActivatableClassWithBasicFactory(SelectorBarTestHooks)
+}
+
+#include "SelectorBarTestHooks.g.cpp"
+
+
diff --git a/controls/dev/ItemContainer/InteractionTests/ItemContainerTests.cs b/controls/dev/ItemContainer/InteractionTests/ItemContainerTests.cs
index 99a89e1851..537b3c44bc 100644
--- a/controls/dev/ItemContainer/InteractionTests/ItemContainerTests.cs
+++ b/controls/dev/ItemContainer/InteractionTests/ItemContainerTests.cs
@@ -38,12 +38,6 @@ public void TestCleanup()
TestCleanupHelper.Cleanup();
}
- [TestMethod]
- public void BasicTest()
- {
- Log.Comment("ItemContainer Basic Test");
- }
-
#if MUX_PRERELEASE
[TestMethod]
[TestProperty("Description", "Verify ItemInvoked via mouse")]
@@ -150,7 +144,7 @@ private string IsItemContainerSelected()
Log.Comment("Retrieving IsSelectedTextBlock");
Edit isSelectedTextBlock = new Edit(FindElement.ById("IsSelectedTextBlock"));
- Verify.IsNotNull(btnGetIsSelected, "Verifying that IsSelectedTextBlock was found");
+ Verify.IsNotNull(isSelectedTextBlock, "Verifying that IsSelectedTextBlock was found");
btnGetIsSelected.Invoke();
Wait.ForIdle();
diff --git a/controls/dev/ItemContainer/ItemContainer.cpp b/controls/dev/ItemContainer/ItemContainer.cpp
index 13dc93c103..7ce8e03520 100644
--- a/controls/dev/ItemContainer/ItemContainer.cpp
+++ b/controls/dev/ItemContainer/ItemContainer.cpp
@@ -59,11 +59,11 @@ void ItemContainer::OnApplyTemplate()
// If the Child property is already set, add it to the tree. After this point, the
// property changed event for Child property will add it to the tree.
- if (Child() != nullptr)
+ if (const auto& child = Child())
{
if (auto&& rootPanel = m_rootPanel.get())
{
- rootPanel.Children().InsertAt(0, Child());
+ rootPanel.Children().InsertAt(0, child);
}
}
@@ -183,6 +183,7 @@ void ItemContainer::UpdateVisualState(bool useTransitions)
if (!IsEnabled())
{
GoToState(s_disabledStateName, useTransitions);
+ GoToState(IsSelected() ? s_selectedNormalStateName : s_unselectedNormalStateName, useTransitions);
}
else
{
diff --git a/controls/dev/ItemContainer/ItemContainer.h b/controls/dev/ItemContainer/ItemContainer.h
index b613b0f1e2..6f4d61982b 100644
--- a/controls/dev/ItemContainer/ItemContainer.h
+++ b/controls/dev/ItemContainer/ItemContainer.h
@@ -18,10 +18,10 @@ class ItemContainer :
~ItemContainer();
// IFrameworkElement
- void OnApplyTemplate();
+ virtual void OnApplyTemplate();
// IUIElement
- winrt::AutomationPeer OnCreateAutomationPeer();
+ virtual winrt::AutomationPeer OnCreateAutomationPeer();
void OnDoubleTapped(winrt::DoubleTappedRoutedEventArgs const& args);
void OnKeyDown(winrt::KeyRoutedEventArgs const& args);
diff --git a/controls/dev/ItemContainer/ItemContainerAutomationPeer.h b/controls/dev/ItemContainer/ItemContainerAutomationPeer.h
index 980713a989..d7cca0cd3f 100644
--- a/controls/dev/ItemContainer/ItemContainerAutomationPeer.h
+++ b/controls/dev/ItemContainer/ItemContainerAutomationPeer.h
@@ -9,16 +9,15 @@
class ItemContainerAutomationPeer :
public ReferenceTracker
{
-
public:
ItemContainerAutomationPeer(winrt::FrameworkElement const& owner);
// IAutomationPeerOverrides
- winrt::hstring GetNameCore();
+ virtual winrt::hstring GetNameCore();
winrt::IInspectable GetPatternCore(winrt::PatternInterface const& patternInterface);
winrt::AutomationControlType GetAutomationControlTypeCore();
- winrt::hstring GetLocalizedControlTypeCore();
- winrt::hstring GetClassNameCore();
+ virtual winrt::hstring GetLocalizedControlTypeCore();
+ virtual winrt::hstring GetClassNameCore();
// IInvokeProvider
void Invoke();
diff --git a/controls/dev/ItemContainer/ItemContainerTrace.h b/controls/dev/ItemContainer/ItemContainerTrace.h
index 752550cfb4..3cb75ff301 100644
--- a/controls/dev/ItemContainer/ItemContainerTrace.h
+++ b/controls/dev/ItemContainer/ItemContainerTrace.h
@@ -4,7 +4,7 @@
#pragma once
#include "common.h"
-#include "TraceLogging.h"
+#include "MuxcTraceLogging.h"
#include "Utils.h"
#include "MUXControlsTestHooks.h"
@@ -87,7 +87,7 @@ class ItemContainerTrace
if (includeTraceLogging)
{
// TraceViewers
- // http://toolbox/pef
+ // http://toolbox/pef
// http://fastetw/index.aspx
TraceLoggingWrite(
g_hLoggingProvider,
@@ -123,7 +123,7 @@ class ItemContainerTrace
if (includeTraceLogging)
{
// TraceViewers
- // http://toolbox/pef
+ // http://toolbox/pef
// http://fastetw/index.aspx
TraceLoggingWrite(
g_hLoggingProvider,
@@ -152,7 +152,7 @@ class ItemContainerTrace
static void TracePerfInfo(PCWSTR info) noexcept
{
// TraceViewers
- // http://toolbox/pef
+ // http://toolbox/pef
// http://fastetw/index.aspx
TraceLoggingWrite(
g_hPerfProvider,
diff --git a/controls/dev/ItemsView/APITests/ItemsViewTests.cs b/controls/dev/ItemsView/APITests/ItemsViewTests.cs
index 7325d2d451..3bd9d52b75 100644
--- a/controls/dev/ItemsView/APITests/ItemsViewTests.cs
+++ b/controls/dev/ItemsView/APITests/ItemsViewTests.cs
@@ -119,7 +119,7 @@ public void VerifyPropertyValuesAfterTemplateApplication()
Verify.AreEqual(c_defaultUIItemsViewWidth, itemsView.ActualWidth);
Verify.AreEqual(c_defaultUIItemsViewHeight, itemsView.ActualHeight);
- Log.Comment("Verifying ItemsView property values after Loaded event");
+ Log.Comment("Verifying ScrollView property values after Loaded event");
ScrollView scrollView = ItemsViewTestHooks.GetScrollViewPart(itemsView);
Verify.IsNotNull(scrollView);
@@ -287,6 +287,61 @@ public void VerifyPropertySetters()
}
}
+ [TestMethod]
+ [TestProperty("Description", "Loads and populates an ItemsView with an ItemsSource made of ItemContainers.")]
+ public void CanUseItemsSourceWithItemContainers()
+ {
+ using (PrivateLoggingHelper privateIVLoggingHelper = new PrivateLoggingHelper("ItemsView"))
+ {
+ ItemsView itemsView = null;
+ List itemsSource = new List();
+ AutoResetEvent itemsViewLoadedEvent = new AutoResetEvent(false);
+
+ RunOnUIThread.Execute(() =>
+ {
+ for (int i = 0; i < 3; i++)
+ {
+ ItemContainer itemContainer = new ItemContainer()
+ {
+ Name = "itemContainer" + i.ToString(),
+ Child = new TextBlock()
+ {
+ Text = i.ToString()
+ }
+ };
+ itemsSource.Add(itemContainer);
+ }
+
+ itemsView = new ItemsView() { ItemsSource = itemsSource };
+ SetupDefaultUI(itemsView, itemsViewLoadedEvent);
+ });
+
+ WaitForEvent("Waiting for Loaded event", itemsViewLoadedEvent);
+ IdleSynchronizer.Wait();
+
+ RunOnUIThread.Execute(() =>
+ {
+ Log.Comment("Logging ItemsView property values after Loaded event");
+ LogItemsViewProperties(itemsView);
+
+ Log.Comment("Accessing inner ItemsRepeater");
+ ItemsRepeater itemsRepeater = ItemsViewTestHooks.GetItemsRepeaterPart(itemsView);
+ Verify.IsNotNull(itemsRepeater);
+
+ Log.Comment("Verifying ItemsRepeater children count");
+ int childrenCount = VisualTreeHelper.GetChildrenCount(itemsRepeater);
+ Verify.AreEqual(3, childrenCount);
+
+ Log.Comment($"Extracting first ItemContainer, children count: {childrenCount}");
+ ItemContainer itemContainer = itemsRepeater.FindVisualChildByType();
+ Verify.IsNotNull(itemContainer);
+
+ Log.Comment("Verifying ItemsContainer name");
+ Verify.AreEqual("itemContainer0", itemContainer.Name);
+ });
+ }
+ }
+
[TestMethod]
[TestProperty("Description", "Loads and populates an ItemsView, changes SelectionMode property to all enum values.")]
public void CanChangeSelectionModeProperty()
diff --git a/controls/dev/ItemsView/InteractionTests/ItemsViewTestsWithInputHelper.cs b/controls/dev/ItemsView/InteractionTests/ItemsViewTestsWithInputHelper.cs
index 0396f03d86..f57299cf9b 100644
--- a/controls/dev/ItemsView/InteractionTests/ItemsViewTestsWithInputHelper.cs
+++ b/controls/dev/ItemsView/InteractionTests/ItemsViewTestsWithInputHelper.cs
@@ -27,6 +27,7 @@ public class ItemsViewTestsWithInputHelper
[TestProperty("RunAs", "User")]
[TestProperty("Classification", "Integration")]
[TestProperty("TestPass:IncludeOnlyOn", "Desktop")]
+ [TestProperty("IsolationLevel", "Method")]
public static void ClassInitialize(TestContext testContext)
{
TestEnvironment.Initialize(testContext);
@@ -761,8 +762,8 @@ public void BringFocusedItemIntoView()
Button btnClearLogs = new Button(FindElement.ById("btnClearLogs"));
Verify.IsNotNull(btnClearLogs, "Verifying that btnClearLogs was found");
- Log.Comment("Clicking center of btnClearLogs.");
- btnClearLogs.Click();
+ Log.Comment("Invoke btnClearLogs.");
+ btnClearLogs.Invoke();
Wait.ForIdle();
LogAndClearTraces();
@@ -1516,8 +1517,8 @@ private void StartBringItemIntoView(bool clearItemAspectRatios)
Button btnClearLogs = new Button(FindElement.ById("btnClearLogs"));
Verify.IsNotNull(btnClearLogs, "Verifying that btnClearLogs was found");
- Log.Comment("Clicking center of btnClearLogs.");
- btnClearLogs.Click();
+ Log.Comment("Invoking btnClearLogs.");
+ btnClearLogs.Invoke();
Wait.ForIdle();
LogAndClearTraces();
@@ -2647,18 +2648,35 @@ private void LogScrollViewInfo(UIObject itemsViewUIObject, double? expectedVerti
if (getScrollViewView == true)
{
- double horizontalOffset;
- double verticalOffset;
- float zoomFactor;
+ int attempts = 0;
+ double verticalOffsetDelta = 0.0;
+ bool verticalOffsetDeltaTooLarge = false;
- GetScrollViewView(out horizontalOffset, out verticalOffset, out zoomFactor);
- Log.Comment("horizontalOffset={0}", horizontalOffset);
- Log.Comment("verticalOffset={0}", verticalOffset);
- Log.Comment("zoomFactor={0}", zoomFactor);
+ do
+ {
+ Wait.ForIdle();
+
+ double horizontalOffset;
+ double verticalOffset;
+ float zoomFactor;
+
+ GetScrollViewView(out horizontalOffset, out verticalOffset, out zoomFactor);
+ Log.Comment("horizontalOffset={0}", horizontalOffset);
+ Log.Comment("verticalOffset={0}", verticalOffset);
+ Log.Comment("zoomFactor={0}", zoomFactor);
+
+ if (expectedVerticalOffset != null)
+ {
+ attempts++;
+ verticalOffsetDelta = Math.Abs((double)expectedVerticalOffset - verticalOffset);
+ verticalOffsetDeltaTooLarge = verticalOffsetDelta > 0.5;
+ }
+ }
+ while (verticalOffsetDeltaTooLarge && attempts <= 3);
if (expectedVerticalOffset != null)
{
- Verify.IsLessThanOrEqual(Math.Abs((double)expectedVerticalOffset - verticalOffset), 0.5, "Verifying verticalOffset is close to " + expectedVerticalOffset);
+ Verify.IsLessThanOrEqual(verticalOffsetDelta, 0.5, "Verifying verticalOffset is close to " + expectedVerticalOffset);
}
}
}
diff --git a/controls/dev/ItemsView/ItemsView.cpp b/controls/dev/ItemsView/ItemsView.cpp
index 123ae448fa..cb1685e243 100644
--- a/controls/dev/ItemsView/ItemsView.cpp
+++ b/controls/dev/ItemsView/ItemsView.cpp
@@ -18,6 +18,9 @@
#include "ItemContainer.h"
#include "ItemContainerRevokers.h"
#include "ScrollView.h"
+#include "SelectionNode.h"
+#include "SelectionModel.h"
+#include "SharedHelpers.h"
// Change to 'true' to turn on debugging outputs in Output window
bool ItemsViewTrace::s_IsDebugOutputEnabled{ false };
@@ -197,6 +200,7 @@ void ItemsView::InvertSelection()
#pragma region IControlOverrides
+#ifdef DBG
void ItemsView::OnGotFocus(
winrt::RoutedEventArgs const& args)
{
@@ -204,6 +208,7 @@ void ItemsView::OnGotFocus(
__super::OnGotFocus(args);
}
+#endif
#pragma endregion
@@ -279,16 +284,41 @@ void ItemsView::OnPropertyChanged(const winrt::DependencyPropertyChangedEventArg
// Make sure the default ItemTemplate is used when the ItemsSource is non-null and the ItemTemplate is null.
// Prevents ViewManager::GetElementFromElementFactory from setting the ItemsRepeater.ItemTemplate property
// which would clear the template-binding between the ItemsView & ItemsRepeater ItemTemplate properties.
+// This is not needed though when the ItemsSource points to UIElements instead of data items. In that case,
+// ViewManager::GetElementFromElementFactory will not set a default ItemTemplate. It must remain null.
void ItemsView::EnsureItemTemplate()
{
ITEMSVIEW_TRACE_VERBOSE(*this, TRACE_MSG_METH, METH_NAME, this);
- if (ItemsSource() != nullptr && ItemTemplate() == nullptr)
+ if (ItemsSource() == nullptr || ItemTemplate() != nullptr)
+ {
+ return;
+ }
+
+ if (auto const& itemsRepeater = m_itemsRepeater.get())
{
- // The default ItemTemplate uses an ItemContainer for its root element since this is an ItemsView requirement for now.
- auto const defaultItemTemplate = winrt::XamlReader::Load(L"").as();
+ if (auto const& itemsSourceView = itemsRepeater.ItemsSourceView())
+ {
+ const auto itemCount = itemsSourceView.Count();
- ItemTemplate(defaultItemTemplate);
+ if (itemCount == 0)
+ {
+ return;
+ }
+
+ const auto data = itemsSourceView.GetAt(0);
+
+ if (auto const& dataAsUIElement = data.try_as())
+ {
+ // No need to set a default ItemTemplate with an ItemContainer when the ItemsSource is a list of UIElements.
+ return;
+ }
+
+ // The default ItemTemplate uses an ItemContainer for its root element since this is an ItemsView requirement for now.
+ auto const defaultItemTemplate = winrt::XamlReader::Load(L"").as();
+
+ ItemTemplate(defaultItemTemplate);
+ }
}
}
@@ -312,6 +342,7 @@ void ItemsView::UpdateItemsRepeater(
m_itemsRepeater.set(itemsRepeater);
HookItemsRepeaterEvents();
+ HookItemsSourceViewEvents();
}
void ItemsView::UpdateScrollView(
@@ -431,6 +462,24 @@ void ItemsView::RaiseSelectionChanged()
}
}
+void ItemsView::HookItemsSourceViewEvents()
+{
+ ITEMSVIEW_TRACE_VERBOSE(*this, TRACE_MSG_METH, METH_NAME, this);
+
+ m_itemsSourceViewChangedRevoker.revoke();
+
+ if (auto const& itemsRepeater = m_itemsRepeater.get())
+ {
+ if (auto const& itemsSourceView = itemsRepeater.ItemsSourceView())
+ {
+ m_itemsSourceViewChangedRevoker = itemsSourceView.CollectionChanged(winrt::auto_revoke, { this, &ItemsView::OnSourceListChanged });
+
+ // Make sure the default ItemTemplate is used when the ItemsSource is non-null and the ItemTemplate is null.
+ EnsureItemTemplate();
+ }
+ }
+}
+
void ItemsView::HookItemsRepeaterEvents()
{
ITEMSVIEW_TRACE_VERBOSE(*this, TRACE_MSG_METH, METH_NAME, this);
@@ -746,9 +795,28 @@ void ItemsView::OnItemsRepeaterElementPrepared(
}
#endif
- winrt::IReference isItemContainerSelected = m_selectionModel.IsSelected(index);
+ winrt::IReference isSelectionModelSelectedAsNullable = m_selectionModel.IsSelected(index);
+ bool isSelectionModelSelected = isSelectionModelSelectedAsNullable != nullptr && isSelectionModelSelectedAsNullable.Value();
- itemContainer.IsSelected(isItemContainerSelected != nullptr && isItemContainerSelected.Value());
+ if (itemContainer.IsSelected())
+ {
+ // The ItemsSource may be a list of ItemContainers, some of them having IsSelected==True. Account for this situation
+ // by updating the selection model accordingly. Only selected containers are pushed into the selection model to avoid
+ // clearing any potential selections already present in that model, which are pushed into the ItemContainers next.
+ if (!isSelectionModelSelected && SelectionMode() != winrt::ItemsViewSelectionMode::None)
+ {
+ // When SelectionMode is None, ItemContainer.IsSelected will be reset below.
+ // For all other selection modes, simply select the item.
+ // No need to go through the SingleSelector, MultipleSelector or ExtendedSelector policy.
+ m_selectionModel.Select(index);
+
+ // Access the new selection status for the same ItemContainer so it can be updated accordingly below.
+ isSelectionModelSelectedAsNullable = m_selectionModel.IsSelected(index);
+ isSelectionModelSelected = isSelectionModelSelectedAsNullable != nullptr && isSelectionModelSelectedAsNullable.Value();
+ }
+ }
+
+ itemContainer.IsSelected(isSelectionModelSelected);
SetItemsViewItemContainerRevokers(itemContainer);
}
@@ -847,15 +915,7 @@ void ItemsView::OnItemsRepeaterItemsSourceChanged(
{
ITEMSVIEW_TRACE_VERBOSE(*this, TRACE_MSG_METH, METH_NAME, this);
- m_itemsSourceViewChangedRevoker.revoke();
-
- if (auto const& itemsRepeater = m_itemsRepeater.get())
- {
- if (auto const& itemsSourceView = itemsRepeater.ItemsSourceView())
- {
- m_itemsSourceViewChangedRevoker = itemsSourceView.CollectionChanged(winrt::auto_revoke, { this, &ItemsView::OnSourceListChanged });
- }
- }
+ HookItemsSourceViewEvents();
auto const& itemsSource = ItemsSource();
@@ -1166,9 +1226,6 @@ void ItemsView::OnItemsSourceChanged()
m_selectionModel.Source(itemsSource);
m_currentElementSelectionModel.Source(itemsSource);
}
-
- // Make sure the default ItemTemplate is used when the ItemsSource is non-null and the ItemTemplate is null.
- EnsureItemTemplate();
}
void ItemsView::OnVerticalScrollControllerChanged()
@@ -1313,6 +1370,42 @@ void ItemsView::OnSelectionModelSelectionChanged(
{
ITEMSVIEW_TRACE_VERBOSE(*this, TRACE_MSG_METH, METH_NAME, this);
+ // Unfortunately using an internal hook to see whether this notification orginated from a collection change or not.
+ const bool selectionInvalidatedDueToCollectionChange =
+ winrt::get_self(selectionModel)->SelectionInvalidatedDueToCollectionChange();
+
+ /*
+ Another option, besides a public API on SelectionModel, would have been to apply the changes
+ asynchronously like below. But that seems fragile compared to delaying the application until
+ the synchronous call to ItemsView::OnSourceListChanged that is about to occur.
+ DispatcherQueue().TryEnqueue(
+ winrt::DispatcherQueuePriority::Low,
+ winrt::DispatcherQueueHandler([weakThis{ get_weak() }]()
+ {
+ if (auto strongThis = weakThis.get())
+ {
+ strongThis->ApplySelectionModelSelectionChange();
+ }
+ }));
+ */
+
+ if (selectionInvalidatedDueToCollectionChange)
+ {
+ // Delay the SelectionModel's selection changes until the upcoming ItemsView::OnSourceListChanged
+ // call because neither m_itemsRepeater's Children nor m_itemsRepeater's ItemsSourceView have been updated yet.
+ // ApplySelectionModelSelectionChange which uses both is thus delayed, but is still going to be called synchronously.
+ m_applySelectionChangeOnSourceListChanged = true;
+ }
+ else
+ {
+ ApplySelectionModelSelectionChange();
+ }
+}
+
+void ItemsView::ApplySelectionModelSelectionChange()
+{
+ ITEMSVIEW_TRACE_VERBOSE(*this, TRACE_MSG_METH, METH_NAME, this);
+
// Update ItemsView properties
SelectedItem(m_selectionModel.SelectedItem());
@@ -1321,6 +1414,13 @@ void ItemsView::OnSelectionModelSelectionChanged(
{
const auto count = winrt::VisualTreeHelper::GetChildrenCount(itemsRepeater);
+#ifdef DBG
+ if (const auto itemsSourceView = itemsRepeater.ItemsSourceView())
+ {
+ const auto itemsSourceViewCount = itemsSourceView.Count();
+ }
+#endif
+
for (int32_t childIndex = 0; childIndex < count; childIndex++)
{
auto elementAsDO = winrt::VisualTreeHelper::GetChild(itemsRepeater, childIndex);
@@ -1383,6 +1483,19 @@ void ItemsView::OnSourceListChanged(
const winrt::IInspectable& dataSource,
const winrt::NotifyCollectionChangedEventArgs& args)
{
+ if (m_applySelectionChangeOnSourceListChanged)
+ {
+ m_applySelectionChangeOnSourceListChanged = false;
+
+ // Finally apply the SelectionModel's changes notified in ItemsView::OnSelectionModelSelectionChanged
+ // now that both m_itemsRepeater's Children & m_itemsRepeater's ItemsSourceView are up-to-date.
+ ApplySelectionModelSelectionChange();
+ }
+
+ // When the item count goes from 0 to strictly positive, the ItemTemplate property may
+ // have to be set to a default template which includes an ItemContainer.
+ EnsureItemTemplate();
+
m_keyboardNavigationReferenceResetPending = true;
if (const auto itemsRepeater = m_itemsRepeater.get())
@@ -1634,7 +1747,7 @@ int ItemsView::GetItemInternal(
if (element != nullptr)
{
- if (forFocusableItemsOnly && !IsFocusableElement(element))
+ if (forFocusableItemsOnly && !SharedHelpers::IsFocusableElement(element))
{
continue;
}
diff --git a/controls/dev/ItemsView/ItemsView.h b/controls/dev/ItemsView/ItemsView.h
index 00671db660..04e0c244e0 100644
--- a/controls/dev/ItemsView/ItemsView.h
+++ b/controls/dev/ItemsView/ItemsView.h
@@ -51,8 +51,10 @@ class ItemsView :
#endif
#pragma region IControlOverrides
+#ifdef DBG
void OnGotFocus(
winrt::RoutedEventArgs const& args);
+#endif
void OnKeyDown(
winrt::KeyRoutedEventArgs const& args);
#pragma endregion
@@ -80,6 +82,7 @@ class ItemsView :
void RaiseSelectionChanged();
+ void HookItemsSourceViewEvents();
void HookItemsRepeaterEvents();
void UnhookItemsRepeaterEvents(
bool isForDestructor);
@@ -210,6 +213,7 @@ class ItemsView :
const winrt::IInspectable& sender,
const winrt::RoutedEventArgs& args);
+ void ApplySelectionModelSelectionChange();
int GetAdjacentFocusableElementByDirection(
const winrt::FocusNavigationDirection& focusNavigationDirection,
bool hasIndexBasedLayoutOrientation);
@@ -296,9 +300,6 @@ class ItemsView :
const winrt::VirtualKey& key,
bool isRepeatKey);
- bool IsFocusableElement(
- winrt::UIElement const& element) const;
-
bool IsLayoutOrientationIndexBased(
bool horizontal);
@@ -353,6 +354,10 @@ class ItemsView :
bool m_setVerticalScrollControllerOnLoaded{ false };
+ // Set to True in ItemsView::OnSelectionModelSelectionChanged to delay the application
+ // of the selection changes until the imminent ItemsView::OnSourceListChanged call.
+ bool m_applySelectionChangeOnSourceListChanged{ false };
+
std::shared_ptr m_selector;
winrt::Microsoft::UI::Xaml::Media::CompositionTarget::Rendering_revoker m_renderingRevoker{};
diff --git a/controls/dev/ItemsView/ItemsViewInteractions.cpp b/controls/dev/ItemsView/ItemsViewInteractions.cpp
index 6fea4bfaca..bfb82f6b0a 100644
--- a/controls/dev/ItemsView/ItemsViewInteractions.cpp
+++ b/controls/dev/ItemsView/ItemsViewInteractions.cpp
@@ -10,6 +10,7 @@
#include "ItemsViewTestHooks.h"
#include "ItemsViewItemInvokedEventArgs.h"
#include "NullSelector.h"
+#include "SharedHelpers.h"
#include "SingleSelector.h"
#include "ItemContainerRevokers.h"
@@ -197,7 +198,7 @@ int ItemsView::GetAdjacentFocusableElementByDirection(
MUX_ASSERT(element != nullptr);
- if (IsFocusableElement(element))
+ if (SharedHelpers::IsFocusableElement(element))
{
float navigationDirectionDistance = std::numeric_limits::max();
float noneNavigationDirectionDistance = std::numeric_limits::max();
@@ -315,7 +316,7 @@ int ItemsView::GetAdjacentFocusableElementByIndex(
MUX_ASSERT(element != nullptr);
- if (IsFocusableElement(element))
+ if (SharedHelpers::IsFocusableElement(element))
{
return itemIndex;
}
@@ -582,19 +583,6 @@ bool ItemsView::IsCancelingNavigationKey(
return false;
}
-bool ItemsView::IsFocusableElement(
- winrt::UIElement const& element) const
-{
- if (element.Visibility() == winrt::Visibility::Collapsed)
- {
- return false;
- }
-
- auto const& control = element.try_as();
-
- return control && (control.IsEnabled() || control.AllowFocusWhenDisabled()) && control.IsTabStop();
-}
-
bool ItemsView::IsLayoutOrientationIndexBased(bool horizontal)
{
const winrt::IndexBasedLayoutOrientation indexBasedLayoutOrientation = GetLayoutIndexBasedLayoutOrientation();
@@ -663,16 +651,40 @@ void ItemsView::OnItemsViewElementGettingFocus(
// Tabbing (direction == FocusNavigationDirection::Next) or Shift-Tabbing (direction == FocusNavigationDirection::Previous) into
// the ItemsRepeater while there is no current element.
- // Retrieve the focusable index on the top/left corner for Tabbing, or bottom/right corner for Shift-Tabbing.
- int cornerFocusableItem = ItemsView::GetCornerFocusableItem(direction == winrt::FocusNavigationDirection::Next /*isForTopLeftItem*/);
- MUX_ASSERT(cornerFocusableItem != -1);
+ int focusableItemIndex{ -1 };
+
+ // When these conditions are fulfilled, set the selected item as the current one.
+ // - TabNavigation is Once
+ // - SelectionMode is Single
+ // - an item is selected and is focusable
+ if (TabNavigation() == winrt::KeyboardNavigationMode::Once &&
+ SelectionMode() == winrt::ItemsViewSelectionMode::Single)
+ {
+ const auto selectedItem = m_selectionModel.SelectedItem().as();
+
+ if (selectedItem && SharedHelpers::IsFocusableElement(selectedItem))
+ {
+ winrt::IndexPath selectedItemIndexPath = m_selectionModel.SelectedIndex();
+ MUX_ASSERT(selectedItemIndexPath != nullptr && selectedItemIndexPath.GetSize() == 1);
+
+ focusableItemIndex = selectedItemIndexPath.GetAt(0);
+ MUX_ASSERT(focusableItemIndex != -1);
+ }
+ }
+
+ if (focusableItemIndex == -1)
+ {
+ // Retrieve the focusable index on the top/left corner for Tabbing, or bottom/right corner for Shift-Tabbing.
+ focusableItemIndex = ItemsView::GetCornerFocusableItem(direction == winrt::FocusNavigationDirection::Next /*isForTopLeftItem*/);
+ MUX_ASSERT(focusableItemIndex != -1);
+ }
// Set that index as the current one.
- SetCurrentElementIndex(cornerFocusableItem, winrt::FocusState::Unfocused, false /*forceKeyboardNavigationReferenceReset*/);
- MUX_ASSERT(cornerFocusableItem == GetCurrentElementIndex());
+ SetCurrentElementIndex(focusableItemIndex, winrt::FocusState::Unfocused, false /*forceKeyboardNavigationReferenceReset*/);
+ MUX_ASSERT(focusableItemIndex == GetCurrentElementIndex());
// Allow TrySetNewFocusedElement to be called below for that new current element.
- currentElementIndex = cornerFocusableItem;
+ currentElementIndex = focusableItemIndex;
}
}
diff --git a/controls/dev/ItemsView/ItemsViewTrace.h b/controls/dev/ItemsView/ItemsViewTrace.h
index 5db4211554..c3b2366525 100644
--- a/controls/dev/ItemsView/ItemsViewTrace.h
+++ b/controls/dev/ItemsView/ItemsViewTrace.h
@@ -4,7 +4,7 @@
#pragma once
#include "common.h"
-#include "TraceLogging.h"
+#include "MuxcTraceLogging.h"
#include "Utils.h"
#include "MUXControlsTestHooks.h"
@@ -87,7 +87,7 @@ class ItemsViewTrace
if (includeTraceLogging)
{
// TraceViewers
- // http://toolbox/pef
+ // http://toolbox/pef
// http://fastetw/index.aspx
TraceLoggingWrite(
g_hLoggingProvider,
@@ -123,7 +123,7 @@ class ItemsViewTrace
if (includeTraceLogging)
{
// TraceViewers
- // http://toolbox/pef
+ // http://toolbox/pef
// http://fastetw/index.aspx
TraceLoggingWrite(
g_hLoggingProvider,
@@ -152,7 +152,7 @@ class ItemsViewTrace
static void TracePerfInfo(PCWSTR info) noexcept
{
// TraceViewers
- // http://toolbox/pef
+ // http://toolbox/pef
// http://fastetw/index.aspx
TraceLoggingWrite(
g_hPerfProvider,
diff --git a/controls/dev/ItemsView/TestUI/ItemsViewSummaryPage.xaml b/controls/dev/ItemsView/TestUI/ItemsViewSummaryPage.xaml
index e03d338862..70e3ae1ce6 100644
--- a/controls/dev/ItemsView/TestUI/ItemsViewSummaryPage.xaml
+++ b/controls/dev/ItemsView/TestUI/ItemsViewSummaryPage.xaml
@@ -298,6 +298,8 @@
Small ObservableCollection<Recipe>
Small Uniform ObservableCollection<Recipe>
ObservableCollection<Recipe>
+ Small ObservableCollection<ItemContainer>
+ Small ObservableCollection<Image>
diff --git a/controls/dev/ItemsView/TestUI/ItemsViewSummaryPage.xaml.cs b/controls/dev/ItemsView/TestUI/ItemsViewSummaryPage.xaml.cs
index bb94b2b00d..56e5fdc1c2 100644
--- a/controls/dev/ItemsView/TestUI/ItemsViewSummaryPage.xaml.cs
+++ b/controls/dev/ItemsView/TestUI/ItemsViewSummaryPage.xaml.cs
@@ -76,6 +76,8 @@ public QueuedOperation(QueuedOperationType type, string value)
private ObservableCollection _colRecipes = null;
private ObservableCollection _colSmallRecipes = null;
private ObservableCollection _colSmallUniformRecipes = null;
+ private ObservableCollection _colSmallItemContainers = null;
+ private ObservableCollection _colSmallImages = null;
private List _lstRecipes = null;
private DataTemplate[] _recipeTemplates = new DataTemplate[17];
private StackLayout _stackLayout = null;
@@ -330,7 +332,9 @@ private void ItemsView_SelectionChanged(ItemsView sender, ItemsViewSelectionChan
foreach (var selectedItem in sender.SelectedItems)
{
- selectedItems += (selectedItem == null) ? ", " : selectedItem.ToString().Substring(0, 9) + ", ";
+ string selectedItemAsString = selectedItem.ToString();
+
+ selectedItems += (selectedItem == null) ? ", " : selectedItemAsString.Substring(0, Math.Min(selectedItemAsString.Length, 9)) + ", ";
}
AppendAsyncEventMessage($"ItemsView.SelectionChanged SelectedItems={selectedItems}");
@@ -1086,6 +1090,14 @@ private void UpdateDataSourceItemCount()
{
txtDataSourceItemCount.Text = _colRecipes.Count.ToString();
}
+ else if (_itemsView.ItemsSource == _colSmallItemContainers)
+ {
+ txtDataSourceItemCount.Text = _colSmallItemContainers.Count.ToString();
+ }
+ else if (_itemsView.ItemsSource == _colSmallImages)
+ {
+ txtDataSourceItemCount.Text = _colSmallImages.Count.ToString();
+ }
}
}
@@ -1881,7 +1893,9 @@ private void UpdateSelectedItem()
}
else
{
- txtSelectedItem.Text = _itemsView.SelectedItem.ToString().Substring(0, 12);
+ string selectedItemAsString = _itemsView.SelectedItem.ToString();
+
+ txtSelectedItem.Text = selectedItemAsString.Substring(0, Math.Min(selectedItemAsString.Length, 12));
}
}
}
@@ -1900,7 +1914,9 @@ private void UpdateSelectedItems()
foreach (var selectedItem in _itemsView.SelectedItems)
{
- txtSelectedItems.Text += (selectedItem == null) ? ", " : selectedItem.ToString().Substring(0, 9) + ", ";
+ string selectedItemAsString = selectedItem.ToString();
+
+ txtSelectedItems.Text += (selectedItem == null) ? ", " : selectedItemAsString.Substring(0, Math.Min(selectedItemAsString.Length, 9)) + ", ";
}
}
}
@@ -4439,7 +4455,6 @@ private void CmbItemsSource_SelectionChanged(object sender, SelectionChangedEven
case 2:
if (_colSmallRecipes == null)
{
- var rnd = new Random();
_colSmallRecipes = new ObservableCollection();
for (int itemIndex = 0; itemIndex < 7; itemIndex++)
@@ -4487,6 +4502,34 @@ private void CmbItemsSource_SelectionChanged(object sender, SelectionChangedEven
}
_itemsView.ItemsSource = _colRecipes;
break;
+ case 5:
+ if (_colSmallItemContainers == null)
+ {
+ _colSmallItemContainers = new ObservableCollection();
+
+ for (int itemIndex = 0; itemIndex < 7; itemIndex++)
+ {
+ ItemContainer itemContainer = GetItemContainerAsItemsSourceItem(itemIndex);
+
+ _colSmallItemContainers.Add(itemContainer);
+ }
+ }
+ _itemsView.ItemsSource = _colSmallItemContainers;
+ break;
+ case 6:
+ if (_colSmallImages == null)
+ {
+ _colSmallImages = new ObservableCollection();
+
+ for (int itemIndex = 0; itemIndex < 7; itemIndex++)
+ {
+ Image image = GetImageAsItemsSourceItem(itemIndex);
+
+ _colSmallImages.Add(image);
+ }
+ }
+ _itemsView.ItemsSource = _colSmallImages;
+ break;
}
}
}
@@ -4965,6 +5008,78 @@ private void BtnDataSourceSetItemCount_Click(object sender, RoutedEventArgs e)
_itemsView.ItemsSource = _colRecipes;
}
}
+
+ if (_itemsView.ItemsSource == null || _itemsView.ItemsSource == _colSmallItemContainers)
+ {
+ bool setItemsSource = _itemsView.ItemsSource != null && _itemsView.ItemsSource == _colSmallItemContainers;
+ int currentItemCount = _colSmallItemContainers == null ? 0 : _colSmallItemContainers.Count;
+
+ if (currentItemCount < newItemCount)
+ {
+ var colItemContainersEnd = new ObservableCollection();
+
+ for (int itemIndex = currentItemCount; itemIndex < newItemCount; itemIndex++)
+ {
+ ItemContainer itemContainer = GetItemContainerAsItemsSourceItem(itemIndex);
+
+ colItemContainersEnd.Add(itemContainer);
+ }
+
+ if (currentItemCount == 0)
+ {
+ _colSmallItemContainers = colItemContainersEnd;
+ }
+ else
+ {
+ _colSmallItemContainers = new ObservableCollection(_colSmallItemContainers.Concat(colItemContainersEnd));
+ }
+ }
+ else if (currentItemCount > newItemCount)
+ {
+ _colSmallItemContainers = new ObservableCollection(_colSmallItemContainers.Take(newItemCount));
+ }
+
+ if (setItemsSource)
+ {
+ _itemsView.ItemsSource = _colSmallItemContainers;
+ }
+ }
+
+ if (_itemsView.ItemsSource == null || _itemsView.ItemsSource == _colSmallImages)
+ {
+ bool setItemsSource = _itemsView.ItemsSource != null && _itemsView.ItemsSource == _colSmallImages;
+ int currentItemCount = _colSmallImages == null ? 0 : _colSmallImages.Count;
+
+ if (currentItemCount < newItemCount)
+ {
+ var colImagesEnd = new ObservableCollection();
+
+ for (int itemIndex = currentItemCount; itemIndex < newItemCount; itemIndex++)
+ {
+ Image image = GetImageAsItemsSourceItem(itemIndex);
+
+ colImagesEnd.Add(image);
+ }
+
+ if (currentItemCount == 0)
+ {
+ _colSmallImages = colImagesEnd;
+ }
+ else
+ {
+ _colSmallImages = new ObservableCollection(_colSmallImages.Concat(colImagesEnd));
+ }
+ }
+ else if (currentItemCount > newItemCount)
+ {
+ _colSmallImages = new ObservableCollection(_colSmallImages.Take(newItemCount));
+ }
+
+ if (setItemsSource)
+ {
+ _itemsView.ItemsSource = _colSmallImages;
+ }
+ }
}
}
catch (Exception ex)
@@ -5020,6 +5135,28 @@ private void DataSourceAddItem()
colRecipes.Add(recipe);
}
+ else
+ {
+ ObservableCollection colItemContainers = _itemsView.ItemsSource as ObservableCollection;
+
+ if (colItemContainers != null)
+ {
+ ItemContainer itemContainer = GetItemContainerAsItemsSourceItem(colItemContainers.Count);
+
+ colItemContainers.Add(itemContainer);
+ }
+ else
+ {
+ ObservableCollection colImages = _itemsView.ItemsSource as ObservableCollection;
+
+ if (colImages != null)
+ {
+ Image image = GetImageAsItemsSourceItem(colImages.Count);
+
+ colImages.Add(image);
+ }
+ }
+ }
}
}
}
@@ -5076,6 +5213,28 @@ private void DataSourceInsertItem(int newItemIndex)
colRecipes.Insert(newItemIndex, recipe);
}
+ else
+ {
+ ObservableCollection colItemContainers = _itemsView.ItemsSource as ObservableCollection;
+
+ if (colItemContainers != null)
+ {
+ ItemContainer itemContainer = GetItemContainerAsItemsSourceItem(colItemContainers.Count);
+
+ colItemContainers.Insert(newItemIndex, itemContainer);
+ }
+ else
+ {
+ ObservableCollection colImages = _itemsView.ItemsSource as ObservableCollection;
+
+ if (colImages != null)
+ {
+ Image image = GetImageAsItemsSourceItem(colImages.Count);
+
+ colImages.Insert(newItemIndex, image);
+ }
+ }
+ }
}
}
}
@@ -5108,6 +5267,14 @@ private void DataSourceRemoveAllItems()
{
_colRecipes.Clear();
}
+ else if (_itemsView.ItemsSource == _colSmallItemContainers)
+ {
+ _colSmallItemContainers.Clear();
+ }
+ else if (_itemsView.ItemsSource == _colSmallImages)
+ {
+ _colSmallImages.Clear();
+ }
}
}
catch (Exception ex)
@@ -5139,6 +5306,14 @@ private void DataSourceRemoveItem(int oldItemIndex)
{
_colRecipes.RemoveAt(oldItemIndex);
}
+ else if (_itemsView.ItemsSource == _colSmallItemContainers)
+ {
+ _colSmallItemContainers.RemoveAt(oldItemIndex);
+ }
+ else if (_itemsView.ItemsSource == _colSmallImages)
+ {
+ _colSmallImages.RemoveAt(oldItemIndex);
+ }
}
}
catch (Exception ex)
@@ -6168,6 +6343,71 @@ private int GetItemsRepeaterElementIndex(FrameworkElement element)
return -1;
}
+ private ItemContainer GetItemContainerAsItemsSourceItem(int itemIndex)
+ {
+ Grid grid = new Grid() {
+ Name = "itemPanel"
+ };
+
+ BitmapImage bitmapImage = new BitmapImage() {
+ DecodePixelHeight = 96,
+ UriSource = new Uri(string.Format("ms-appx:///Images/Rect{0}.png", itemIndex % 6))
+ };
+
+ Image image = new Image() {
+ Name = "image",
+ Stretch = Stretch.UniformToFill,
+ HorizontalAlignment = HorizontalAlignment.Center,
+ VerticalAlignment = VerticalAlignment.Center,
+ Source = bitmapImage
+ };
+
+ grid.Children.Add(image);
+
+ TextBlock textBlock = new TextBlock() {
+ Text = itemIndex.ToString(),
+ TextWrapping = TextWrapping.Wrap,
+ Margin = new Thickness(4),
+ Foreground = new SolidColorBrush(Colors.Yellow),
+ FontSize = 14.0,
+ MaxWidth = 68.0,
+ MaxHeight = 48.0,
+ HorizontalAlignment = HorizontalAlignment.Center,
+ VerticalAlignment = VerticalAlignment.Bottom
+ };
+
+ grid.Children.Add(textBlock);
+
+ ItemContainer itemContainer = new ItemContainer() {
+ MinWidth = 72.0,
+ Height = 96.0,
+ Background = new SolidColorBrush(Colors.Gray),
+ Child = grid
+ };
+
+ return itemContainer;
+ }
+
+ private Image GetImageAsItemsSourceItem(int itemIndex)
+ {
+ BitmapImage bitmapImage = new BitmapImage() {
+ DecodePixelHeight = 96,
+ UriSource = new Uri(string.Format("ms-appx:///Images/Rect{0}.png", itemIndex % 6))
+ };
+
+ Image image = new Image() {
+ Name = "image",
+ MinWidth = 72.0,
+ Height = 96.0,
+ Stretch = Stretch.UniformToFill,
+ HorizontalAlignment = HorizontalAlignment.Center,
+ VerticalAlignment = VerticalAlignment.Center,
+ Source = bitmapImage
+ };
+
+ return image;
+ }
+
private Thickness GetThicknessFromString(string thickness)
{
string[] lengths = thickness.Split(',');
diff --git a/controls/dev/Lightup/Microsoft.UI.Xaml.Controls.Lightup.vcxproj b/controls/dev/Lightup/Microsoft.UI.Xaml.Controls.Lightup.vcxproj
new file mode 100644
index 0000000000..a4dc672d99
--- /dev/null
+++ b/controls/dev/Lightup/Microsoft.UI.Xaml.Controls.Lightup.vcxproj
@@ -0,0 +1,37 @@
+
+
+
+
+
+ true
+ false
+ false
+ {711ec81d-74eb-401f-b397-7431e5f79ede}
+ Generic
+ true
+ Microsoft.UI.Xaml.Controls.Lightup
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.
+
+
+
+
+
diff --git a/controls/dev/MapControl/APITests/MapControlTests.cs b/controls/dev/MapControl/APITests/MapControlTests.cs
new file mode 100644
index 0000000000..a480df66d7
--- /dev/null
+++ b/controls/dev/MapControl/APITests/MapControlTests.cs
@@ -0,0 +1,22 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License. See LICENSE in the project root for license information.
+
+using System;
+using Common;
+using System.Collections.Generic;
+using Microsoft.UI.Xaml.Controls;
+using MUXControlsTestApp.Utilities;
+
+using WEX.TestExecution;
+using WEX.TestExecution.Markup;
+using WEX.Logging.Interop;
+
+namespace Microsoft.UI.Xaml.Tests.MUXControls.ApiTests
+{
+
+ [TestClass]
+ public class MapControlTests : ApiTestBase
+ {
+
+ }
+}
diff --git a/controls/dev/MapControl/APITests/MapControl_APITests.projitems b/controls/dev/MapControl/APITests/MapControl_APITests.projitems
new file mode 100644
index 0000000000..324df44daf
--- /dev/null
+++ b/controls/dev/MapControl/APITests/MapControl_APITests.projitems
@@ -0,0 +1,14 @@
+
+
+
+ $(MSBuildAllProjects);$(MSBuildThisFileFullPath)
+ true
+ cb2352e2-d633-41a3-8cdc-b28731a4c490
+
+
+ MapControl_APITests
+
+
+
+
+
diff --git a/controls/dev/MapControl/APITests/MapControl_APITests.shproj b/controls/dev/MapControl/APITests/MapControl_APITests.shproj
new file mode 100644
index 0000000000..75b36552db
--- /dev/null
+++ b/controls/dev/MapControl/APITests/MapControl_APITests.shproj
@@ -0,0 +1,13 @@
+
+
+
+ {F350D71A-A980-4D63-A38A-8A2035DC4EF2}
+ 14.0
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/controls/dev/MapControl/InteractionTests/MapControlTests.cs b/controls/dev/MapControl/InteractionTests/MapControlTests.cs
new file mode 100644
index 0000000000..83e5f4ed82
--- /dev/null
+++ b/controls/dev/MapControl/InteractionTests/MapControlTests.cs
@@ -0,0 +1,41 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License. See LICENSE in the project root for license information.
+
+using System;
+using Common;
+using Microsoft.UI.Xaml.Tests.MUXControls.InteractionTests.Infra;
+using Microsoft.UI.Xaml.Tests.MUXControls.InteractionTests.Common;
+using System.Collections.Generic;
+
+using WEX.TestExecution;
+using WEX.TestExecution.Markup;
+using WEX.Logging.Interop;
+
+using Microsoft.Windows.Apps.Test.Automation;
+using Microsoft.Windows.Apps.Test.Foundation;
+using Microsoft.Windows.Apps.Test.Foundation.Controls;
+using Microsoft.Windows.Apps.Test.Foundation.Patterns;
+using Microsoft.Windows.Apps.Test.Foundation.Waiters;
+
+namespace Microsoft.UI.Xaml.Tests.MUXControls.InteractionTests
+{
+ [TestClass]
+ public class MapControlTests
+ {
+ [ClassInitialize]
+ [TestProperty("RunAs", "User")]
+ [TestProperty("Classification", "Integration")]
+ [TestProperty("Platform", "Any")]
+ [TestProperty("MUXControlsTestSuite", "SuiteB")]
+ public static void ClassInitialize(TestContext testContext)
+ {
+ TestEnvironment.Initialize(testContext);
+ }
+
+ public void TestCleanup()
+ {
+ TestCleanupHelper.Cleanup();
+ }
+
+ }
+}
diff --git a/controls/dev/MapControl/InteractionTests/MapControl_InteractionTests.projitems b/controls/dev/MapControl/InteractionTests/MapControl_InteractionTests.projitems
new file mode 100644
index 0000000000..44a18ffbaf
--- /dev/null
+++ b/controls/dev/MapControl/InteractionTests/MapControl_InteractionTests.projitems
@@ -0,0 +1,15 @@
+
+
+
+
+ $(MSBuildAllProjects);$(MSBuildThisFileFullPath)
+ true
+ A1553559-5786-4B44-AB9E-94AB95C86D4D
+
+
+ MapControl_InteractionTests
+
+
+
+
+
diff --git a/controls/dev/MapControl/InteractionTests/MapControl_InteractionTests.shproj b/controls/dev/MapControl/InteractionTests/MapControl_InteractionTests.shproj
new file mode 100644
index 0000000000..8cd216c7ad
--- /dev/null
+++ b/controls/dev/MapControl/InteractionTests/MapControl_InteractionTests.shproj
@@ -0,0 +1,14 @@
+
+
+
+
+ {189F0B87-4CA1-4F77-8195-FC6DC714157A}
+ 15.0
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/controls/dev/MapControl/MapControl.cpp b/controls/dev/MapControl/MapControl.cpp
new file mode 100644
index 0000000000..763468cf5f
--- /dev/null
+++ b/controls/dev/MapControl/MapControl.cpp
@@ -0,0 +1,385 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License. See LICENSE in the project root for license information.
+
+#include "pch.h"
+#include "common.h"
+#include "MapControl.h"
+#include "RuntimeProfiler.h"
+#include "ResourceAccessor.h"
+#include "WebView2.h"
+#include
+#include
+#include
+#include
+#include "MapElementClickEventArgs.h"
+#include "MapControlMapServiceErrorOccurredEventArgs.h"
+#include "MapElementsLayer.h"
+#include "Vector.h"
+
+
+
+winrt::hstring MapControl::s_mapHtmlContent{};
+
+MapControl::MapControl()
+{
+ SetDefaultStyleKey(this);
+
+ // Create layers vector that can hold MapElements to display information and be interacted with on the map
+ auto layers = winrt::make>().as>();
+ layers.VectorChanged({ this, &MapControl::OnLayersVectorChanged });
+ SetValue(s_LayersProperty, layers);
+}
+
+void MapControl::OnApplyTemplate()
+{
+ m_webviewWebMessageReceivedRevoker.revoke();
+ m_webviewNavigationCompletedRevoker.revoke();
+
+ winrt::IControlProtected thisAsControlProtected = *this;
+ if (auto webview = GetTemplateChildT(L"PART_WebView2", thisAsControlProtected))
+ {
+ m_webView.set(webview);
+
+ m_webviewWebMessageReceivedRevoker = webview.WebMessageReceived(winrt::auto_revoke, { this, &MapControl::WebMessageReceived });
+ m_webviewNavigationCompletedRevoker = webview.NavigationCompleted(winrt::auto_revoke,{
+ [this](auto const&, winrt::CoreWebView2NavigationCompletedEventArgs const& args)
+ {
+ InitializeWebMap();
+ }});
+
+ SetUpWebView();
+ }
+}
+
+winrt::IAsyncOperation MapControl::GetCoreWebView2()
+{
+ if (auto webView = m_webView.get())
+ {
+ co_await webView.EnsureCoreWebView2Async();
+ co_return webView.CoreWebView2();
+ }
+ co_return nullptr;
+}
+
+winrt::fire_and_forget MapControl::SetUpWebView()
+{
+ if (auto webView = m_webView.get())
+ {
+ auto core = co_await GetCoreWebView2();
+
+ // azure maps might not be displayed correctly with tracking prevention enabled
+ core.Profile().PreferredTrackingPreventionLevel(winrt::CoreWebView2TrackingPreventionLevel::None);
+ webView.NavigateToString(co_await GetMapHtmlContent());
+ }
+}
+
+winrt::IAsyncOperation MapControl::InitializeWebMap()
+{
+ winrt::hstring returnedValue{};
+ auto center = Center();
+ winrt::hstring pos = L"0,0";
+ if (center != nullptr)
+ {
+ const auto centerPosition = center.Position();
+ pos = std::format(L"{},{}", centerPosition.Longitude, centerPosition.Latitude);
+ }
+ auto token = IsValidMapServiceToken() ? MapServiceToken() : L"";
+ auto parameters = std::format(L"{},\"{}\"", pos, token);
+
+ if (auto webView = m_webView.get())
+ {
+ auto core = webView.CoreWebView2();
+ // Initializing Azure Maps on WebView
+ // params: longitude, latitude, mapServiceToken
+ returnedValue = co_await core.ExecuteScriptAsync(L"initializeMap(" + parameters + L");");
+
+ for (uint32_t i = 0; i < Layers().Size(); i++)
+ {
+ winrt::MapElementsLayer layer = Layers().GetAt(i).as();
+ OnLayerAdded(layer);
+ }
+ }
+ UpdateControlsInWebPage();
+ co_return returnedValue;
+}
+
+void MapControl::OnPropertyChanged(const winrt::DependencyPropertyChangedEventArgs& args)
+{
+ winrt::IDependencyProperty property = args.Property();
+
+ if (property == s_MapServiceTokenProperty)
+ {
+ if (IsValidMapServiceToken())
+ {
+ UpdateMapServiceTokenInWebPage();
+ }
+ }
+ else if (property == s_CenterProperty)
+ {
+ UpdateCenterInWebPage();
+ }
+ else if (property == s_ZoomLevelProperty)
+ {
+ UpdateZoomLevelInWebPage();
+ }
+ else if (property == s_InteractiveControlsVisibleProperty)
+ {
+ UpdateControlsInWebPage();
+ }
+}
+
+bool MapControl::IsValidMapServiceToken() {
+ return !MapServiceToken().empty() && std::all_of(MapServiceToken().begin(), MapServiceToken().end(), ::isalnum);
+}
+
+// Updates Azure Maps Authentication Key on WebView
+winrt::fire_and_forget MapControl::UpdateMapServiceTokenInWebPage()
+{
+ if (auto webView = m_webView.get())
+ {
+ auto core = co_await GetCoreWebView2();
+ // Sends new token to WebView
+ // params: mapServiceToken
+ co_await core.ExecuteScriptAsync(L"updateMapServiceToken(\"" + MapServiceToken() + L"\");");
+
+ for (uint32_t i = 0; i < Layers().Size(); i++)
+ {
+ winrt::MapElementsLayer layer = Layers().GetAt(i).try_as();
+ OnLayerAdded(layer);
+ }
+
+ UpdateControlsInWebPage();
+ UpdateCenterInWebPage();
+ UpdateZoomLevelInWebPage();
+ }
+}
+
+winrt::fire_and_forget MapControl::UpdateCenterInWebPage()
+{
+ if (auto webView = m_webView.get())
+ {
+ auto core = co_await GetCoreWebView2();
+
+ auto newCenter = Center().Position();
+ auto pos = std::format(L"{},{}", newCenter.Longitude, newCenter.Latitude);
+ // Updates center of map in WebView
+ // params: longitude, latitude
+ co_await core.ExecuteScriptAsync(L"updateCenter(" + pos + L")");
+ }
+}
+
+winrt::fire_and_forget MapControl::UpdateZoomLevelInWebPage()
+{
+ if (auto webView = m_webView.get())
+ {
+ auto core = co_await GetCoreWebView2();
+ core.ExecuteScriptAsync(L"updateZoom(" + winrt::to_hstring(ZoomLevel()) + L")");
+ }
+}
+
+winrt::fire_and_forget MapControl::UpdateControlsInWebPage()
+{
+ if (auto webView = m_webView.get())
+ {
+ auto core = co_await GetCoreWebView2();
+ core.ExecuteScriptAsync(L"interactiveControlsVisible(" + winrt::to_hstring(InteractiveControlsVisible()) + L")");
+ }
+}
+
+void MapControl::WebMessageReceived(winrt::WebView2 sender, winrt::CoreWebView2WebMessageReceivedEventArgs args)
+{
+ auto jsonAsString = args.WebMessageAsJson();
+ if (!jsonAsString.empty())
+ {
+ winrt::Windows::Data::Json::JsonObject obj = winrt::Windows::Data::Json::JsonObject();
+ if (winrt::Windows::Data::Json::JsonObject::TryParse(jsonAsString, obj))
+ {
+ auto type = obj.GetNamedObject(L"type");
+ // Handles click events on MapElements
+ if (type.GetString() == L"pushpinClickEvent")
+ {
+ auto clickedLayer = Layers().GetAt(static_cast(obj.GetNamedObject(L"layer").GetNumber())).try_as();
+ auto location = winrt::Geopoint{ winrt::BasicGeoposition{
+ obj.GetNamedObject(L"coordinate").GetNamedValue(L"longitude").GetNumber(),
+ obj.GetNamedObject(L"coordinate").GetNamedValue(L"latitude").GetNumber() }};
+
+ auto pointId = obj.GetNamedObject(L"point").GetString();
+ winrt::MapElement clickedElement{nullptr};
+ auto elements = clickedLayer->MapElements();
+ for (uint32_t i = 0; i < elements.Size(); i++)
+ {
+ auto elem = elements.GetAt(i);
+ if (winrt::get_self(elem)->Id == pointId)
+ {
+ clickedElement = elem.try_as();
+ }
+ }
+ auto clickArgs = winrt::make_self(location, clickedElement);
+ m_mapElementClickEventSource(*this, *clickArgs);
+
+ clickedLayer->RaiseMapElementClick(*clickArgs);
+ }
+ // Raises error events from WebView
+ else if (type.GetString() == L"javascriptError")
+ {
+ auto errorArgs = winrt::make_self(jsonAsString);
+ m_mapServiceErrorOccurredEventSource(*this, *errorArgs);
+ }
+ }
+ }
+}
+
+winrt::fire_and_forget MapControl::ClearLayer(winrt::hstring layerId)
+{
+ if (auto webView = m_webView.get())
+ {
+ auto core = co_await GetCoreWebView2();
+ co_await core.ExecuteScriptAsync(L"clearLayer(" + layerId + L");");
+ }
+}
+
+winrt::fire_and_forget MapControl::ResetLayerCollection()
+{
+ if (auto webView = m_webView.get())
+ {
+ auto core = co_await GetCoreWebView2();
+
+ for (uint32_t i = 0; i < Layers().Size(); i++)
+ {
+ winrt::MapElementsLayer layer = Layers().GetAt(i).as();
+ auto layerId = winrt::get_self(layer)->Id;
+ co_await core.ExecuteScriptAsync(L"clearLayer(" + winrt::to_hstring(layerId) + L");");
+
+ auto elements = layer.MapElements();
+ for (uint32_t j = 0; j < elements.Size(); j++)
+ {
+ auto element = elements.GetAt(j);
+ auto location = element.as().Location();
+ winrt::get_self(element)->Id = co_await AddMapIcon(location, layerId);
+ }
+ }
+ }
+}
+
+void MapControl::OnLayersVectorChanged(const winrt::IObservableVector&, const winrt::Collections::IVectorChangedEventArgs& args)
+{
+ if (args.CollectionChange() == winrt::Collections::CollectionChange::ItemInserted)
+ {
+ if (winrt::MapElementsLayer elementLayer = Layers().GetAt(args.Index()).try_as())
+ {
+ OnLayerAdded(elementLayer);
+ }
+ }
+ else if (args.CollectionChange() == winrt::Collections::CollectionChange::ItemRemoved)
+ {
+
+ if (winrt::MapElementsLayer elementLayer = Layers().GetAt(args.Index()).try_as())
+ {
+ auto layerId = winrt::get_self(elementLayer)->Id;
+ ClearLayer(layerId);
+ }
+ }
+ else if (args.CollectionChange() == winrt::Collections::CollectionChange::Reset)
+ {
+ ResetLayerCollection();
+ }
+}
+
+winrt::fire_and_forget MapControl::OnLayerAdded(const winrt::MapElementsLayer layer)
+{
+ if (auto webView = m_webView.get())
+ {
+ auto core = co_await GetCoreWebView2();
+ auto layerId = winrt::get_self(layer)->Id;
+ winrt::get_self(layer)->Id = co_await core.ExecuteScriptAsync(L"addSymbolLayer();");
+
+ auto elements = layer.MapElements();
+ for (uint32_t i = 0; i < elements.Size(); i++)
+ {
+ auto element = elements.GetAt(i);
+ auto location = element.as().Location();
+ winrt::get_self(element)->Id = co_await AddMapIcon(location, winrt::get_self(layer)->Id);
+ }
+ }
+}
+
+winrt::IAsyncOperation MapControl::AddMapIcon(winrt::Geopoint mapIconPoint, winrt::hstring layerId)
+{
+ winrt::hstring returnedValue{};
+ if (auto webView = m_webView.get())
+ {
+ auto core = co_await GetCoreWebView2();
+
+ const auto mapIconPosition = mapIconPoint.Position();
+ const auto latitude = winrt::to_hstring(mapIconPosition.Latitude);
+ const auto longitude = winrt::to_hstring(mapIconPosition.Longitude);
+
+ returnedValue = co_await core.ExecuteScriptAsync(L"addPoint(" + longitude + L", " + latitude + L"," + layerId + L");");
+ }
+ co_return returnedValue;
+}
+
+winrt::fire_and_forget MapControl::RemoveMapIcon(winrt::hstring pointId, winrt::hstring layerId)
+{
+ if (auto webView = m_webView.get())
+ {
+ auto core = co_await GetCoreWebView2();
+
+ auto result = co_await core.ExecuteScriptAsync(L"removePoint(" + pointId + L"," + layerId + L");");
+ }
+}
+
+winrt::fire_and_forget MapControl::UpdateMapIcon(winrt::Geopoint mapIconPoint, winrt::hstring pointId, winrt::hstring layerId)
+{
+ if (auto webView = m_webView.get())
+ {
+ auto core = co_await GetCoreWebView2();
+
+ const auto mapIconPosition = mapIconPoint.Position();
+ const auto latitude = winrt::to_hstring(mapIconPosition.Latitude);
+ const auto longitude = winrt::to_hstring(mapIconPosition.Longitude);
+
+ co_await core.ExecuteScriptAsync(L"updatePoint(" + longitude + L", " + latitude + L"," + pointId + L"," + layerId + L");");
+ }
+}
+
+winrt::fire_and_forget MapControl::LayerElementsChanged(const winrt::MapElementsLayer& layer, const winrt::IObservableVector& elements, const winrt::Collections::IVectorChangedEventArgs& args, winrt::hstring elementId)
+{
+ const auto index = args.Index();
+ auto layerId = winrt::get_self(layer)->Id;
+
+ switch (args.CollectionChange())
+ {
+ case winrt::Collections::CollectionChange::ItemInserted:
+ {
+ auto element = elements.GetAt(index);
+ winrt::get_self(element)->Id = co_await AddMapIcon(element.as().Location(), layerId);
+ break;
+ }
+ case winrt::Collections::CollectionChange::ItemRemoved:
+ RemoveMapIcon(elementId, layerId);
+ break;
+ case winrt::Collections::CollectionChange::ItemChanged:
+ {
+ auto element = elements.GetAt(index);
+ RemoveMapIcon(elementId, layerId);
+ winrt::get_self(element)->Id = co_await AddMapIcon(element.as().Location(), layerId);
+ break;
+ }
+ case winrt::Collections::CollectionChange::Reset:
+ {
+ OnLayerAdded(layer);
+ break;
+ }
+ }
+}
+
+winrt::IAsyncOperation MapControl::GetMapHtmlContent()
+{
+ if (s_mapHtmlContent.size() == 0)
+ {
+ s_mapHtmlContent = co_await ResourceAccessor::GetFileContents(FR_Map_Html);
+ }
+
+ co_return s_mapHtmlContent;
+}
\ No newline at end of file
diff --git a/controls/dev/MapControl/MapControl.h b/controls/dev/MapControl/MapControl.h
new file mode 100644
index 0000000000..ac0c9b7ec2
--- /dev/null
+++ b/controls/dev/MapControl/MapControl.h
@@ -0,0 +1,58 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License. See LICENSE in the project root for license information.
+
+#pragma once
+
+#include "pch.h"
+#include "common.h"
+#include "MapControl.g.h"
+#include "MapControl.properties.h"
+#include "WebView2.h"
+#include "MapElementsLayer.h"
+#include "winrt/Windows.Foundation.h"
+#include
+
+
+class MapControl :
+ public ReferenceTracker,
+ public MapControlProperties
+{
+
+public:
+ MapControl();
+
+ void OnApplyTemplate();
+ void OnPropertyChanged(const winrt::DependencyPropertyChangedEventArgs& args);
+
+ winrt::fire_and_forget LayerElementsChanged(const winrt::MapElementsLayer& layer, const winrt::IObservableVector& elements, const winrt::Collections::IVectorChangedEventArgs& args, winrt::hstring elementId);
+ winrt::fire_and_forget MapControl::UpdateMapIcon(winrt::Geopoint mapIconPoint, winrt::hstring pointId, winrt::hstring layerId);
+
+private:
+
+ tracker_ref m_webView{ this };
+
+ bool IsValidMapServiceToken();
+ winrt::IAsyncOperation InitializeWebMap();
+ winrt::fire_and_forget SetUpWebView();
+ winrt::fire_and_forget OnLayerAdded(const winrt::MapElementsLayer layer);
+ winrt::IAsyncOperation AddMapIcon(winrt::Geopoint mapIconPoint, winrt::hstring layerId);
+ winrt::IAsyncOperation MapControl::GetCoreWebView2();
+ winrt::fire_and_forget RemoveMapIcon(winrt::hstring pointId, winrt::hstring layerId);
+ winrt::fire_and_forget ClearLayer(winrt::hstring layerId);
+ winrt::fire_and_forget ResetLayerCollection();
+ void OnLayersVectorChanged(const winrt::IObservableVector&, const winrt::Collections::IVectorChangedEventArgs& args);
+ void WebMessageReceived(winrt::WebView2 sender, winrt::CoreWebView2WebMessageReceivedEventArgs args);
+
+ winrt::WebView2::WebMessageReceived_revoker m_webviewWebMessageReceivedRevoker{};
+ winrt::WebView2::NavigationCompleted_revoker m_webviewNavigationCompletedRevoker{};
+
+ winrt::fire_and_forget UpdateMapServiceTokenInWebPage();
+ winrt::fire_and_forget UpdateCenterInWebPage();
+ winrt::fire_and_forget UpdateZoomLevelInWebPage();
+ winrt::fire_and_forget UpdateControlsInWebPage();
+
+ winrt::event_token m_layersVectorChangedToken{};
+
+ static winrt::IAsyncOperation GetMapHtmlContent();
+ static winrt::hstring s_mapHtmlContent;
+};
diff --git a/controls/dev/MapControl/MapControl.idl b/controls/dev/MapControl/MapControl.idl
new file mode 100644
index 0000000000..16dd37846e
--- /dev/null
+++ b/controls/dev/MapControl/MapControl.idl
@@ -0,0 +1,83 @@
+namespace MU_XC_NAMESPACE
+{
+
+[MUX_PUBLIC_V6]
+[webhosthidden]
+[MUX_PROPERTY_CHANGED_CALLBACK(TRUE)]
+[MUX_PROPERTY_CHANGED_CALLBACK_METHODNAME("OnPropertyChanged")]
+unsealed runtimeclass MapControl : Microsoft.UI.Xaml.Controls.Control
+{
+ MapControl();
+
+ String MapServiceToken{ get;set; };
+ Windows.Devices.Geolocation.Geopoint Center{ get;set; };
+ Windows.Foundation.Collections.IVector Layers{ get;set; };
+ Double ZoomLevel{ get;set; };
+ Boolean InteractiveControlsVisible{ get;set; };
+
+ static Microsoft.UI.Xaml.DependencyProperty LayersProperty{ get; };
+ static Microsoft.UI.Xaml.DependencyProperty MapServiceTokenProperty{ get; };
+ static Microsoft.UI.Xaml.DependencyProperty CenterProperty{ get; };
+ static Microsoft.UI.Xaml.DependencyProperty ZoomLevelProperty{ get; };
+ static Microsoft.UI.Xaml.DependencyProperty InteractiveControlsVisibleProperty{ get; };
+
+ event Windows.Foundation.TypedEventHandler MapElementClick;
+ event Windows.Foundation.TypedEventHandler MapServiceErrorOccurred;
+}
+
+[MUX_PUBLIC_V6]
+[webhosthidden]
+unsealed runtimeclass MapElement : Microsoft.UI.Xaml.DependencyObject
+{
+}
+
+[MUX_PUBLIC_V6]
+[webhosthidden]
+[MUX_PROPERTY_CHANGED_CALLBACK(TRUE)]
+[MUX_PROPERTY_CHANGED_CALLBACK_METHODNAME("OnPropertyChanged")]
+unsealed runtimeclass MapIcon : Microsoft.UI.Xaml.Controls.MapElement
+{
+ MapIcon();
+ Windows.Devices.Geolocation.Geopoint Location{ get;set; };
+
+ static Microsoft.UI.Xaml.DependencyProperty LocationProperty{ get; };
+}
+
+[MUX_PUBLIC_V6]
+[webhosthidden]
+[MUX_PROPERTY_CHANGED_CALLBACK(TRUE)]
+[MUX_PROPERTY_CHANGED_CALLBACK_METHODNAME("OnPropertyChanged")]
+unsealed runtimeclass MapLayer : Microsoft.UI.Xaml.DependencyObject
+{
+}
+
+[MUX_PUBLIC_V6]
+[webhosthidden]
+[MUX_PROPERTY_CHANGED_CALLBACK(TRUE)]
+[MUX_PROPERTY_CHANGED_CALLBACK_METHODNAME("OnPropertyChanged")]
+unsealed runtimeclass MapElementsLayer : Microsoft.UI.Xaml.Controls.MapLayer
+{
+ MapElementsLayer();
+
+ Windows.Foundation.Collections.IVector MapElements{ get;set; };
+ static Microsoft.UI.Xaml.DependencyProperty MapElementsProperty{ get; };
+
+ event Windows.Foundation.TypedEventHandler MapElementClick;
+}
+
+[MUX_PUBLIC_V6]
+[webhosthidden]
+runtimeclass MapElementClickEventArgs
+{
+ Windows.Devices.Geolocation.Geopoint Location{ get; };
+ MapElement Element{ get; };
+}
+
+[MUX_PUBLIC_V6]
+[webhosthidden]
+runtimeclass MapControlMapServiceErrorOccurredEventArgs
+{
+ String DiagnosticMessage{ get; };
+}
+
+}
\ No newline at end of file
diff --git a/controls/dev/MapControl/MapControl.vcxitems b/controls/dev/MapControl/MapControl.vcxitems
new file mode 100644
index 0000000000..0372177231
--- /dev/null
+++ b/controls/dev/MapControl/MapControl.vcxitems
@@ -0,0 +1,53 @@
+
+
+
+ $(MSBuildAllProjects);$(MSBuildThisFileFullPath)
+ true
+ {7C60C2AE-6ABC-4762-A0EF-1F50CDD0BA1E}
+
+
+
+ %(AdditionalIncludeDirectories);$(MSBuildThisFileDirectory)
+ %(PreprocessorDefinitions);MAPCONTROL_INCLUDED
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ DefaultStyle
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/controls/dev/MapControl/MapControl.xaml b/controls/dev/MapControl/MapControl.xaml
new file mode 100644
index 0000000000..9c07f9e7fb
--- /dev/null
+++ b/controls/dev/MapControl/MapControl.xaml
@@ -0,0 +1,21 @@
+
+
+
+
+
+
diff --git a/controls/dev/MapControl/MapControlMapServiceErrorOccurredEventArgs.cpp b/controls/dev/MapControl/MapControlMapServiceErrorOccurredEventArgs.cpp
new file mode 100644
index 0000000000..5cc239089d
--- /dev/null
+++ b/controls/dev/MapControl/MapControlMapServiceErrorOccurredEventArgs.cpp
@@ -0,0 +1,8 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License. See LICENSE in the project root for license information.
+
+#include "pch.h"
+#include "common.h"
+#include "MapControlMapServiceErrorOccurredEventArgs.h"
+#include "RuntimeProfiler.h"
+#include "ResourceAccessor.h"
diff --git a/controls/dev/MapControl/MapControlMapServiceErrorOccurredEventArgs.h b/controls/dev/MapControl/MapControlMapServiceErrorOccurredEventArgs.h
new file mode 100644
index 0000000000..fc8b076987
--- /dev/null
+++ b/controls/dev/MapControl/MapControlMapServiceErrorOccurredEventArgs.h
@@ -0,0 +1,23 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License. See LICENSE in the project root for license information.
+
+#pragma once
+
+#include "pch.h"
+#include "common.h"
+#include "MapControlMapServiceErrorOccurredEventArgs.g.h"
+
+
+class MapControlMapServiceErrorOccurredEventArgs :
+ public winrt::implementation::MapControlMapServiceErrorOccurredEventArgsT
+{
+public:
+
+ MapControlMapServiceErrorOccurredEventArgs(winrt::hstring diagnosticMessage) :
+ m_diagnosticMessage(diagnosticMessage) {};
+
+ winrt::hstring DiagnosticMessage() { return m_diagnosticMessage; };
+
+private:
+ winrt::hstring m_diagnosticMessage;
+};
diff --git a/controls/dev/MapControl/MapElement.cpp b/controls/dev/MapControl/MapElement.cpp
new file mode 100644
index 0000000000..17aef8099a
--- /dev/null
+++ b/controls/dev/MapControl/MapElement.cpp
@@ -0,0 +1,13 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License. See LICENSE in the project root for license information.
+
+#include "pch.h"
+#include "common.h"
+#include "MapElement.h"
+#include "RuntimeProfiler.h"
+#include "ResourceAccessor.h"
+
+
+MapElement::MapElement()
+{
+}
\ No newline at end of file
diff --git a/controls/dev/MapControl/MapElement.h b/controls/dev/MapControl/MapElement.h
new file mode 100644
index 0000000000..e7b2d90add
--- /dev/null
+++ b/controls/dev/MapControl/MapElement.h
@@ -0,0 +1,17 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License. See LICENSE in the project root for license information.
+
+#pragma once
+
+#include "pch.h"
+#include "common.h"
+
+#include "MapElement.g.h"
+
+class MapElement :
+ public winrt::implementation::MapElementT
+{
+public:
+ MapElement();
+ winrt::hstring Id;
+};
diff --git a/controls/dev/MapControl/MapElementClickEventArgs.cpp b/controls/dev/MapControl/MapElementClickEventArgs.cpp
new file mode 100644
index 0000000000..4b130de728
--- /dev/null
+++ b/controls/dev/MapControl/MapElementClickEventArgs.cpp
@@ -0,0 +1,8 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License. See LICENSE in the project root for license information.
+
+#include "pch.h"
+#include "common.h"
+#include "MapElementClickEventArgs.h"
+#include "RuntimeProfiler.h"
+#include "ResourceAccessor.h"
diff --git a/controls/dev/MapControl/MapElementClickEventArgs.h b/controls/dev/MapControl/MapElementClickEventArgs.h
new file mode 100644
index 0000000000..ba1b1e630a
--- /dev/null
+++ b/controls/dev/MapControl/MapElementClickEventArgs.h
@@ -0,0 +1,27 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License. See LICENSE in the project root for license information.
+
+#pragma once
+
+#include "pch.h"
+#include "common.h"
+#include "MapElement.h"
+#include "MapElementClickEventArgs.g.h"
+#include
+
+
+class MapElementClickEventArgs :
+ public winrt::implementation::MapElementClickEventArgsT
+{
+public:
+
+ MapElementClickEventArgs(winrt::Geopoint location, winrt::MapElement element) :
+ m_location(location), m_element(element) {};
+
+ winrt::Geopoint Location() { return m_location; };
+ winrt::MapElement Element() { return m_element; };
+
+private:
+ winrt::Geopoint m_location;
+ winrt::MapElement m_element;
+};
diff --git a/controls/dev/MapControl/MapElementsLayer.cpp b/controls/dev/MapControl/MapElementsLayer.cpp
new file mode 100644
index 0000000000..aafbaac958
--- /dev/null
+++ b/controls/dev/MapControl/MapElementsLayer.cpp
@@ -0,0 +1,74 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License. See LICENSE in the project root for license information.
+
+#include "pch.h"
+#include "common.h"
+#include "MapElementsLayer.h"
+#include "RuntimeProfiler.h"
+#include "ResourceAccessor.h"
+#include "MapElementClickEventArgs.h"
+#include "MapControl.h"
+#include "Vector.h"
+#include "MapElement.h"
+#include "MapControl.h"
+
+MapElementsLayer::MapElementsLayer()
+{
+ auto elements = winrt::make>();
+ auto observableVector = elements.try_as>();
+ observableVector.VectorChanged({ this, &MapElementsLayer::OnMapElementsVectorChanged });
+ SetValue(s_MapElementsProperty, elements);
+
+ m_elementIds = winrt::make>();
+
+}
+
+void MapElementsLayer::OnPropertyChanged(const winrt::DependencyPropertyChangedEventArgs& args)
+{
+ winrt::IDependencyProperty property = args.Property();
+
+}
+void MapElementsLayer::RaiseMapElementClick(MapElementClickEventArgs const& args)
+{
+ m_mapElementClickEventSource(*this, args);
+}
+
+void MapElementsLayer::OnMapElementsVectorChanged(const winrt::IObservableVector& sender, const winrt::Collections::IVectorChangedEventArgs& args)
+{
+ const auto index = args.Index();
+ auto map = winrt::get_self(SharedHelpers::GetAncestorOfType(winrt::VisualTreeHelper::GetParent(*this)));
+ if (map)
+ {
+ if (index)
+ {
+ map->LayerElementsChanged(*this, sender, args, m_elementIds.GetAt(index));
+ }
+ else
+ {
+ map->LayerElementsChanged(*this, sender, args, L"");
+ }
+ }
+
+ switch (args.CollectionChange())
+ {
+ case winrt::Collections::CollectionChange::ItemInserted:
+ m_elementIds.Append(winrt::get_self