diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md
index 150850157..8c35fb672 100644
--- a/.github/ISSUE_TEMPLATE.md
+++ b/.github/ISSUE_TEMPLATE.md
@@ -42,11 +42,13 @@ Package Version(s):
Windows 10 Build Number:
- [ ] Anniversary Update (14393)
- [ ] Creators Update (15063)
+- [ ] Fall Creators Update (16299)
- [ ] Insider Build (xxxxx)
App min and target version:
- [ ] Anniversary Update (14393)
- [ ] Creators Update (15063)
+- [ ] Fall Creators Update (16299)
- [ ] Insider Build (xxxxx)
Device form factor:
diff --git a/Directory.Build.props b/Directory.Build.props
index e3527eecd..ca7211072 100644
--- a/Directory.Build.props
+++ b/Directory.Build.props
@@ -22,8 +22,8 @@
$(MSBuildProjectName.Contains('Sample'))
- 5.3.4
- 15063
+ 5.4.1
+ 1629914393
diff --git a/Microsoft.Toolkit.Services/Microsoft.Toolkit.Services.csproj b/Microsoft.Toolkit.Services/Microsoft.Toolkit.Services.csproj
index 59f2268a0..352301bb7 100644
--- a/Microsoft.Toolkit.Services/Microsoft.Toolkit.Services.csproj
+++ b/Microsoft.Toolkit.Services/Microsoft.Toolkit.Services.csproj
@@ -5,6 +5,9 @@
This .NET standard library enables access to different data sources such as Bing. It is part of the UWP Community Toolkit.UWP Toolkit Windows Bing
UWP Community Toolkit .NET Standard Services
+
+
+ Full
diff --git a/Microsoft.Toolkit.Uwp.DeveloperTools/Microsoft.Toolkit.Uwp.DeveloperTools.csproj b/Microsoft.Toolkit.Uwp.DeveloperTools/Microsoft.Toolkit.Uwp.DeveloperTools.csproj
index 44d5d5c2c..91b094245 100644
--- a/Microsoft.Toolkit.Uwp.DeveloperTools/Microsoft.Toolkit.Uwp.DeveloperTools.csproj
+++ b/Microsoft.Toolkit.Uwp.DeveloperTools/Microsoft.Toolkit.Uwp.DeveloperTools.csproj
@@ -7,12 +7,19 @@
UWP Toolkit Windows Controls XAML Developer Tools Accessibilitytrue
-
-
+
+
+
+
+
+
+
+
+
diff --git a/Microsoft.Toolkit.Uwp.Notifications/Microsoft.Toolkit.Uwp.Notifications.csproj b/Microsoft.Toolkit.Uwp.Notifications/Microsoft.Toolkit.Uwp.Notifications.csproj
index 9e24898b1..8b80a0bc7 100644
--- a/Microsoft.Toolkit.Uwp.Notifications/Microsoft.Toolkit.Uwp.Notifications.csproj
+++ b/Microsoft.Toolkit.Uwp.Notifications/Microsoft.Toolkit.Uwp.Notifications.csproj
@@ -10,7 +10,7 @@ Supports adaptive tiles and adaptive/interactive toasts for Windows 10. It is pa
-
+
diff --git a/Microsoft.Toolkit.Uwp.SampleApp/Microsoft.Toolkit.Uwp.SampleApp.csproj b/Microsoft.Toolkit.Uwp.SampleApp/Microsoft.Toolkit.Uwp.SampleApp.csproj
index d1c8bf450..d81b48b4d 100644
--- a/Microsoft.Toolkit.Uwp.SampleApp/Microsoft.Toolkit.Uwp.SampleApp.csproj
+++ b/Microsoft.Toolkit.Uwp.SampleApp/Microsoft.Toolkit.Uwp.SampleApp.csproj
@@ -11,7 +11,7 @@
Microsoft.Toolkit.Uwp.SampleAppen-USUAP
- 10.0.15063.0
+ 10.0.16299.010.0.14393.014512
@@ -119,7 +119,7 @@
4.1.6
- 5.3.4
+ 5.4.10.3.0-alpha
@@ -1091,4 +1091,13 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Microsoft.Toolkit.Uwp.SampleApp/Models/Sample.cs b/Microsoft.Toolkit.Uwp.SampleApp/Models/Sample.cs
index fd37110b2..1f6781777 100644
--- a/Microsoft.Toolkit.Uwp.SampleApp/Models/Sample.cs
+++ b/Microsoft.Toolkit.Uwp.SampleApp/Models/Sample.cs
@@ -337,7 +337,7 @@ namespace Microsoft.Toolkit.Uwp.SampleApp
// Get Xaml code
using (var codeStream = await StreamHelper.GetPackagedFileStreamAsync($"SamplePages/{Name}/{XamlCodeFile}"))
{
- XamlCode = await codeStream.ReadTextAsync();
+ XamlCode = await codeStream.ReadTextAsync(Encoding.UTF8);
// Look for @[] values and generate associated properties
var regularExpression = new Regex(@"@\[(?.+?)(:(?.+?):(?.+?)(:(?.+?))?(:(?.*))*)?\]@?");
diff --git a/Microsoft.Toolkit.Uwp.SampleApp/SamplePages/Blur/BlurBehaviorXaml.bind b/Microsoft.Toolkit.Uwp.SampleApp/SamplePages/Blur/BlurBehaviorXaml.bind
index a97206cc3..d24fe8e70 100644
--- a/Microsoft.Toolkit.Uwp.SampleApp/SamplePages/Blur/BlurBehaviorXaml.bind
+++ b/Microsoft.Toolkit.Uwp.SampleApp/SamplePages/Blur/BlurBehaviorXaml.bind
@@ -11,15 +11,14 @@
-
-
-
-
-
+
+
+
+
@@ -44,8 +44,10 @@
-
+ IsPaneOpen="@[IsPaneOpen:Bool:False]@"
+ UseNavigationViewWhenPossible="@[UseNavigationViewWhenPossible:Bool:True]">
@@ -83,12 +86,12 @@
+ Background="LightGray">
+
+
+
+
+ RightLabel="@[Right Label:String:Delete]"
+ UseSwipeControlWhenPossible="@[UseSwipeControlWhenPossible:Bool:True]">
diff --git a/Microsoft.Toolkit.Uwp.SampleApp/SamplePages/samples.json b/Microsoft.Toolkit.Uwp.SampleApp/SamplePages/samples.json
index 96bac7df1..9e3d5523d 100644
--- a/Microsoft.Toolkit.Uwp.SampleApp/SamplePages/samples.json
+++ b/Microsoft.Toolkit.Uwp.SampleApp/SamplePages/samples.json
@@ -34,10 +34,11 @@
{
"Name": "HamburgerMenu",
"Type": "HamburgerMenuPage",
- "About": "The HamburgerMenu provides a simple to use side bar menu that you can show/hide using a hamburger button.",
+ "About": "The HamburgerMenu is deprecated and will be removed in a future major release. Please use the NavigationView available in the Fall Creators Update.",
"CodeUrl": "https://github.com/Microsoft/UWPCommunityToolkit/tree/master/Microsoft.Toolkit.Uwp.UI.Controls/HamburgerMenu",
"XamlCodeFile": "HamburgerMenuCode.bind",
"Icon": "/SamplePages/HamburgerMenu/HamburgerMenu.png",
+ "BadgeUpdateVersionRequired": "DEPRECATED",
"DocumentationUrl": "https://raw.githubusercontent.com/Microsoft/UWPCommunityToolkit/master/docs/controls/HamburgerMenu.md"
},
{
@@ -108,10 +109,11 @@
{
"Name": "SlidableListItem",
"Type": "SlidableListItemPage",
- "About": "A UI control that enables actions to be triggered by sliding the content left or right. In most cases, it will be used as a ListView DataTemplate root similar to email apps, but it is not required.",
+ "About": "The SlidableListItem is deprecated and will be removed in a future major release. Please use the SwipeControl available in the Fall Creators Update.",
"CodeUrl": "https://github.com/Microsoft/UWPCommunityToolkit/tree/master/Microsoft.Toolkit.Uwp.UI.Controls/SlidableListItem",
"XamlCodeFile": "SlidableListItemCode.bind",
"Icon": "/SamplePages/SlidableListItem/SlidableListItem.png",
+ "BadgeUpdateVersionRequired": "DEPRECATED",
"DocumentationUrl": "https://raw.githubusercontent.com/Microsoft/UWPCommunityToolkit/master/docs/controls/SlidableListItem.md"
},
{
@@ -389,10 +391,11 @@
{
"Name": "ParallaxService",
"Type": "ParallaxPage",
- "About": "Parallax items contained within an element that scrolls like a ScrollViewer or ListView",
+ "About": "The ParallaxService is deprecated and will be removed in a future major release. Please use the ParallaxView available in the Fall Creators Update.",
"CodeUrl": "https://github.com/Microsoft/UWPCommunityToolkit/tree/master/Microsoft.Toolkit.Uwp.UI.Animations",
"XamlCodeFile": "ParallaxPage.bind",
"Icon": "/SamplePages/ParallaxService/Parallax.png",
+ "BadgeUpdateVersionRequired": "DEPRECATED",
"DocumentationUrl": "https://raw.githubusercontent.com/Microsoft/UWPCommunityToolkit/master/docs/animations/ParallaxService.md"
},
{
diff --git a/Microsoft.Toolkit.Uwp.Samples.BackgroundTasks/Microsoft.Toolkit.Uwp.Samples.BackgroundTasks.csproj b/Microsoft.Toolkit.Uwp.Samples.BackgroundTasks/Microsoft.Toolkit.Uwp.Samples.BackgroundTasks.csproj
index b2b0225ab..ce261e208 100644
--- a/Microsoft.Toolkit.Uwp.Samples.BackgroundTasks/Microsoft.Toolkit.Uwp.Samples.BackgroundTasks.csproj
+++ b/Microsoft.Toolkit.Uwp.Samples.BackgroundTasks/Microsoft.Toolkit.Uwp.Samples.BackgroundTasks.csproj
@@ -11,7 +11,7 @@
Microsoft.Toolkit.Uwp.Samples.BackgroundTasksfr-FRUAP
- 10.0.15063.0
+ 10.0.16299.010.0.14393.014512
@@ -117,7 +117,7 @@
- 5.3.4
+ 5.4.1
diff --git a/Microsoft.Toolkit.Uwp.UI.Animations/ParallaxService.cs b/Microsoft.Toolkit.Uwp.UI.Animations/ParallaxService.cs
index 272f0da09..36d71fa78 100644
--- a/Microsoft.Toolkit.Uwp.UI.Animations/ParallaxService.cs
+++ b/Microsoft.Toolkit.Uwp.UI.Animations/ParallaxService.cs
@@ -10,6 +10,7 @@
// THE CODE OR THE USE OR OTHER DEALINGS IN THE CODE.
// ******************************************************************
+using System;
using Microsoft.Toolkit.Uwp.UI.Extensions;
using Windows.UI.Composition;
using Windows.UI.Xaml;
@@ -21,16 +22,19 @@ namespace Microsoft.Toolkit.Uwp.UI.Animations
///
/// Provides the ability to create a parallax effect to items within a ScrollViewer or List control
///
+ [Obsolete("The ParallaxService will be removed in a future major release. Please use the ParallaxView control available in the Fall Creators Update")]
public class ParallaxService
{
///
/// Identifies the ParallaxService.VerticalMultiplier XAML attached property.
///
+ [Obsolete("The ParallaxService will be removed in a future major release. Please use the ParallaxView control available in the Fall Creators Update")]
public static readonly DependencyProperty VerticalMultiplierProperty = DependencyProperty.RegisterAttached("VerticalMultiplier", typeof(double), typeof(ParallaxService), new PropertyMetadata(0d, OnMultiplierChanged));
///
/// Identifies the ParallaxService.HorizontalMultiplier attached property.
///
+ [Obsolete("The ParallaxService will be removed in a future major release. Please use the ParallaxView control available in the Fall Creators Update")]
public static readonly DependencyProperty HorizontalMultiplierProperty = DependencyProperty.RegisterAttached("HorizontalMultiplier", typeof(double), typeof(ParallaxService), new PropertyMetadata(0d, OnMultiplierChanged));
///
@@ -38,6 +42,7 @@ namespace Microsoft.Toolkit.Uwp.UI.Animations
///
/// The target element for the attached property value..
/// A value for how fast the parallax effect should scroll vertically.
+ [Obsolete("The ParallaxService will be removed in a future major release. Please use the ParallaxView control available in the Fall Creators Update")]
public static double GetVerticalMultiplier(UIElement element)
{
return (double)element.GetValue(VerticalMultiplierProperty);
@@ -48,6 +53,7 @@ namespace Microsoft.Toolkit.Uwp.UI.Animations
///
/// The target element for the attached property value.
/// The value for how fast the parallax effect should scroll vertically.
+ [Obsolete("The ParallaxService will be removed in a future major release. Please use the ParallaxView control available in the Fall Creators Update")]
public static void SetVerticalMultiplier(UIElement element, double value)
{
element.SetValue(VerticalMultiplierProperty, value);
@@ -58,6 +64,7 @@ namespace Microsoft.Toolkit.Uwp.UI.Animations
///
/// The target element for the attached property value..
/// A value for how fast the parallax effect should scroll vertically.
+ [Obsolete("The ParallaxService will be removed in a future major release. Please use the ParallaxView control available in the Fall Creators Update")]
public static double GetHorizontalMultiplier(UIElement element)
{
return (double)element.GetValue(HorizontalMultiplierProperty);
@@ -68,6 +75,7 @@ namespace Microsoft.Toolkit.Uwp.UI.Animations
///
/// The target element for the attached property value.
/// The value for how fast the parallax effect should scroll horizontally.
+ [Obsolete("The ParallaxService will be removed in a future major release. Please use the ParallaxView control available in the Fall Creators Update")]
public static void SetHorizontalMultiplier(UIElement element, double value)
{
element.SetValue(HorizontalMultiplierProperty, value);
diff --git a/Microsoft.Toolkit.Uwp.UI.Controls/Expander/Expander.Constants.cs b/Microsoft.Toolkit.Uwp.UI.Controls/Expander/Expander.Constants.cs
index 1a8590863..97f146c4f 100644
--- a/Microsoft.Toolkit.Uwp.UI.Controls/Expander/Expander.Constants.cs
+++ b/Microsoft.Toolkit.Uwp.UI.Controls/Expander/Expander.Constants.cs
@@ -18,19 +18,69 @@ namespace Microsoft.Toolkit.Uwp.UI.Controls
public partial class Expander
{
///
- /// Key of the VisualStateGroup that open/close content
+ /// Key of the VisualStateGroup that trigger display mode (visible/collapsed/overlay) and direction content
///
- private const string ExpandedGroupStateContent = "ExpandedStates";
+ private const string DisplayModeAndDirectionStatesGroupStateContent = "DisplayModeAndDirectionStates";
///
- /// Key of the VisualState when content is expanded
+ /// Key of the VisualState when expander is visible and expander direction is set to Left
///
- private const string StateContentExpanded = "Expanded";
+ private const string StateContentVisibleLeft = "VisibleLeft";
///
- /// Key of the VisualState when content is collapsed
+ /// Key of the VisualState when expander is visible and expander direction is set to Down
///
- private const string StateContentCollapsed = "Collapsed";
+ private const string StateContentVisibleDown = "VisibleDown";
+
+ ///
+ /// Key of the VisualState when expander is visible and expander direction is set to Right
+ ///
+ private const string StateContentVisibleRight = "VisibleRight";
+
+ ///
+ /// Key of the VisualState when expander is visible and expander direction is set to Up
+ ///
+ private const string StateContentVisibleUp = "VisibleUp";
+
+ ///
+ /// Key of the VisualState when expander is collapsed and expander direction is set to Left
+ ///
+ private const string StateContentCollapsedLeft = "CollapsedLeft";
+
+ ///
+ /// Key of the VisualState when expander is collapsed and expander direction is set to Down
+ ///
+ private const string StateContentCollapsedDown = "CollapsedDown";
+
+ ///
+ /// Key of the VisualState when expander is collapsed and expander direction is set to Right
+ ///
+ private const string StateContentCollapsedRight = "CollapsedRight";
+
+ ///
+ /// Key of the VisualState when expander is collapsed and expander direction is set to Up
+ ///
+ private const string StateContentCollapsedUp = "CollapsedUp";
+
+ ///
+ /// Key of the VisualState when expander is overlay and expander direction is set to Left
+ ///
+ private const string StateContentOverlayLeft = "OverlayLeft";
+
+ ///
+ /// Key of the VisualState when expander is overlay and expander direction is set to Down
+ ///
+ private const string StateContentOverlayDown = "OverlayDown";
+
+ ///
+ /// Key of the VisualState when expander is overlay and expander direction is set to Right
+ ///
+ private const string StateContentOverlayRight = "OverlayRight";
+
+ ///
+ /// Key of the VisualState when expander is overlay and expander direction is set to Up
+ ///
+ private const string StateContentOverlayUp = "OverlayUp";
///
/// Key of the UI Element that toggle IsExpanded property
@@ -76,5 +126,10 @@ namespace Microsoft.Toolkit.Uwp.UI.Controls
/// Key of the UI Element that contains the content of the LayoutTransformer (of the expander button)
///
private const string LayoutTransformerPart = "PART_LayoutTransformer";
+
+ ///
+ /// Key of the UI Element that contains the content of the control that is visible in Overlay mode
+ ///
+ private const string ContentOverlayPart = "PART_ContentOverlay";
}
}
\ No newline at end of file
diff --git a/Microsoft.Toolkit.Uwp.UI.Controls/Expander/Expander.Properties.cs b/Microsoft.Toolkit.Uwp.UI.Controls/Expander/Expander.Properties.cs
index a43e55812..f31b3d6b8 100644
--- a/Microsoft.Toolkit.Uwp.UI.Controls/Expander/Expander.Properties.cs
+++ b/Microsoft.Toolkit.Uwp.UI.Controls/Expander/Expander.Properties.cs
@@ -43,6 +43,18 @@ namespace Microsoft.Toolkit.Uwp.UI.Controls
public static readonly DependencyProperty ExpandDirectionProperty =
DependencyProperty.Register(nameof(ExpandDirection), typeof(ExpandDirection), typeof(Expander), new PropertyMetadata(ExpandDirection.Down, OnExpandDirectionChanged));
+ ///
+ /// Identifies the dependency property.
+ ///
+ public static readonly DependencyProperty DisplayModeProperty =
+ DependencyProperty.Register(nameof(DisplayMode), typeof(ExpanderDisplayMode), typeof(Expander), new PropertyMetadata(ExpanderDisplayMode.Expand, OnDisplayModeChanged));
+
+ ///
+ /// Identifies the dependency property.
+ ///
+ public static readonly DependencyProperty ContentOverlayProperty =
+ DependencyProperty.Register(nameof(ContentOverlay), typeof(UIElement), typeof(Expander), new PropertyMetadata(default(UIElement)));
+
///
/// Gets or sets a value indicating whether the Header of the control.
///
@@ -79,6 +91,24 @@ namespace Microsoft.Toolkit.Uwp.UI.Controls
set { SetValue(ExpandDirectionProperty, value); }
}
+ ///
+ /// Gets or sets a value indicating whether the Expander control should be in Expand or Overlay mode.
+ ///
+ public ExpanderDisplayMode DisplayMode
+ {
+ get { return (ExpanderDisplayMode)GetValue(DisplayModeProperty); }
+ set { SetValue(DisplayModeProperty, value); }
+ }
+
+ ///
+ /// Gets or sets a value indicating whether the ContentOverlay of the control.
+ ///
+ public UIElement ContentOverlay
+ {
+ get { return (UIElement)GetValue(ContentOverlayProperty); }
+ set { SetValue(ContentOverlayProperty, value); }
+ }
+
private static void OnIsExpandedPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var expander = d as Expander;
@@ -105,5 +135,17 @@ namespace Microsoft.Toolkit.Uwp.UI.Controls
expander.OnExpandDirectionChanged();
}
}
+
+ private static void OnDisplayModeChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
+ {
+ var expander = d as Expander;
+ var previousDisplayMode = (ExpanderDisplayMode)e.OldValue;
+ var newDisplayMode = (ExpanderDisplayMode)e.NewValue;
+
+ if (previousDisplayMode != newDisplayMode)
+ {
+ expander.OnDisplayModeOrIsExpandedChanged();
+ }
+ }
}
}
\ No newline at end of file
diff --git a/Microsoft.Toolkit.Uwp.UI.Controls/Expander/Expander.cs b/Microsoft.Toolkit.Uwp.UI.Controls/Expander/Expander.cs
index c0579d9f4..d66f47724 100644
--- a/Microsoft.Toolkit.Uwp.UI.Controls/Expander/Expander.cs
+++ b/Microsoft.Toolkit.Uwp.UI.Controls/Expander/Expander.cs
@@ -15,6 +15,7 @@ using Windows.System;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Controls.Primitives;
+using Windows.UI.Xaml.Input;
using Windows.UI.Xaml.Markup;
namespace Microsoft.Toolkit.Uwp.UI.Controls
@@ -22,15 +23,26 @@ namespace Microsoft.Toolkit.Uwp.UI.Controls
///
/// The control allows user to show/hide content based on a boolean state
///
- [TemplateVisualState(Name = StateContentExpanded, GroupName = ExpandedGroupStateContent)]
- [TemplateVisualState(Name = StateContentCollapsed, GroupName = ExpandedGroupStateContent)]
[TemplateVisualState(Name = StateContentLeftDirection, GroupName = ExpandDirectionGroupStateContent)]
[TemplateVisualState(Name = StateContentDownDirection, GroupName = ExpandDirectionGroupStateContent)]
[TemplateVisualState(Name = StateContentRightDirection, GroupName = ExpandDirectionGroupStateContent)]
[TemplateVisualState(Name = StateContentUpDirection, GroupName = ExpandDirectionGroupStateContent)]
+ [TemplateVisualState(Name = StateContentVisibleLeft, GroupName = DisplayModeAndDirectionStatesGroupStateContent)]
+ [TemplateVisualState(Name = StateContentVisibleDown, GroupName = DisplayModeAndDirectionStatesGroupStateContent)]
+ [TemplateVisualState(Name = StateContentVisibleRight, GroupName = DisplayModeAndDirectionStatesGroupStateContent)]
+ [TemplateVisualState(Name = StateContentVisibleUp, GroupName = DisplayModeAndDirectionStatesGroupStateContent)]
+ [TemplateVisualState(Name = StateContentCollapsedLeft, GroupName = DisplayModeAndDirectionStatesGroupStateContent)]
+ [TemplateVisualState(Name = StateContentCollapsedDown, GroupName = DisplayModeAndDirectionStatesGroupStateContent)]
+ [TemplateVisualState(Name = StateContentCollapsedRight, GroupName = DisplayModeAndDirectionStatesGroupStateContent)]
+ [TemplateVisualState(Name = StateContentCollapsedUp, GroupName = DisplayModeAndDirectionStatesGroupStateContent)]
+ [TemplateVisualState(Name = StateContentOverlayLeft, GroupName = DisplayModeAndDirectionStatesGroupStateContent)]
+ [TemplateVisualState(Name = StateContentOverlayDown, GroupName = DisplayModeAndDirectionStatesGroupStateContent)]
+ [TemplateVisualState(Name = StateContentOverlayRight, GroupName = DisplayModeAndDirectionStatesGroupStateContent)]
+ [TemplateVisualState(Name = StateContentOverlayUp, GroupName = DisplayModeAndDirectionStatesGroupStateContent)]
[TemplatePart(Name = RootGridPart, Type = typeof(Grid))]
[TemplatePart(Name = ExpanderToggleButtonPart, Type = typeof(ToggleButton))]
[TemplatePart(Name = LayoutTransformerPart, Type = typeof(LayoutTransformControl))]
+ [TemplatePart(Name = ContentOverlayPart, Type = typeof(ContentPresenter))]
[ContentProperty(Name = "Content")]
public partial class Expander : ContentControl
{
@@ -47,15 +59,6 @@ namespace Microsoft.Toolkit.Uwp.UI.Controls
{
base.OnApplyTemplate();
- if (IsExpanded)
- {
- VisualStateManager.GoToState(this, StateContentExpanded, false);
- }
- else
- {
- VisualStateManager.GoToState(this, StateContentCollapsed, false);
- }
-
var button = (ToggleButton)GetTemplateChild(ExpanderToggleButtonPart);
if (button != null)
@@ -65,6 +68,7 @@ namespace Microsoft.Toolkit.Uwp.UI.Controls
}
OnExpandDirectionChanged();
+ OnDisplayModeOrIsExpandedChanged(false);
}
///
@@ -85,7 +89,7 @@ namespace Microsoft.Toolkit.Uwp.UI.Controls
Collapsed?.Invoke(this, args);
}
- private void ExpanderToggleButtonPart_KeyDown(object sender, Windows.UI.Xaml.Input.KeyRoutedEventArgs e)
+ private void ExpanderToggleButtonPart_KeyDown(object sender, KeyRoutedEventArgs e)
{
if (e.Key != VirtualKey.Enter)
{
@@ -106,20 +110,20 @@ namespace Microsoft.Toolkit.Uwp.UI.Controls
private void ExpandControl()
{
- VisualStateManager.GoToState(this, StateContentExpanded, true);
+ OnDisplayModeOrIsExpandedChanged();
OnExpanded(EventArgs.Empty);
}
private void CollapseControl()
{
- VisualStateManager.GoToState(this, StateContentCollapsed, true);
+ OnDisplayModeOrIsExpandedChanged();
OnCollapsed(EventArgs.Empty);
}
///
/// Called when the ExpandDirection on Expander changes
///
- public void OnExpandDirectionChanged()
+ private void OnExpandDirectionChanged()
{
var button = (ToggleButton)GetTemplateChild(ExpanderToggleButtonPart);
@@ -128,22 +132,20 @@ namespace Microsoft.Toolkit.Uwp.UI.Controls
return;
}
+ UpdateDisplayModeOrExpanderDirection();
+
switch (ExpandDirection)
{
case ExpandDirection.Left:
- VisualStateManager.GoToState(this, StateContentLeftDirection, true);
VisualStateManager.GoToState(button, StateContentLeftDirection, true);
break;
case ExpandDirection.Down:
- VisualStateManager.GoToState(this, StateContentDownDirection, true);
VisualStateManager.GoToState(button, StateContentDownDirection, true);
break;
case ExpandDirection.Right:
- VisualStateManager.GoToState(this, StateContentRightDirection, true);
VisualStateManager.GoToState(button, StateContentRightDirection, true);
break;
case ExpandDirection.Up:
- VisualStateManager.GoToState(this, StateContentUpDirection, true);
VisualStateManager.GoToState(button, StateContentUpDirection, true);
break;
}
@@ -155,5 +157,54 @@ namespace Microsoft.Toolkit.Uwp.UI.Controls
VisualStateManager.GoToState(button, "Checked", true);
}
}
+
+ private void OnDisplayModeOrIsExpandedChanged(bool useTransitions = true)
+ {
+ UpdateDisplayModeOrExpanderDirection();
+ }
+
+ private void UpdateDisplayModeOrExpanderDirection()
+ {
+ string visualState = null;
+
+ switch (ExpandDirection)
+ {
+ case ExpandDirection.Left:
+ visualState = GetDisplayModeVisualState(StateContentOverlayLeft, StateContentCollapsedLeft, StateContentVisibleLeft);
+ break;
+ case ExpandDirection.Down:
+ visualState = GetDisplayModeVisualState(StateContentOverlayDown, StateContentCollapsedDown, StateContentVisibleDown);
+ break;
+ case ExpandDirection.Right:
+ visualState = GetDisplayModeVisualState(StateContentOverlayRight, StateContentCollapsedRight, StateContentVisibleRight);
+ break;
+ case ExpandDirection.Up:
+ visualState = GetDisplayModeVisualState(StateContentOverlayUp, StateContentCollapsedUp, StateContentVisibleUp);
+ break;
+ }
+
+ if (!string.IsNullOrWhiteSpace(visualState))
+ {
+ VisualStateManager.GoToState(this, visualState, true);
+ }
+ }
+
+ private string GetDisplayModeVisualState(string overlayState, string collapsedState, string visibleState)
+ {
+ if (!IsExpanded && DisplayMode == ExpanderDisplayMode.Overlay)
+ {
+ // Overlay
+ return overlayState;
+ }
+
+ if (!IsExpanded && DisplayMode == ExpanderDisplayMode.Expand)
+ {
+ // Collapsed
+ return collapsedState;
+ }
+
+ // Visible
+ return visibleState;
+ }
}
}
\ No newline at end of file
diff --git a/Microsoft.Toolkit.Uwp.UI.Controls/Expander/Expander.xaml b/Microsoft.Toolkit.Uwp.UI.Controls/Expander/Expander.xaml
index 5f357e115..ccc480e11 100644
--- a/Microsoft.Toolkit.Uwp.UI.Controls/Expander/Expander.xaml
+++ b/Microsoft.Toolkit.Uwp.UI.Controls/Expander/Expander.xaml
@@ -7,7 +7,7 @@
mc:Ignorable="d">
+
+
+
diff --git a/Microsoft.Toolkit.Uwp.UI.Controls/HamburgerMenu/HamburgerMenuNavViewItemStyleSelector.cs b/Microsoft.Toolkit.Uwp.UI.Controls/HamburgerMenu/HamburgerMenuNavViewItemStyleSelector.cs
new file mode 100644
index 000000000..8fcd642e5
--- /dev/null
+++ b/Microsoft.Toolkit.Uwp.UI.Controls/HamburgerMenu/HamburgerMenuNavViewItemStyleSelector.cs
@@ -0,0 +1,44 @@
+// ******************************************************************
+// Copyright (c) Microsoft. All rights reserved.
+// This code is licensed under the MIT License (MIT).
+// THE CODE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
+// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH
+// THE CODE OR THE USE OR OTHER DEALINGS IN THE CODE.
+// ******************************************************************
+
+using System;
+using Windows.UI.Xaml;
+using Windows.UI.Xaml.Controls;
+
+namespace Microsoft.Toolkit.Uwp.UI.Controls
+{
+ ///
+ /// to be used with
+ /// HamburgerMenuNavViewItemStyleSelector is used by the
+ ///
+ [Obsolete("The HamburgerMenuNavViewItemStyleSelector will be removed alongside the HamburgerMenu in a future major release. Please use the NavigationView control available in the Fall Creators Update")]
+ public class HamburgerMenuNavViewItemStyleSelector : StyleSelector
+ {
+ ///
+ /// Gets or sets the to be set if the container is a
+ ///
+ public Style MenuItemStyle { get; set; }
+
+ ///
+ protected override Style SelectStyleCore(object item, DependencyObject container)
+ {
+ if (container is NavigationViewItem)
+ {
+ return MenuItemStyle;
+ }
+ else
+ {
+ return null;
+ }
+ }
+ }
+}
diff --git a/Microsoft.Toolkit.Uwp.UI.Controls/HamburgerMenu/HamburgerMenuNavViewItemTemplateSelector.cs b/Microsoft.Toolkit.Uwp.UI.Controls/HamburgerMenu/HamburgerMenuNavViewItemTemplateSelector.cs
new file mode 100644
index 000000000..3d907665b
--- /dev/null
+++ b/Microsoft.Toolkit.Uwp.UI.Controls/HamburgerMenu/HamburgerMenuNavViewItemTemplateSelector.cs
@@ -0,0 +1,86 @@
+// ******************************************************************
+// Copyright (c) Microsoft. All rights reserved.
+// This code is licensed under the MIT License (MIT).
+// THE CODE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
+// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH
+// THE CODE OR THE USE OR OTHER DEALINGS IN THE CODE.
+// ******************************************************************
+
+using System.Collections.Generic;
+using System.Linq;
+using Windows.UI.Xaml;
+using Windows.UI.Xaml.Controls;
+
+namespace Microsoft.Toolkit.Uwp.UI.Controls
+{
+ internal class HamburgerMenuNavViewItemTemplateSelector : DataTemplateSelector
+ {
+#pragma warning disable CS0618 // Type or member is obsolete
+ private HamburgerMenu _hamburgerMenu;
+#pragma warning restore CS0618 // Type or member is obsolete
+
+#pragma warning disable CS0618 // Type or member is obsolete
+ internal HamburgerMenuNavViewItemTemplateSelector(HamburgerMenu hamburgerMenu)
+#pragma warning restore CS0618 // Type or member is obsolete
+ {
+ _hamburgerMenu = hamburgerMenu;
+ }
+
+ private DataTemplate SelectItemTemplate(object item)
+ {
+ if (_hamburgerMenu == null)
+ {
+ return TemplateFromItemTemplateSelector(item);
+ }
+
+ if (_hamburgerMenu.ItemsSource is IEnumerable
+
+
+
+
+
+
+
+
+
diff --git a/Microsoft.Toolkit.Uwp.UI.Controls/SlidableListItem/SlidableListItem.cs b/Microsoft.Toolkit.Uwp.UI.Controls/SlidableListItem/SlidableListItem.cs
index 44f9f50ba..efbf3fc42 100644
--- a/Microsoft.Toolkit.Uwp.UI.Controls/SlidableListItem/SlidableListItem.cs
+++ b/Microsoft.Toolkit.Uwp.UI.Controls/SlidableListItem/SlidableListItem.cs
@@ -15,6 +15,7 @@ using System.Windows.Input;
using Microsoft.Toolkit.Uwp.UI.Animations;
using Windows.Devices.Input;
using Windows.Foundation;
+using Windows.Foundation.Metadata;
using Windows.UI;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
@@ -31,6 +32,7 @@ namespace Microsoft.Toolkit.Uwp.UI.Controls
[TemplatePart(Name = PartCommandContainer, Type = typeof(Grid))]
[TemplatePart(Name = PartLeftCommandPanel, Type = typeof(StackPanel))]
[TemplatePart(Name = PartRightCommandPanel, Type = typeof(StackPanel))]
+ [Obsolete("The SlidableListItem will be removed in a future major release. Please use the SwipeControl available in the Fall Creators Update")]
public class SlidableListItem : ContentControl
{
///
@@ -49,13 +51,13 @@ namespace Microsoft.Toolkit.Uwp.UI.Controls
/// Identifies the property
///
public static readonly DependencyProperty IsRightCommandEnabledProperty =
- DependencyProperty.Register(nameof(IsRightCommandEnabled), typeof(bool), typeof(SlidableListItem), new PropertyMetadata(true));
+ DependencyProperty.Register(nameof(IsRightCommandEnabled), typeof(bool), typeof(SlidableListItem), new PropertyMetadata(true, OnSwipeControlValueChanged));
///
/// Identifies the property
///
public static readonly DependencyProperty IsLeftCommandEnabledProperty =
- DependencyProperty.Register(nameof(IsLeftCommandEnabled), typeof(bool), typeof(SlidableListItem), new PropertyMetadata(true));
+ DependencyProperty.Register(nameof(IsLeftCommandEnabled), typeof(bool), typeof(SlidableListItem), new PropertyMetadata(true, OnSwipeControlValueChanged));
///
/// Identifies the property
@@ -64,52 +66,52 @@ namespace Microsoft.Toolkit.Uwp.UI.Controls
DependencyProperty.Register(nameof(ActivationWidth), typeof(double), typeof(SlidableListItem), new PropertyMetadata(80));
///
- /// Indeifies the property
+ /// Identifies the property
///
public static readonly DependencyProperty LeftIconProperty =
- DependencyProperty.Register(nameof(LeftIcon), typeof(Symbol), typeof(SlidableListItem), new PropertyMetadata(Symbol.Favorite));
+ DependencyProperty.Register(nameof(LeftIcon), typeof(Symbol), typeof(SlidableListItem), new PropertyMetadata(Symbol.Favorite, OnSwipeControlValueChanged));
///
/// Identifies the property
///
public static readonly DependencyProperty RightIconProperty =
- DependencyProperty.Register(nameof(RightIcon), typeof(Symbol), typeof(SlidableListItem), new PropertyMetadata(Symbol.Delete));
+ DependencyProperty.Register(nameof(RightIcon), typeof(Symbol), typeof(SlidableListItem), new PropertyMetadata(Symbol.Delete, OnSwipeControlValueChanged));
///
/// Identifies the property
///
public static readonly DependencyProperty LeftLabelProperty =
- DependencyProperty.Register(nameof(LeftLabel), typeof(string), typeof(SlidableListItem), new PropertyMetadata(string.Empty));
+ DependencyProperty.Register(nameof(LeftLabel), typeof(string), typeof(SlidableListItem), new PropertyMetadata(string.Empty, OnSwipeControlValueChanged));
///
/// Identifies the property
///
public static readonly DependencyProperty RightLabelProperty =
- DependencyProperty.Register(nameof(RightLabel), typeof(string), typeof(SlidableListItem), new PropertyMetadata(string.Empty));
+ DependencyProperty.Register(nameof(RightLabel), typeof(string), typeof(SlidableListItem), new PropertyMetadata(string.Empty, OnSwipeControlValueChanged));
///
/// Identifies the property
///
public static readonly DependencyProperty LeftForegroundProperty =
- DependencyProperty.Register(nameof(LeftForeground), typeof(Brush), typeof(SlidableListItem), new PropertyMetadata(new SolidColorBrush(Colors.White)));
+ DependencyProperty.Register(nameof(LeftForeground), typeof(Brush), typeof(SlidableListItem), new PropertyMetadata(new SolidColorBrush(Colors.White), OnSwipeControlValueChanged));
///
/// Identifies the property
///
public static readonly DependencyProperty RightForegroundProperty =
- DependencyProperty.Register(nameof(RightForeground), typeof(Brush), typeof(SlidableListItem), new PropertyMetadata(new SolidColorBrush(Colors.White)));
+ DependencyProperty.Register(nameof(RightForeground), typeof(Brush), typeof(SlidableListItem), new PropertyMetadata(new SolidColorBrush(Colors.White), OnSwipeControlValueChanged));
///
/// Identifies the property
///
public static readonly DependencyProperty LeftBackgroundProperty =
- DependencyProperty.Register(nameof(LeftBackground), typeof(Brush), typeof(SlidableListItem), new PropertyMetadata(new SolidColorBrush(Colors.LightGray)));
+ DependencyProperty.Register(nameof(LeftBackground), typeof(Brush), typeof(SlidableListItem), new PropertyMetadata(new SolidColorBrush(Colors.LightGray), OnSwipeControlValueChanged));
///
/// Identifies the property
///
public static readonly DependencyProperty RightBackgroundProperty =
- DependencyProperty.Register(nameof(RightBackground), typeof(Brush), typeof(SlidableListItem), new PropertyMetadata(new SolidColorBrush(Colors.DarkGray)));
+ DependencyProperty.Register(nameof(RightBackground), typeof(Brush), typeof(SlidableListItem), new PropertyMetadata(new SolidColorBrush(Colors.DarkGray), OnSwipeControlValueChanged));
///
/// Identifies the property
@@ -121,25 +123,25 @@ namespace Microsoft.Toolkit.Uwp.UI.Controls
/// Identifies the property
///
public static readonly DependencyProperty LeftCommandProperty =
- DependencyProperty.Register(nameof(LeftCommand), typeof(ICommand), typeof(SlidableListItem), new PropertyMetadata(null));
+ DependencyProperty.Register(nameof(LeftCommand), typeof(ICommand), typeof(SlidableListItem), new PropertyMetadata(null, OnSwipeControlValueChanged));
///
/// Identifies the property
///
public static readonly DependencyProperty RightCommandProperty =
- DependencyProperty.Register(nameof(RightCommand), typeof(ICommand), typeof(SlidableListItem), new PropertyMetadata(null));
+ DependencyProperty.Register(nameof(RightCommand), typeof(ICommand), typeof(SlidableListItem), new PropertyMetadata(null, OnSwipeControlValueChanged));
///
/// Identifies the property
///
public static readonly DependencyProperty LeftCommandParameterProperty =
- DependencyProperty.Register(nameof(LeftCommandParameter), typeof(object), typeof(SlidableListItem), new PropertyMetadata(null));
+ DependencyProperty.Register(nameof(LeftCommandParameter), typeof(object), typeof(SlidableListItem), new PropertyMetadata(null, OnSwipeControlValueChanged));
///
/// Identifies the property
///
public static readonly DependencyProperty RightCommandParameterProperty =
- DependencyProperty.Register(nameof(RightCommandParameter), typeof(object), typeof(SlidableListItem), new PropertyMetadata(null));
+ DependencyProperty.Register(nameof(RightCommandParameter), typeof(object), typeof(SlidableListItem), new PropertyMetadata(null, OnSwipeControlValueChanged));
///
/// Identifies the property
@@ -148,11 +150,17 @@ namespace Microsoft.Toolkit.Uwp.UI.Controls
DependencyProperty.Register(nameof(SwipeStatus), typeof(object), typeof(SlidableListItem), new PropertyMetadata(SwipeStatus.Idle));
///
- /// Identifues the property
+ /// Identifies the property
///
public static readonly DependencyProperty IsPointerReleasedOnSwipingHandledProperty =
DependencyProperty.Register("IsPointerReleasedOnSwipingHandled", typeof(bool), typeof(SlidableListItem), new PropertyMetadata(false));
+ ///
+ /// Identifies the dependency property
+ ///
+ public static readonly DependencyProperty UseSwipeControlWhenPossibleProperty =
+ DependencyProperty.Register("UseSwipeControlWhenPossible", typeof(bool), typeof(SlidableListItem), new PropertyMetadata(false, OnUseSwipeControlWhenPossibleChanged));
+
///
/// Occurs when SwipeStatus has changed
///
@@ -165,6 +173,7 @@ namespace Microsoft.Toolkit.Uwp.UI.Controls
private const int FinishAnimationDuration = 150;
private const int SnappedCommandMargin = 20;
private const int AnimationSetDuration = 200;
+
private Grid _contentGrid;
private CompositeTransform _transform;
private Grid _commandContainer;
@@ -179,6 +188,20 @@ namespace Microsoft.Toolkit.Uwp.UI.Controls
private AnimationSet _leftCommandAnimationSet;
private AnimationSet _rightCommandAnimationSet;
+ private ControlTemplate _previousTemplateUsed;
+ private object _swipeControl;
+ private object _leftSwipeItems;
+ private object _leftSwipeItem;
+ private object _rightSwipeItems;
+ private object _rightSwipeItem;
+
+ private bool UsingSwipeControl => UseSwipeControlWhenPossible && IsSwipeControlSupported;
+
+ ///
+ /// Gets a value indicating whether is supported
+ ///
+ public static bool IsSwipeControlSupported { get; } = ApiInformation.IsTypePresent("Windows.UI.Xaml.Controls.SwipeControl");
+
///
/// Initializes a new instance of the class.
/// Creates a new instance of
@@ -226,12 +249,159 @@ namespace Microsoft.Toolkit.Uwp.UI.Controls
_contentGrid.ManipulationCompleted += ContentGrid_ManipulationCompleted;
}
+ if (UsingSwipeControl)
+ {
+ OnApplyTemplateSwipeControl();
+ }
+
Loaded += SlidableListItem_Loaded;
Unloaded += SlidableListItem_Unloaded;
base.OnApplyTemplate();
}
+ private static void OnUseSwipeControlWhenPossibleChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
+ {
+ var slider = d as SlidableListItem;
+ if (slider == null)
+ {
+ return;
+ }
+
+ if (slider.UseSwipeControlWhenPossible && SlidableListItem.IsSwipeControlSupported)
+ {
+ ResourceDictionary dict = new ResourceDictionary();
+ dict.Source = new System.Uri("ms-appx:///Microsoft.Toolkit.Uwp.UI.Controls/SlidableListItem/SlidableListItemSwipeControlTemplate.xaml");
+ slider._previousTemplateUsed = slider.Template;
+ slider.Template = dict["SlidableListItemSwipeControlStyle"] as ControlTemplate;
+ }
+ else if (!slider.UseSwipeControlWhenPossible &&
+ e.OldValue is bool oldValue &&
+ oldValue)
+ {
+ if (slider._previousTemplateUsed != null)
+ {
+ slider.Template = slider._previousTemplateUsed;
+ }
+ else
+ {
+ ResourceDictionary dict = new ResourceDictionary();
+ dict.Source = new System.Uri("ms-appx:///Microsoft.Toolkit.Uwp.UI.Controls/SlidableListItem/SlidableListItem.xaml");
+ slider.Template = dict["SlidableListItemDefaultTemplate"] as ControlTemplate;
+ }
+ }
+ }
+
+ private static void OnSwipeControlValueChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
+ {
+ if (d is SlidableListItem control && control.UsingSwipeControl)
+ {
+ control.UpdateSwipeControlItems();
+ }
+ }
+
+ private void OnApplyTemplateSwipeControl()
+ {
+ if (GetTemplateChild("SwipeControl") is SwipeControl swipeControl)
+ {
+ _swipeControl = swipeControl;
+ UpdateSwipeControlItems();
+ }
+ }
+
+ private void UpdateSwipeControlItems()
+ {
+ var swipeControl = _swipeControl as SwipeControl;
+ if (swipeControl == null)
+ {
+ return;
+ }
+
+ if (IsLeftCommandEnabled)
+ {
+ var leftItem = _leftSwipeItem as SwipeItem;
+ var leftItems = _leftSwipeItems as SwipeItems;
+
+ if (leftItem == null)
+ {
+ leftItem = new SwipeItem();
+ leftItem.IconSource = new SymbolIconSource();
+ leftItem.Invoked += LeftControl_Invoked;
+
+ leftItems = new SwipeItems()
+ {
+ leftItem
+ };
+ leftItems.Mode = SwipeMode.Execute;
+
+ _leftSwipeItems = leftItems;
+ _leftSwipeItem = leftItem;
+ }
+
+ leftItem.BehaviorOnInvoked = SwipeBehaviorOnInvoked.Close;
+ leftItem.Background = LeftBackground;
+ leftItem.Text = LeftLabel;
+ leftItem.Foreground = LeftForeground;
+ leftItem.Command = LeftCommand;
+ leftItem.CommandParameter = LeftCommandParameter;
+ leftItem.IconSource.Foreground = LeftForeground;
+ ((SymbolIconSource)leftItem.IconSource).Symbol = LeftIcon;
+
+ swipeControl.LeftItems = leftItems;
+ }
+ else
+ {
+ swipeControl.LeftItems = null;
+ }
+
+ if (IsRightCommandEnabled)
+ {
+ var rightItem = _rightSwipeItem as SwipeItem;
+ var rightItems = _rightSwipeItems as SwipeItems;
+
+ if (rightItem == null)
+ {
+ rightItem = new SwipeItem();
+ rightItem.IconSource = new SymbolIconSource();
+ rightItem.Invoked += RightControl_Invoked;
+
+ rightItems = new SwipeItems()
+ {
+ rightItem
+ };
+ rightItems.Mode = SwipeMode.Execute;
+
+ _rightSwipeItems = rightItems;
+ _rightSwipeItem = rightItem;
+ }
+
+ rightItem.BehaviorOnInvoked = SwipeBehaviorOnInvoked.Close;
+ rightItem.Background = RightBackground;
+ rightItem.Text = RightLabel;
+ rightItem.Foreground = RightForeground;
+ rightItem.Command = RightCommand;
+ rightItem.CommandParameter = RightCommandParameter;
+ rightItem.IconSource.Foreground = RightForeground;
+ ((SymbolIconSource)rightItem.IconSource).Symbol = RightIcon;
+
+ swipeControl.RightItems = rightItems;
+ }
+ else
+ {
+ swipeControl.RightItems = null;
+ }
+ }
+
+ private void LeftControl_Invoked(SwipeItem sender, SwipeItemInvokedEventArgs args)
+ {
+ LeftCommandRequested?.Invoke(this, EventArgs.Empty);
+ }
+
+ private void RightControl_Invoked(SwipeItem sender, SwipeItemInvokedEventArgs args)
+ {
+ RightCommandRequested?.Invoke(this, EventArgs.Empty);
+ }
+
private void SlidableListItem_Loaded(object sender, RoutedEventArgs e)
{
if (_contentStoryboard != null)
@@ -487,7 +657,7 @@ namespace Microsoft.Toolkit.Uwp.UI.Controls
}
else if (SwipeStatus != SwipeStatus.SwipingPassedRightThreshold)
{
- // This will cover extrem cases when previous state wasn't
+ // This will cover extreme cases when previous state wasn't
// below threshold.
_leftCommandAnimationSet?.Stop();
_leftCommandPanel.RenderTransform = _leftCommandTransform;
@@ -528,7 +698,7 @@ namespace Microsoft.Toolkit.Uwp.UI.Controls
}
else if (SwipeStatus != SwipeStatus.SwipingPassedLeftThreshold)
{
- // This will cover extrem cases when previous state wasn't
+ // This will cover extreme cases when previous state wasn't
// below threshold.
_rightCommandAnimationSet?.Stop();
_rightCommandPanel.RenderTransform = _rightCommandTransform;
@@ -777,5 +947,15 @@ namespace Microsoft.Toolkit.Uwp.UI.Controls
get { return (bool)GetValue(IsPointerReleasedOnSwipingHandledProperty); }
set { SetValue(IsPointerReleasedOnSwipingHandledProperty, value); }
}
+
+ ///
+ /// Gets or sets a value indicating whether the SlidableListItem should use the SwipeControl when possible (Fall Creators Update and above)
+ /// When set to true and the device supports SwipeControl, the SlidableListItem will use a template based on SwipeControl
+ ///
+ public bool UseSwipeControlWhenPossible
+ {
+ get { return (bool)GetValue(UseSwipeControlWhenPossibleProperty); }
+ set { SetValue(UseSwipeControlWhenPossibleProperty, value); }
+ }
}
}
diff --git a/Microsoft.Toolkit.Uwp.UI.Controls/SlidableListItem/SlidableListItem.xaml b/Microsoft.Toolkit.Uwp.UI.Controls/SlidableListItem/SlidableListItem.xaml
index c8612689f..2a8e20604 100644
--- a/Microsoft.Toolkit.Uwp.UI.Controls/SlidableListItem/SlidableListItem.xaml
+++ b/Microsoft.Toolkit.Uwp.UI.Controls/SlidableListItem/SlidableListItem.xaml
@@ -2,6 +2,52 @@
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:controls="using:Microsoft.Toolkit.Uwp.UI.Controls">
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Microsoft.Toolkit.Uwp.UI.Controls/SlidableListItem/SlidableListItemSwipeControlTemplate.xaml b/Microsoft.Toolkit.Uwp.UI.Controls/SlidableListItem/SlidableListItemSwipeControlTemplate.xaml
new file mode 100644
index 000000000..a83e60ce6
--- /dev/null
+++ b/Microsoft.Toolkit.Uwp.UI.Controls/SlidableListItem/SlidableListItemSwipeControlTemplate.xaml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Microsoft.Toolkit.Uwp.UI.Controls/SlidableListItem/SwipeStatus.cs b/Microsoft.Toolkit.Uwp.UI.Controls/SlidableListItem/SwipeStatus.cs
index 45d3b5fde..6896da4cf 100644
--- a/Microsoft.Toolkit.Uwp.UI.Controls/SlidableListItem/SwipeStatus.cs
+++ b/Microsoft.Toolkit.Uwp.UI.Controls/SlidableListItem/SwipeStatus.cs
@@ -10,15 +10,18 @@
// THE CODE OR THE USE OR OTHER DEALINGS IN THE CODE.
// ******************************************************************
+using System;
+
namespace Microsoft.Toolkit.Uwp.UI.Controls
{
///
/// Types of swipe status.
///
+ [Obsolete("The SwipeStatus will be removed alongside SlidableListItem in a future major release. Please use the SwipeControl available in the Fall Creators Update")]
public enum SwipeStatus
{
///
- /// Swiping is not occuring.
+ /// Swiping is not occurring.
///
Idle,
diff --git a/Microsoft.Toolkit.Uwp.UI.Controls/SlidableListItem/SwipeStatusChangedEventArgs.cs b/Microsoft.Toolkit.Uwp.UI.Controls/SlidableListItem/SwipeStatusChangedEventArgs.cs
index 7467d0a77..af22e0413 100644
--- a/Microsoft.Toolkit.Uwp.UI.Controls/SlidableListItem/SwipeStatusChangedEventArgs.cs
+++ b/Microsoft.Toolkit.Uwp.UI.Controls/SlidableListItem/SwipeStatusChangedEventArgs.cs
@@ -10,11 +10,14 @@
// THE CODE OR THE USE OR OTHER DEALINGS IN THE CODE.
// ******************************************************************
+using System;
+
namespace Microsoft.Toolkit.Uwp.UI.Controls
{
///
/// Event args for a SwipeStatus changing event
///
+ [Obsolete("The SwipeStatusChangedEventArgs will be removed alongside SlidableListItem in a future major release. Please use the SwipeControl available in the Fall Creators Update")]
public class SwipeStatusChangedEventArgs
{
///
diff --git a/Microsoft.Toolkit.Uwp.UI/Converters/VisibilityToBoolConverter.cs b/Microsoft.Toolkit.Uwp.UI/Converters/VisibilityToBoolConverter.cs
new file mode 100644
index 000000000..6c4d4cfcc
--- /dev/null
+++ b/Microsoft.Toolkit.Uwp.UI/Converters/VisibilityToBoolConverter.cs
@@ -0,0 +1,50 @@
+// ******************************************************************
+// Copyright (c) Microsoft. All rights reserved.
+// This code is licensed under the MIT License (MIT).
+// THE CODE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
+// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH
+// THE CODE OR THE USE OR OTHER DEALINGS IN THE CODE.
+// ******************************************************************
+
+using System;
+using Windows.UI.Xaml;
+using Windows.UI.Xaml.Data;
+
+namespace Microsoft.Toolkit.Uwp.UI.Converters
+{
+ ///
+ /// This class converts a Visibility enumeration to a boolean value.
+ ///
+ public class VisibilityToBoolConverter : IValueConverter
+ {
+ ///
+ /// Convert a value to boolean.
+ ///
+ /// The value to convert.
+ /// The type of the target property, as a type reference.
+ /// Optional parameter. Not used.
+ /// The language of the conversion. Not used
+ /// The value to be passed to the target dependency property.
+ public object Convert(object value, Type targetType, object parameter, string language)
+ {
+ return value is Visibility visibility && visibility == Visibility.Visible;
+ }
+
+ ///
+ /// Convert back a boolean value to .
+ ///
+ /// The value to convert back.
+ /// The type of the target property, as a type reference.
+ /// Optional parameter. Not used.
+ /// The language of the conversion. Not used
+ /// The value to be passed to the target dependency property.
+ public object ConvertBack(object value, Type targetType, object parameter, string language)
+ {
+ return (value is bool bl && bl) ? Visibility.Visible : Visibility.Collapsed;
+ }
+ }
+}
diff --git a/Microsoft.Toolkit/Microsoft.Toolkit.csproj b/Microsoft.Toolkit/Microsoft.Toolkit.csproj
index 21faca999..2ec98b65e 100644
--- a/Microsoft.Toolkit/Microsoft.Toolkit.csproj
+++ b/Microsoft.Toolkit/Microsoft.Toolkit.csproj
@@ -5,6 +5,9 @@
UWP Community Toolkit .NET StandardThis package includes .NET Standard code only helpers.UWP Toolkit Windows
+
+
+ Full
\ No newline at end of file
diff --git a/UnitTests/UnitTests.Notifications.UWP/UnitTests.Notifications.UWP.csproj b/UnitTests/UnitTests.Notifications.UWP/UnitTests.Notifications.UWP.csproj
index f29d12072..9fb5aaf35 100644
--- a/UnitTests/UnitTests.Notifications.UWP/UnitTests.Notifications.UWP.csproj
+++ b/UnitTests/UnitTests.Notifications.UWP/UnitTests.Notifications.UWP.csproj
@@ -11,7 +11,7 @@
UnitTests.Notifications.UWPen-USUAP
- 10.0.15063.0
+ 10.0.16299.010.0.10586.014512
@@ -99,7 +99,7 @@
- 5.3.4
+ 5.4.1
diff --git a/UnitTests/UnitTests.Notifications.WinRT/UnitTests.Notifications.WinRT.csproj b/UnitTests/UnitTests.Notifications.WinRT/UnitTests.Notifications.WinRT.csproj
index 8b9a4e5eb..80fd9aa1a 100644
--- a/UnitTests/UnitTests.Notifications.WinRT/UnitTests.Notifications.WinRT.csproj
+++ b/UnitTests/UnitTests.Notifications.WinRT/UnitTests.Notifications.WinRT.csproj
@@ -11,7 +11,7 @@
UnitTests.Notifications.WinRTen-USUAP
- 10.0.15063.0
+ 10.0.16299.010.0.10586.014512
@@ -99,7 +99,7 @@
- 5.3.4
+ 5.4.1
diff --git a/UnitTests/UnitTests.csproj b/UnitTests/UnitTests.csproj
index 08cd28324..577619fca 100644
--- a/UnitTests/UnitTests.csproj
+++ b/UnitTests/UnitTests.csproj
@@ -11,7 +11,7 @@
UnitTestsen-USUAP
- 10.0.15063.0
+ 10.0.16299.010.0.14393.014512
@@ -112,7 +112,7 @@
- 5.3.4
+ 5.4.11.0.2
diff --git a/contributing.md b/contributing.md
index 26bc2f946..5e222e995 100644
--- a/contributing.md
+++ b/contributing.md
@@ -46,6 +46,9 @@ PR has to be validated by at least two core members before being merged.
Once merged, you can get a pre-release package of the toolkit by adding this ([Nuget repo](https://dotnet.myget.org/F/uwpcommunitytoolkit/api/v3/index.json) | [Gallery](https://dotnet.myget.org/gallery/uwpcommunitytoolkit)) to your Visual Studio.
+### What about the t-shirt?
+Did your contribute but didin't get the t-shirt? Then make sure to fill out [this form](https://1drv.ms/xs/s!AjZLNGpIZBbgr7ZvtqjV-LcgdRcc7A).
+
## Quality assurance for pull requests for XAML controls
We encourage developers to follow the following guidances when submitting pull requests for controls:
* Your control must be usable and efficient with keyboard only
diff --git a/docs/animations/ParallaxService.md b/docs/animations/ParallaxService.md
index 91e3bc7e7..421138b19 100644
--- a/docs/animations/ParallaxService.md
+++ b/docs/animations/ParallaxService.md
@@ -8,6 +8,9 @@ keywords: windows 10, uwp, uwp community toolkit, uwp toolkit, parallaxservice
# ParallaxService
+> [!NOTE]
+The ParallaxService is deprecated and will be removed in a future major release. Please use the [ParallaxView](https://docs.microsoft.com/en-us/windows/uwp/style/parallax) available in the Fall Creators Update. Read the [Moving to ParallaxView](#parallaxview) section for more info.
+
The ParallaxService class allows to create a parallax effect for items contained within an element that scrolls like a ScrollViewer or ListView.
## Syntax
@@ -40,6 +43,28 @@ MyUIElement.SetValue(ParallaxService.HorizontalMultiplierProperty, 0.5);
[ParallaxService Sample Page Source](https://github.com/Microsoft/UWPCommunityToolkit/tree/master/Microsoft.Toolkit.Uwp.SampleApp/SamplePages/ParallaxService). You can see this in action in [UWP Community Toolkit Sample App](https://www.microsoft.com/store/apps/9NBLGGH4TLCQ)
+## Moving to ParallaxView
+The Windows 10 Fall Creators Update SDK now includes the [ParallaxView](https://docs.microsoft.com/en-us/windows/uwp/style/parallax) control among other new controls and APIs. The ParallaxService and ParallaxView share the same concepts and provide the same functionality. In fact, the ParallaxView adds even more functionality and can be used in even more scenarios.
+
+However, the way the two are used is different. Unlike the ParallaxService, the ParallaxView is a control hosting the background element. This control ties the scroll position of a foreground element, such as a list, to a background element, such as an image. As you scroll through the foreground element, it animates the background element to create a parallax effect. To use the ParallaxView control, you provide a Source element, a background element, and set the VerticalShift (for vertical scrolling) and/or HorizontalShift (for horizontal scrolling) properties to a value greater than zero. To create a parallax effect, the ParallaxView must be behind the foreground element.
+
+Here is an example of using the ParallaxView
+
+```csharp
+
+
+
+
+
+
+
+
+
+
+
+```
+
## Requirements
| [Device family](http://go.microsoft.com/fwlink/p/?LinkID=526370) | Universal, 10.0.14393.0 or higher |
diff --git a/docs/controls/Expander.md b/docs/controls/Expander.md
index 3a931bce3..1c08d02fb 100644
--- a/docs/controls/Expander.md
+++ b/docs/controls/Expander.md
@@ -17,6 +17,7 @@ You can use these properties :
* HeaderTemplate
* IsExpanded (define if the content is visible or not)
* ExpandDirection
+* DisplayMode
You can also use these events :
@@ -52,6 +53,13 @@ The `ExpandDirection` property can take 4 values that will expand the content ba
* `Right` - from left to right
* `Left` - from right to left
+### DisplayMode
+
+The `DisplayMode` property can take 2 values that will modify the behavior of the Expander control:
+
+* `Expand` - the content is either visible or collapsed (default)
+* `Overlay` - when the content is collapsed, an overlay content is shown
+
## Example Image
![Expander animation](../resources/images/Controls-Expander.gif "Expander")
diff --git a/docs/controls/HamburgerMenu.md b/docs/controls/HamburgerMenu.md
index f9ff3695c..03c21b52c 100644
--- a/docs/controls/HamburgerMenu.md
+++ b/docs/controls/HamburgerMenu.md
@@ -1,13 +1,16 @@
---
title: HamburgerMenu XAML Control
author: nmetulev
-ms.date: 08/20/2017
+ms.date: 11/20/2017
description: The Hamburger Menu Control provides an easy-to-use, side-bar menu which users can show or hide by using a Hamburger button
keywords: windows 10, uwp, uwp community toolkit, uwp toolkit, HamburgerMenu, xaml control, xaml
---
# HamburgerMenu XAML Control
+> [!NOTE]
+The HamburgerMenu is deprecated and will be removed in a future major release. Please use the [NavigationView](https://docs.microsoft.com/en-us/windows/uwp/controls-and-patterns/navigationview) available in the Fall Creators Update. Read the [Moving to NavigationView](#navview) section for more info.
+
The **Hamburger Menu Control** provides an easy-to-use, side-bar menu which users can show or hide by using a Hamburger button. By tapping the icon, it opens up a side menu with a selection of options or additional pages.
### How it works
@@ -143,6 +146,56 @@ namespace HamburgerSample
```
+## Moving to NavigationView
+The Windows 10 Fall Creators Update SDK now includes the [NavigationView](https://docs.microsoft.com/en-us/windows/uwp/controls-and-patterns/navigationview) control among other new controls and APIs. This is great news for the UWP Community Toolkit as it means that one of its most popular controls, the HamburgerMenu, has a comparable counterpart in the Windows SDK and it is very easy to transition to the NavigationView if you are already using the HamburgerMenu.
+
+The HamburgerMenu and NavigationView share the same concepts and provide the same functionality with one major exception being the NavigationView takes advantage of the new fluent design system. In fact, the NavigationView does everything the HamburgerMenu does and even more.
+
+### What developers need to know to move to NavigationView?
+
+* **Pane:** Both the NavigationView and HamburgerMenu are based on the SplitView, so the same properties exist in both controls. However, the NavigationView uses the new AcrylicBrush for the background which creates the semi-transparent material out of the box. Additionally, the navigation view automatically changes its display mode based on the amount of screen size available to it, so you are no longer required to write all that code.
+* **NavigationViewItems and Item Templates:** The NavigationView uses a similar pattern to define the Menu Items, with some naming changes. Here is the mapping from some properties in the HamburgerMenu to the comparable properties in the NavigationView:
+
+ | HamburgerMenu | NavigationView |
+ | --- | --- |
+ | ItemsSource | MenuItemsSource |
+ | ItemTemplate | MenuItemTemplate |
+ | ItemClick | ItemInvoked |
+
+ The *OptionsItemsSource* and *OptionItemsTemplate* is not available in the NavigationView. Instead, the NavigationView has two additional new properties that provide a much more flexible way of handling settings and optional items:
+ * An optional property for app settings. Simply set the property *IsSettingsVisible* to true and the NavigationView will display the settings button at the bottom. You can even customize the settings item
+
+ ```csharp
+ var settingsItem = HamburgerMenu.SettingsItem as NavigationViewItem;
+ settingsItem.Content = "About";
+ settingsItem.Icon = new FontIcon() { Glyph = "?" };
+ ```
+
+ * Free-form content in the pane’s footer, by adding any content in the new *PaneFooter* property
+
+ In addition, the NavigationView introduces new classes for quickly adding navigation items and grouping items. You can use the new NavigationViewItem, NavigationViewItemSeparator and NavigationViewItemHeader to directly populate the MenuItems and get the look you want
+
+* **Additional features in the NavigationView:** The navigation view also introduces several new features that are not available in the HamburgerMenu:
+
+ * There is a new optional header area that is vertically aligned with the navigation button and has a fixed height. Its purpose is to hold the page title of the selected nav category. The header is docked to the top of the page and acts as a scroll clipping point for the content area.
+ * AutoSuggestBox property allows you to add a search box that integrates directly with the NavigationView. Some developers accomplished the same with the HamburgerMenu by re-templating it and writing a lot of custom code. That is not needed with the NavigationView
+
+
+### Making the transition even easier
+Starting with v2.1 of the UWP Community Toolkit, the HamburgerMenu provides a new property called **UseNavigationViewWhenPossible**. Setting the value to true will force the HamburgerMenu to use a template based on the NavigationView when running on the Fall Creators Update and above, and the regular template otherwise.
+
+Using this property will enable you to take advantage of the NavigationView on devices that supported the NavigationView, while providing an experience based on HamburgerMenu on devices that have not yet updated to the Fall Creators Update. Make sure to test the experience on multiple OS releases and plan to fully transition to the NavigationView as the HamburgerMenu will be removed from the UWP Community Toolkit in a future major release.
+
+There are several HamburgerMenu properties that have no effect when the HamburgerMenu is using the NavigationView:
+* DisplayMode
+* PanePlacement
+* PaneBackground
+* PaneForeground
+* HamburgerWidth
+* HamburgerHeight
+* HamburgerMargin
+* HamburgerMenuTemplate
+
## Default Template
[HamburgerMenu XAML File](https://github.com/Microsoft/UWPCommunityToolkit/blob/master/Microsoft.Toolkit.Uwp.UI.Controls/HamburgerMenu/HamburgerMenu.xaml) is the XAML template used in the toolkit for the default styling.
diff --git a/docs/controls/ImageEx.md b/docs/controls/ImageEx.md
index fad6c84ce..3857e55a1 100644
--- a/docs/controls/ImageEx.md
+++ b/docs/controls/ImageEx.md
@@ -43,6 +43,10 @@ You can also use a placeholder image that will be displayed will loading the mai
[ImageEx Control XAML File](https://github.com/Microsoft/UWPCommunityToolkit/blob/master/Microsoft.Toolkit.Uwp.UI.Controls/ImageEx/ImageEx.xaml) is the XAML template used in the toolkit for the default styling.
[RoundImageEx Control XAML File](https://github.com/Microsoft/UWPCommunityToolkit/blob/master/Microsoft.Toolkit.Uwp.UI.Controls/ImageEx/RoundImageEx.xaml) is the XAML template used in the toolkit for the default styling of the Control that has Corner Rounding.
+## Platform Specific Notes
+
+On Windows 10.0.16299.0 or higher, **CornerRadius** is supported on ImageEx. Use of this property will not cause an exception on downlevel platforms; however, the desired effect will not render.
+
## Requirements (Windows 10 Device Family)
| [Device family](http://go.microsoft.com/fwlink/p/?LinkID=526370) | Universal, 10.0.14393.0 or higher |
diff --git a/docs/controls/SlidableListItem.md b/docs/controls/SlidableListItem.md
index 8e4ae1479..f2452d1a2 100644
--- a/docs/controls/SlidableListItem.md
+++ b/docs/controls/SlidableListItem.md
@@ -2,13 +2,16 @@
title: SlidableListItem XAML Control
author: nmetulev
ms.date: 08/20/2017
-description: The SlideableListItem Control is a UI control that enables actions to be triggered by sliding the content left or right.
+description: The SlidableListItem Control is a UI control that enables actions to be triggered by sliding the content left or right.
keywords: windows 10, uwp, uwp community toolkit, uwp toolkit, SlidableListItem, XAML Control, xaml
---
# SlidableListItem XAML Control
-The **SlideableListItem Control** is a UI control that enables actions to be triggered by sliding the content left or right. This effect can be forced to ignore the mouse if only touch screen interaction is desired.
+> [!NOTE]
+The SlidableListItem is deprecated and will be removed in a future major release. Please use the [SwipeControl](https://docs.microsoft.com/en-us/windows/uwp/controls-and-patterns/swipe) available in the Fall Creators Update. Read the [Moving to SwipeControl](#swipe) section for more info.
+
+The **SlidableListItem Control** is a UI control that enables actions to be triggered by sliding the content left or right. This effect can be forced to ignore the mouse if only touch screen interaction is desired.
This control can be used as a ListView Data Template root to create effects similar to those common in mobile email apps like Outlook.
@@ -86,6 +89,30 @@ If you use **SlidableListItem** in a **ListView** with the **ItemClick** event,
```
+## Moving to SwipeControl
+The Windows 10 Fall Creators Update SDK now includes the [SwipeControl](https://docs.microsoft.com/en-us/windows/uwp/controls-and-patterns/swipe) control among other new controls and APIs. This is great news for the UWP Community Toolkit as it means that one of its most popular controls has a comparable counterpart in the Windows SDK and it is very easy to transition to the SwipeControl if you are already using the SlidableListItem.
+
+The SlidableListItem and SwipeControl share the same concepts and provide the same functionality. In fact, the SwipeControl adds even more functionality and can be used in even more scenarios.
+
+### What developers need to know to move to the SwipeControl?
+
+* **Two different modes:** The SwipeControl has two different modes of commanding:
+ * Execute mode - works the same way as the commanding on the SlidableListItem, where the user executes a command with a single swipe
+ * Reveal mode - the user swipes an item to open a menu where the commands can be executed by tapping them
+* **Swipe direction:** SlidableListItem only supports left and right swiping while the SwipeControl supports all four directions (Up, Down, Left, Right)
+* **SwipeItem:** The Fall Creators Update defines new objects to help define the swipe commands. Unlike the SlidableListItem where each command is defined through properties on the control itself, the SwipeControl accepts a collection of SwipeItems that define the commands. This is where you can specify properties such as background, foreground, icon, label, and invoked events.
+
+### Making the transition easier
+Starting with v2.1 of the UWP Community Toolkit, the SwipeControl provides a new property called **UseSwipeControlWhenPossible**. Setting the value to true will force the SlidableListItem to use a template based on the SwipeControl when running on the Fall Creators Update and above, and the regular template otherwise.
+
+Using this property will enable you to take advantage of the SwipeControl on devices that supported it, while providing an experience based on SlidableListItem on devices that have not yet updated to the Fall Creators Update. Make sure to test the experience on multiple OS releases and plan to fully transition to the SwipeControl as the SlidableListItem will be removed from the UWP Community Toolkit in a future major release.
+
+There are several SlidableListItem properties that have no effect when the SlidableListItem is using the SwipeControl:
+* ActivationWidth
+* IsOffsetLimited
+* IsPointerReleasedOnSwipingHandled
+* MouseSlidingEnabled
+
## Example Image
![SlidableListItem animation](../resources/images/Controls-SlidableListItem.gif "SlidableListItem")
diff --git a/readme.md b/readme.md
index 08bd63285..04bedabbe 100644
--- a/readme.md
+++ b/readme.md
@@ -46,6 +46,7 @@ Once you search you should see a list similar to the one below (versions may be
## Supported SDKs
* Anniversary Update (14393)
* Creators Update (15063)
+* Fall Creators Update (16299)
## Features