From 7ecfbffb13543c5ce83e44df8a9ab655ea512055 Mon Sep 17 00:00:00 2001 From: Xiaotian Gu Date: Fri, 9 Sep 2022 14:13:05 -0400 Subject: [PATCH] feat: TabBarItemExtensions (#293) --- doc/controls-styles.md | 1 + doc/helpers/TabBarItem-extensions.md | 29 +++ .../Uno.Toolkit.Samples.Droid.csproj | 10 +- .../Uno.Toolkit.Samples.Shared/App.xaml | 2 +- .../TabBarItemExtensionsSamplePage.xaml | 154 ++++++++++++++++ .../TabBarItemExtensionsSamplePage.xaml.cs | 53 ++++++ .../TabBarItemExtensions_NestedPage1.xaml | 31 ++++ .../TabBarItemExtensions_NestedPage1.xaml.cs | 41 +++++ .../TabBarItemExtensions_NestedPage2.xaml | 13 ++ .../TabBarItemExtensions_NestedPage2.xaml.cs | 41 +++++ .../Uno.Toolkit.Samples.Shared.projitems | 21 +++ .../Uno.Toolkit.Samples.Skia.Gtk.csproj | 12 +- .../Uno.Toolkit.Samples.Skia.Tizen.csproj | 4 +- .../Uno.Toolkit.Samples.Skia.Wpf.Host.csproj | 4 +- .../Uno.Toolkit.Samples.Skia.Wpf.csproj | 4 +- .../Uno.Toolkit.Samples.UWP.csproj | 6 +- .../Uno.Toolkit.Samples.Wasm.csproj | 12 +- .../Uno.Toolkit.Samples.iOS.csproj | 20 +- .../Uno.Toolkit.Samples.macOS.csproj | 10 +- .../Uno.Toolkit.WinUI.Samples.Droid.csproj | 8 +- .../Uno.Toolkit.WinUI.Samples.Skia.Gtk.csproj | 10 +- .../Uno.Toolkit.WinUI.Samples.UWP.csproj | 2 +- .../Uno.Toolkit.WinUI.Samples.Wasm.csproj | 10 +- ...olkit.WinUI.Samples.Windows.Desktop.csproj | 2 +- .../Uno.Toolkit.WinUI.Samples.iOS.csproj | 8 +- .../Uno.Toolkit.WinUI.Samples.macOS.csproj | 8 +- .../Behaviors/TabBarItemExtensions.cs | 174 ++++++++++++++++++ .../Helpers/ScrollableHelper.cs | 145 +++++++++++++++ .../Helpers/VisualTreeHelperEx.cs | 157 ++++++++++++++-- src/Uno.Toolkit.UI/Uno.Toolkit.UI.csproj | 2 +- src/Uno.Toolkit.UI/Uno.Toolkit.WinUI.csproj | 2 +- .../Uno.Toolkit.UI.Cupertino.csproj | 4 +- .../Uno.Toolkit.WinUI.Cupertino.csproj | 4 +- .../Uno.Toolkit.UI.Material.csproj | 4 +- .../Uno.Toolkit.WinUI.Material.csproj | 4 +- 35 files changed, 927 insertions(+), 85 deletions(-) create mode 100644 doc/helpers/TabBarItem-extensions.md create mode 100644 samples/Uno.Toolkit.Samples/Uno.Toolkit.Samples.Shared/Content/Controls/TabBarItemExtensionsSamplePage.xaml create mode 100644 samples/Uno.Toolkit.Samples/Uno.Toolkit.Samples.Shared/Content/Controls/TabBarItemExtensionsSamplePage.xaml.cs create mode 100644 samples/Uno.Toolkit.Samples/Uno.Toolkit.Samples.Shared/Content/NestedSamples/TabBarItemExtensions_NestedPage1.xaml create mode 100644 samples/Uno.Toolkit.Samples/Uno.Toolkit.Samples.Shared/Content/NestedSamples/TabBarItemExtensions_NestedPage1.xaml.cs create mode 100644 samples/Uno.Toolkit.Samples/Uno.Toolkit.Samples.Shared/Content/NestedSamples/TabBarItemExtensions_NestedPage2.xaml create mode 100644 samples/Uno.Toolkit.Samples/Uno.Toolkit.Samples.Shared/Content/NestedSamples/TabBarItemExtensions_NestedPage2.xaml.cs create mode 100644 src/Uno.Toolkit.UI/Behaviors/TabBarItemExtensions.cs create mode 100644 src/Uno.Toolkit.UI/Helpers/ScrollableHelper.cs diff --git a/doc/controls-styles.md b/doc/controls-styles.md index 20c72d6c3..fe07f7918 100644 --- a/doc/controls-styles.md +++ b/doc/controls-styles.md @@ -16,6 +16,7 @@ The `Uno.Toolkit.UI` library adds the following helper classes: - [`ControlExtensions`](helpers\control-extensions.md): Provides various attached properties for common controls. - [`InputExtensions`](helpers\input-extensions.md): Provides various attached properties for _input controls_, such as `TextBox` and `PasswordBox`. - [`StatusBar`](helpers\StatusBar-extensions.md): Provides two attached properties on `Page` to controls the visual of the status bar on mobile platforms. +- [`TabBarItemExtensions`](helpers\TabBarItem-extensions.md): Provides additional features for `TabBarItem`. ## Control Styles Control|Style Key|IsDefaultStyle* diff --git a/doc/helpers/TabBarItem-extensions.md b/doc/helpers/TabBarItem-extensions.md new file mode 100644 index 000000000..9a6c94bc9 --- /dev/null +++ b/doc/helpers/TabBarItem-extensions.md @@ -0,0 +1,29 @@ +# TabBarItemExtensions Attached Properties +Provides additional features for `TabBarItem`. + +## Properties +Property|Type|Description +-|-|- +OnClickBehaviors|TBIOnClickBehavior\*|Backing property for the `TabBarItem` on-click behaviors when already selected. +OnClickBehaviorsTarget|UIElement|Optional. Backing property for the target of OnClickBehaviors.\* + +TBIOnClickBehavior\*: Specifies the on-click behaviors of `TabBarItem`: + - `BackNavigation`: Find the first `NavigationView` with back stack to back navigate. + - `ScrollToTop`: Find the first `ListView` or `ScrollViewer` to reset scroll position. + - `Auto`: All of above. + +OnClickBehaviorsTarget\*: The content host which the on-click behavior is applied is either the target itself or one of its descendent (via deep first search) suitable for the behavior. When omitted, the parent of `TabBar` will serve as the target. + +## Usage +```xml +xmlns:utu="using:Uno.Toolkit.UI" +... + + + + + + + + +``` diff --git a/samples/Uno.Toolkit.Samples/Uno.Toolkit.Samples.Droid/Uno.Toolkit.Samples.Droid.csproj b/samples/Uno.Toolkit.Samples/Uno.Toolkit.Samples.Droid/Uno.Toolkit.Samples.Droid.csproj index 14dee7557..5d52c8000 100644 --- a/samples/Uno.Toolkit.Samples/Uno.Toolkit.Samples.Droid/Uno.Toolkit.Samples.Droid.csproj +++ b/samples/Uno.Toolkit.Samples/Uno.Toolkit.Samples.Droid/Uno.Toolkit.Samples.Droid.csproj @@ -66,13 +66,13 @@ - 2.3.0-dev.6 + 2.3.0-dev.12 - 2.3.0-dev.6 + 2.3.0-dev.12 - - + + @@ -88,7 +88,7 @@ 2.3.1.1 - + diff --git a/samples/Uno.Toolkit.Samples/Uno.Toolkit.Samples.Shared/App.xaml b/samples/Uno.Toolkit.Samples/Uno.Toolkit.Samples.Shared/App.xaml index 6957a41dc..7c95dc432 100644 --- a/samples/Uno.Toolkit.Samples/Uno.Toolkit.Samples.Shared/App.xaml +++ b/samples/Uno.Toolkit.Samples/Uno.Toolkit.Samples.Shared/App.xaml @@ -26,7 +26,7 @@ -input + diff --git a/samples/Uno.Toolkit.Samples/Uno.Toolkit.Samples.Shared/Content/Controls/TabBarItemExtensionsSamplePage.xaml b/samples/Uno.Toolkit.Samples/Uno.Toolkit.Samples.Shared/Content/Controls/TabBarItemExtensionsSamplePage.xaml new file mode 100644 index 000000000..16268a867 --- /dev/null +++ b/samples/Uno.Toolkit.Samples/Uno.Toolkit.Samples.Shared/Content/Controls/TabBarItemExtensionsSamplePage.xaml @@ -0,0 +1,154 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/samples/Uno.Toolkit.Samples/Uno.Toolkit.Samples.Shared/Content/Controls/TabBarItemExtensionsSamplePage.xaml.cs b/samples/Uno.Toolkit.Samples/Uno.Toolkit.Samples.Shared/Content/Controls/TabBarItemExtensionsSamplePage.xaml.cs new file mode 100644 index 000000000..898ee9b8c --- /dev/null +++ b/samples/Uno.Toolkit.Samples/Uno.Toolkit.Samples.Shared/Content/Controls/TabBarItemExtensionsSamplePage.xaml.cs @@ -0,0 +1,53 @@ +using System; +using Uno.Toolkit.Samples.Content.NestedSamples; +using Uno.Toolkit.Samples.Entities; +using Uno.Toolkit.UI; + +#if IS_WINUI +using Microsoft.UI.Xaml; +using Microsoft.UI.Xaml.Controls; +#else +using Windows.UI.Xaml; +using Windows.UI.Xaml.Controls; +#endif + +namespace Uno.Toolkit.Samples.Content.Controls +{ + [SamplePage(SampleCategory.Behaviors, nameof(TabBarItemExtensions))] + public sealed partial class TabBarItemExtensionsSamplePage : Page + { + public TabBarItemExtensionsSamplePage() + { + this.InitializeComponent(); + + NestedNestedFrame.Navigate(typeof(TabBarItemExtensions_NestedPage1)); + } + + private void ScrollTop(object sender, RoutedEventArgs e) + { + if (!(sender is Button button)) return; + if (!(button.Tag is UIElement contentHost)) return; + + switch (contentHost) + { + case ListView lv: ScrollableHelper.SmoothScrollTop(lv); break; + case ScrollViewer sv: sv.ChangeView(0, 0, zoomFactor: default, disableAnimation: false); break; + + default: throw new InvalidOperationException(); + } + } + + private void ScrollBottom(object sender, RoutedEventArgs e) + { + if (!(sender is Button button)) return; + if (!(button.Tag is UIElement contentHost)) return; + + switch (contentHost) + { + case ListView lv: ScrollableHelper.SmoothScrollBottom(lv); break; + + default: throw new InvalidOperationException(); + } + } + } +} diff --git a/samples/Uno.Toolkit.Samples/Uno.Toolkit.Samples.Shared/Content/NestedSamples/TabBarItemExtensions_NestedPage1.xaml b/samples/Uno.Toolkit.Samples/Uno.Toolkit.Samples.Shared/Content/NestedSamples/TabBarItemExtensions_NestedPage1.xaml new file mode 100644 index 000000000..2d65b1ee3 --- /dev/null +++ b/samples/Uno.Toolkit.Samples/Uno.Toolkit.Samples.Shared/Content/NestedSamples/TabBarItemExtensions_NestedPage1.xaml @@ -0,0 +1,31 @@ + + + + + +