# XamlFlair **Repository Path**: sesametechgroup/XamlFlair ## Basic Information - **Project Name**: XamlFlair - **Description**: No description available - **Primary Language**: C# - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-09-04 - **Last Updated**: 2021-09-04 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # XamlFlair The goal of the XamlFlair library is to ease the implementation of common animations and allow a developer to *easily* add a single or combined set of animations with just a few lines of Xaml. ![Sample App](doc/gifs/uwp.gif) # Showcase [Sekuence Puzzle Game](https://sekuence.fun)| :-------------------------------------------: ![Sekuence](doc/gifs/Sekuence.gif) | ## Supporting Me If you would like to support my work with a few coffees, you can do it here: [Buy Me A Coffee](https://www.buymeacoffee.com/xamlflair). Your help allows me to continue to spend time on this project and continue to maintain and update it with new features when possible. Thanks in advance! ## Contents - [Install from Nuget](#install-from-nuget) - [Features Overview](#features-overview) - [Basic Concepts](#basic-concepts) - [Usage](#usage) - [Base Animation Types](#base-animation-types) - [Color Animations (*WPF And Uno Only*)](#color-animations-wpf-and-uno-only) - [Overriding the Global Default Values](#overriding-the-global-default-values) - [Using a `ResourceDictionary` for Base Settings](#using-a-resourcedictionary-for-base-settings) - [Default Animations (*WPF Only*)](#default-animations-wpf-only) - [`TransformOn` Property (*WPF Only*)](#transformon-property-wpf-only) - [Perspective Rotations (*UWP Only*)](#perspective-rotations-uwp-only) - [Combining Animations](#combining-animations) - [Overriding Values](#overriding-values) - [Relative Translations on X and Y Axes](#relative-translations-on-x-and-y-axes) - [Compound Animations](#compound-animations) - [Repeating Animations](#repeating-animations) - [Events](#events) - [Bindings](#bindings) - [Primary and Secondary Completion Commands](#primary-and-secondary-completion-commands) - [Using the `StartWith` Property](#using-the-startwith-property) - [Using the `AllowOpacityReset` Property (*WPF Only*)](#using-the-allowopacityreset-property-wpf-only) - [Using the `ClipToBounds` Property (*UWP And Uno Only*)](#using-the-cliptobounds-property-uwp-and-uno-only) - [Debugging Animations](#debugging-animations) - [Logging Animations](#logging-animations) - [`ListViewBase` (_UWP and Uno_) and `ListBox`-based (_WPF_) Animations](#listviewbase-uwp-and-uno-and-listbox-based-wpf-animations) ## Install from Nuget | Platform | Package | NuGet | | -------- | -------- | ------- | | UWP | [XamlFlair.UWP][UWPNuGet] | [![UWPNuGetShield]][UWPNuGet] | | WPF | [XamlFlair.WPF][WPFNuGet] | [![WPFNuGetShield]][WPFNuGet] | | Uno | [XamlFlair.Uno][UNONuGet] | [![UNONuGetShield]][UNONuGet] | To install **XamlFlair**, run the following command in the **Package Manager Console**: UWP: ``` Install-Package XamlFlair.UWP ``` > Your app must target a minimum of Windows 10 version 1809 (build 17763) WPF: ``` Install-Package XamlFlair.WPF ``` Uno: ``` Install-Package XamlFlair.Uno ``` > Your UWP app must target a minimum of Windows 10 version 1809 (build 18362) ## Features Overview Feature | **UWP** | **WPF** | **UWP (Uno)** | **iOS (Uno)** | **Android (Uno)** | **Wasm (Uno) EXPERIMENTAL** ------------------------------------- | ----------- | -------------- | ------------------ | ------------------ | ------------------ | ---------------------------- *Animation System* | Composition | Storyboards | Storyboards | Storyboards | Storyboards | Storyboards *Transform Type* | N/A | TransformGroup | CompositeTransform | CompositeTransform | CompositeTransform | CompositeTransform DefaultAnimations.xaml | - | ✔ | - | - | - | - `TransformOn` | - | ✔ | - | - | - | - Compound Animations | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ Relative Translations | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ Repeating Animations | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ Events & Bindings | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ Primary/Secondary Completion Commands | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ `StartWith` | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ `AllowOpacityReset` | - | ✔ | - | - | - | - `ClipToBounds` | ✔ | N/A | ✔ | ✔ | ✔ | ✔ Animated Lists | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ Blur Effect | ✔ | ✔ | - | - | - | - Saturation Effect | ✔ | - | - | - | - | - Tint Effect | ✔ | - | - | - | - | - Color Animations | - | ✔ | ✔ | ✔ | ✔ | ✔ Perspective Rotations (Swivel) | ✔ | - | - | - | - | - Debugging Animations | ✔ | ✔ | ✔ | ✔ | ✔ | - ## Basic Concepts The basic concept of XamlFlair is based on animations that are categorized as _From_ and _To_. Any UI element that consists of a _From_ animation will **start with one or more arbitrary values, and complete using the default value of the corresponding property**. Any UI element that consists of a _To_ animation will **start in its current state and animate to one or more arbitrary values**. Example of a _From_ animation (a UI element translating to the default value of a Translation (0)): ![From animation](doc/gifs/TranslateFrom.gif) Example of a _To_ animation (a UI element sliding away from its current state): ![To animation](doc/gifs/TranslateTo.gif) > **Note**: It's important to note there is an exception to this rule for Color Animations, which is explained in the Base Animation Types section. ## Usage To begin, you need to have the following Xaml namespace reference: UWP and Uno: ```xml xmlns:xf="using:XamlFlair" ``` WPF: ```xml xmlns:xf="clr-namespace:XamlFlair;assembly=XamlFlair.WPF" ``` From here on, it's a simple matter of setting an attached property to any `FrameworkElement` that needs an animation: ```xml ``` > **Note**: If your `FrameworkElement` defines a `CompositeTransform` in your Xaml, it will be altered during the animation process. > **Note**: The use of `StaticResource` is to reference global common animations, which is discussed in the next section. ### Base Animation Types #### Fade ![Fade animation](doc/gifs/FadeFrom.gif) > **Warning**: Be careful when animating `FadeTo` since the element remains in the Visual Tree if the `Visibility` is `Visible`. There may be cases where you'll need to manually manage `IsHitTestVisible` to allow the user to tap *through* the element. #### Translate ![Translation animation](doc/gifs/TranslateFrom.gif) #### Scale ![Scale animation](doc/gifs/ScaleFrom.gif) #### Rotate ![Rotation animation](doc/gifs/RotateFrom.gif) #### Blur (_UWP and WPF only_) ![Blur animation](doc/gifs/Blur.gif) #### Saturate (_UWP only_) ![Saturate animation](doc/gifs/Saturate.gif) #### Tint (_UWP only_) ![Tint animation](doc/gifs/Tint.gif) #### Color (_WPF and Uno only_) ![Color animation](doc/gifs/ColorTo.gif) > **Note**: It's important to note when animating a color using a _From_ animation, the color will animate from a specified value to its **current state** instead of a default value. #### Swivel (_UWP only_) ![Swivel animation](doc/gifs/Swivel.gif) > **Note**: Read the section [Perspective Rotations (*UWP Only*)](#perspective-rotations-uwp-only) for further details. The following lists some notable **default values** when working with XamlFlair: - **Kind**: FadeTo - **Duration** (_milliseconds_): 500 - **Easing**: Cubic - **Easing Mode**: EaseOut - **TransformCenterPoint**: (0.5, 0.5) - **Event**: Loaded - **InterElementDelay** (_milliseconds_): 25 (_List controls only_) - **TransformOn**: Render (_WPF only_) - **Saturation**: 0.5 (_UWP only_) - **Tint**: Transparent (_UWP only_) ### Color Animations (*WPF And Uno Only*) Color animations require some attention since they are **slightly** different than the other base type animations. When using either `ColorTo` and `ColorFrom`, the following must be done: - You can only animate the following properties: `Control.Background`, `Control.Foreground`, `Control.BorderBrush`, `Border.Background`, `Border.BorderBrush`, `TextBlock.Foreground`, `Shape.Fill`, `Shape.Stroke` - Make sure to set a brush on the corresponding property you intend to animate - You must also specify the target property using `ColorOn` The following example will animate the Rectangle's `Fill` from RoyalBlue to DarkGreen: ```xml ``` ### Overriding the Global Default Values If you have the need to globally change one of the default animation values (for example, having a default `Duration` of 750 instead of 500), you can call the `OverrideDefaultSettings` function in your app's initialization code. The following example changes the default values for `Duration` and `Easing`: ```cs XamlFlair.Animations.OverrideDefaultSettings( duration: 750, easing: EasingType.Quadratic); ``` Therefore, with the sample code above, every animation will run for 750ms with a quadratic easing. ### Using a `ResourceDictionary` for Base Settings All **common** animations should be placed in a global `ResourceDictionary` (ex: `Animations.xaml`) and used where needed throughout the app. The goal is to consolidate all the animations into one file with meaningful names so that any developer can understand exactly what animation is applied to a `FrameworkElement`. Here's a small example of what it looks like: ```xml 50 -50 0.75 1.25 . . . ``` To setup this set of pre-configured `AnimationSettings` already available in your app, perform the following steps: 1. Right-click on your project, then click **Add > New Item...** 2. Choose **Resource Dictionary** and name it `Animations.xaml` 3. In your `App.xaml`, add the following: ```xml ``` 4. In `Animations.xaml`, copy & paste the contents from the corresponding links below: - [Animation settings for UWP](https://github.com/XamlFlair/XamlFlair/blob/master/Samples/XamlFlair.Samples.UWP/Animations.xaml) - [Animation settings for WPF](https://github.com/XamlFlair/XamlFlair/blob/master/Samples/XamlFlair.Samples.WPF/Animations.xaml) - [Animation settings for Uno](https://github.com/XamlFlair/XamlFlair/blob/master/Samples/Uno/XamlFlair.Samples.Uno.Shared/Animations.xaml) Your app now has a global set of **common** animations ready to use. ### Default Animations (*WPF Only*) Alternatively to creating your own `ResourceDictionary` containing your custom `AnimationSettings`, XamlFlair provides some **Default** Animations. To reference these Default Animations in your application, perform the following steps in your `App.xaml`: 1. Define the `XamlFlair.WPF` namespace at the top: ```xml xmlns:xf="clr-namespace:XamlFlair;assembly=XamlFlair.WPF" ``` 2. Update your Application Resources: ```xml ``` Your application now has a global set of **Default** animations ready to use. If Visual Studio Intellisense does not work when using ``, you may want to try the following instead: ```xml ``` ### `TransformOn` Property (*WPF Only*) Using the `TransformOn` property, you can target which type of `RenderTransform` to apply to your animation. Available options are `Render` and `Layout`. When nothing is specified, the default vale is `Render`. Here's an example of the two: ![TransformOn animation](doc/gifs/TransformOn.gif) > **Note**: Very important to note that WPF's `LayoutTransform` does not support any `TranslateTransform`, therefore translate animations will never work. You can read more about it in the Remarks section [here](https://docs.microsoft.com/en-us/dotnet/api/system.windows.frameworkelement.layouttransform?redirectedfrom=MSDN&view=net-5.0#remarks). ### Perspective Rotations (*UWP Only*) It is important to note that to apply a perspective rotation (also referred to as `Swivel`) to a target element, it is required that it be wrapped in a container with the layout properties applied to the container element. Therefore, consider the following simple perspective rotation: ```xml ``` Instead of animating the element as such: ```xml ``` The element should be placed in a container for the animation to work correctly: ```xml ``` ### Combining Animations Animations can be combined, and as previously mentioned, any of these *combined* animations that are commonly used should be placed in the global `ResourceDictionary` (ex: `Animations.xaml`): ```xml . . . . . . ``` This demonstrates a combined animation of a `FadeFrom` and `TranslateFrom`: ![Fade and translation animation](doc/gifs/FadeFromTranslateFrom.gif) This demonstrates a combined animation of a `FadeFrom`, `TranslateFrom`, and `ScaleFrom`: ![Fade, translation, and scale snimation](doc/gifs/FadeFromTranslateFromScaleFrom.gif) ### Overriding Values Animations can have their settings overridden directly on the `FrameworkElement`. This is commonly done to alter values for Delay and Duration so that we don't over-populate the `Animations.xaml` file with repeated resources. To achieve overriding, use the `Animate` markup extension paired with the `BasedOn` property: ```xml ``` ### Relative Translations on X and Y Axes Since hard-coded values for `OffsetX` and `OffsetY` can be limiting (such as in cases when dealing with resizable windows), both `OffsetX` and `OffsetY` support star-based values: ```xml ``` > A star-based value will calculate the offset based on the **current** `ActualWidth` and/or `ActualHeight` value(s) of the `FrameworkElement`, therefore it's important that the element has executed its `Loaded` event. If `ActualWidth` and/or `ActualHeight` are not yet calculated, the offset value will try to be based on `Width` and/or `Height`. ### Compound Animations A compound animation is simply a multi-step animation using the `CompoundSettings` class. Each inner animation executes once the previous one completes, hence they're sequential animations: ![Compound animation](doc/gifs/Compound.gif) ```xml ``` > **Note**: `CompoundSettings` support the `Event` property, which is discussed in a later section. ### Repeating Animations An animation can be repeated by using the `IterationBehavior` and `IterationCount` properties (default values of `Count` and `1` respectively). ![Compound animation](doc/gifs/Repeating.gif) The following demonstrates how to run an animation only 5 times: ```xml ``` The following demonstrates how to run an animation indefinitely: ```xml ``` Also note that it is also possible to repeat a Compound animation. For example, using the compound animation (named _Progress_) from the previous section: ```xml ``` > **Warning**: When using repeating animations, you cannot set a `Secondary` animation on the element. It's important to note that all XamlFlair animations are *"kick-off"* animations, in other words, they start and only stop when they complete (or when the associated element unloads), **except** repeating animations. A repeating animation can be stopped when supplying a `false` value to the `PrimaryBinding` property (bindings are covered in the next section): ```xml ``` When a `false` is set on the binding, the animation's current iteration will run until it finishes and then the repeating animation will stop. ### Events By default, all animations execute when the animated element fires its `Loaded` event. This behavior can be overridden by setting the `Event` property. `Event` can be any event that is exposed from the element being animated. For example, to execute an animation on a button when it is clicked, the `Click` event can be used: ```xml