From a4ba7cc346645d73c1c62d5fe3a96ca8c0dcf12a Mon Sep 17 00:00:00 2001 From: michael-hawker <24302614+michael-hawker@users.noreply.github.com> Date: Fri, 1 Sep 2023 15:23:27 -0700 Subject: [PATCH 1/8] Update tooling pointer to latest --- tooling | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tooling b/tooling index c11f75df..8013fc71 160000 --- a/tooling +++ b/tooling @@ -1 +1 @@ -Subproject commit c11f75df72b7d02f15426868422072e141829492 +Subproject commit 8013fc71c0863ee2a3958d5a500a0558722d9f01 From 594c6cf48d12b6d3e6ec6772d77d2a8e674547fa Mon Sep 17 00:00:00 2001 From: michael-hawker <24302614+michael-hawker@users.noreply.github.com> Date: Fri, 1 Sep 2023 14:07:05 -0700 Subject: [PATCH 2/8] Fixes #197 misconfigured namespaces caused sample code not to load in app We should think of making an analyzer to detect this, since we use it... See discussion here about this issue: https://github.com/CommunityToolkit/Tooling-Windows-Submodule/pull/134#issuecomment-1703294644 --- .../Behaviors/samples/Headers/FadeHeaderBehaviorSample.xaml | 2 +- .../samples/Headers/FadeHeaderBehaviorSample.xaml.cs | 2 +- .../samples/Headers/QuickReturnHeaderBehaviorSample.xaml | 2 +- .../samples/Headers/QuickReturnHeaderBehaviorSample.xaml.cs | 2 +- .../samples/Headers/QuickReturnScrollViewerSample.xaml | 2 +- .../samples/Headers/QuickReturnScrollViewerSample.xaml.cs | 2 +- .../Behaviors/samples/Headers/StickyHeaderBehaviorSample.xaml | 4 ++-- .../samples/Headers/StickyHeaderBehaviorSample.xaml.cs | 2 +- .../samples/Headers/StickyHeaderItemsControlSample.xaml | 2 +- .../samples/Headers/StickyHeaderItemsControlSample.xaml.cs | 2 +- .../samples/HeaderedContentControlComplexSample.xaml | 2 +- .../samples/HeaderedContentControlComplexSample.xaml.cs | 2 +- .../samples/HeaderedContentControlImageSample.xaml | 2 +- .../samples/HeaderedContentControlImageSample.xaml.cs | 2 +- .../samples/HeaderedContentControlSample.xaml | 2 +- .../samples/HeaderedContentControlSample.xaml.cs | 2 +- .../samples/HeaderedContentControlTextSample.xaml | 2 +- .../samples/HeaderedContentControlTextSample.xaml.cs | 2 +- .../HeaderedControls/samples/HeaderedItemsControlSample.xaml | 4 ++-- .../samples/HeaderedItemsControlSample.xaml.cs | 2 +- .../HeaderedControls/samples/HeaderedTreeViewSample.xaml | 4 ++-- .../HeaderedControls/samples/HeaderedTreeViewSample.xaml.cs | 2 +- .../samples/ConstrainedBox/ConstrainedBoxAspectSample.xaml | 2 +- .../samples/ConstrainedBox/ConstrainedBoxAspectSample.xaml.cs | 4 +--- .../samples/ConstrainedBox/ConstrainedBoxMultipleSample.xaml | 2 +- .../ConstrainedBox/ConstrainedBoxMultipleSample.xaml.cs | 4 +--- .../samples/ConstrainedBox/ConstrainedBoxScaleSample.xaml | 2 +- .../samples/ConstrainedBox/ConstrainedBoxScaleSample.xaml.cs | 4 +--- 28 files changed, 31 insertions(+), 37 deletions(-) diff --git a/components/Behaviors/samples/Headers/FadeHeaderBehaviorSample.xaml b/components/Behaviors/samples/Headers/FadeHeaderBehaviorSample.xaml index af2f4ae8..3017c101 100644 --- a/components/Behaviors/samples/Headers/FadeHeaderBehaviorSample.xaml +++ b/components/Behaviors/samples/Headers/FadeHeaderBehaviorSample.xaml @@ -1,4 +1,4 @@ - /// An empty page that can be used on its own or navigated to within a Frame. diff --git a/components/Behaviors/samples/Headers/QuickReturnHeaderBehaviorSample.xaml b/components/Behaviors/samples/Headers/QuickReturnHeaderBehaviorSample.xaml index 39f95e6f..36c66603 100644 --- a/components/Behaviors/samples/Headers/QuickReturnHeaderBehaviorSample.xaml +++ b/components/Behaviors/samples/Headers/QuickReturnHeaderBehaviorSample.xaml @@ -1,4 +1,4 @@ - /// An empty page that can be used on its own or navigated to within a Frame. diff --git a/components/Behaviors/samples/Headers/QuickReturnScrollViewerSample.xaml b/components/Behaviors/samples/Headers/QuickReturnScrollViewerSample.xaml index 5528ff53..86104a96 100644 --- a/components/Behaviors/samples/Headers/QuickReturnScrollViewerSample.xaml +++ b/components/Behaviors/samples/Headers/QuickReturnScrollViewerSample.xaml @@ -1,4 +1,4 @@ - /// An empty page that can be used on its own or navigated to within a Frame. diff --git a/components/Behaviors/samples/Headers/StickyHeaderBehaviorSample.xaml b/components/Behaviors/samples/Headers/StickyHeaderBehaviorSample.xaml index 61438908..160a6125 100644 --- a/components/Behaviors/samples/Headers/StickyHeaderBehaviorSample.xaml +++ b/components/Behaviors/samples/Headers/StickyHeaderBehaviorSample.xaml @@ -1,11 +1,11 @@ - diff --git a/components/Behaviors/samples/Headers/StickyHeaderBehaviorSample.xaml.cs b/components/Behaviors/samples/Headers/StickyHeaderBehaviorSample.xaml.cs index 49c1ba53..32a33631 100644 --- a/components/Behaviors/samples/Headers/StickyHeaderBehaviorSample.xaml.cs +++ b/components/Behaviors/samples/Headers/StickyHeaderBehaviorSample.xaml.cs @@ -4,7 +4,7 @@ using CommunityToolkit.WinUI.Behaviors; -namespace BehaviorsExperiment.Samples; +namespace BehaviorsExperiment.Samples.Headers; /// /// An empty page that can be used on its own or navigated to within a Frame. diff --git a/components/Behaviors/samples/Headers/StickyHeaderItemsControlSample.xaml b/components/Behaviors/samples/Headers/StickyHeaderItemsControlSample.xaml index c594d072..9f5fcf93 100644 --- a/components/Behaviors/samples/Headers/StickyHeaderItemsControlSample.xaml +++ b/components/Behaviors/samples/Headers/StickyHeaderItemsControlSample.xaml @@ -1,4 +1,4 @@ - /// An empty page that can be used on its own or navigated to within a Frame. diff --git a/components/HeaderedControls/samples/HeaderedContentControlComplexSample.xaml b/components/HeaderedControls/samples/HeaderedContentControlComplexSample.xaml index 0168b9e5..1e9f7505 100644 --- a/components/HeaderedControls/samples/HeaderedContentControlComplexSample.xaml +++ b/components/HeaderedControls/samples/HeaderedContentControlComplexSample.xaml @@ -1,5 +1,5 @@ - diff --git a/components/HeaderedControls/samples/HeaderedContentControlComplexSample.xaml.cs b/components/HeaderedControls/samples/HeaderedContentControlComplexSample.xaml.cs index 288c6424..c7582a84 100644 --- a/components/HeaderedControls/samples/HeaderedContentControlComplexSample.xaml.cs +++ b/components/HeaderedControls/samples/HeaderedContentControlComplexSample.xaml.cs @@ -4,7 +4,7 @@ using CommunityToolkit.WinUI.Controls; -namespace HeaderedContentControlExperiment.Samples; +namespace HeaderedControlsExperiment.Samples; [ToolkitSample(id: nameof(HeaderedContentControlComplexSample), "HeaderedContentControl Complex Sample", description: $"A sample for showing how to create and use a {nameof(HeaderedContentControl)} control with complex content.")] public sealed partial class HeaderedContentControlComplexSample : Page diff --git a/components/HeaderedControls/samples/HeaderedContentControlImageSample.xaml b/components/HeaderedControls/samples/HeaderedContentControlImageSample.xaml index 6754cbd5..5a70df43 100644 --- a/components/HeaderedControls/samples/HeaderedContentControlImageSample.xaml +++ b/components/HeaderedControls/samples/HeaderedContentControlImageSample.xaml @@ -1,5 +1,5 @@ - diff --git a/components/HeaderedControls/samples/HeaderedContentControlImageSample.xaml.cs b/components/HeaderedControls/samples/HeaderedContentControlImageSample.xaml.cs index 049c59cb..bdd20584 100644 --- a/components/HeaderedControls/samples/HeaderedContentControlImageSample.xaml.cs +++ b/components/HeaderedControls/samples/HeaderedContentControlImageSample.xaml.cs @@ -4,7 +4,7 @@ using CommunityToolkit.WinUI.Controls; -namespace HeaderedContentControlExperiment.Samples; +namespace HeaderedControlsExperiment.Samples; [ToolkitSample(id: nameof(HeaderedContentControlImageSample), "HeaderedContentControl Image Sample", description: $"A sample for showing how to create and use a {nameof(HeaderedContentControl)} control with image content.")] public sealed partial class HeaderedContentControlImageSample : Page diff --git a/components/HeaderedControls/samples/HeaderedContentControlSample.xaml b/components/HeaderedControls/samples/HeaderedContentControlSample.xaml index 7c5dc54a..93a5001a 100644 --- a/components/HeaderedControls/samples/HeaderedContentControlSample.xaml +++ b/components/HeaderedControls/samples/HeaderedContentControlSample.xaml @@ -1,5 +1,5 @@  - diff --git a/components/HeaderedControls/samples/HeaderedContentControlSample.xaml.cs b/components/HeaderedControls/samples/HeaderedContentControlSample.xaml.cs index e38abd03..7e3be4c1 100644 --- a/components/HeaderedControls/samples/HeaderedContentControlSample.xaml.cs +++ b/components/HeaderedControls/samples/HeaderedContentControlSample.xaml.cs @@ -4,7 +4,7 @@ using CommunityToolkit.WinUI.Controls; -namespace HeaderedContentControlExperiment.Samples; +namespace HeaderedControlsExperiment.Samples; [ToolkitSample(id: nameof(HeaderedContentControlSample), "HeaderedContentControl", description: $"A sample for showing how to create and use a {nameof(HeaderedContentControl)} control.")] public sealed partial class HeaderedContentControlSample : Page diff --git a/components/HeaderedControls/samples/HeaderedContentControlTextSample.xaml b/components/HeaderedControls/samples/HeaderedContentControlTextSample.xaml index 6cb5d85e..d551d010 100644 --- a/components/HeaderedControls/samples/HeaderedContentControlTextSample.xaml +++ b/components/HeaderedControls/samples/HeaderedContentControlTextSample.xaml @@ -1,5 +1,5 @@  - diff --git a/components/HeaderedControls/samples/HeaderedContentControlTextSample.xaml.cs b/components/HeaderedControls/samples/HeaderedContentControlTextSample.xaml.cs index b5218250..b4540c06 100644 --- a/components/HeaderedControls/samples/HeaderedContentControlTextSample.xaml.cs +++ b/components/HeaderedControls/samples/HeaderedContentControlTextSample.xaml.cs @@ -4,7 +4,7 @@ using CommunityToolkit.WinUI.Controls; -namespace HeaderedContentControlExperiment.Samples; +namespace HeaderedControlsExperiment.Samples; [ToolkitSample(id: nameof(HeaderedContentControlTextSample), "HeaderedContentControl Text Sample", description: $"A sample for showing how to create and use a {nameof(HeaderedContentControl)} control with text content.")] public sealed partial class HeaderedContentControlTextSample : Page diff --git a/components/HeaderedControls/samples/HeaderedItemsControlSample.xaml b/components/HeaderedControls/samples/HeaderedItemsControlSample.xaml index 5d32d394..449d34bf 100644 --- a/components/HeaderedControls/samples/HeaderedItemsControlSample.xaml +++ b/components/HeaderedControls/samples/HeaderedItemsControlSample.xaml @@ -1,10 +1,10 @@ - diff --git a/components/HeaderedControls/samples/HeaderedItemsControlSample.xaml.cs b/components/HeaderedControls/samples/HeaderedItemsControlSample.xaml.cs index 86e2cefa..f3d038bb 100644 --- a/components/HeaderedControls/samples/HeaderedItemsControlSample.xaml.cs +++ b/components/HeaderedControls/samples/HeaderedItemsControlSample.xaml.cs @@ -4,7 +4,7 @@ using CommunityToolkit.WinUI.Controls; -namespace HeaderedItemsControlExperiment.Samples; +namespace HeaderedControlsExperiment.Samples; [ToolkitSample(id: nameof(HeaderedItemsControlSample), "HeaderedItemsControl", description: $"A sample for showing how to create and use a {nameof(HeaderedItemsControl)} control.")] public sealed partial class HeaderedItemsControlSample : Page diff --git a/components/HeaderedControls/samples/HeaderedTreeViewSample.xaml b/components/HeaderedControls/samples/HeaderedTreeViewSample.xaml index 15b3aec8..a1b1dae0 100644 --- a/components/HeaderedControls/samples/HeaderedTreeViewSample.xaml +++ b/components/HeaderedControls/samples/HeaderedTreeViewSample.xaml @@ -1,10 +1,10 @@ - diff --git a/components/HeaderedControls/samples/HeaderedTreeViewSample.xaml.cs b/components/HeaderedControls/samples/HeaderedTreeViewSample.xaml.cs index 9098ed18..572e1da7 100644 --- a/components/HeaderedControls/samples/HeaderedTreeViewSample.xaml.cs +++ b/components/HeaderedControls/samples/HeaderedTreeViewSample.xaml.cs @@ -4,7 +4,7 @@ using CommunityToolkit.WinUI.Controls; -namespace HeaderedItemsControlExperiment.Samples; +namespace HeaderedControlsExperiment.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 diff --git a/components/Primitives/samples/ConstrainedBox/ConstrainedBoxAspectSample.xaml b/components/Primitives/samples/ConstrainedBox/ConstrainedBoxAspectSample.xaml index 40d48de2..e550939a 100644 --- a/components/Primitives/samples/ConstrainedBox/ConstrainedBoxAspectSample.xaml +++ b/components/Primitives/samples/ConstrainedBox/ConstrainedBoxAspectSample.xaml @@ -1,5 +1,5 @@ - - - Date: Fri, 1 Sep 2023 14:13:50 -0700 Subject: [PATCH 3/8] Fix a couple of typos in docs --- components/Behaviors/samples/Behaviors.md | 2 +- components/Primitives/samples/ConstrainedBox.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/components/Behaviors/samples/Behaviors.md b/components/Behaviors/samples/Behaviors.md index f410cb55..0ae7a213 100644 --- a/components/Behaviors/samples/Behaviors.md +++ b/components/Behaviors/samples/Behaviors.md @@ -44,6 +44,6 @@ Empty lists do not receive focus: > [!Sample FocusBehaviorListSample] ## NavigateToUriAction -This behavior allows you to define a Uri in XAML, similiar to a `Hyperlink` or `HyperlinkButton`. This allows you to use a `Button` and still define the Uri in XAML without wiring up the `Click` event in code-behind, or restyling a `HyperlinkButton`. +This behavior allows you to define a Uri in XAML, similar to a `Hyperlink` or `HyperlinkButton`. This allows you to use a `Button` and still define the Uri in XAML without wiring up the `Click` event in code-behind, or restyling a `HyperlinkButton`. > [!Sample NavigateToUriActionSample] diff --git a/components/Primitives/samples/ConstrainedBox.md b/components/Primitives/samples/ConstrainedBox.md index 9016c351..5d56c466 100644 --- a/components/Primitives/samples/ConstrainedBox.md +++ b/components/Primitives/samples/ConstrainedBox.md @@ -1,7 +1,7 @@ --- title: ConstrainedBox author: michael-hawker -description: The ConstrainedBox is a FrameworkElement which can allow a developer to constrain the aspect ration, scale, or multiple boundary alignment of its content. +description: The ConstrainedBox is a FrameworkElement which can allow a developer to constrain the aspect ratio, scale, or multiple boundary alignment of its content. keywords: viewbox, content decorator, ConstrainedBox dev_langs: - csharp From b33066e29818ba746cd9b28a94f123bcc87c8ea0 Mon Sep 17 00:00:00 2001 From: michael-hawker <24302614+michael-hawker@users.noreply.github.com> Date: Fri, 1 Sep 2023 15:20:54 -0700 Subject: [PATCH 4/8] Re-organize Notification Behavior samples into sub-folder Move Header Behaviors doc into root --- components/Behaviors/samples/{Headers => }/HeaderBehaviors.md | 0 .../StackedNotificationsBehaviorCustomSample.xaml | 2 +- .../StackedNotificationsBehaviorCustomSample.xaml.cs | 2 +- .../StackedNotificationsBehaviorToolkitSample.xaml | 4 ++-- .../StackedNotificationsBehaviorToolkitSample.xaml.cs | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) rename components/Behaviors/samples/{Headers => }/HeaderBehaviors.md (100%) rename components/Behaviors/samples/{ => Notifications}/StackedNotificationsBehaviorCustomSample.xaml (92%) rename components/Behaviors/samples/{ => Notifications}/StackedNotificationsBehaviorCustomSample.xaml.cs (97%) rename components/Behaviors/samples/{ => Notifications}/StackedNotificationsBehaviorToolkitSample.xaml (78%) rename components/Behaviors/samples/{ => Notifications}/StackedNotificationsBehaviorToolkitSample.xaml.cs (96%) diff --git a/components/Behaviors/samples/Headers/HeaderBehaviors.md b/components/Behaviors/samples/HeaderBehaviors.md similarity index 100% rename from components/Behaviors/samples/Headers/HeaderBehaviors.md rename to components/Behaviors/samples/HeaderBehaviors.md diff --git a/components/Behaviors/samples/StackedNotificationsBehaviorCustomSample.xaml b/components/Behaviors/samples/Notifications/StackedNotificationsBehaviorCustomSample.xaml similarity index 92% rename from components/Behaviors/samples/StackedNotificationsBehaviorCustomSample.xaml rename to components/Behaviors/samples/Notifications/StackedNotificationsBehaviorCustomSample.xaml index 1c57592f..3f93215e 100644 --- a/components/Behaviors/samples/StackedNotificationsBehaviorCustomSample.xaml +++ b/components/Behaviors/samples/Notifications/StackedNotificationsBehaviorCustomSample.xaml @@ -1,5 +1,5 @@ - - + Date: Fri, 1 Sep 2023 15:21:42 -0700 Subject: [PATCH 5/8] Add SwitchPresenter samples, missed in #16 --- .../samples/Assets/SwitchPresenter.png | Bin 0 -> 3642 bytes .../samples/Primitives.Samples.csproj | 4 ++ .../Primitives/samples/SwitchPresenter.md | 27 +++++++++ .../SwitchPresenterLayoutSample.xaml | 54 ++++++++++++++++++ .../SwitchPresenterLayoutSample.xaml.cs | 16 ++++++ .../SwitchPresenterValueSample.xaml | 45 +++++++++++++++ .../SwitchPresenterValueSample.xaml.cs | 24 ++++++++ components/Primitives/samples/UniformGrid.md | 2 +- 8 files changed, 171 insertions(+), 1 deletion(-) create mode 100644 components/Primitives/samples/Assets/SwitchPresenter.png create mode 100644 components/Primitives/samples/SwitchPresenter.md create mode 100644 components/Primitives/samples/SwitchPresenter/SwitchPresenterLayoutSample.xaml create mode 100644 components/Primitives/samples/SwitchPresenter/SwitchPresenterLayoutSample.xaml.cs create mode 100644 components/Primitives/samples/SwitchPresenter/SwitchPresenterValueSample.xaml create mode 100644 components/Primitives/samples/SwitchPresenter/SwitchPresenterValueSample.xaml.cs diff --git a/components/Primitives/samples/Assets/SwitchPresenter.png b/components/Primitives/samples/Assets/SwitchPresenter.png new file mode 100644 index 0000000000000000000000000000000000000000..b8daf434272f5ecc9fda11d58c38457b481ebdec GIT binary patch literal 3642 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 M07*qoM6N<$f`TK-N&o-= literal 0 HcmV?d00001 diff --git a/components/Primitives/samples/Primitives.Samples.csproj b/components/Primitives/samples/Primitives.Samples.csproj index fe8244d6..fcdf49bc 100644 --- a/components/Primitives/samples/Primitives.Samples.csproj +++ b/components/Primitives/samples/Primitives.Samples.csproj @@ -17,6 +17,7 @@ + @@ -39,6 +40,9 @@ PreserveNewest + + PreserveNewest + PreserveNewest diff --git a/components/Primitives/samples/SwitchPresenter.md b/components/Primitives/samples/SwitchPresenter.md new file mode 100644 index 00000000..e7ec2938 --- /dev/null +++ b/components/Primitives/samples/SwitchPresenter.md @@ -0,0 +1,27 @@ +--- +title: SwitchPresenter +author: michael-hawker +description: A XAML ContentPresenter which can act like a switch statement for showing different UI based on a condition. +keywords: switch, logic, switchpresenter, contentpresenter, visibility, triggers, converters +dev_langs: + - csharp +category: Layouts +subcategory: Miscellaneous +discussion-id: 0 +issue-id: 0 +icon: Assets/SwitchPresenter.png +--- + +The `SwitchPresenter` control acts like a switch statement for XAML. It allows a developer to display certain content based on the condition of another value as an alternative to managing multiple Visibility values or complex visual states. + +Unlike traditional approaches of showing/hiding components within a page, the `SwitchPresenter` will only load and attach the matching Case's content to the Visual Tree. + +## Examples + +SwitchPresenter can make it easier to follow complex layout changes or layouts with varying logic that are based on a property, for instance the type of ticketing mode for an airline: + +> [!SAMPLE SwitchPresenterLayoutSample] + +Or it can simply be used to clearly display different outcomes based on some state which can be useful for a `NavigationView` or with a simple enum as in the following example: + +> [!SAMPLE SwitchPresenterValueSample] diff --git a/components/Primitives/samples/SwitchPresenter/SwitchPresenterLayoutSample.xaml b/components/Primitives/samples/SwitchPresenter/SwitchPresenterLayoutSample.xaml new file mode 100644 index 00000000..b521a1c5 --- /dev/null +++ b/components/Primitives/samples/SwitchPresenter/SwitchPresenterLayoutSample.xaml @@ -0,0 +1,54 @@ + + + + + Select an option + Confirmation Code + E-ticket number + Mileage Plan number + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/components/Primitives/samples/SwitchPresenter/SwitchPresenterLayoutSample.xaml.cs b/components/Primitives/samples/SwitchPresenter/SwitchPresenterLayoutSample.xaml.cs new file mode 100644 index 00000000..e5edd4e6 --- /dev/null +++ b/components/Primitives/samples/SwitchPresenter/SwitchPresenterLayoutSample.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. + +using PrimitivesExperiment.Samples.ConstrainedBox; + +namespace PrimitivesExperiment.Samples.SwitchPresenter; + +[ToolkitSample(id: nameof(SwitchPresenterLayoutSample), "SwitchPresenter Layout", description: $"A sample for showing how to use a {nameof(SwitchPresenter)} for complex layouts.")] +public sealed partial class SwitchPresenterLayoutSample : Page +{ + public SwitchPresenterLayoutSample() + { + this.InitializeComponent(); + } +} diff --git a/components/Primitives/samples/SwitchPresenter/SwitchPresenterValueSample.xaml b/components/Primitives/samples/SwitchPresenter/SwitchPresenterValueSample.xaml new file mode 100644 index 00000000..648ec60c --- /dev/null +++ b/components/Primitives/samples/SwitchPresenter/SwitchPresenterValueSample.xaml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/components/Primitives/samples/SwitchPresenter/SwitchPresenterValueSample.xaml.cs b/components/Primitives/samples/SwitchPresenter/SwitchPresenterValueSample.xaml.cs new file mode 100644 index 00000000..0fb2f77e --- /dev/null +++ b/components/Primitives/samples/SwitchPresenter/SwitchPresenterValueSample.xaml.cs @@ -0,0 +1,24 @@ +// 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 PrimitivesExperiment.Samples.SwitchPresenter; + +[ToolkitSample(id: nameof(SwitchPresenterValueSample), "SwitchPresenter Value", description: $"A sample for showing how to use a {nameof(SwitchPresenter)} for state changes from an enum.")] +public sealed partial class SwitchPresenterValueSample : Page +{ + public SwitchPresenterValueSample() + { + this.InitializeComponent(); + } +} + +public enum Animal +{ + Cat, + Dog, + Bunny, + Llama, + Parrot, + Squirrel +} diff --git a/components/Primitives/samples/UniformGrid.md b/components/Primitives/samples/UniformGrid.md index 7b66e8c6..7778928a 100644 --- a/components/Primitives/samples/UniformGrid.md +++ b/components/Primitives/samples/UniformGrid.md @@ -6,7 +6,7 @@ keywords: UniformGrid, grid, layout, responsive dev_langs: - csharp category: Layouts -subcategory: Layout +subcategory: Miscellaneous discussion-id: 0 issue-id: 0 icon: Assets/UniformGrid.png From e68be90484a9a40e37c0b18a4df374ba132d2580 Mon Sep 17 00:00:00 2001 From: michael-hawker <24302614+michael-hawker@users.noreply.github.com> Date: Fri, 1 Sep 2023 18:20:18 -0700 Subject: [PATCH 6/8] Fix ListViewExtensions doc and add working SmoothScrollIntoView sample Tested on UWP only --- .../Extensions/samples/ListViewExtensions.md | 63 +------------------ .../SmoothScrollIntoViewSample.xaml | 18 ++++++ .../SmoothScrollIntoViewSample.xaml.cs | 47 ++++++++++++++ 3 files changed, 68 insertions(+), 60 deletions(-) create mode 100644 components/Extensions/samples/ListViewExtensions/SmoothScrollIntoViewSample.xaml create mode 100644 components/Extensions/samples/ListViewExtensions/SmoothScrollIntoViewSample.xaml.cs diff --git a/components/Extensions/samples/ListViewExtensions.md b/components/Extensions/samples/ListViewExtensions.md index 5a118668..ed500289 100644 --- a/components/Extensions/samples/ListViewExtensions.md +++ b/components/Extensions/samples/ListViewExtensions.md @@ -111,8 +111,6 @@ Here is how this property can be used from XAML: Use SmoothScrollIntoView helps to scroll the item into the view with animation. Specify the ItemPosition property to align the item. -### Syntax - ```csharp // Scrolling with index await MyGridView.SmoothScrollIntoViewWithIndexAsync(index: int, itemPlacement: ItemPlacement, disableAnimation: bool, scrollIfVisibile: bool, additionalHorizontalOffset: int, additionalVerticalOffset: int); @@ -121,61 +119,6 @@ await MyGridView.SmoothScrollIntoViewWithIndexAsync(index: int, itemPlacement: I await MyGridView.SmoothScrollIntoViewWithItemAsync(item: object, itemPlacement: ItemPlacement, disableAnimation: bool, scrollIfVisibile: bool, additionalHorizontalOffset: int, additionalVerticalOffset: int); ``` -### Methods - -| Methods | Return Type | Description | -|---------|-------------|-------------| -| SmoothScrollIntoViewWithIndexAsync(int, ScrollItemPlacement, bool, bool, int, int) | Task | Smooth scroll item into view With index number | -| SmoothScrollIntoViewWithItemAsync(object, ScrollItemPlacement, bool, bool, int, int) | Task | Smooth scroll item into view With item object | - -### Method params - -| Properties | Type | Description | -|------------|------|-------------| -| intex | int | Intex of the item to be scrolled. Index can be negative | -| item | int | Intex of the item to be scrolled | -| itemPosition | ScrollItemPlacement | Specify the position of the Item after scrolling | -| disableAnimation | bool | To disable the scrolling animation | -| scrollIfVisibile | bool | Set `true` to scroll even if the scroll to item is visible so that the item will be aligned depend upon `itemPosition` | -| additionalHorizontalOffset | bool | Give addition horizontal offset | -| additionalVerticalOffset | bool | Give addition vertical offset | - -### ItemPosition - -| ScrollItemPlacement | Description | -|--------------|-------------| -| Default | If visible then it will not scroll, if not then item will be aligned to the nearest edge | -| Left | Aligned left | -| Top | Aligned top | -| Center | Aligned center | -| Right | Aligned right | -| Bottom | Aligned bottom | - -### Examples - -- We can use this extension to make the selected item always centered. - - **Sample Code** - - ```xaml - - - - - - - - - - - - - ``` - - ```csharp - private async void ListView_SelectionChanged(object sender, SelectionChangedEventArgs e) - { - var listView = (sender as ListView); - await listView.SmoothScrollIntoViewWithIndexAsync(listView.SelectedIndex, ScrollItemPlacement.Center, false, true); - } - ``` +We can use this extension to make the selected item always centered: + +> [!SAMPLE SmoothScrollIntoViewSample] diff --git a/components/Extensions/samples/ListViewExtensions/SmoothScrollIntoViewSample.xaml b/components/Extensions/samples/ListViewExtensions/SmoothScrollIntoViewSample.xaml new file mode 100644 index 00000000..73db0137 --- /dev/null +++ b/components/Extensions/samples/ListViewExtensions/SmoothScrollIntoViewSample.xaml @@ -0,0 +1,18 @@ + + + + + + + + + + diff --git a/components/Extensions/samples/ListViewExtensions/SmoothScrollIntoViewSample.xaml.cs b/components/Extensions/samples/ListViewExtensions/SmoothScrollIntoViewSample.xaml.cs new file mode 100644 index 00000000..e92a1837 --- /dev/null +++ b/components/Extensions/samples/ListViewExtensions/SmoothScrollIntoViewSample.xaml.cs @@ -0,0 +1,47 @@ +// 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; + +#if WINAPPSDK +using ListView = Microsoft.UI.Xaml.Controls.ListView; +#else +using ListView = Windows.UI.Xaml.Controls.ListView; +#endif + +namespace ExtensionsExperiment.Samples.ListViewExtensions; + +[ToolkitSample(id: nameof(SmoothScrollIntoViewSample), "SmoothScrollIntoView Extension", description: "A sample for showing how to the SmoothScrollIntoViewWithIndexAsync API.")] +public sealed partial class SmoothScrollIntoViewSample : Page +{ + public ObservableCollection Items { get; set; } = new(); + + public SmoothScrollIntoViewSample() + { + Items = GetOddEvenSource(201); + + this.InitializeComponent(); + } + + private async void ListView_SelectionChanged(object sender, SelectionChangedEventArgs e) + { + if (sender is ListView listView) + { + await listView.SmoothScrollIntoViewWithIndexAsync(listView.SelectedIndex, ScrollItemPlacement.Center, false, true); + } + } + + private ObservableCollection GetOddEvenSource(int count) + { + ObservableCollection oddEvenSource = new(); + + for (int number = 0; number < count; number++) + { + var item = (number % 2) == 0 ? $"{number} - Even" : $"{number} - Odd"; + oddEvenSource.Add(item); + } + + return oddEvenSource; + } +} From 9a3acf11c69d33be596f2a808a1a174aaa1069f5 Mon Sep 17 00:00:00 2001 From: michael-hawker <24302614+michael-hawker@users.noreply.github.com> Date: Fri, 1 Sep 2023 18:19:39 -0700 Subject: [PATCH 7/8] Port AttachedCardShadow from Media to Media package, missed in initial port somehow! Tested on UWP, should work on WASDK, but needs test... Updated namespace, and did null work - Otherwise should be no changes from UWP main source of old repo --- .../Media/src/Shadows/AttachedCardShadow.cs | 372 ++++++++++++++++++ 1 file changed, 372 insertions(+) create mode 100644 components/Media/src/Shadows/AttachedCardShadow.cs diff --git a/components/Media/src/Shadows/AttachedCardShadow.cs b/components/Media/src/Shadows/AttachedCardShadow.cs new file mode 100644 index 00000000..223ce515 --- /dev/null +++ b/components/Media/src/Shadows/AttachedCardShadow.cs @@ -0,0 +1,372 @@ +// 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.Numerics; +using Microsoft.Graphics.Canvas.Geometry; + +#if WINUI2 +using Windows.UI; +using Windows.UI.Composition; +using Windows.UI.Xaml.Hosting; +#elif WINUI3 +using Microsoft.UI; +using Microsoft.UI.Composition; +using Microsoft.UI.Xaml.Hosting; +#endif + +namespace CommunityToolkit.WinUI.Media; + +/// +/// A performant rectangular which can be attached to any . It uses Win2D to create a clipped area of the outline of the element such that transparent elements don't see the shadow below them, and the shadow can be attached without having to project to another surface. It is animatable, can be shared via a resource, and used in a . +/// +/// +/// This shadow will not work on which is directly clipping to its bounds (e.g. a using a ). An extra can instead be applied around the clipped border with the Shadow to create the desired effect. Most existing controls due to how they're templated will not encounter this behavior or require this workaround. +/// +public sealed class AttachedCardShadow : AttachedShadowBase +{ + private const float MaxBlurRadius = 72; + + private static readonly TypedResourceKey ClipResourceKey = "Clip"; + private static readonly TypedResourceKey PathGeometryResourceKey = "PathGeometry"; + private static readonly TypedResourceKey OpacityMaskBrushResourceKey = "OpacityMask"; + private static readonly TypedResourceKey OpacityMaskShapeVisualResourceKey = "OpacityMaskShapeVisual"; + private static readonly TypedResourceKey OpacityMaskGeometryResourceKey = "OpacityMaskGeometry"; + private static readonly TypedResourceKey OpacityMaskSpriteShapeResourceKey = "OpacityMaskSpriteShape"; + private static readonly TypedResourceKey OpacityMaskShapeVisualSurfaceResourceKey = "OpacityMaskShapeVisualSurface"; + private static readonly TypedResourceKey OpacityMaskShapeVisualSurfaceBrushResourceKey = "OpacityMaskShapeVisualSurfaceBrush"; + private static readonly TypedResourceKey OpacityMaskVisualSurfaceResourceKey = "OpacityMaskVisualSurface"; + private static readonly TypedResourceKey OpacityMaskSurfaceBrushResourceKey = "OpacityMaskSurfaceBrush"; + private static readonly TypedResourceKey OpacityMaskVisualResourceKey = "OpacityMaskVisual"; + private static readonly TypedResourceKey RoundedRectangleGeometryResourceKey = "RoundedGeometry"; + private static readonly TypedResourceKey ShapeResourceKey = "Shape"; + private static readonly TypedResourceKey ShapeVisualResourceKey = "ShapeVisual"; + private static readonly TypedResourceKey SurfaceBrushResourceKey = "SurfaceBrush"; + private static readonly TypedResourceKey VisualSurfaceResourceKey = "VisualSurface"; + + /// + /// The for + /// + public static readonly DependencyProperty CornerRadiusProperty = + DependencyProperty.Register( + nameof(CornerRadius), + typeof(double), + typeof(AttachedCardShadow), + new PropertyMetadata(4d, OnDependencyPropertyChanged)); // Default WinUI ControlCornerRadius is 4 + + /// + /// The for . + /// + public static readonly DependencyProperty InnerContentClipModeProperty = + DependencyProperty.Register( + nameof(InnerContentClipMode), + typeof(InnerContentClipMode), + typeof(AttachedCardShadow), + new PropertyMetadata(InnerContentClipMode.CompositionGeometricClip, OnDependencyPropertyChanged)); + + /// + /// Gets or sets the roundness of the shadow's corners. + /// + public double CornerRadius + { + get => (double)GetValue(CornerRadiusProperty); + set => SetValue(CornerRadiusProperty, value); + } + + /// + /// Gets or sets the mode use to clip inner content from the shadow. + /// + public InnerContentClipMode InnerContentClipMode + { + get => (InnerContentClipMode)GetValue(InnerContentClipModeProperty); + set => SetValue(InnerContentClipModeProperty, value); + } + +#if !WINAPPSDK + /// + protected override bool IsSupported => SupportsCompositionVisualSurface; +#endif + + /// + protected internal override bool SupportsOnSizeChangedEvent => true; + + /// + protected internal override void OnElementContextInitialized(AttachedShadowElementContext context) + { + UpdateVisualOpacityMask(context); + base.OnElementContextInitialized(context); + } + + /// + protected override void OnPropertyChanged(AttachedShadowElementContext context, DependencyProperty property, object oldValue, object newValue) + { + if (property == CornerRadiusProperty) + { + UpdateShadowClip(context); + UpdateVisualOpacityMask(context); + + var geometry = context.GetResource(RoundedRectangleGeometryResourceKey); + if (geometry != null) + { + geometry.CornerRadius = new Vector2((float)(double)newValue); + } + } + else if (property == InnerContentClipModeProperty) + { + UpdateShadowClip(context); + UpdateVisualOpacityMask(context); + SetElementChildVisual(context); + } + else + { + base.OnPropertyChanged(context, property, oldValue, newValue); + } + } + + /// + protected override CompositionBrush? GetShadowMask(AttachedShadowElementContext context) + { + if (context.Compositor == null +#if !WINAPPSDK + || !SupportsCompositionVisualSurface +#endif + ) + { + return null; + } + + // Create rounded rectangle geometry and add it to a shape + var geometry = context.GetResource(RoundedRectangleGeometryResourceKey) ?? context.AddResource( + RoundedRectangleGeometryResourceKey, + context.Compositor.CreateRoundedRectangleGeometry()); + geometry.CornerRadius = new Vector2((float)CornerRadius); + + var shape = context.GetResource(ShapeResourceKey) ?? context.AddResource(ShapeResourceKey, context.Compositor.CreateSpriteShape(geometry)); + shape.FillBrush = context.Compositor.CreateColorBrush(Colors.Black); + + // Create a ShapeVisual so that our geometry can be rendered to a visual + var shapeVisual = context.GetResource(ShapeVisualResourceKey) ?? + context.AddResource(ShapeVisualResourceKey, context.Compositor.CreateShapeVisual()); + shapeVisual.Shapes.Add(shape); + + // Create a CompositionVisualSurface, which renders our ShapeVisual to a texture + var visualSurface = context.GetResource(VisualSurfaceResourceKey) ?? + context.AddResource(VisualSurfaceResourceKey, context.Compositor.CreateVisualSurface()); + visualSurface.SourceVisual = shapeVisual; + + // Create a CompositionSurfaceBrush to render our CompositionVisualSurface to a brush. + // Now we have a rounded rectangle brush that can be used on as the mask for our shadow. + var surfaceBrush = context.GetResource(SurfaceBrushResourceKey) ?? context.AddResource( + SurfaceBrushResourceKey, + context.Compositor.CreateSurfaceBrush(visualSurface)); + + geometry.Size = visualSurface.SourceSize = shapeVisual.Size = context.Element.RenderSize.ToVector2(); + + return surfaceBrush; + } + + /// + protected override CompositionClip? GetShadowClip(AttachedShadowElementContext context) + { + if (InnerContentClipMode != InnerContentClipMode.CompositionGeometricClip + || context.Compositor == null) + { + context.RemoveAndDisposeResource(PathGeometryResourceKey); + context.RemoveAndDisposeResource(ClipResourceKey); + + return null; + } + + // The way this shadow works without the need to project on another element is because + // we're clipping the inner part of the shadow which would be cast on the element + // itself away. This method is creating an outline so that we are only showing the + // parts of the shadow that are outside the element's context. + // Note: This does cause an issue if the element does clip itself to its bounds, as then + // the shadowed area is clipped as well. + var pathGeom = context.GetResource(PathGeometryResourceKey) ?? + context.AddResource(PathGeometryResourceKey, context.Compositor.CreatePathGeometry()); + var clip = context.GetResource(ClipResourceKey) ?? context.AddResource(ClipResourceKey, context.Compositor.CreateGeometricClip(pathGeom)); + + // Create rounded rectangle geometry at a larger size that compensates for the size of the stroke, + // as we want the inside edge of the stroke to match the edges of the element. + // Additionally, the inside edge of the stroke will have a smaller radius than the radius we specified. + // Using "(StrokeThickness / 2) + Radius" as our rectangle's radius will give us an inside stroke radius that matches the radius we want. + var canvasRectangle = CanvasGeometry.CreateRoundedRectangle( + null, + -MaxBlurRadius / 2, + -MaxBlurRadius / 2, + (float)context.Element.ActualWidth + MaxBlurRadius, + (float)context.Element.ActualHeight + MaxBlurRadius, + (MaxBlurRadius / 2) + (float)CornerRadius, + (MaxBlurRadius / 2) + (float)CornerRadius); + + var canvasStroke = canvasRectangle.Stroke(MaxBlurRadius); + + pathGeom.Path = new CompositionPath(canvasStroke); + + return clip; + } + + /// + /// Updates the used to mask .SpriteVisual. + /// + /// The whose will be masked. + private void UpdateVisualOpacityMask(AttachedShadowElementContext context) + { + if (InnerContentClipMode != InnerContentClipMode.CompositionMaskBrush + || context.Compositor == null) + { + context.RemoveAndDisposeResource(OpacityMaskShapeVisualResourceKey); + context.RemoveAndDisposeResource(OpacityMaskGeometryResourceKey); + context.RemoveAndDisposeResource(OpacityMaskSpriteShapeResourceKey); + context.RemoveAndDisposeResource(OpacityMaskShapeVisualSurfaceResourceKey); + context.RemoveAndDisposeResource(OpacityMaskShapeVisualSurfaceBrushResourceKey); + + return; + } + + // Create ShapeVisual, and CompositionSpriteShape with geometry, these will provide the visuals for the opacity mask. + ShapeVisual shapeVisual = context.GetResource(OpacityMaskShapeVisualResourceKey) ?? + context.AddResource(OpacityMaskShapeVisualResourceKey, context.Compositor.CreateShapeVisual()); + + CompositionRoundedRectangleGeometry geometry = context.GetResource(OpacityMaskGeometryResourceKey) ?? + context.AddResource(OpacityMaskGeometryResourceKey, context.Compositor.CreateRoundedRectangleGeometry()); + CompositionSpriteShape shape = context.GetResource(OpacityMaskSpriteShapeResourceKey) ?? + context.AddResource(OpacityMaskSpriteShapeResourceKey, context.Compositor.CreateSpriteShape(geometry)); + + // Set the attributes of the geometry, and add the CompositionSpriteShape to the ShapeVisual. + // The geometry will have a thick outline and no fill, meaning that when used as a mask, + // the shadow will only be rendered on the outer area covered by the outline, clipping out its inner portion. + geometry.Offset = new Vector2(MaxBlurRadius / 2); + geometry.CornerRadius = new Vector2((MaxBlurRadius / 2) + (float)CornerRadius); + shape.StrokeThickness = MaxBlurRadius; + shape.StrokeBrush = shape.StrokeBrush ?? context.Compositor.CreateColorBrush(Colors.Black); + + if (!shapeVisual.Shapes.Contains(shape)) + { + shapeVisual.Shapes.Add(shape); + } + + // Create CompositionVisualSurface using the ShapeVisual as the source visual. + CompositionVisualSurface visualSurface = context.GetResource(OpacityMaskShapeVisualSurfaceResourceKey) ?? + context.AddResource(OpacityMaskShapeVisualSurfaceResourceKey, context.Compositor.CreateVisualSurface()); + visualSurface.SourceVisual = shapeVisual; + + geometry.Size = new Vector2((float)context.Element.ActualWidth, (float)context.Element.ActualHeight) + new Vector2(MaxBlurRadius); + shapeVisual.Size = visualSurface.SourceSize = new Vector2((float)context.Element.ActualWidth, (float)context.Element.ActualHeight) + new Vector2(MaxBlurRadius * 2); + + // Create a CompositionSurfaceBrush using the CompositionVisualSurface as the source, this essentially converts the ShapeVisual into a brush. + // This brush can then be used as a mask. + CompositionSurfaceBrush opacityMask = context.GetResource(OpacityMaskShapeVisualSurfaceBrushResourceKey) ?? + context.AddResource(OpacityMaskShapeVisualSurfaceBrushResourceKey, context.Compositor.CreateSurfaceBrush()); + opacityMask.Surface = visualSurface; + } + + /// + protected override void SetElementChildVisual(AttachedShadowElementContext context) + { + if (context.TryGetResource(OpacityMaskShapeVisualSurfaceBrushResourceKey, out CompositionSurfaceBrush? opacityMask) + && context.Compositor != null) + { + // If the resource for OpacityMaskShapeVisualSurfaceBrushResourceKey exists it means this.InnerContentClipMode == CompositionVisualSurface, + // which means we need to take some steps to set up an opacity mask. + + // Create a CompositionVisualSurface, and use the SpriteVisual containing the shadow as the source. + CompositionVisualSurface shadowVisualSurface = context.GetResource(OpacityMaskVisualSurfaceResourceKey) ?? + context.AddResource(OpacityMaskVisualSurfaceResourceKey, context.Compositor.CreateVisualSurface()); + shadowVisualSurface.SourceVisual = context.SpriteVisual; + + if (context.SpriteVisual != null) + { + context.SpriteVisual.RelativeSizeAdjustment = Vector2.Zero; + context.SpriteVisual.Size = new Vector2((float)context.Element.ActualWidth, (float)context.Element.ActualHeight); + } + + // Adjust the offset and size of the CompositionVisualSurface to accommodate the thick outline of the shape created in UpdateVisualOpacityMask(). + shadowVisualSurface.SourceOffset = new Vector2(-MaxBlurRadius); + shadowVisualSurface.SourceSize = new Vector2((float)context.Element.ActualWidth, (float)context.Element.ActualHeight) + new Vector2(MaxBlurRadius * 2); + + // Create a CompositionSurfaceBrush from the CompositionVisualSurface. This allows us to render the shadow in a brush. + CompositionSurfaceBrush shadowSurfaceBrush = context.GetResource(OpacityMaskSurfaceBrushResourceKey) ?? + context.AddResource(OpacityMaskSurfaceBrushResourceKey, context.Compositor.CreateSurfaceBrush()); + shadowSurfaceBrush.Surface = shadowVisualSurface; + shadowSurfaceBrush.Stretch = CompositionStretch.None; + + // Create a CompositionMaskBrush, using the CompositionSurfaceBrush of the shadow as the source, + // and the CompositionSurfaceBrush created in UpdateVisualOpacityMask() as the mask. + // This creates a brush that renders the shadow with its inner portion clipped out. + CompositionMaskBrush maskBrush = context.GetResource(OpacityMaskBrushResourceKey) ?? + context.AddResource(OpacityMaskBrushResourceKey, context.Compositor.CreateMaskBrush()); + maskBrush.Source = shadowSurfaceBrush; + maskBrush.Mask = opacityMask; + + // Create a SpriteVisual and set its brush to the CompositionMaskBrush created in the previous step, + // then set it as the child of the element in the context. + SpriteVisual visual = context.GetResource(OpacityMaskVisualResourceKey) ?? + context.AddResource(OpacityMaskVisualResourceKey, context.Compositor.CreateSpriteVisual()); + visual.RelativeSizeAdjustment = Vector2.One; + visual.Offset = new Vector3(-MaxBlurRadius, -MaxBlurRadius, 0); + visual.Size = new Vector2(MaxBlurRadius * 2); + visual.Brush = maskBrush; + ElementCompositionPreview.SetElementChildVisual(context.Element, visual); + } + else + { + base.SetElementChildVisual(context); + + // Reset context.SpriteVisual.Size and RelativeSizeAdjustment to default values + // as they may be changed in the block above. + if (context.SpriteVisual != null) + { + context.SpriteVisual.Size = Vector2.Zero; + context.SpriteVisual.RelativeSizeAdjustment = Vector2.One; + } + + context.RemoveAndDisposeResource(OpacityMaskVisualSurfaceResourceKey); + context.RemoveAndDisposeResource(OpacityMaskSurfaceBrushResourceKey); + context.RemoveAndDisposeResource(OpacityMaskVisualResourceKey); + context.RemoveAndDisposeResource(OpacityMaskBrushResourceKey); + } + } + + /// + protected internal override void OnSizeChanged(AttachedShadowElementContext context, Size newSize, Size previousSize) + { + Vector2 sizeAsVec2 = newSize.ToVector2(); + + if (context.TryGetResource(RoundedRectangleGeometryResourceKey, out CompositionRoundedRectangleGeometry? geometry) + && geometry != null) + { + geometry.Size = sizeAsVec2; + } + + if (context.TryGetResource(VisualSurfaceResourceKey, out CompositionVisualSurface? visualSurface) + && visualSurface != null) + { + visualSurface.SourceSize = sizeAsVec2; + } + + if (context.TryGetResource(ShapeVisualResourceKey, out ShapeVisual? shapeVisual) + && shapeVisual != null) + { + shapeVisual.Size = sizeAsVec2; + } + + if (context.TryGetResource(OpacityMaskVisualSurfaceResourceKey, out CompositionVisualSurface? opacityMaskVisualSurface) + && opacityMaskVisualSurface != null) + { + opacityMaskVisualSurface.SourceSize = sizeAsVec2 + new Vector2(MaxBlurRadius * 2); + } + + if (context.SpriteVisual != null + && InnerContentClipMode is InnerContentClipMode.CompositionMaskBrush) + { + context.SpriteVisual.Size = sizeAsVec2; + } + + UpdateShadowClip(context); + UpdateVisualOpacityMask(context); + + base.OnSizeChanged(context, newSize, previousSize); + } +} From e62fdc67840ea945a75b24575bd77cdebb7ce79e Mon Sep 17 00:00:00 2001 From: michael-hawker <24302614+michael-hawker@users.noreply.github.com> Date: Fri, 1 Sep 2023 18:21:16 -0700 Subject: [PATCH 8/8] Add AttachedCardShadow samples to Media Samples Moves AttachedCardShadow doc to the Media Samples Move AttachedDropShadow samples to their own folder --- .../Extensions/samples/AttachedShadows.md | 6 ++-- .../AttachedDropShadowBasicSample.xaml | 2 +- .../AttachedDropShadowBasicSample.xaml.cs | 2 +- .../AttachedDropShadowResourceSample.xaml | 2 +- .../AttachedDropShadowResourceSample.xaml.cs | 2 +- .../AttachedDropShadowStyleSample.xaml | 2 +- .../AttachedDropShadowStyleSample.xaml.cs | 2 +- components/Media/samples/Assets/OwlShadow.jpg | Bin 0 -> 61678 bytes .../samples/AttachedCardShadow.md | 29 +++++---------- components/Media/samples/Media.Samples.csproj | 4 +++ .../AttachedCardShadowBasicSample.xaml | 29 +++++++++++++++ .../AttachedCardShadowBasicSample.xaml.cs | 16 +++++++++ .../AttachedCardShadowUntemplatedSample.xaml | 34 ++++++++++++++++++ ...ttachedCardShadowUntemplatedSample.xaml.cs | 16 +++++++++ 14 files changed, 117 insertions(+), 29 deletions(-) rename components/Extensions/samples/{ => Shadows}/AttachedDropShadowBasicSample.xaml (94%) rename components/Extensions/samples/{ => Shadows}/AttachedDropShadowBasicSample.xaml.cs (91%) rename components/Extensions/samples/{ => Shadows}/AttachedDropShadowResourceSample.xaml (94%) rename components/Extensions/samples/{ => Shadows}/AttachedDropShadowResourceSample.xaml.cs (92%) rename components/Extensions/samples/{ => Shadows}/AttachedDropShadowStyleSample.xaml (95%) rename components/Extensions/samples/{ => Shadows}/AttachedDropShadowStyleSample.xaml.cs (92%) create mode 100644 components/Media/samples/Assets/OwlShadow.jpg rename components/{Extensions => Media}/samples/AttachedCardShadow.md (60%) create mode 100644 components/Media/samples/Shadows/AttachedCardShadowBasicSample.xaml create mode 100644 components/Media/samples/Shadows/AttachedCardShadowBasicSample.xaml.cs create mode 100644 components/Media/samples/Shadows/AttachedCardShadowUntemplatedSample.xaml create mode 100644 components/Media/samples/Shadows/AttachedCardShadowUntemplatedSample.xaml.cs diff --git a/components/Extensions/samples/AttachedShadows.md b/components/Extensions/samples/AttachedShadows.md index 47094279..e11d4ef2 100644 --- a/components/Extensions/samples/AttachedShadows.md +++ b/components/Extensions/samples/AttachedShadows.md @@ -15,11 +15,11 @@ icon: Assets/Shadow.png There are two types of attached shadows available today, the `AttachedCardShadow` and the `AttachedDropShadow`. It is recommended to use the `AttachedCardShadow` where possible, if you don't mind the dependency on Win2D. The `AttachedCardShadow` provides an easier to use experience that is more performant and easier to apply across an entire set of elements, assuming those elements are rounded-rectangular in shape. The `AttachedDropShadow` provides masking support and can be leveraged in any UWP app without adding an extra dependency. -### Capability Comparison +## Capability Comparison The following table outlines the various capabilities of each shadow type in addition to comparing to the previous `DropShadowPanel` implementation: -| Capability | AttachedCardShadow | AttachedDropShadow | DropShadowPanel (deprecated) | +| Capability | AttachedCardShadow | AttachedDropShadow | DropShadowPanel (deprecated/removed) | |-------------------------------|--------------------------------------------------------------------|-----------------------------------------------------------------|-----------------------------------------------------------------------------------------| | Dependency/NuGet Package | 🟡 Win2D via
`CommunityToolkit.WinUI.Media` | ✅ Framework Only (Composition Effect)
`CommunityToolkit.WinUI.Effects` | ✅ Framework Only (Composition Effect)
`Microsoft.Toolkit.Uwp.UI.Controls` (legacy) | | Layer | Inline Composition +
Win2D Clip Geometry | Composition via
Target Element Backdrop | Composition via
`ContentControl` Container | @@ -40,7 +40,7 @@ The great benefit to the `AttachedCardShadow` is that no extra surface or elemen ## AttachedDropShadow (Composition) -The `AttachedDropShadow` provides masking support to a wide variety of elements including transparent images, shapes, and text. Masking to a custom shape that's not rectangular or rounded-rectangular is the main scenario where an `AttachedDropShadow` will be useful. Unlike it's predecessor, the [`DropShadowPanel`](../Controls/DropShadowPanel.md), the `AttachedDropShadow` doesn't need to wrap the element being shadowed; however, it does require another element to cast the shadow on to. +The `AttachedDropShadow` provides masking support to a wide variety of elements including transparent images, shapes, and text. Masking to a custom shape that's not rectangular or rounded-rectangular is the main scenario where an `AttachedDropShadow` will be useful. Unlike it's predecessor, the `DropShadowPanel`, the `AttachedDropShadow` doesn't need to wrap the element being shadowed; however, it does require another element to cast the shadow on to. This makes it a bit more complex to use than the `AttachedCardShadow` and the `DropShadowPanel`, but since multiple `AttachedDropShadow` elements can share the same surface, this makes it much more performant than its predecessor. diff --git a/components/Extensions/samples/AttachedDropShadowBasicSample.xaml b/components/Extensions/samples/Shadows/AttachedDropShadowBasicSample.xaml similarity index 94% rename from components/Extensions/samples/AttachedDropShadowBasicSample.xaml rename to components/Extensions/samples/Shadows/AttachedDropShadowBasicSample.xaml index 4386358a..f85f1cfe 100644 --- a/components/Extensions/samples/AttachedDropShadowBasicSample.xaml +++ b/components/Extensions/samples/Shadows/AttachedDropShadowBasicSample.xaml @@ -1,5 +1,5 @@ - - --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 literal 0 HcmV?d00001 diff --git a/components/Extensions/samples/AttachedCardShadow.md b/components/Media/samples/AttachedCardShadow.md similarity index 60% rename from components/Extensions/samples/AttachedCardShadow.md rename to components/Media/samples/AttachedCardShadow.md index 8ac08e22..58420d95 100644 --- a/components/Extensions/samples/AttachedCardShadow.md +++ b/components/Media/samples/AttachedCardShadow.md @@ -18,23 +18,12 @@ The great benefit to the `AttachedCardShadow` is that no extra surface or elemen The example shows how easy it is to not only apply an `AttachedCardShadow` to an element, but use it in a style to apply to multiple elements as well: -```xaml - xmlns:ui="using:CommunityToolkit.WinUI" - xmlns:media="using:CommunityToolkit.WinUI.Media"/> - - - - - - - - -