diff --git a/Microsoft.Toolkit.Uwp.SampleApp/App.xaml b/Microsoft.Toolkit.Uwp.SampleApp/App.xaml
index f7b74b15f8d..37bc22cada3 100644
--- a/Microsoft.Toolkit.Uwp.SampleApp/App.xaml
+++ b/Microsoft.Toolkit.Uwp.SampleApp/App.xaml
@@ -4,25 +4,25 @@
xmlns:converters="using:Microsoft.Toolkit.Uwp.UI.Converters"
RequiresPointerMode="Auto">
-
-
-
-
-
-
+
+
+
+
+
+
-
-
-
+
+
+
-
-
+
+
-
+
-
-
-
+
+
+
\ No newline at end of file
diff --git a/Microsoft.Toolkit.Uwp.SampleApp/Microsoft.Toolkit.Uwp.SampleApp.csproj b/Microsoft.Toolkit.Uwp.SampleApp/Microsoft.Toolkit.Uwp.SampleApp.csproj
index c7acab21bfa..6b37565291a 100644
--- a/Microsoft.Toolkit.Uwp.SampleApp/Microsoft.Toolkit.Uwp.SampleApp.csproj
+++ b/Microsoft.Toolkit.Uwp.SampleApp/Microsoft.Toolkit.Uwp.SampleApp.csproj
@@ -272,6 +272,7 @@
+
@@ -515,6 +516,9 @@
FocusBehaviorPage.xaml
+
+ TabbedCommandBarPage.xaml
+
TilesBrushPage.xaml
@@ -1001,6 +1005,14 @@
MSBuild:Compile
Designer
+
+ Designer
+ MSBuild:Compile
+
+
+ Designer
+ MSBuild:Compile
+
MSBuild:Compile
Designer
diff --git a/Microsoft.Toolkit.Uwp.SampleApp/SamplePages/TabbedCommandBar/TabbedCommandBar.bind b/Microsoft.Toolkit.Uwp.SampleApp/SamplePages/TabbedCommandBar/TabbedCommandBar.bind
new file mode 100644
index 00000000000..690e3e93bd7
--- /dev/null
+++ b/Microsoft.Toolkit.Uwp.SampleApp/SamplePages/TabbedCommandBar/TabbedCommandBar.bind
@@ -0,0 +1,83 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Microsoft.Toolkit.Uwp.SampleApp/SamplePages/TabbedCommandBar/TabbedCommandBar.png b/Microsoft.Toolkit.Uwp.SampleApp/SamplePages/TabbedCommandBar/TabbedCommandBar.png
new file mode 100644
index 00000000000..9761391a31c
Binary files /dev/null and b/Microsoft.Toolkit.Uwp.SampleApp/SamplePages/TabbedCommandBar/TabbedCommandBar.png differ
diff --git a/Microsoft.Toolkit.Uwp.SampleApp/SamplePages/TabbedCommandBar/TabbedCommandBarPage.xaml b/Microsoft.Toolkit.Uwp.SampleApp/SamplePages/TabbedCommandBar/TabbedCommandBarPage.xaml
new file mode 100644
index 00000000000..43c51189031
--- /dev/null
+++ b/Microsoft.Toolkit.Uwp.SampleApp/SamplePages/TabbedCommandBar/TabbedCommandBarPage.xaml
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
+
diff --git a/Microsoft.Toolkit.Uwp.SampleApp/SamplePages/TabbedCommandBar/TabbedCommandBarPage.xaml.cs b/Microsoft.Toolkit.Uwp.SampleApp/SamplePages/TabbedCommandBar/TabbedCommandBarPage.xaml.cs
new file mode 100644
index 00000000000..77e088b3dc4
--- /dev/null
+++ b/Microsoft.Toolkit.Uwp.SampleApp/SamplePages/TabbedCommandBar/TabbedCommandBarPage.xaml.cs
@@ -0,0 +1,30 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Runtime.InteropServices.WindowsRuntime;
+using Windows.Foundation;
+using Windows.Foundation.Collections;
+using Windows.UI.Xaml;
+using Windows.UI.Xaml.Controls;
+using Windows.UI.Xaml.Controls.Primitives;
+using Windows.UI.Xaml.Data;
+using Windows.UI.Xaml.Input;
+using Windows.UI.Xaml.Media;
+using Windows.UI.Xaml.Navigation;
+
+// The Blank Page item template is documented at https://go.microsoft.com/fwlink/?LinkId=234238
+
+namespace Microsoft.Toolkit.Uwp.SampleApp.SamplePages
+{
+ ///
+ /// An empty page that can be used on its own or navigated to within a Frame.
+ ///
+ public sealed partial class TabbedCommandBarPage : Page
+ {
+ public TabbedCommandBarPage()
+ {
+ this.InitializeComponent();
+ }
+ }
+}
diff --git a/Microsoft.Toolkit.Uwp.SampleApp/SamplePages/samples.json b/Microsoft.Toolkit.Uwp.SampleApp/SamplePages/samples.json
index 1a5c5303b40..4eabf24be86 100644
--- a/Microsoft.Toolkit.Uwp.SampleApp/SamplePages/samples.json
+++ b/Microsoft.Toolkit.Uwp.SampleApp/SamplePages/samples.json
@@ -433,6 +433,16 @@
"XamlCodeFile": "TokenizingTextBoxXaml.bind",
"Icon": "/SamplePages/TokenizingTextBox/TokenizingTextBox.png",
"DocumentationUrl": "https://raw.githubusercontent.com/MicrosoftDocs/WindowsCommunityToolkitDocs/master/docs/controls/TokenizingTextBox.md"
+ },
+ {
+ "Name": "TabbedCommandBar",
+ "Type": "TabbedCommandBarPage",
+ "Subcategory": "Layout",
+ "About": "A control for displaying multiple CommandBars in the same space, like Microsoft Office's ribbon.",
+ "CodeUrl": "https://github.com/windows-toolkit/WindowsCommunityToolkit/tree/master/Microsoft.Toolkit.Uwp.UI.Controls/TabbedCommandBar",
+ "XamlCodeFile": "TabbedCommandBar.bind",
+ "Icon": "/SamplePages/TabbedCommandBar/TabbedCommandBar.png",
+ "DocumentationUrl": "https://raw.githubusercontent.com/MicrosoftDocs/WindowsCommunityToolkitDocs/master/docs/controls/TabbedCommandBar.md"
}
]
},
diff --git a/Microsoft.Toolkit.Uwp.UI.Controls.Design/Microsoft.Toolkit.Uwp.UI.Controls.Design.csproj b/Microsoft.Toolkit.Uwp.UI.Controls.Design/Microsoft.Toolkit.Uwp.UI.Controls.Design.csproj
index 1201d323388..ada3759c203 100644
--- a/Microsoft.Toolkit.Uwp.UI.Controls.Design/Microsoft.Toolkit.Uwp.UI.Controls.Design.csproj
+++ b/Microsoft.Toolkit.Uwp.UI.Controls.Design/Microsoft.Toolkit.Uwp.UI.Controls.Design.csproj
@@ -122,6 +122,7 @@
+
diff --git a/Microsoft.Toolkit.Uwp.UI.Controls.Design/TabbedCommandBarMetadata.cs b/Microsoft.Toolkit.Uwp.UI.Controls.Design/TabbedCommandBarMetadata.cs
new file mode 100644
index 00000000000..44a2343c54b
--- /dev/null
+++ b/Microsoft.Toolkit.Uwp.UI.Controls.Design/TabbedCommandBarMetadata.cs
@@ -0,0 +1,33 @@
+// 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 Microsoft.Windows.Design.Metadata;
+using Microsoft.Windows.Design.PropertyEditing;
+using System.ComponentModel;
+
+namespace Microsoft.Toolkit.Uwp.UI.Controls.Design
+{
+ internal class TabbedCommandBarMetadata : AttributeTableBuilder
+ {
+ public TabbedCommandBarMetadata()
+ : base()
+ {
+ AddCallback(typeof(TabbedCommandBar),
+ b =>
+ {
+ b.AddCustomAttributes(nameof(TabbedCommandBar.Items),
+ new PropertyOrderAttribute(PropertyOrder.Early),
+ new CategoryAttribute(Properties.Resources.CategoryCommon),
+ //The following is necessary because this is a collection of an abstract type, so we help
+ //the designer with populating supported types that can be added to the collection
+ new NewItemTypesAttribute(new System.Type[] {
+ typeof(TabbedCommandBarItem),
+ }),
+ new AlternateContentPropertyAttribute()
+ );
+ }
+ );
+ }
+ }
+}
diff --git a/Microsoft.Toolkit.Uwp.UI.Controls/Microsoft.Toolkit.Uwp.UI.Controls.csproj b/Microsoft.Toolkit.Uwp.UI.Controls/Microsoft.Toolkit.Uwp.UI.Controls.csproj
index 6258250a2f0..e66525ff1e6 100644
--- a/Microsoft.Toolkit.Uwp.UI.Controls/Microsoft.Toolkit.Uwp.UI.Controls.csproj
+++ b/Microsoft.Toolkit.Uwp.UI.Controls/Microsoft.Toolkit.Uwp.UI.Controls.csproj
@@ -71,6 +71,9 @@
Designer
+
+ MSBuild:Compile
+
MSBuild:Compile
diff --git a/Microsoft.Toolkit.Uwp.UI.Controls/TabbedCommandBar/TabbedCommandBar.cs b/Microsoft.Toolkit.Uwp.UI.Controls/TabbedCommandBar/TabbedCommandBar.cs
new file mode 100644
index 00000000000..a1284f4ea78
--- /dev/null
+++ b/Microsoft.Toolkit.Uwp.UI.Controls/TabbedCommandBar/TabbedCommandBar.cs
@@ -0,0 +1,117 @@
+// 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.Collections.Generic;
+using System.Linq;
+using Windows.UI.Xaml;
+using Windows.UI.Xaml.Controls;
+using Windows.UI.Xaml.Markup;
+using Windows.UI.Xaml.Media.Animation;
+
+namespace Microsoft.Toolkit.Uwp.UI.Controls
+{
+ ///
+ /// A basic ribbon control that houses s
+ ///
+ [ContentProperty(Name = nameof(Items))]
+ [TemplatePart(Name = "PART_RibbonNavigationView", Type = typeof(NavigationView))]
+ [TemplatePart(Name = "PART_RibbonContent", Type = typeof(ContentControl))]
+ [TemplatePart(Name = "PART_TabChangedStoryboard", Type = typeof(Storyboard))]
+ public class TabbedCommandBar : Control
+ {
+ private NavigationView _ribbonNavigationView = null;
+ private ContentControl _ribbonContent = null;
+ private Storyboard _tabChangedStoryboard = null;
+
+ // This should probably be made public at some point
+ private TabbedCommandBarItem SelectedTab { get; set; }
+
+ ///
+ /// Identifies the property.
+ ///
+ public static readonly DependencyProperty ItemsProperty = DependencyProperty.Register(
+ nameof(Items),
+ typeof(IList