diff --git a/components/HeaderedContentControl/samples/HeaderedContentControl.md b/components/HeaderedContentControl/samples/HeaderedContentControl.md
deleted file mode 100644
index cbc7ffe7..00000000
--- a/components/HeaderedContentControl/samples/HeaderedContentControl.md
+++ /dev/null
@@ -1,75 +0,0 @@
----
-title: HeaderedContentControl
-author: skendrot
-description: The HeaderedContentControl allows content to be displayed with a specified header.
-keywords: HeaderedContentControl, Control, headered
-dev_langs:
- - csharp
-category: Controls
-subcategory: Layout
-discussion-id: 0
-issue-id: 0
-icon: Assets/HeaderedContentControl.png
----
-
-The `Header` property can be any object and you can use the `HeaderTemplate` to specify a custom look to the header. Content for the HeaderedContentControl will align to the top left. This is to maintain the same functionality as the ContentControl.
-
-> [!NOTE]
-> Setting the `Background`, `BorderBrush` and `BorderThickness` properties will not have any effect on the HeaderedContentControl. This is to maintain the same functionality as the ContentControl.
-
-> [!Sample HeaderedContentControlSample]
-
-> [!Sample HeaderedContentControlTextSample]
-
-> [!Sample HeaderedContentControlImageSample]
-
-> [!Sample HeaderedContentControlComplexSample]
-
-## Syntax
-
-```xaml
-
-
-
-
-
-```
-
-## Properties
-
-| Property | Type | Gets or sets the data used for the header of each control |
-| -- | -- | -- |
-| Header | object | Gets or sets the data used for the header of each control |
-| HeaderTemplate | DataTemplate | Gets or sets the template used to display the content of the control's header |
-| Orientation | Orientation | Gets or sets the Orientation to use for layout of the header. If set to Vertical the Header will be above the content. If set to Horizontal the Header will be to the left of the content. |
-
-### Examples
-
-- The `Header` property can be set to a string, or any xaml elements. If binding the `Header` to an object that is not a string, use the `HeaderTemplate` to control how the content is rendered.
-
- *Sample Code*
-
- ```xaml
-
-
-
-
-
-
-
-
-
- ```
-
-- Used to control the look of the header. The default value for the `HeaderTemplate` will display the string representation of the `Header`. Set this property if you need to bind the `Header` to an object.
-
- ```xaml
-
-
-
-
-
-
-
- ```
diff --git a/components/HeaderedContentControl/src/AdditionalAssemblyInfo.cs b/components/HeaderedContentControl/src/AdditionalAssemblyInfo.cs
deleted file mode 100644
index ba8804d3..00000000
--- a/components/HeaderedContentControl/src/AdditionalAssemblyInfo.cs
+++ /dev/null
@@ -1,13 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-// See the LICENSE file in the project root for more information.
-
-using System.Runtime.CompilerServices;
-
-// These `InternalsVisibleTo` calls are intended to make it easier for
-// for any internal code to be testable in all the different test projects
-// used with the Labs infrastructure.
-[assembly: InternalsVisibleTo("HeaderedContentControl.Tests.Uwp")]
-[assembly: InternalsVisibleTo("HeaderedContentControl.Tests.WinAppSdk")]
-[assembly: InternalsVisibleTo("CommunityToolkit.Tests.Uwp")]
-[assembly: InternalsVisibleTo("CommunityToolkit.Tests.WinAppSdk")]
diff --git a/components/HeaderedContentControl/src/CommunityToolkit.WinUI.Controls.HeaderedContentControl.csproj b/components/HeaderedContentControl/src/CommunityToolkit.WinUI.Controls.HeaderedContentControl.csproj
deleted file mode 100644
index 15fba2fb..00000000
--- a/components/HeaderedContentControl/src/CommunityToolkit.WinUI.Controls.HeaderedContentControl.csproj
+++ /dev/null
@@ -1,17 +0,0 @@
-
-
- HeaderedContentControl
- This package contains HeaderedContentControl.
- 8.0.0-beta.1
-
-
- CommunityToolkit.WinUI.Controls.HeaderedContentControlRns
-
-
-
-
-
-
- $(PackageIdPrefix).$(PackageIdVariant).Controls.$(ToolkitComponentName)
-
-
diff --git a/components/HeaderedContentControl/src/Themes/Generic.xaml b/components/HeaderedContentControl/src/Themes/Generic.xaml
deleted file mode 100644
index 99aa4b24..00000000
--- a/components/HeaderedContentControl/src/Themes/Generic.xaml
+++ /dev/null
@@ -1,9 +0,0 @@
-
-
-
-
-
-
-
diff --git a/components/HeaderedContentControl/tests/HeaderedContentControl.Tests.projitems b/components/HeaderedContentControl/tests/HeaderedContentControl.Tests.projitems
deleted file mode 100644
index aa263439..00000000
--- a/components/HeaderedContentControl/tests/HeaderedContentControl.Tests.projitems
+++ /dev/null
@@ -1,11 +0,0 @@
-
-
-
- $(MSBuildAllProjects);$(MSBuildThisFileFullPath)
- true
- 863388CB-7C3F-4CD3-8ACE-79F0BB855EFD
-
-
- HeaderedContentControlExperiment.Tests
-
-
\ No newline at end of file
diff --git a/components/HeaderedContentControl/tests/HeaderedContentControl.Tests.shproj b/components/HeaderedContentControl/tests/HeaderedContentControl.Tests.shproj
deleted file mode 100644
index 5a76a5e7..00000000
--- a/components/HeaderedContentControl/tests/HeaderedContentControl.Tests.shproj
+++ /dev/null
@@ -1,13 +0,0 @@
-
-
-
- 863388CB-7C3F-4CD3-8ACE-79F0BB855EFD
- 14.0
-
-
-
-
-
-
-
-
diff --git a/components/HeaderedContentControl/OpenSolution.bat b/components/HeaderedControls/OpenSolution.bat
similarity index 100%
rename from components/HeaderedContentControl/OpenSolution.bat
rename to components/HeaderedControls/OpenSolution.bat
diff --git a/components/HeaderedContentControl/samples/Assets/BisonBadlandsChillin.jpg b/components/HeaderedControls/samples/Assets/BisonBadlandsChillin.jpg
similarity index 100%
rename from components/HeaderedContentControl/samples/Assets/BisonBadlandsChillin.jpg
rename to components/HeaderedControls/samples/Assets/BisonBadlandsChillin.jpg
diff --git a/components/HeaderedContentControl/samples/Assets/HeaderedContentControl.png b/components/HeaderedControls/samples/Assets/HeaderedContentControl.png
similarity index 100%
rename from components/HeaderedContentControl/samples/Assets/HeaderedContentControl.png
rename to components/HeaderedControls/samples/Assets/HeaderedContentControl.png
diff --git a/components/HeaderedItemsControl/samples/Assets/HeaderedItemsControl.png b/components/HeaderedControls/samples/Assets/HeaderedItemsControl.png
similarity index 100%
rename from components/HeaderedItemsControl/samples/Assets/HeaderedItemsControl.png
rename to components/HeaderedControls/samples/Assets/HeaderedItemsControl.png
diff --git a/components/HeaderedControls/samples/Assets/HeaderedTreeView.png b/components/HeaderedControls/samples/Assets/HeaderedTreeView.png
new file mode 100644
index 00000000..997dc91c
Binary files /dev/null and b/components/HeaderedControls/samples/Assets/HeaderedTreeView.png differ
diff --git a/components/HeaderedContentControl/samples/Assets/Sunny.png b/components/HeaderedControls/samples/Assets/Sunny.png
similarity index 100%
rename from components/HeaderedContentControl/samples/Assets/Sunny.png
rename to components/HeaderedControls/samples/Assets/Sunny.png
diff --git a/components/HeaderedContentControl/samples/Dependencies.props b/components/HeaderedControls/samples/Dependencies.props
similarity index 100%
rename from components/HeaderedContentControl/samples/Dependencies.props
rename to components/HeaderedControls/samples/Dependencies.props
diff --git a/components/HeaderedControls/samples/HeaderedContentControl.md b/components/HeaderedControls/samples/HeaderedContentControl.md
new file mode 100644
index 00000000..352dbf47
--- /dev/null
+++ b/components/HeaderedControls/samples/HeaderedContentControl.md
@@ -0,0 +1,37 @@
+---
+title: HeaderedContentControl
+author: skendrot
+description: The HeaderedContentControl allows content to be displayed with a specified header.
+keywords: HeaderedContentControl, Control, headered
+dev_langs:
+ - csharp
+category: Controls
+subcategory: Layout
+discussion-id: 0
+issue-id: 0
+icon: Assets/HeaderedContentControl.png
+---
+
+The `Header` property can be any object and you can use the `HeaderTemplate` to specify a custom look to the header. Content for the HeaderedContentControl will align to the top left. This is to maintain the same functionality as the ContentControl.
+
+> [!NOTE]
+> Setting the `Background`, `BorderBrush` and `BorderThickness` properties will not have any effect on the HeaderedContentControl. This is to maintain the same functionality as the ContentControl.
+
+> [!Sample HeaderedContentControlSample]
+
+> [!Sample HeaderedContentControlTextSample]
+
+> [!Sample HeaderedContentControlImageSample]
+
+> [!Sample HeaderedContentControlComplexSample]
+
+## Syntax
+
+```xaml
+
+
+
+
+
+```
diff --git a/components/HeaderedContentControl/samples/HeaderedContentControlComplexSample.xaml b/components/HeaderedControls/samples/HeaderedContentControlComplexSample.xaml
similarity index 83%
rename from components/HeaderedContentControl/samples/HeaderedContentControlComplexSample.xaml
rename to components/HeaderedControls/samples/HeaderedContentControlComplexSample.xaml
index 5b2ce71d..0168b9e5 100644
--- a/components/HeaderedContentControl/samples/HeaderedContentControlComplexSample.xaml
+++ b/components/HeaderedControls/samples/HeaderedContentControlComplexSample.xaml
@@ -1,4 +1,4 @@
-
+
+
- HeaderedContentControl
+ HeaderedControls
diff --git a/components/HeaderedControls/samples/HeaderedItemsControl.md b/components/HeaderedControls/samples/HeaderedItemsControl.md
new file mode 100644
index 00000000..00a769b1
--- /dev/null
+++ b/components/HeaderedControls/samples/HeaderedItemsControl.md
@@ -0,0 +1,30 @@
+---
+title: HeaderedItemsControl
+author: skendrot
+description: The HeaderedItemsControl allows items to be displayed with a specified header.
+keywords: HeaderedItemsControl, Control, Layout
+dev_langs:
+ - csharp
+category: Controls
+subcategory: Layout
+discussion-id: 0
+issue-id: 0
+icon: Assets/HeaderedItemsControl.png
+---
+The `Header` property can be any object and you can use the `HeaderTemplate` to specify a custom look to the header. Similiar objects can be set for the `Footer` and `FooterTemplate`.
+
+> [!NOTE]
+> Setting the `Background`, `BorderBrush` and `BorderThickness` properties will not have any effect on the HeaderedItemsControl. This is to maintain the same functionality as the ItemsControl.
+
+> [!Sample HeaderedItemsControlSample]
+
+## Syntax
+
+```xaml
+
+
+
+
+
+```
\ No newline at end of file
diff --git a/components/HeaderedItemsControl/samples/HeaderedItemsControlSample.xaml b/components/HeaderedControls/samples/HeaderedItemsControlSample.xaml
similarity index 79%
rename from components/HeaderedItemsControl/samples/HeaderedItemsControlSample.xaml
rename to components/HeaderedControls/samples/HeaderedItemsControlSample.xaml
index e1631910..5d32d394 100644
--- a/components/HeaderedItemsControl/samples/HeaderedItemsControlSample.xaml
+++ b/components/HeaderedControls/samples/HeaderedItemsControlSample.xaml
@@ -13,10 +13,12 @@
-
@@ -25,6 +27,12 @@
Text="{Binding}" />
+
+
+
+
+ [!Sample HeaderedTreeViewSample]
+
+## Syntax
+
+```xaml
+
+
+
+
+
+```
\ No newline at end of file
diff --git a/components/HeaderedControls/samples/HeaderedTreeViewSample.xaml b/components/HeaderedControls/samples/HeaderedTreeViewSample.xaml
new file mode 100644
index 00000000..15b3aec8
--- /dev/null
+++ b/components/HeaderedControls/samples/HeaderedTreeViewSample.xaml
@@ -0,0 +1,37 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/components/HeaderedControls/samples/HeaderedTreeViewSample.xaml.cs b/components/HeaderedControls/samples/HeaderedTreeViewSample.xaml.cs
new file mode 100644
index 00000000..9098ed18
--- /dev/null
+++ b/components/HeaderedControls/samples/HeaderedTreeViewSample.xaml.cs
@@ -0,0 +1,108 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using CommunityToolkit.WinUI.Controls;
+
+namespace HeaderedItemsControlExperiment.Samples;
+
+[ToolkitSample(id: nameof(HeaderedTreeViewSample), "HeaderedTreeView", description: $"A sample for showing how to create and use a {nameof(HeaderedTreeView)} control.")]
+public sealed partial class HeaderedTreeViewSample : Page
+{
+ public HeaderedTreeViewSample()
+ {
+ this.InitializeComponent();
+ Items = GetData();
+ }
+ public ObservableCollection Items { get; }
+
+ private ObservableCollection GetData()
+ {
+ var list = new ObservableCollection();
+ ExplorerItem folder1 = new ExplorerItem()
+ {
+ Name = "Work Documents",
+ Children =
+ {
+ new ExplorerItem()
+ {
+ Name = "Functional Specifications",
+ Children =
+ {
+ new ExplorerItem()
+ {
+ Name = "TreeView spec",
+ }
+ }
+ },
+ new ExplorerItem()
+ {
+ Name = "Feature Schedule",
+ },
+ new ExplorerItem()
+ {
+ Name = "Overall Project Plan",
+ },
+ new ExplorerItem()
+ {
+ Name = "Feature Resources Allocation",
+ }
+ }
+ };
+ ExplorerItem folder2 = new ExplorerItem()
+ {
+ Name = "Personal Folder",
+ Children =
+ {
+ new ExplorerItem()
+ {
+ Name = "Home Remodel Folder",
+ Children =
+ {
+ new ExplorerItem()
+ {
+ Name = "Contractor Contact Info",
+ },
+ new ExplorerItem()
+ {
+ Name = "Paint Color Scheme",
+ },
+ new ExplorerItem()
+ {
+ Name = "Flooring Woodgrain type",
+ },
+ new ExplorerItem()
+ {
+ Name = "Kitchen Cabinet Style",
+ }
+ }
+ }
+ }
+ };
+
+ list.Add(folder1);
+ list.Add(folder2);
+ return list;
+ }
+}
+
+public class ExplorerItem
+{
+ public string? Name { get; set; }
+ private ObservableCollection? _children;
+ public ObservableCollection Children
+ {
+ get
+ {
+ if (_children == null)
+ {
+ _children = new ObservableCollection();
+ }
+ return _children;
+ }
+ set
+ {
+ _children = value;
+ }
+ }
+}
diff --git a/components/HeaderedItemsControl/src/AdditionalAssemblyInfo.cs b/components/HeaderedControls/src/AdditionalAssemblyInfo.cs
similarity index 80%
rename from components/HeaderedItemsControl/src/AdditionalAssemblyInfo.cs
rename to components/HeaderedControls/src/AdditionalAssemblyInfo.cs
index 3117b930..ea96b9e0 100644
--- a/components/HeaderedItemsControl/src/AdditionalAssemblyInfo.cs
+++ b/components/HeaderedControls/src/AdditionalAssemblyInfo.cs
@@ -7,7 +7,7 @@
// These `InternalsVisibleTo` calls are intended to make it easier for
// for any internal code to be testable in all the different test projects
// used with the Labs infrastructure.
-[assembly: InternalsVisibleTo("HeaderedItemsControl.Tests.Uwp")]
-[assembly: InternalsVisibleTo("HeaderedItemsControl.Tests.WinAppSdk")]
+[assembly: InternalsVisibleTo("HeaderedControls.Tests.Uwp")]
+[assembly: InternalsVisibleTo("HeaderedControls.Tests.WinAppSdk")]
[assembly: InternalsVisibleTo("CommunityToolkit.Tests.Uwp")]
[assembly: InternalsVisibleTo("CommunityToolkit.Tests.WinAppSdk")]
diff --git a/components/HeaderedItemsControl/src/CommunityToolkit.WinUI.Controls.HeaderedItemsControl.csproj b/components/HeaderedControls/src/CommunityToolkit.WinUI.Controls.HeaderedControls.csproj
similarity index 62%
rename from components/HeaderedItemsControl/src/CommunityToolkit.WinUI.Controls.HeaderedItemsControl.csproj
rename to components/HeaderedControls/src/CommunityToolkit.WinUI.Controls.HeaderedControls.csproj
index a4efb30c..94103446 100644
--- a/components/HeaderedItemsControl/src/CommunityToolkit.WinUI.Controls.HeaderedItemsControl.csproj
+++ b/components/HeaderedControls/src/CommunityToolkit.WinUI.Controls.HeaderedControls.csproj
@@ -1,17 +1,17 @@
- HeaderedItemsControl
- This package contains HeaderedItemsControl.
- 8.0.0-beta.1
+ HeaderedControls
+ This package contains HeaderedControls.
+ 0.0.1
- CommunityToolkit.WinUI.Controls.HeaderedItemsControlRns
+ CommunityToolkit.WinUI.Controls.HeaderedControlsRns
-
+ $(PackageIdPrefix).$(PackageIdVariant).Controls.$(ToolkitComponentName)
diff --git a/components/HeaderedContentControl/src/Dependencies.props b/components/HeaderedControls/src/Dependencies.props
similarity index 100%
rename from components/HeaderedContentControl/src/Dependencies.props
rename to components/HeaderedControls/src/Dependencies.props
diff --git a/components/HeaderedContentControl/src/HeaderedContentControl.cs b/components/HeaderedControls/src/HeaderedContentControl/HeaderedContentControl.cs
similarity index 98%
rename from components/HeaderedContentControl/src/HeaderedContentControl.cs
rename to components/HeaderedControls/src/HeaderedContentControl/HeaderedContentControl.cs
index e1affb78..86d9b08c 100644
--- a/components/HeaderedContentControl/src/HeaderedContentControl.cs
+++ b/components/HeaderedControls/src/HeaderedContentControl/HeaderedContentControl.cs
@@ -23,7 +23,7 @@ public HeaderedContentControl()
/// Identifies the dependency property.
///
public static readonly DependencyProperty HeaderProperty = DependencyProperty.Register(
- "Header",
+ nameof(Header),
typeof(object),
typeof(HeaderedContentControl),
new PropertyMetadata(null, OnHeaderChanged));
@@ -32,7 +32,7 @@ public HeaderedContentControl()
/// Identifies the dependency property.
///
public static readonly DependencyProperty HeaderTemplateProperty = DependencyProperty.Register(
- "HeaderTemplate",
+ nameof(HeaderTemplate),
typeof(DataTemplate),
typeof(HeaderedContentControl),
new PropertyMetadata(null));
diff --git a/components/HeaderedContentControl/src/HeaderedContentControl.xaml b/components/HeaderedControls/src/HeaderedContentControl/HeaderedContentControl.xaml
similarity index 96%
rename from components/HeaderedContentControl/src/HeaderedContentControl.xaml
rename to components/HeaderedControls/src/HeaderedContentControl/HeaderedContentControl.xaml
index 6f874519..e8af9d7b 100644
--- a/components/HeaderedContentControl/src/HeaderedContentControl.xaml
+++ b/components/HeaderedControls/src/HeaderedContentControl/HeaderedContentControl.xaml
@@ -3,10 +3,10 @@
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:controls="using:CommunityToolkit.WinUI.Controls">
-
-
-
+
diff --git a/components/HeaderedControls/src/HeaderedItemsControl/HeaderedItemsControl.cs b/components/HeaderedControls/src/HeaderedItemsControl/HeaderedItemsControl.cs
new file mode 100644
index 00000000..ae194529
--- /dev/null
+++ b/components/HeaderedControls/src/HeaderedItemsControl/HeaderedItemsControl.cs
@@ -0,0 +1,121 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+namespace CommunityToolkit.WinUI.Controls;
+
+///
+/// Represents a control that contains multiple items and has a header.
+///
+public partial class HeaderedItemsControl : ItemsControl
+{
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ public HeaderedItemsControl()
+ {
+ DefaultStyleKey = typeof(HeaderedItemsControl);
+ }
+
+ ///
+ /// Identifies the dependency property.
+ ///
+ public static readonly DependencyProperty FooterProperty = DependencyProperty.Register(
+ nameof(Footer),
+ typeof(object),
+ typeof(HeaderedItemsControl),
+ new PropertyMetadata(null, OnFooterChanged));
+
+ ///
+ /// Identifies the dependency property.
+ ///
+ public static readonly DependencyProperty FooterTemplateProperty = DependencyProperty.Register(
+ nameof(FooterTemplate),
+ typeof(DataTemplate),
+ typeof(HeaderedItemsControl),
+ new PropertyMetadata(null));
+
+ ///
+ /// Gets or sets the data used for the Footer of each control.
+ ///
+ public object Footer
+ {
+ get { return GetValue(FooterProperty); }
+ set { SetValue(FooterProperty, value); }
+ }
+
+ ///
+ /// Gets or sets the template used to display the content of the control's Footer.
+ ///
+ public DataTemplate FooterTemplate
+ {
+ get { return (DataTemplate)GetValue(FooterTemplateProperty); }
+ set { SetValue(FooterTemplateProperty, value); }
+ }
+
+ ///
+ /// Identifies the dependency property.
+ ///
+ public static readonly DependencyProperty HeaderProperty = DependencyProperty.Register(
+ nameof(Header),
+ typeof(object),
+ typeof(HeaderedItemsControl),
+ new PropertyMetadata(null, OnHeaderChanged));
+
+ ///
+ /// Identifies the dependency property.
+ ///
+ public static readonly DependencyProperty HeaderTemplateProperty = DependencyProperty.Register(
+ nameof(HeaderTemplate),
+ typeof(DataTemplate),
+ typeof(HeaderedItemsControl),
+ new PropertyMetadata(null));
+
+ ///
+ /// Gets or sets the data used for the header of each control.
+ ///
+ public object Header
+ {
+ get { return GetValue(HeaderProperty); }
+ set { SetValue(HeaderProperty, value); }
+ }
+
+ ///
+ /// Gets or sets the template used to display the content of the control's header.
+ ///
+ public DataTemplate HeaderTemplate
+ {
+ get { return (DataTemplate)GetValue(HeaderTemplateProperty); }
+ set { SetValue(HeaderTemplateProperty, value); }
+ }
+
+ ///
+ /// Called when the property changes.
+ ///
+ /// The old value of the property.
+ /// The new value of the property.
+ protected virtual void OnFooterChanged(object oldValue, object newValue)
+ {
+ }
+
+ private static void OnFooterChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
+ {
+ var control = (HeaderedItemsControl)d;
+ control.OnFooterChanged(e.OldValue, e.NewValue);
+ }
+
+ ///
+ /// Called when the property changes.
+ ///
+ /// The old value of the property.
+ /// The new value of the property.
+ protected virtual void OnHeaderChanged(object oldValue, object newValue)
+ {
+ }
+
+ private static void OnHeaderChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
+ {
+ var control = (HeaderedItemsControl)d;
+ control.OnHeaderChanged(e.OldValue, e.NewValue);
+ }
+}
diff --git a/components/HeaderedItemsControl/src/HeaderedItemsControl.xaml b/components/HeaderedControls/src/HeaderedItemsControl/HeaderedItemsControl.xaml
similarity index 66%
rename from components/HeaderedItemsControl/src/HeaderedItemsControl.xaml
rename to components/HeaderedControls/src/HeaderedItemsControl/HeaderedItemsControl.xaml
index 0f5c8612..79a2524f 100644
--- a/components/HeaderedItemsControl/src/HeaderedItemsControl.xaml
+++ b/components/HeaderedControls/src/HeaderedItemsControl/HeaderedItemsControl.xaml
@@ -3,24 +3,24 @@
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:controls="using:CommunityToolkit.WinUI.Controls">
-
+
diff --git a/components/HeaderedControls/src/HeaderedTreeView/HeaderedTreeView.cs b/components/HeaderedControls/src/HeaderedTreeView/HeaderedTreeView.cs
new file mode 100644
index 00000000..b6f9e8a1
--- /dev/null
+++ b/components/HeaderedControls/src/HeaderedTreeView/HeaderedTreeView.cs
@@ -0,0 +1,126 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using TreeView = Microsoft.UI.Xaml.Controls.TreeView;
+
+namespace CommunityToolkit.WinUI.Controls;
+
+///
+/// Represents a and has a header.
+///
+public partial class HeaderedTreeView : TreeView
+{
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ public HeaderedTreeView()
+ {
+ DefaultStyleKey = typeof(HeaderedTreeView);
+
+ // Workaround for https://github.com/microsoft/microsoft-ui-xaml/issues/3502
+ this.DefaultStyleResourceUri = new Uri("ms-appx:///CommunityToolkit.WinUI.Controls.HeaderedControls/Themes/Generic.xaml");
+ }
+
+ ///
+ /// Identifies the dependency property.
+ ///
+ public static readonly DependencyProperty FooterProperty = DependencyProperty.Register(
+ nameof(Footer),
+ typeof(object),
+ typeof(HeaderedTreeView),
+ new PropertyMetadata(null, OnFooterChanged));
+
+ ///
+ /// Identifies the dependency property.
+ ///
+ public static readonly DependencyProperty FooterTemplateProperty = DependencyProperty.Register(
+ nameof(FooterTemplate),
+ typeof(DataTemplate),
+ typeof(HeaderedTreeView),
+ new PropertyMetadata(null));
+
+ ///
+ /// Gets or sets the data used for the Footer of each control.
+ ///
+ public object Footer
+ {
+ get { return GetValue(FooterProperty); }
+ set { SetValue(FooterProperty, value); }
+ }
+
+ ///
+ /// Gets or sets the template used to display the content of the control's Footer.
+ ///
+ public DataTemplate FooterTemplate
+ {
+ get { return (DataTemplate)GetValue(FooterTemplateProperty); }
+ set { SetValue(FooterTemplateProperty, value); }
+ }
+
+ ///
+ /// Identifies the dependency property.
+ ///
+ public static readonly DependencyProperty HeaderProperty = DependencyProperty.Register(
+ nameof(Header),
+ typeof(object),
+ typeof(HeaderedTreeView),
+ new PropertyMetadata(null, OnHeaderChanged));
+
+ ///
+ /// Identifies the dependency property.
+ ///
+ public static readonly DependencyProperty HeaderTemplateProperty = DependencyProperty.Register(
+ nameof(HeaderTemplate),
+ typeof(DataTemplate),
+ typeof(HeaderedTreeView),
+ new PropertyMetadata(null));
+
+ ///
+ /// Gets or sets the data used for the header of each control.
+ ///
+ public object Header
+ {
+ get { return GetValue(HeaderProperty); }
+ set { SetValue(HeaderProperty, value); }
+ }
+
+ ///
+ /// Gets or sets the template used to display the content of the control's header.
+ ///
+ public DataTemplate HeaderTemplate
+ {
+ get { return (DataTemplate)GetValue(HeaderTemplateProperty); }
+ set { SetValue(HeaderTemplateProperty, value); }
+ }
+
+ ///
+ /// Called when the property changes.
+ ///
+ /// The old value of the property.
+ /// The new value of the property.
+ protected virtual void OnFooterChanged(object oldValue, object newValue)
+ {
+ }
+
+ private static void OnFooterChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
+ {
+ var control = (HeaderedTreeView)d;
+ control.OnFooterChanged(e.OldValue, e.NewValue);
+ }
+
+ ///
+ /// Called when the property changes.
+ ///
+ /// The old value of the property.
+ /// The new value of the property.
+ protected virtual void OnHeaderChanged(object oldValue, object newValue)
+ {
+ }
+
+ private static void OnHeaderChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
+ {
+ var control = (HeaderedTreeView)d;
+ control.OnHeaderChanged(e.OldValue, e.NewValue);
+ }
+}
\ No newline at end of file
diff --git a/components/HeaderedControls/src/HeaderedTreeView/HeaderedTreeView.xaml b/components/HeaderedControls/src/HeaderedTreeView/HeaderedTreeView.xaml
new file mode 100644
index 00000000..401eaf54
--- /dev/null
+++ b/components/HeaderedControls/src/HeaderedTreeView/HeaderedTreeView.xaml
@@ -0,0 +1,46 @@
+
+
+
+
+
+
+
diff --git a/components/HeaderedContentControl/src/MultiTarget.props b/components/HeaderedControls/src/MultiTarget.props
similarity index 100%
rename from components/HeaderedContentControl/src/MultiTarget.props
rename to components/HeaderedControls/src/MultiTarget.props
diff --git a/components/HeaderedItemsControl/src/Themes/Generic.xaml b/components/HeaderedControls/src/Themes/Generic.xaml
similarity index 52%
rename from components/HeaderedItemsControl/src/Themes/Generic.xaml
rename to components/HeaderedControls/src/Themes/Generic.xaml
index 3add0105..7381d438 100644
--- a/components/HeaderedItemsControl/src/Themes/Generic.xaml
+++ b/components/HeaderedControls/src/Themes/Generic.xaml
@@ -3,7 +3,9 @@
xmlns:controls="using:CommunityToolkit.WinUI.Controls">
-
+
+
+
diff --git a/components/HeaderedControls/tests/HeaderedContentControlTestClass.cs b/components/HeaderedControls/tests/HeaderedContentControlTestClass.cs
new file mode 100644
index 00000000..56329212
--- /dev/null
+++ b/components/HeaderedControls/tests/HeaderedContentControlTestClass.cs
@@ -0,0 +1,104 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+using CommunityToolkit.Tests;
+using CommunityToolkit.WinUI.Controls;
+using CommunityToolkit.Tooling.TestGen;
+
+namespace HeaderedControls.Tests;
+
+[TestClass]
+public partial class HeaderedContentControlTestClass : VisualUITestBase
+{
+ // If you don't need access to UI objects directly or async code, use this pattern.
+ [TestMethod]
+ public void SimpleSynchronousExampleTest()
+ {
+ var assembly = typeof(HeaderedContentControl).Assembly;
+ var type = assembly.GetType(typeof(HeaderedContentControl).FullName ?? string.Empty);
+
+ Assert.IsNotNull(type, "Could not find HeaderedContentControl type.");
+ Assert.AreEqual(typeof(HeaderedContentControl), type, "Type of HeaderedContentControl does not match expected type.");
+ }
+
+ // The UIThreadTestMethod can also easily grab a XAML Page for us by passing its type as a parameter.
+ // This lets us actually test a control as it would behave within an actual application.
+ // The page will already be loaded by the time your test is called.
+ [UIThreadTestMethod]
+ public void SimpleUIExamplePageTest(HeaderedContentControlTestPage page)
+ {
+ // You can use the Toolkit Visual Tree helpers here to find the component by type or name:
+ var component = page.FindDescendant();
+
+ Assert.IsNotNull(component);
+
+ var componentByName = page.FindDescendant("HeaderedContentControl");
+
+ Assert.IsNotNull(componentByName);
+ }
+
+ // You can still do async work with a UIThreadTestMethod as well.
+ [UIThreadTestMethod]
+ public async Task SimpleAsyncUIExamplePageTest(HeaderedContentControlTestPage page)
+ {
+ // This helper can be used to wait for a rendering pass to complete.
+ await CompositionTargetHelper.ExecuteAfterCompositionRenderingAsync(() => { });
+
+ var component = page.FindDescendant();
+
+ Assert.IsNotNull(component);
+ }
+
+ //// ----------------------------- ADVANCED TEST SCENARIOS -----------------------------
+
+ // If you need to use DataRow, you can use this pattern with the UI dispatch still.
+ // Otherwise, checkout the UIThreadTestMethod attribute above.
+ // See https://github.com/CommunityToolkit/Labs-Windows/issues/186
+ [TestMethod]
+ public async Task ComplexAsyncUIExampleTest()
+ {
+ await EnqueueAsync(() =>
+ {
+ var component = new HeaderedContentControl();
+ Assert.IsNotNull(component);
+ });
+ }
+
+ // If you want to load other content not within a XAML page using the UIThreadTestMethod above.
+ // Then you can do that using the Load/UnloadTestContentAsync methods.
+ [TestMethod]
+ public async Task ComplexAsyncLoadUIExampleTest()
+ {
+ await EnqueueAsync(async () =>
+ {
+ var component = new HeaderedContentControl();
+ Assert.IsNotNull(component);
+ Assert.IsFalse(component.IsLoaded);
+
+ await LoadTestContentAsync(component);
+
+ Assert.IsTrue(component.IsLoaded);
+
+ await UnloadTestContentAsync(component);
+
+ Assert.IsFalse(component.IsLoaded);
+ });
+ }
+
+ // You can still use the UIThreadTestMethod to remove the extra layer for the dispatcher as well:
+ [UIThreadTestMethod]
+ public async Task ComplexAsyncLoadUIExampleWithoutDispatcherTest()
+ {
+ var component = new HeaderedContentControl();
+ Assert.IsNotNull(component);
+ Assert.IsFalse(component.IsLoaded);
+
+ await LoadTestContentAsync(component);
+
+ Assert.IsTrue(component.IsLoaded);
+
+ await UnloadTestContentAsync(component);
+
+ Assert.IsFalse(component.IsLoaded);
+ }
+}
diff --git a/components/HeaderedControls/tests/HeaderedContentControlTestPage.xaml b/components/HeaderedControls/tests/HeaderedContentControlTestPage.xaml
new file mode 100644
index 00000000..4ea1a6cc
--- /dev/null
+++ b/components/HeaderedControls/tests/HeaderedContentControlTestPage.xaml
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
+
diff --git a/components/HeaderedControls/tests/HeaderedContentControlTestPage.xaml.cs b/components/HeaderedControls/tests/HeaderedContentControlTestPage.xaml.cs
new file mode 100644
index 00000000..53bb001a
--- /dev/null
+++ b/components/HeaderedControls/tests/HeaderedContentControlTestPage.xaml.cs
@@ -0,0 +1,16 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+namespace HeaderedControls.Tests;
+
+///
+/// An empty page that can be used on its own or navigated to within a Frame.
+///
+public sealed partial class HeaderedContentControlTestPage : Page
+{
+ public HeaderedContentControlTestPage()
+ {
+ this.InitializeComponent();
+ }
+}
diff --git a/components/HeaderedControls/tests/HeaderedControls.Tests.projitems b/components/HeaderedControls/tests/HeaderedControls.Tests.projitems
new file mode 100644
index 00000000..27aec599
--- /dev/null
+++ b/components/HeaderedControls/tests/HeaderedControls.Tests.projitems
@@ -0,0 +1,39 @@
+
+
+
+ $(MSBuildAllProjects);$(MSBuildThisFileFullPath)
+ true
+ 26383DFF-4962-4C54-B444-B170B62D7252
+
+
+ HeaderedControlsExperiment.Tests
+
+
+
+
+ HeaderedContentControlTestPage.xaml
+
+
+
+ HeaderedItemsControlTestPage.xaml
+
+
+
+ HeaderedTreeViewTestPage.xaml
+
+
+
+
+ Designer
+ MSBuild:Compile
+
+
+ Designer
+ MSBuild:Compile
+
+
+ Designer
+ MSBuild:Compile
+
+
+
\ No newline at end of file
diff --git a/components/HeaderedItemsControl/tests/HeaderedItemsControl.Tests.shproj b/components/HeaderedControls/tests/HeaderedControls.Tests.shproj
similarity index 86%
rename from components/HeaderedItemsControl/tests/HeaderedItemsControl.Tests.shproj
rename to components/HeaderedControls/tests/HeaderedControls.Tests.shproj
index 1689e6b6..ddac55fd 100644
--- a/components/HeaderedItemsControl/tests/HeaderedItemsControl.Tests.shproj
+++ b/components/HeaderedControls/tests/HeaderedControls.Tests.shproj
@@ -1,13 +1,13 @@
- D693442A-E55C-4414-AC45-C5631BCD35F9
+ 26383DFF-4962-4C54-B444-B170B62D725214.0
-
+
diff --git a/components/HeaderedControls/tests/HeaderedItemsControlTestClass.cs b/components/HeaderedControls/tests/HeaderedItemsControlTestClass.cs
new file mode 100644
index 00000000..d7213490
--- /dev/null
+++ b/components/HeaderedControls/tests/HeaderedItemsControlTestClass.cs
@@ -0,0 +1,112 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+using CommunityToolkit.Tests;
+using CommunityToolkit.WinUI.Controls;
+using CommunityToolkit.Tooling.TestGen;
+
+namespace HeaderedControls.Tests;
+
+[TestClass]
+public partial class HeaderedItemsControlTestClass : VisualUITestBase
+{
+ // If you don't need access to UI objects directly or async code, use this pattern.
+ [TestMethod]
+ public void SimpleSynchronousExampleTest()
+ {
+ var assembly = typeof(HeaderedItemsControl).Assembly;
+ var type = assembly.GetType(typeof(HeaderedItemsControl).FullName ?? string.Empty);
+
+ Assert.IsNotNull(type, "Could not find HeaderedItemsControl type.");
+ Assert.AreEqual(typeof(HeaderedItemsControl), type, "Type of HeaderedItemsControl does not match expected type.");
+ }
+
+ // The UIThreadTestMethod automatically dispatches to the UI for us to work with UI objects.
+ [UIThreadTestMethod]
+ public void SimpleUIAttributeExampleTest()
+ {
+ var component = new HeaderedItemsControl();
+ Assert.IsNotNull(component);
+ }
+
+ // The UIThreadTestMethod can also easily grab a XAML Page for us by passing its type as a parameter.
+ // This lets us actually test a control as it would behave within an actual application.
+ // The page will already be loaded by the time your test is called.
+ [UIThreadTestMethod]
+ public void SimpleUIExamplePageTest(HeaderedItemsControlTestPage page)
+ {
+ // You can use the Toolkit Visual Tree helpers here to find the component by type or name:
+ var component = page.FindDescendant();
+
+ Assert.IsNotNull(component);
+
+ var componentByName = page.FindDescendant("HeaderedItemsControl");
+
+ Assert.IsNotNull(componentByName);
+ }
+
+ // You can still do async work with a UIThreadTestMethod as well.
+ [UIThreadTestMethod]
+ public async Task SimpleAsyncUIExamplePageTest(HeaderedItemsControlTestPage page)
+ {
+ // This helper can be used to wait for a rendering pass to complete.
+ await CompositionTargetHelper.ExecuteAfterCompositionRenderingAsync(() => { });
+
+ var component = page.FindDescendant();
+
+ Assert.IsNotNull(component);
+ }
+
+ //// ----------------------------- ADVANCED TEST SCENARIOS -----------------------------
+
+ // If you need to use DataRow, you can use this pattern with the UI dispatch still.
+ // Otherwise, checkout the UIThreadTestMethod attribute above.
+ // See https://github.com/CommunityToolkit/Labs-Windows/issues/186
+ [TestMethod]
+ public async Task ComplexAsyncUIExampleTest()
+ {
+ await EnqueueAsync(() =>
+ {
+ var component = new HeaderedItemsControl();
+ Assert.IsNotNull(component);
+ });
+ }
+
+ // If you want to load other content not within a XAML page using the UIThreadTestMethod above.
+ // Then you can do that using the Load/UnloadTestContentAsync methods.
+ [TestMethod]
+ public async Task ComplexAsyncLoadUIExampleTest()
+ {
+ await EnqueueAsync(async () =>
+ {
+ var component = new HeaderedItemsControl();
+ Assert.IsNotNull(component);
+ Assert.IsFalse(component.IsLoaded);
+
+ await LoadTestContentAsync(component);
+
+ Assert.IsTrue(component.IsLoaded);
+
+ await UnloadTestContentAsync(component);
+
+ Assert.IsFalse(component.IsLoaded);
+ });
+ }
+
+ // You can still use the UIThreadTestMethod to remove the extra layer for the dispatcher as well:
+ [UIThreadTestMethod]
+ public async Task ComplexAsyncLoadUIExampleWithoutDispatcherTest()
+ {
+ var component = new HeaderedItemsControl();
+ Assert.IsNotNull(component);
+ Assert.IsFalse(component.IsLoaded);
+
+ await LoadTestContentAsync(component);
+
+ Assert.IsTrue(component.IsLoaded);
+
+ await UnloadTestContentAsync(component);
+
+ Assert.IsFalse(component.IsLoaded);
+ }
+}
diff --git a/components/HeaderedControls/tests/HeaderedItemsControlTestPage.xaml b/components/HeaderedControls/tests/HeaderedItemsControlTestPage.xaml
new file mode 100644
index 00000000..3da66b2e
--- /dev/null
+++ b/components/HeaderedControls/tests/HeaderedItemsControlTestPage.xaml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
diff --git a/components/HeaderedControls/tests/HeaderedItemsControlTestPage.xaml.cs b/components/HeaderedControls/tests/HeaderedItemsControlTestPage.xaml.cs
new file mode 100644
index 00000000..81225a69
--- /dev/null
+++ b/components/HeaderedControls/tests/HeaderedItemsControlTestPage.xaml.cs
@@ -0,0 +1,16 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+namespace HeaderedControls.Tests;
+
+///
+/// An empty page that can be used on its own or navigated to within a Frame.
+///
+public sealed partial class HeaderedItemsControlTestPage : Page
+{
+ public HeaderedItemsControlTestPage()
+ {
+ this.InitializeComponent();
+ }
+}
diff --git a/components/HeaderedControls/tests/HeaderedTreeViewTestClass.cs b/components/HeaderedControls/tests/HeaderedTreeViewTestClass.cs
new file mode 100644
index 00000000..61caf983
--- /dev/null
+++ b/components/HeaderedControls/tests/HeaderedTreeViewTestClass.cs
@@ -0,0 +1,112 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+using CommunityToolkit.Tests;
+using CommunityToolkit.WinUI.Controls;
+using CommunityToolkit.Tooling.TestGen;
+
+namespace HeaderedControls.Tests;
+
+[TestClass]
+public partial class HeaderedTreeViewTestClass : VisualUITestBase
+{
+ // If you don't need access to UI objects directly or async code, use this pattern.
+ [TestMethod]
+ public void SimpleSynchronousExampleTest()
+ {
+ var assembly = typeof(HeaderedTreeView).Assembly;
+ var type = assembly.GetType(typeof(HeaderedTreeView).FullName ?? string.Empty);
+
+ Assert.IsNotNull(type, "Could not find HeaderedTreeView type.");
+ Assert.AreEqual(typeof(HeaderedTreeView), type, "Type of HeaderedTreeView does not match expected type.");
+ }
+
+ // The UIThreadTestMethod automatically dispatches to the UI for us to work with UI objects.
+ [UIThreadTestMethod]
+ public void SimpleUIAttributeExampleTest()
+ {
+ var component = new HeaderedTreeView();
+ Assert.IsNotNull(component);
+ }
+
+ // The UIThreadTestMethod can also easily grab a XAML Page for us by passing its type as a parameter.
+ // This lets us actually test a control as it would behave within an actual application.
+ // The page will already be loaded by the time your test is called.
+ [UIThreadTestMethod]
+ public void SimpleUIExamplePageTest(HeaderedTreeViewTestPage page)
+ {
+ // You can use the Toolkit Visual Tree helpers here to find the component by type or name:
+ var component = page.FindDescendant();
+
+ Assert.IsNotNull(component);
+
+ var componentByName = page.FindDescendant("HeaderedTreeView");
+
+ Assert.IsNotNull(componentByName);
+ }
+
+ // You can still do async work with a UIThreadTestMethod as well.
+ [UIThreadTestMethod]
+ public async Task SimpleAsyncUIExamplePageTest(HeaderedTreeViewTestPage page)
+ {
+ // This helper can be used to wait for a rendering pass to complete.
+ await CompositionTargetHelper.ExecuteAfterCompositionRenderingAsync(() => { });
+
+ var component = page.FindDescendant();
+
+ Assert.IsNotNull(component);
+ }
+
+ //// ----------------------------- ADVANCED TEST SCENARIOS -----------------------------
+
+ // If you need to use DataRow, you can use this pattern with the UI dispatch still.
+ // Otherwise, checkout the UIThreadTestMethod attribute above.
+ // See https://github.com/CommunityToolkit/Labs-Windows/issues/186
+ [TestMethod]
+ public async Task ComplexAsyncUIExampleTest()
+ {
+ await EnqueueAsync(() =>
+ {
+ var component = new HeaderedTreeView();
+ Assert.IsNotNull(component);
+ });
+ }
+
+ // If you want to load other content not within a XAML page using the UIThreadTestMethod above.
+ // Then you can do that using the Load/UnloadTestContentAsync methods.
+ [TestMethod]
+ public async Task ComplexAsyncLoadUIExampleTest()
+ {
+ await EnqueueAsync(async () =>
+ {
+ var component = new HeaderedTreeView();
+ Assert.IsNotNull(component);
+ Assert.IsFalse(component.IsLoaded);
+
+ await LoadTestContentAsync(component);
+
+ Assert.IsTrue(component.IsLoaded);
+
+ await UnloadTestContentAsync(component);
+
+ Assert.IsFalse(component.IsLoaded);
+ });
+ }
+
+ // You can still use the UIThreadTestMethod to remove the extra layer for the dispatcher as well:
+ [UIThreadTestMethod]
+ public async Task ComplexAsyncLoadUIExampleWithoutDispatcherTest()
+ {
+ var component = new HeaderedTreeView();
+ Assert.IsNotNull(component);
+ Assert.IsFalse(component.IsLoaded);
+
+ await LoadTestContentAsync(component);
+
+ Assert.IsTrue(component.IsLoaded);
+
+ await UnloadTestContentAsync(component);
+
+ Assert.IsFalse(component.IsLoaded);
+ }
+}
diff --git a/components/HeaderedControls/tests/HeaderedTreeViewTestPage.xaml b/components/HeaderedControls/tests/HeaderedTreeViewTestPage.xaml
new file mode 100644
index 00000000..08ebaabb
--- /dev/null
+++ b/components/HeaderedControls/tests/HeaderedTreeViewTestPage.xaml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
diff --git a/components/HeaderedControls/tests/HeaderedTreeViewTestPage.xaml.cs b/components/HeaderedControls/tests/HeaderedTreeViewTestPage.xaml.cs
new file mode 100644
index 00000000..4d5274aa
--- /dev/null
+++ b/components/HeaderedControls/tests/HeaderedTreeViewTestPage.xaml.cs
@@ -0,0 +1,16 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+namespace HeaderedControls.Tests;
+
+///
+/// An empty page that can be used on its own or navigated to within a Frame.
+///
+public sealed partial class HeaderedTreeViewTestPage : Page
+{
+ public HeaderedTreeViewTestPage()
+ {
+ this.InitializeComponent();
+ }
+}
diff --git a/components/HeaderedItemsControl/OpenSolution.bat b/components/HeaderedItemsControl/OpenSolution.bat
deleted file mode 100644
index 814a56d4..00000000
--- a/components/HeaderedItemsControl/OpenSolution.bat
+++ /dev/null
@@ -1,3 +0,0 @@
-@ECHO OFF
-
-powershell ..\..\tooling\ProjectHeads\GenerateSingleSampleHeads.ps1 -componentPath %CD% %*
\ No newline at end of file
diff --git a/components/HeaderedItemsControl/samples/Dependencies.props b/components/HeaderedItemsControl/samples/Dependencies.props
deleted file mode 100644
index e622e1df..00000000
--- a/components/HeaderedItemsControl/samples/Dependencies.props
+++ /dev/null
@@ -1,31 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/components/HeaderedItemsControl/samples/HeaderedItemsControl.Samples.csproj b/components/HeaderedItemsControl/samples/HeaderedItemsControl.Samples.csproj
deleted file mode 100644
index 28d68742..00000000
--- a/components/HeaderedItemsControl/samples/HeaderedItemsControl.Samples.csproj
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
- HeaderedItemsControl
-
-
-
-
-
diff --git a/components/HeaderedItemsControl/samples/HeaderedItemsControl.md b/components/HeaderedItemsControl/samples/HeaderedItemsControl.md
deleted file mode 100644
index f952cb09..00000000
--- a/components/HeaderedItemsControl/samples/HeaderedItemsControl.md
+++ /dev/null
@@ -1,71 +0,0 @@
----
-title: HeaderedItemsControl
-author: skendrot
-description: The HeaderedItemsControl allows items to be displayed with a specified header.
-keywords: HeaderedItemsControl, Control, Layout
-dev_langs:
- - csharp
-category: Controls
-subcategory: Layout
-discussion-id: 0
-issue-id: 0
-icon: Assets/HeaderedItemsControl.png
----
-The `Header` property can be any object and you can use the `HeaderTemplate` to specify a custom look to the header.
-
-> [!NOTE]
-> Setting the `Background`, `BorderBrush` and `BorderThickness` properties will not have any effect on the HeaderedItemsControl. This is to maintain the same functionality as the ItemsControl.
-
-> [!Sample HeaderedItemsControlSample]
-
-## Syntax
-
-```xaml
-
-
-
-
-
-```
-
-
-## Properties
-
-| Property | Type | Gets or sets the data used for the header of each control |
-| -- | -- | -- |
-| Header | object | Gets or sets the data used for the header of each control |
-| HeaderTemplate | DataTemplate | Gets or sets the template used to display the content of the control's header |
-| Orientation | Orientation | Gets or sets the Orientation to use for layout of the header. If set to Vertical the Header will be above the items. If set to Horizontal the Header will be to the left of the items. |
-
-### Examples
-
-- The `Header` property can be set to a string, or any xaml elements. If binding the `Header` to an object that is not a string, use the `HeaderTemplate` to control how the content is rendered.
-
- *Sample Code*
-
- ```xaml
-
-
-
-
-
-
-
-
-
- ```
-
-- Used to control the look of the header. The default value for the `HeaderTemplate` will display the string representation of the `Header`. Set this property if you need to bind the `Header` to an object.
-
- *Sample Code*
-
- ```xaml
-
-
-
-
-
-
-
- ```
diff --git a/components/HeaderedItemsControl/src/Dependencies.props b/components/HeaderedItemsControl/src/Dependencies.props
deleted file mode 100644
index e622e1df..00000000
--- a/components/HeaderedItemsControl/src/Dependencies.props
+++ /dev/null
@@ -1,31 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/components/HeaderedItemsControl/src/HeaderedItemsControl.cs b/components/HeaderedItemsControl/src/HeaderedItemsControl.cs
deleted file mode 100644
index 15326467..00000000
--- a/components/HeaderedItemsControl/src/HeaderedItemsControl.cs
+++ /dev/null
@@ -1,93 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-// See the LICENSE file in the project root for more information.
-
-namespace CommunityToolkit.WinUI.Controls
-{
- ///
- /// Represents a control that contains multiple items and has a header.
- ///
- public partial class HeaderedItemsControl : ItemsControl
- {
- ///
- /// Initializes a new instance of the class.
- ///
- public HeaderedItemsControl()
- {
- DefaultStyleKey = typeof(HeaderedItemsControl);
- }
-
- ///
- /// Identifies the dependency property.
- ///
- public static readonly DependencyProperty HeaderProperty = DependencyProperty.Register(
- "Header",
- typeof(object),
- typeof(HeaderedItemsControl),
- new PropertyMetadata(null, OnHeaderChanged));
-
- ///
- /// Identifies the dependency property.
- ///
- public static readonly DependencyProperty HeaderTemplateProperty = DependencyProperty.Register(
- "HeaderTemplate",
- typeof(DataTemplate),
- typeof(HeaderedItemsControl),
- new PropertyMetadata(null));
-
- ///
- /// Identifies the dependency property.
- ///
- public static readonly DependencyProperty OrientationProperty = DependencyProperty.Register(
- nameof(Orientation),
- typeof(Orientation),
- typeof(HeaderedItemsControl),
- new PropertyMetadata(Orientation.Vertical));
-
- ///
- /// Gets or sets the data used for the header of each control.
- ///
- public object Header
- {
- get { return GetValue(HeaderProperty); }
- set { SetValue(HeaderProperty, value); }
- }
-
- ///
- /// Gets or sets the template used to display the content of the control's header.
- ///
- public DataTemplate HeaderTemplate
- {
- get { return (DataTemplate)GetValue(HeaderTemplateProperty); }
- set { SetValue(HeaderTemplateProperty, value); }
- }
-
- ///
- /// Gets or sets the used for the header.
- ///
- ///
- /// If set to the header will be above the content.
- /// If set to the header will be to the left of the content.
- ///
- public Orientation Orientation
- {
- get { return (Orientation)GetValue(OrientationProperty); }
- set { SetValue(OrientationProperty, value); }
- }
-
- ///
- /// Called when the property changes.
- ///
- /// The old value of the property.
- /// The new value of the property.
- protected virtual void OnHeaderChanged(object oldValue, object newValue)
- {
- }
-
- private static void OnHeaderChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
- {
- var control = (HeaderedItemsControl)d;
- control.OnHeaderChanged(e.OldValue, e.NewValue);
- }
- }
-}
diff --git a/components/HeaderedItemsControl/src/MultiTarget.props b/components/HeaderedItemsControl/src/MultiTarget.props
deleted file mode 100644
index b11c1942..00000000
--- a/components/HeaderedItemsControl/src/MultiTarget.props
+++ /dev/null
@@ -1,9 +0,0 @@
-
-
-
- uwp;wasdk;wpf;wasm;linuxgtk;macos;ios;android;
-
-
\ No newline at end of file
diff --git a/components/HeaderedItemsControl/tests/HeaderedItemsControl.Tests.projitems b/components/HeaderedItemsControl/tests/HeaderedItemsControl.Tests.projitems
deleted file mode 100644
index 2e1a786b..00000000
--- a/components/HeaderedItemsControl/tests/HeaderedItemsControl.Tests.projitems
+++ /dev/null
@@ -1,11 +0,0 @@
-
-
-
- $(MSBuildAllProjects);$(MSBuildThisFileFullPath)
- true
- D693442A-E55C-4414-AC45-C5631BCD35F9
-
-
- HeaderedItemsControlExperiment.Tests
-
-
\ No newline at end of file