From c18f7896fd2d436663700176351db95b68f05838 Mon Sep 17 00:00:00 2001 From: h82258652 <842053625@qq.com> Date: Tue, 22 Aug 2023 15:26:51 +0800 Subject: [PATCH 01/10] init commit --- components/OpacityMaskView/OpenSolution.bat | 3 + .../OpacityMaskView/samples/Assets/icon.png | Bin 0 -> 6192 bytes .../samples/Dependencies.props | 31 ++++ .../samples/OpacityMaskView.Samples.csproj | 8 ++ .../samples/OpacityMaskView.md | 65 +++++++++ .../samples/OpacityMaskViewCustomSample.xaml | 25 ++++ .../OpacityMaskViewCustomSample.xaml.cs | 30 ++++ .../OpacityMaskViewTemplatedSample.xaml | 16 +++ .../OpacityMaskViewTemplatedSample.xaml.cs | 21 +++ ...ityMaskViewTemplatedStyleCustomSample.xaml | 26 ++++ ...MaskViewTemplatedStyleCustomSample.xaml.cs | 21 +++ .../OpacityMaskViewXbindBackedSample.xaml | 16 +++ .../OpacityMaskViewXbindBackedSample.xaml.cs | 21 +++ ...yMaskViewXbindBackedStyleCustomSample.xaml | 26 ++++ ...skViewXbindBackedStyleCustomSample.xaml.cs | 21 +++ ...lkit.WinUI.Controls.OpacityMaskView.csproj | 12 ++ .../OpacityMaskView/src/Dependencies.props | 31 ++++ .../OpacityMaskView/src/MultiTarget.props | 9 ++ .../OpacityMaskView/src/OpacityMaskView.cs | 108 ++++++++++++++ .../OpacityMaskViewStyle_ClassicBinding.xaml | 62 ++++++++ .../src/OpacityMaskViewStyle_xBind.xaml | 69 +++++++++ .../src/OpacityMaskViewStyle_xBind.xaml.cs | 20 +++ .../src/OpacityMaskView_ClassicBinding.cs | 94 ++++++++++++ .../src/OpacityMaskView_xBind.cs | 71 ++++++++++ .../OpacityMaskView/src/Themes/Generic.xaml | 10 ++ .../tests/ExampleOpacityMaskViewTestClass.cs | 134 ++++++++++++++++++ .../tests/ExampleOpacityMaskViewTestPage.xaml | 14 ++ .../ExampleOpacityMaskViewTestPage.xaml.cs | 16 +++ .../tests/OpacityMaskView.Tests.projitems | 23 +++ .../tests/OpacityMaskView.Tests.shproj | 13 ++ 30 files changed, 1016 insertions(+) create mode 100644 components/OpacityMaskView/OpenSolution.bat create mode 100644 components/OpacityMaskView/samples/Assets/icon.png create mode 100644 components/OpacityMaskView/samples/Dependencies.props create mode 100644 components/OpacityMaskView/samples/OpacityMaskView.Samples.csproj create mode 100644 components/OpacityMaskView/samples/OpacityMaskView.md create mode 100644 components/OpacityMaskView/samples/OpacityMaskViewCustomSample.xaml create mode 100644 components/OpacityMaskView/samples/OpacityMaskViewCustomSample.xaml.cs create mode 100644 components/OpacityMaskView/samples/OpacityMaskViewTemplatedSample.xaml create mode 100644 components/OpacityMaskView/samples/OpacityMaskViewTemplatedSample.xaml.cs create mode 100644 components/OpacityMaskView/samples/OpacityMaskViewTemplatedStyleCustomSample.xaml create mode 100644 components/OpacityMaskView/samples/OpacityMaskViewTemplatedStyleCustomSample.xaml.cs create mode 100644 components/OpacityMaskView/samples/OpacityMaskViewXbindBackedSample.xaml create mode 100644 components/OpacityMaskView/samples/OpacityMaskViewXbindBackedSample.xaml.cs create mode 100644 components/OpacityMaskView/samples/OpacityMaskViewXbindBackedStyleCustomSample.xaml create mode 100644 components/OpacityMaskView/samples/OpacityMaskViewXbindBackedStyleCustomSample.xaml.cs create mode 100644 components/OpacityMaskView/src/CommunityToolkit.WinUI.Controls.OpacityMaskView.csproj create mode 100644 components/OpacityMaskView/src/Dependencies.props create mode 100644 components/OpacityMaskView/src/MultiTarget.props create mode 100644 components/OpacityMaskView/src/OpacityMaskView.cs create mode 100644 components/OpacityMaskView/src/OpacityMaskViewStyle_ClassicBinding.xaml create mode 100644 components/OpacityMaskView/src/OpacityMaskViewStyle_xBind.xaml create mode 100644 components/OpacityMaskView/src/OpacityMaskViewStyle_xBind.xaml.cs create mode 100644 components/OpacityMaskView/src/OpacityMaskView_ClassicBinding.cs create mode 100644 components/OpacityMaskView/src/OpacityMaskView_xBind.cs create mode 100644 components/OpacityMaskView/src/Themes/Generic.xaml create mode 100644 components/OpacityMaskView/tests/ExampleOpacityMaskViewTestClass.cs create mode 100644 components/OpacityMaskView/tests/ExampleOpacityMaskViewTestPage.xaml create mode 100644 components/OpacityMaskView/tests/ExampleOpacityMaskViewTestPage.xaml.cs create mode 100644 components/OpacityMaskView/tests/OpacityMaskView.Tests.projitems create mode 100644 components/OpacityMaskView/tests/OpacityMaskView.Tests.shproj diff --git a/components/OpacityMaskView/OpenSolution.bat b/components/OpacityMaskView/OpenSolution.bat new file mode 100644 index 000000000..814a56d4b --- /dev/null +++ b/components/OpacityMaskView/OpenSolution.bat @@ -0,0 +1,3 @@ +@ECHO OFF + +powershell ..\..\tooling\ProjectHeads\GenerateSingleSampleHeads.ps1 -componentPath %CD% %* \ No newline at end of file diff --git a/components/OpacityMaskView/samples/Assets/icon.png b/components/OpacityMaskView/samples/Assets/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..5f574ceca233597ecc5d775fd2f516c0d9685cfa GIT binary patch literal 6192 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 O0000 + + + + + + + + + + + + + + + + + + + + + diff --git a/components/OpacityMaskView/samples/OpacityMaskView.Samples.csproj b/components/OpacityMaskView/samples/OpacityMaskView.Samples.csproj new file mode 100644 index 000000000..492c47ffc --- /dev/null +++ b/components/OpacityMaskView/samples/OpacityMaskView.Samples.csproj @@ -0,0 +1,8 @@ + + + OpacityMaskView + + + + + diff --git a/components/OpacityMaskView/samples/OpacityMaskView.md b/components/OpacityMaskView/samples/OpacityMaskView.md new file mode 100644 index 000000000..738d9751d --- /dev/null +++ b/components/OpacityMaskView/samples/OpacityMaskView.md @@ -0,0 +1,65 @@ +--- +title: OpacityMaskView +author: githubaccount +description: TODO: Your experiment's description here +keywords: OpacityMaskView, Control, Layout +dev_langs: + - csharp +category: Controls +subcategory: Layout +discussion-id: 0 +issue-id: 0 +icon: assets/icon.png +--- + + + + + + + + + +# OpacityMaskView + +TODO: Fill in information about this experiment and how to get started here... + +## Custom Control + +You can inherit from an existing component as well, like `Panel`, this example shows a control without a +XAML Style that will be more light-weight to consume by an app developer: + +> [!Sample OpacityMaskViewCustomSample] + +## Templated Controls + +The Toolkit is built with templated controls. This provides developers a flexible way to restyle components +easily while still inheriting the general functionality a control provides. The examples below show +how a component can use a default style and then get overridden by the end developer. + +TODO: Two types of templated control building methods are shown. Delete these if you're building a custom component. +Otherwise, pick one method for your component and delete the files related to the unchosen `_ClassicBinding` or `_xBind` +classes (and the custom non-suffixed one as well). Then, rename your component to just be your component name. + +The `_ClassicBinding` class shows the traditional method used to develop components with best practices. + +### Implict style + +> [!SAMPLE OpacityMaskViewTemplatedSample] + +### Custom style + +> [!SAMPLE OpacityMaskViewTemplatedStyleCustomSample] + +## Templated Controls with x:Bind + +This is an _experimental_ new way to define components which allows for the use of x:Bind within the style. + +### Implict style + +> [!SAMPLE OpacityMaskViewXbindBackedSample] + +### Custom style + +> [!SAMPLE OpacityMaskViewXbindBackedStyleCustomSample] + diff --git a/components/OpacityMaskView/samples/OpacityMaskViewCustomSample.xaml b/components/OpacityMaskView/samples/OpacityMaskViewCustomSample.xaml new file mode 100644 index 000000000..c398aac1d --- /dev/null +++ b/components/OpacityMaskView/samples/OpacityMaskViewCustomSample.xaml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + diff --git a/components/OpacityMaskView/samples/OpacityMaskViewCustomSample.xaml.cs b/components/OpacityMaskView/samples/OpacityMaskViewCustomSample.xaml.cs new file mode 100644 index 000000000..ec71e2e3e --- /dev/null +++ b/components/OpacityMaskView/samples/OpacityMaskViewCustomSample.xaml.cs @@ -0,0 +1,30 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using CommunityToolkit.WinUI.Controls; + +namespace OpacityMaskViewExperiment.Samples; + +/// +/// An example sample page of a custom control inheriting from Panel. +/// +[ToolkitSampleTextOption("TitleText", "This is a title", Title = "Input the text")] +[ToolkitSampleMultiChoiceOption("LayoutOrientation", "Horizontal", "Vertical", Title = "Orientation")] + +[ToolkitSample(id: nameof(OpacityMaskViewCustomSample), "Custom control", description: $"A sample for showing how to create and use a {nameof(OpacityMaskView)} custom control.")] +public sealed partial class OpacityMaskViewCustomSample : Page +{ + public OpacityMaskViewCustomSample() + { + this.InitializeComponent(); + } + + // TODO: See https://github.com/CommunityToolkit/Labs-Windows/issues/149 + public static Orientation ConvertStringToOrientation(string orientation) => orientation switch + { + "Vertical" => Orientation.Vertical, + "Horizontal" => Orientation.Horizontal, + _ => throw new System.NotImplementedException(), + }; +} diff --git a/components/OpacityMaskView/samples/OpacityMaskViewTemplatedSample.xaml b/components/OpacityMaskView/samples/OpacityMaskViewTemplatedSample.xaml new file mode 100644 index 000000000..b580b62a0 --- /dev/null +++ b/components/OpacityMaskView/samples/OpacityMaskViewTemplatedSample.xaml @@ -0,0 +1,16 @@ + + + + + + + diff --git a/components/OpacityMaskView/samples/OpacityMaskViewTemplatedSample.xaml.cs b/components/OpacityMaskView/samples/OpacityMaskViewTemplatedSample.xaml.cs new file mode 100644 index 000000000..0d5206178 --- /dev/null +++ b/components/OpacityMaskView/samples/OpacityMaskViewTemplatedSample.xaml.cs @@ -0,0 +1,21 @@ +// 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 OpacityMaskViewExperiment.Samples; + +[ToolkitSampleBoolOption("IsTextVisible", true, Title = "IsVisible")] +// Single values without a colon are used for both label and value. +// To provide a different label for the value, separate with a colon surrounded by a single space on both sides ("label : value"). +[ToolkitSampleNumericOption("TextSize", 12, 8, 48, 2, false, Title = "FontSize")] +[ToolkitSampleMultiChoiceOption("TextFontFamily", "Segoe UI", "Arial", "Consolas", Title = "Font family")] +[ToolkitSampleMultiChoiceOption("TextForeground", "Teal : #0ddc8c", "Sand : #e7a676", "Dull green : #5d7577", Title = "Text foreground")] + +[ToolkitSample(id: nameof(OpacityMaskViewTemplatedSample), "Templated control", description: "A sample for showing how to create and use a templated control.")] +public sealed partial class OpacityMaskViewTemplatedSample : Page +{ + public OpacityMaskViewTemplatedSample() + { + this.InitializeComponent(); + } +} diff --git a/components/OpacityMaskView/samples/OpacityMaskViewTemplatedStyleCustomSample.xaml b/components/OpacityMaskView/samples/OpacityMaskViewTemplatedStyleCustomSample.xaml new file mode 100644 index 000000000..ec5ea688f --- /dev/null +++ b/components/OpacityMaskView/samples/OpacityMaskViewTemplatedStyleCustomSample.xaml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + diff --git a/components/OpacityMaskView/samples/OpacityMaskViewTemplatedStyleCustomSample.xaml.cs b/components/OpacityMaskView/samples/OpacityMaskViewTemplatedStyleCustomSample.xaml.cs new file mode 100644 index 000000000..900bc69b8 --- /dev/null +++ b/components/OpacityMaskView/samples/OpacityMaskViewTemplatedStyleCustomSample.xaml.cs @@ -0,0 +1,21 @@ +// 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 OpacityMaskViewExperiment.Samples; + +[ToolkitSampleBoolOption("IsTextVisible", true, Title = "IsVisible")] +// Single values without a colon are used for both label and value. +// To provide a different label for the value, separate with a colon surrounded by a single space on both sides ("label : value"). +[ToolkitSampleNumericOption("TextSize", 12, 8, 48, 2, true, Title = "FontSize")] +[ToolkitSampleMultiChoiceOption("TextFontFamily", "Segoe UI", "Arial", "Consolas", Title = "Font family")] +[ToolkitSampleMultiChoiceOption("TextForeground", "Teal : #0ddc8c", "Sand : #e7a676", "Dull green : #5d7577", Title = "Text foreground")] + +[ToolkitSample(id: nameof(OpacityMaskViewTemplatedStyleCustomSample), "Templated control (restyled)", description: "A sample for showing how to create a use and templated control with a custom style.")] +public sealed partial class OpacityMaskViewTemplatedStyleCustomSample : Page +{ + public OpacityMaskViewTemplatedStyleCustomSample() + { + this.InitializeComponent(); + } +} diff --git a/components/OpacityMaskView/samples/OpacityMaskViewXbindBackedSample.xaml b/components/OpacityMaskView/samples/OpacityMaskViewXbindBackedSample.xaml new file mode 100644 index 000000000..2176450d1 --- /dev/null +++ b/components/OpacityMaskView/samples/OpacityMaskViewXbindBackedSample.xaml @@ -0,0 +1,16 @@ + + + + + + + diff --git a/components/OpacityMaskView/samples/OpacityMaskViewXbindBackedSample.xaml.cs b/components/OpacityMaskView/samples/OpacityMaskViewXbindBackedSample.xaml.cs new file mode 100644 index 000000000..04ace38f8 --- /dev/null +++ b/components/OpacityMaskView/samples/OpacityMaskViewXbindBackedSample.xaml.cs @@ -0,0 +1,21 @@ +// 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 OpacityMaskViewExperiment.Samples; + +[ToolkitSampleBoolOption("IsTextVisible", true, Title = "IsVisible")] +// Single values without a colon are used for both label and value. +// To provide a different label for the value, separate with a colon surrounded by a single space on both sides ("label : value"). +[ToolkitSampleNumericOption("TextSize", 12, 8, 48, 2, false, Title = "FontSize")] +[ToolkitSampleMultiChoiceOption("TextFontFamily", "Segoe UI", "Arial", "Consolas", Title = "Font family")] +[ToolkitSampleMultiChoiceOption("TextForeground", "Teal : #0ddc8c", "Sand : #e7a676", "Dull green : #5d7577", Title = "Text foreground")] + +[ToolkitSample(id: nameof(OpacityMaskViewXbindBackedSample), "Backed templated control", description: "A sample for showing how to create and use a templated control with a backed resource dictionary.")] +public sealed partial class OpacityMaskViewXbindBackedSample : Page +{ + public OpacityMaskViewXbindBackedSample() + { + this.InitializeComponent(); + } +} diff --git a/components/OpacityMaskView/samples/OpacityMaskViewXbindBackedStyleCustomSample.xaml b/components/OpacityMaskView/samples/OpacityMaskViewXbindBackedStyleCustomSample.xaml new file mode 100644 index 000000000..4456476b5 --- /dev/null +++ b/components/OpacityMaskView/samples/OpacityMaskViewXbindBackedStyleCustomSample.xaml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + diff --git a/components/OpacityMaskView/samples/OpacityMaskViewXbindBackedStyleCustomSample.xaml.cs b/components/OpacityMaskView/samples/OpacityMaskViewXbindBackedStyleCustomSample.xaml.cs new file mode 100644 index 000000000..2ca587fe4 --- /dev/null +++ b/components/OpacityMaskView/samples/OpacityMaskViewXbindBackedStyleCustomSample.xaml.cs @@ -0,0 +1,21 @@ +// 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 OpacityMaskViewExperiment.Samples; + +[ToolkitSampleBoolOption("IsTextVisible", true, Title = "IsVisible")] +// Single values without a colon are used for both label and value. +// To provide a different label for the value, separate with a colon surrounded by a single space on both sides ("label : value"). +[ToolkitSampleNumericOption("TextSize", 12, 8, 48, 2, true, Title = "FontSize")] +[ToolkitSampleMultiChoiceOption("TextFontFamily", "Segoe UI", "Arial", "Consolas", Title = "Font family")] +[ToolkitSampleMultiChoiceOption("TextForeground", "Teal : #0ddc8c", "Sand : #e7a676", "Dull green : #5d7577", Title = "Text foreground")] + +[ToolkitSample(id: nameof(OpacityMaskViewXbindBackedStyleCustomSample), "Backed templated control (restyled)", description: "A sample for showing how to create and use a templated control with a backed resource dictionary and a custom style.")] +public sealed partial class OpacityMaskViewXbindBackedStyleCustomSample : Page +{ + public OpacityMaskViewXbindBackedStyleCustomSample() + { + this.InitializeComponent(); + } +} diff --git a/components/OpacityMaskView/src/CommunityToolkit.WinUI.Controls.OpacityMaskView.csproj b/components/OpacityMaskView/src/CommunityToolkit.WinUI.Controls.OpacityMaskView.csproj new file mode 100644 index 000000000..450b7af64 --- /dev/null +++ b/components/OpacityMaskView/src/CommunityToolkit.WinUI.Controls.OpacityMaskView.csproj @@ -0,0 +1,12 @@ + + + OpacityMaskView + This package contains OpacityMaskView. + + + CommunityToolkit.WinUI.Controls.OpacityMaskViewRns + + + + + diff --git a/components/OpacityMaskView/src/Dependencies.props b/components/OpacityMaskView/src/Dependencies.props new file mode 100644 index 000000000..e622e1df4 --- /dev/null +++ b/components/OpacityMaskView/src/Dependencies.props @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/components/OpacityMaskView/src/MultiTarget.props b/components/OpacityMaskView/src/MultiTarget.props new file mode 100644 index 000000000..b11c19426 --- /dev/null +++ b/components/OpacityMaskView/src/MultiTarget.props @@ -0,0 +1,9 @@ + + + + uwp;wasdk;wpf;wasm;linuxgtk;macos;ios;android; + + \ No newline at end of file diff --git a/components/OpacityMaskView/src/OpacityMaskView.cs b/components/OpacityMaskView/src/OpacityMaskView.cs new file mode 100644 index 000000000..f9abd9b2b --- /dev/null +++ b/components/OpacityMaskView/src/OpacityMaskView.cs @@ -0,0 +1,108 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +namespace CommunityToolkit.WinUI.Controls; + +/// +/// This is an example control based off of the BoxPanel sample here: https://docs.microsoft.com/windows/apps/design/layout/boxpanel-example-custom-panel. If you need this similar sort of layout component for an application, see UniformGrid in the Toolkit. +/// It is provided as an example of how to inherit from another control like . +/// You can choose to start here or from the or example components. Remove unused components and rename as appropriate. +/// +public partial class OpacityMaskView : Panel +{ + /// + /// Identifies the property. + /// + public static readonly DependencyProperty OrientationProperty = + DependencyProperty.Register(nameof(Orientation), typeof(Orientation), typeof(OpacityMaskView), new PropertyMetadata(null, OnOrientationChanged)); + + /// + /// Gets the preference of the rows/columns when there are a non-square number of children. Defaults to Vertical. + /// + public Orientation Orientation + { + get { return (Orientation)GetValue(OrientationProperty); } + set { SetValue(OrientationProperty, value); } + } + + // Invalidate our layout when the property changes. + private static void OnOrientationChanged(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs args) + { + if (dependencyObject is OpacityMaskView panel) + { + panel.InvalidateMeasure(); + } + } + + // Store calculations we want to use between the Measure and Arrange methods. + int _columnCount; + double _cellWidth, _cellHeight; + + protected override Size MeasureOverride(Size availableSize) + { + // Determine the square that can contain this number of items. + var maxrc = (int)Math.Ceiling(Math.Sqrt(Children.Count)); + // Get an aspect ratio from availableSize, decides whether to trim row or column. + var aspectratio = availableSize.Width / availableSize.Height; + if (Orientation == Orientation.Vertical) { aspectratio = 1 / aspectratio; } + + int rowcount; + + // Now trim this square down to a rect, many times an entire row or column can be omitted. + if (aspectratio > 1) + { + rowcount = maxrc; + _columnCount = (maxrc > 2 && Children.Count <= maxrc * (maxrc - 1)) ? maxrc - 1 : maxrc; + } + else + { + rowcount = (maxrc > 2 && Children.Count <= maxrc * (maxrc - 1)) ? maxrc - 1 : maxrc; + _columnCount = maxrc; + } + + // Now that we have a column count, divide available horizontal, that's our cell width. + _cellWidth = (int)Math.Floor(availableSize.Width / _columnCount); + // Next get a cell height, same logic of dividing available vertical by rowcount. + _cellHeight = Double.IsInfinity(availableSize.Height) ? Double.PositiveInfinity : availableSize.Height / rowcount; + + double maxcellheight = 0; + + foreach (UIElement child in Children) + { + child.Measure(new Size(_cellWidth, _cellHeight)); + maxcellheight = (child.DesiredSize.Height > maxcellheight) ? child.DesiredSize.Height : maxcellheight; + } + + return LimitUnboundedSize(availableSize, maxcellheight); + } + + // This method limits the panel height when no limit is imposed by the panel's parent. + // That can happen to height if the panel is close to the root of main app window. + // In this case, base the height of a cell on the max height from desired size + // and base the height of the panel on that number times the #rows. + Size LimitUnboundedSize(Size input, double maxcellheight) + { + if (Double.IsInfinity(input.Height)) + { + input.Height = maxcellheight * _columnCount; + _cellHeight = maxcellheight; + } + return input; + } + + protected override Size ArrangeOverride(Size finalSize) + { + int count = 1; + double x, y; + foreach (UIElement child in Children) + { + x = (count - 1) % _columnCount * _cellWidth; + y = ((int)(count - 1) / _columnCount) * _cellHeight; + Point anchorPoint = new Point(x, y); + child.Arrange(new Rect(anchorPoint, child.DesiredSize)); + count++; + } + return finalSize; + } +} diff --git a/components/OpacityMaskView/src/OpacityMaskViewStyle_ClassicBinding.xaml b/components/OpacityMaskView/src/OpacityMaskViewStyle_ClassicBinding.xaml new file mode 100644 index 000000000..6e87d400e --- /dev/null +++ b/components/OpacityMaskView/src/OpacityMaskViewStyle_ClassicBinding.xaml @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + 4,4,4,4 + + + + + + + + diff --git a/components/OpacityMaskView/src/OpacityMaskViewStyle_xBind.xaml b/components/OpacityMaskView/src/OpacityMaskViewStyle_xBind.xaml new file mode 100644 index 000000000..081a44c08 --- /dev/null +++ b/components/OpacityMaskView/src/OpacityMaskViewStyle_xBind.xaml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + 4,4,4,4 + + + + + + + + diff --git a/components/OpacityMaskView/src/OpacityMaskViewStyle_xBind.xaml.cs b/components/OpacityMaskView/src/OpacityMaskViewStyle_xBind.xaml.cs new file mode 100644 index 000000000..a78257a84 --- /dev/null +++ b/components/OpacityMaskView/src/OpacityMaskViewStyle_xBind.xaml.cs @@ -0,0 +1,20 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +namespace CommunityToolkit.WinUI.Controls; + +/// +/// Backing code for this resource dictionary. +/// +public sealed partial class OpacityMaskViewStyle_xBind : ResourceDictionary +{ + // NOTICE + // This file only exists to enable x:Bind in the resource dictionary. + // Do not add code here. + // Instead, add code-behind to your templated control. + public OpacityMaskViewStyle_xBind() + { + this.InitializeComponent(); + } +} diff --git a/components/OpacityMaskView/src/OpacityMaskView_ClassicBinding.cs b/components/OpacityMaskView/src/OpacityMaskView_ClassicBinding.cs new file mode 100644 index 000000000..d0bc025a3 --- /dev/null +++ b/components/OpacityMaskView/src/OpacityMaskView_ClassicBinding.cs @@ -0,0 +1,94 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +namespace CommunityToolkit.WinUI.Controls; + +/// +/// An example templated control. +/// +[TemplatePart(Name = nameof(PART_HelloWorld), Type = typeof(TextBlock))] +public partial class OpacityMaskView_ClassicBinding : Control +{ + /// + /// Creates a new instance of the class. + /// + public OpacityMaskView_ClassicBinding() + { + this.DefaultStyleKey = typeof(OpacityMaskView_ClassicBinding); + } + + /// + /// The primary text block that displays "Hello world". + /// + protected TextBlock? PART_HelloWorld { get; private set; } + + /// + protected override void OnApplyTemplate() + { + base.OnApplyTemplate(); + + // Detach all attached events when a new template is applied. + if (PART_HelloWorld is not null) + { + PART_HelloWorld.PointerEntered -= Element_PointerEntered; + } + + // Attach events when the template is applied and the control is loaded. + PART_HelloWorld = GetTemplateChild(nameof(PART_HelloWorld)) as TextBlock; + + if (PART_HelloWorld is not null) + { + PART_HelloWorld.PointerEntered += Element_PointerEntered; + } + } + + /// + /// The backing for the property. + /// + public static readonly DependencyProperty ItemPaddingProperty = DependencyProperty.Register( + nameof(ItemPadding), + typeof(Thickness), + typeof(OpacityMaskView_ClassicBinding), + new PropertyMetadata(defaultValue: new Thickness(0))); + + /// + /// The backing for the property. + /// + public static readonly DependencyProperty MyPropertyProperty = DependencyProperty.Register( + nameof(MyProperty), + typeof(string), + typeof(OpacityMaskView_ClassicBinding), + new PropertyMetadata(defaultValue: string.Empty, (d, e) => ((OpacityMaskView_ClassicBinding)d).OnMyPropertyChanged((string)e.OldValue, (string)e.NewValue))); + + /// + /// Gets or sets an example string. A basic DependencyProperty example. + /// + public string MyProperty + { + get => (string)GetValue(MyPropertyProperty); + set => SetValue(MyPropertyProperty, value); + } + + /// + /// Gets or sets a padding for an item. A basic DependencyProperty example. + /// + public Thickness ItemPadding + { + get => (Thickness)GetValue(ItemPaddingProperty); + set => SetValue(ItemPaddingProperty, value); + } + + protected virtual void OnMyPropertyChanged(string oldValue, string newValue) + { + // Do something with the changed value. + } + + public void Element_PointerEntered(object sender, PointerRoutedEventArgs e) + { + if (sender is TextBlock text) + { + text.Opacity = 1; + } + } +} diff --git a/components/OpacityMaskView/src/OpacityMaskView_xBind.cs b/components/OpacityMaskView/src/OpacityMaskView_xBind.cs new file mode 100644 index 000000000..5b7a79231 --- /dev/null +++ b/components/OpacityMaskView/src/OpacityMaskView_xBind.cs @@ -0,0 +1,71 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +namespace CommunityToolkit.WinUI.Controls; + +/// +/// An example templated control. +/// +public partial class OpacityMaskView_xBind: Control +{ + /// + /// Creates a new instance of the class. + /// + public OpacityMaskView_xBind() + { + this.DefaultStyleKey = typeof(OpacityMaskView_xBind); + + // Allows directly using this control as the x:DataType in the template. + this.DataContext = this; + } + + /// + /// The backing for the property. + /// + public static readonly DependencyProperty ItemPaddingProperty = DependencyProperty.Register( + nameof(ItemPadding), + typeof(Thickness), + typeof(OpacityMaskView_xBind), + new PropertyMetadata(defaultValue: new Thickness(0))); + + /// + /// The backing for the property. + /// + public static readonly DependencyProperty MyPropertyProperty = DependencyProperty.Register( + nameof(MyProperty), + typeof(string), + typeof(OpacityMaskView_xBind), + new PropertyMetadata(defaultValue: string.Empty, (d, e) => ((OpacityMaskView_xBind)d).OnMyPropertyChanged((string)e.OldValue, (string)e.NewValue))); + + /// + /// Gets or sets an example string. A basic DependencyProperty example. + /// + public string MyProperty + { + get => (string)GetValue(MyPropertyProperty); + set => SetValue(MyPropertyProperty, value); + } + + /// + /// Gets or sets a padding for an item. A basic DependencyProperty example. + /// + public Thickness ItemPadding + { + get => (Thickness)GetValue(ItemPaddingProperty); + set => SetValue(ItemPaddingProperty, value); + } + + protected virtual void OnMyPropertyChanged(string oldValue, string newValue) + { + // Do something with the changed value. + } + + public void Element_PointerEntered(object sender, PointerRoutedEventArgs e) + { + if (sender is TextBlock text) + { + text.Opacity = 1; + } + } +} diff --git a/components/OpacityMaskView/src/Themes/Generic.xaml b/components/OpacityMaskView/src/Themes/Generic.xaml new file mode 100644 index 000000000..11ed0185d --- /dev/null +++ b/components/OpacityMaskView/src/Themes/Generic.xaml @@ -0,0 +1,10 @@ + + + + + + + + diff --git a/components/OpacityMaskView/tests/ExampleOpacityMaskViewTestClass.cs b/components/OpacityMaskView/tests/ExampleOpacityMaskViewTestClass.cs new file mode 100644 index 000000000..741b19380 --- /dev/null +++ b/components/OpacityMaskView/tests/ExampleOpacityMaskViewTestClass.cs @@ -0,0 +1,134 @@ +// 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.Tooling.TestGen; +using CommunityToolkit.Tests; +using CommunityToolkit.WinUI.Controls; + +namespace OpacityMaskViewExperiment.Tests; + +[TestClass] +public partial class ExampleOpacityMaskViewTestClass : VisualUITestBase +{ + // If you don't need access to UI objects directly or async code, use this pattern. + [TestMethod] + public void SimpleSynchronousExampleTest() + { + var assembly = typeof(OpacityMaskView).Assembly; + var type = assembly.GetType(typeof(OpacityMaskView).FullName ?? string.Empty); + + Assert.IsNotNull(type, "Could not find OpacityMaskView type."); + Assert.AreEqual(typeof(OpacityMaskView), type, "Type of OpacityMaskView does not match expected type."); + } + + // If you don't need access to UI objects directly, use this pattern. + [TestMethod] + public async Task SimpleAsyncExampleTest() + { + await Task.Delay(250); + + Assert.IsTrue(true); + } + + // Example that shows how to check for exception throwing. + [TestMethod] + public void SimpleExceptionCheckTest() + { + // If you need to check exceptions occur for invalid inputs, etc... + // Use Assert.ThrowsException to limit the scope to where you expect the error to occur. + // Otherwise, using the ExpectedException attribute could swallow or + // catch other issues in setup code. + Assert.ThrowsException(() => throw new NotImplementedException()); + } + + // The UIThreadTestMethod automatically dispatches to the UI for us to work with UI objects. + [UIThreadTestMethod] + public void SimpleUIAttributeExampleTest() + { + var component = new OpacityMaskView(); + Assert.IsNotNull(component); + } + + // The UIThreadTestMethod can also easily grab a XAML Page for us by passing its type as a parameter. + // This lets us actually test a control as it would behave within an actual application. + // The page will already be loaded by the time your test is called. + [UIThreadTestMethod] + public void SimpleUIExamplePageTest(ExampleOpacityMaskViewTestPage page) + { + // You can use the Toolkit Visual Tree helpers here to find the component by type or name: + var component = page.FindDescendant(); + + Assert.IsNotNull(component); + + var componentByName = page.FindDescendant("OpacityMaskViewControl"); + + Assert.IsNotNull(componentByName); + } + + // You can still do async work with a UIThreadTestMethod as well. + [UIThreadTestMethod] + public async Task SimpleAsyncUIExamplePageTest(ExampleOpacityMaskViewTestPage page) + { + // This helper can be used to wait for a rendering pass to complete. + // Note, this is already done by loading a Page with the [UIThreadTestMethod] helper. + await CompositionTargetHelper.ExecuteAfterCompositionRenderingAsync(() => { }); + + var component = page.FindDescendant(); + + Assert.IsNotNull(component); + } + + //// ----------------------------- ADVANCED TEST SCENARIOS ----------------------------- + + // If you need to use DataRow, you can use this pattern with the UI dispatch still. + // Otherwise, checkout the UIThreadTestMethod attribute above. + // See https://github.com/CommunityToolkit/Labs-Windows/issues/186 + [TestMethod] + public async Task ComplexAsyncUIExampleTest() + { + await EnqueueAsync(() => + { + var component = new OpacityMaskView_ClassicBinding(); + Assert.IsNotNull(component); + }); + } + + // If you want to load other content not within a XAML page using the UIThreadTestMethod above. + // Then you can do that using the Load/UnloadTestContentAsync methods. + [TestMethod] + public async Task ComplexAsyncLoadUIExampleTest() + { + await EnqueueAsync(async () => + { + var component = new OpacityMaskView_ClassicBinding(); + Assert.IsNotNull(component); + Assert.IsFalse(component.IsLoaded); + + await LoadTestContentAsync(component); + + Assert.IsTrue(component.IsLoaded); + + await UnloadTestContentAsync(component); + + Assert.IsFalse(component.IsLoaded); + }); + } + + // You can still use the UIThreadTestMethod to remove the extra layer for the dispatcher as well: + [UIThreadTestMethod] + public async Task ComplexAsyncLoadUIExampleWithoutDispatcherTest() + { + var component = new OpacityMaskView_ClassicBinding(); + Assert.IsNotNull(component); + Assert.IsFalse(component.IsLoaded); + + await LoadTestContentAsync(component); + + Assert.IsTrue(component.IsLoaded); + + await UnloadTestContentAsync(component); + + Assert.IsFalse(component.IsLoaded); + } +} diff --git a/components/OpacityMaskView/tests/ExampleOpacityMaskViewTestPage.xaml b/components/OpacityMaskView/tests/ExampleOpacityMaskViewTestPage.xaml new file mode 100644 index 000000000..7fde85a0d --- /dev/null +++ b/components/OpacityMaskView/tests/ExampleOpacityMaskViewTestPage.xaml @@ -0,0 +1,14 @@ + + + + + + + diff --git a/components/OpacityMaskView/tests/ExampleOpacityMaskViewTestPage.xaml.cs b/components/OpacityMaskView/tests/ExampleOpacityMaskViewTestPage.xaml.cs new file mode 100644 index 000000000..711dde9c2 --- /dev/null +++ b/components/OpacityMaskView/tests/ExampleOpacityMaskViewTestPage.xaml.cs @@ -0,0 +1,16 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +namespace OpacityMaskViewExperiment.Tests; + +/// +/// An empty page that can be used on its own or navigated to within a Frame. +/// +public sealed partial class ExampleOpacityMaskViewTestPage : Page +{ + public ExampleOpacityMaskViewTestPage() + { + this.InitializeComponent(); + } +} diff --git a/components/OpacityMaskView/tests/OpacityMaskView.Tests.projitems b/components/OpacityMaskView/tests/OpacityMaskView.Tests.projitems new file mode 100644 index 000000000..d38a56f44 --- /dev/null +++ b/components/OpacityMaskView/tests/OpacityMaskView.Tests.projitems @@ -0,0 +1,23 @@ + + + + $(MSBuildAllProjects);$(MSBuildThisFileFullPath) + true + 04511143-C2A3-4893-810D-3C1EA2877430 + + + OpacityMaskViewExperiment.Tests + + + + + ExampleOpacityMaskViewTestPage.xaml + + + + + Designer + MSBuild:Compile + + + \ No newline at end of file diff --git a/components/OpacityMaskView/tests/OpacityMaskView.Tests.shproj b/components/OpacityMaskView/tests/OpacityMaskView.Tests.shproj new file mode 100644 index 000000000..3f996ee59 --- /dev/null +++ b/components/OpacityMaskView/tests/OpacityMaskView.Tests.shproj @@ -0,0 +1,13 @@ + + + + 04511143-C2A3-4893-810D-3C1EA2877430 + 14.0 + + + + + + + + From 22fb628723cbad3bf4ec1262d056b22da6cc7a74 Mon Sep 17 00:00:00 2001 From: h82258652 <842053625@qq.com> Date: Tue, 22 Aug 2023 17:12:52 +0800 Subject: [PATCH 02/10] commit --- .../OpacityMaskView/samples/Assets/Owl.jpg | Bin 0 -> 61678 bytes .../OpacityMaskView/samples/MultiTarget.props | 9 ++ .../samples/OpacityMaskView.Samples.csproj | 8 + .../samples/OpacityMaskView.md | 55 +------ .../samples/OpacityMaskViewCustomSample.xaml | 25 --- .../OpacityMaskViewCustomSample.xaml.cs | 30 ---- .../samples/OpacityMaskViewSample.xaml | 39 +++++ .../samples/OpacityMaskViewSample.xaml.cs | 19 +++ .../OpacityMaskViewTemplatedSample.xaml | 16 -- .../OpacityMaskViewTemplatedSample.xaml.cs | 21 --- ...ityMaskViewTemplatedStyleCustomSample.xaml | 26 ---- ...MaskViewTemplatedStyleCustomSample.xaml.cs | 21 --- .../OpacityMaskViewXbindBackedSample.xaml | 16 -- .../OpacityMaskViewXbindBackedSample.xaml.cs | 21 --- ...yMaskViewXbindBackedStyleCustomSample.xaml | 26 ---- ...skViewXbindBackedStyleCustomSample.xaml.cs | 21 --- .../OpacityMaskView/src/MultiTarget.props | 4 +- .../OpacityMaskView/src/OpacityMaskView.cs | 145 +++++++++--------- .../OpacityMaskView/src/OpacityMaskView.xaml | 34 ++++ .../OpacityMaskViewStyle_ClassicBinding.xaml | 62 -------- .../src/OpacityMaskViewStyle_xBind.xaml | 69 --------- .../src/OpacityMaskViewStyle_xBind.xaml.cs | 20 --- .../src/OpacityMaskView_ClassicBinding.cs | 94 ------------ .../src/OpacityMaskView_xBind.cs | 71 --------- .../OpacityMaskView/src/Themes/Generic.xaml | 10 +- .../tests/ExampleOpacityMaskViewTestClass.cs | 134 ---------------- .../tests/ExampleOpacityMaskViewTestPage.xaml | 14 -- .../ExampleOpacityMaskViewTestPage.xaml.cs | 16 -- .../tests/OpacityMaskView.Tests.projitems | 12 -- 29 files changed, 192 insertions(+), 846 deletions(-) create mode 100644 components/OpacityMaskView/samples/Assets/Owl.jpg create mode 100644 components/OpacityMaskView/samples/MultiTarget.props delete mode 100644 components/OpacityMaskView/samples/OpacityMaskViewCustomSample.xaml delete mode 100644 components/OpacityMaskView/samples/OpacityMaskViewCustomSample.xaml.cs create mode 100644 components/OpacityMaskView/samples/OpacityMaskViewSample.xaml create mode 100644 components/OpacityMaskView/samples/OpacityMaskViewSample.xaml.cs delete mode 100644 components/OpacityMaskView/samples/OpacityMaskViewTemplatedSample.xaml delete mode 100644 components/OpacityMaskView/samples/OpacityMaskViewTemplatedSample.xaml.cs delete mode 100644 components/OpacityMaskView/samples/OpacityMaskViewTemplatedStyleCustomSample.xaml delete mode 100644 components/OpacityMaskView/samples/OpacityMaskViewTemplatedStyleCustomSample.xaml.cs delete mode 100644 components/OpacityMaskView/samples/OpacityMaskViewXbindBackedSample.xaml delete mode 100644 components/OpacityMaskView/samples/OpacityMaskViewXbindBackedSample.xaml.cs delete mode 100644 components/OpacityMaskView/samples/OpacityMaskViewXbindBackedStyleCustomSample.xaml delete mode 100644 components/OpacityMaskView/samples/OpacityMaskViewXbindBackedStyleCustomSample.xaml.cs create mode 100644 components/OpacityMaskView/src/OpacityMaskView.xaml delete mode 100644 components/OpacityMaskView/src/OpacityMaskViewStyle_ClassicBinding.xaml delete mode 100644 components/OpacityMaskView/src/OpacityMaskViewStyle_xBind.xaml delete mode 100644 components/OpacityMaskView/src/OpacityMaskViewStyle_xBind.xaml.cs delete mode 100644 components/OpacityMaskView/src/OpacityMaskView_ClassicBinding.cs delete mode 100644 components/OpacityMaskView/src/OpacityMaskView_xBind.cs delete mode 100644 components/OpacityMaskView/tests/ExampleOpacityMaskViewTestClass.cs delete mode 100644 components/OpacityMaskView/tests/ExampleOpacityMaskViewTestPage.xaml delete mode 100644 components/OpacityMaskView/tests/ExampleOpacityMaskViewTestPage.xaml.cs diff --git a/components/OpacityMaskView/samples/Assets/Owl.jpg b/components/OpacityMaskView/samples/Assets/Owl.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1c8f39f708c757d35119f225398ee630f7ad3c05 GIT binary patch literal 61678 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 literal 0 HcmV?d00001 diff --git a/components/OpacityMaskView/samples/MultiTarget.props b/components/OpacityMaskView/samples/MultiTarget.props new file mode 100644 index 000000000..18f6c7c98 --- /dev/null +++ b/components/OpacityMaskView/samples/MultiTarget.props @@ -0,0 +1,9 @@ + + + + uwp;wasdk; + + diff --git a/components/OpacityMaskView/samples/OpacityMaskView.Samples.csproj b/components/OpacityMaskView/samples/OpacityMaskView.Samples.csproj index 492c47ffc..915eb89f4 100644 --- a/components/OpacityMaskView/samples/OpacityMaskView.Samples.csproj +++ b/components/OpacityMaskView/samples/OpacityMaskView.Samples.csproj @@ -5,4 +5,12 @@ + + + + + + PreserveNewest + + diff --git a/components/OpacityMaskView/samples/OpacityMaskView.md b/components/OpacityMaskView/samples/OpacityMaskView.md index 738d9751d..ce5a47b76 100644 --- a/components/OpacityMaskView/samples/OpacityMaskView.md +++ b/components/OpacityMaskView/samples/OpacityMaskView.md @@ -1,7 +1,7 @@ --- title: OpacityMaskView -author: githubaccount -description: TODO: Your experiment's description here +author: h82258652 +description: A control that applies an opacity mask to its content. keywords: OpacityMaskView, Control, Layout dev_langs: - csharp @@ -11,55 +11,8 @@ discussion-id: 0 issue-id: 0 icon: assets/icon.png --- - - - - - - - - - # OpacityMaskView -TODO: Fill in information about this experiment and how to get started here... - -## Custom Control - -You can inherit from an existing component as well, like `Panel`, this example shows a control without a -XAML Style that will be more light-weight to consume by an app developer: - -> [!Sample OpacityMaskViewCustomSample] - -## Templated Controls - -The Toolkit is built with templated controls. This provides developers a flexible way to restyle components -easily while still inheriting the general functionality a control provides. The examples below show -how a component can use a default style and then get overridden by the end developer. - -TODO: Two types of templated control building methods are shown. Delete these if you're building a custom component. -Otherwise, pick one method for your component and delete the files related to the unchosen `_ClassicBinding` or `_xBind` -classes (and the custom non-suffixed one as well). Then, rename your component to just be your component name. - -The `_ClassicBinding` class shows the traditional method used to develop components with best practices. - -### Implict style - -> [!SAMPLE OpacityMaskViewTemplatedSample] - -### Custom style - -> [!SAMPLE OpacityMaskViewTemplatedStyleCustomSample] - -## Templated Controls with x:Bind - -This is an _experimental_ new way to define components which allows for the use of x:Bind within the style. - -### Implict style - -> [!SAMPLE OpacityMaskViewXbindBackedSample] - -### Custom style - -> [!SAMPLE OpacityMaskViewXbindBackedStyleCustomSample] +The `OpacityMaskView` control applies an opacity mask to its content. The mask is defined by the `OpacityMask` property, which can contain a `Brush` object. The `OpacityMask` property is typically set to a `LinearGradientBrush` or `ImageBrush` object. +> [!Sample OpacityMaskViewSample] diff --git a/components/OpacityMaskView/samples/OpacityMaskViewCustomSample.xaml b/components/OpacityMaskView/samples/OpacityMaskViewCustomSample.xaml deleted file mode 100644 index c398aac1d..000000000 --- a/components/OpacityMaskView/samples/OpacityMaskViewCustomSample.xaml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - diff --git a/components/OpacityMaskView/samples/OpacityMaskViewCustomSample.xaml.cs b/components/OpacityMaskView/samples/OpacityMaskViewCustomSample.xaml.cs deleted file mode 100644 index ec71e2e3e..000000000 --- a/components/OpacityMaskView/samples/OpacityMaskViewCustomSample.xaml.cs +++ /dev/null @@ -1,30 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. -// See the LICENSE file in the project root for more information. - -using CommunityToolkit.WinUI.Controls; - -namespace OpacityMaskViewExperiment.Samples; - -/// -/// An example sample page of a custom control inheriting from Panel. -/// -[ToolkitSampleTextOption("TitleText", "This is a title", Title = "Input the text")] -[ToolkitSampleMultiChoiceOption("LayoutOrientation", "Horizontal", "Vertical", Title = "Orientation")] - -[ToolkitSample(id: nameof(OpacityMaskViewCustomSample), "Custom control", description: $"A sample for showing how to create and use a {nameof(OpacityMaskView)} custom control.")] -public sealed partial class OpacityMaskViewCustomSample : Page -{ - public OpacityMaskViewCustomSample() - { - this.InitializeComponent(); - } - - // TODO: See https://github.com/CommunityToolkit/Labs-Windows/issues/149 - public static Orientation ConvertStringToOrientation(string orientation) => orientation switch - { - "Vertical" => Orientation.Vertical, - "Horizontal" => Orientation.Horizontal, - _ => throw new System.NotImplementedException(), - }; -} diff --git a/components/OpacityMaskView/samples/OpacityMaskViewSample.xaml b/components/OpacityMaskView/samples/OpacityMaskViewSample.xaml new file mode 100644 index 000000000..673ddc651 --- /dev/null +++ b/components/OpacityMaskView/samples/OpacityMaskViewSample.xaml @@ -0,0 +1,39 @@ + + + + + + + + + + + +