Skip to content

Commit

Permalink
Merge pull request #331 from AvaloniaCommunity/b/borderTransitionsBug
Browse files Browse the repository at this point in the history
Add mixin for BoxShadow instead of just Border style. #330
  • Loading branch information
SKProCH committed Dec 28, 2023
2 parents 6ca5853 + 98120f9 commit ee6cadc
Show file tree
Hide file tree
Showing 4 changed files with 50 additions and 21 deletions.
42 changes: 42 additions & 0 deletions Material.Styles/Assists/Mixins/MaterialBorderBoxShadowMixin.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
using System;
using Avalonia;
using Avalonia.Animation;
using Avalonia.Controls;

namespace Material.Styles.Assists.Mixins;

/// <summary>
/// Adds BoxShadows transitions for any control, which has enabled animations.
/// </summary>
public static class MaterialBorderBoxShadowMixin {
public static BoxShadowsTransition TargetTransition { get; set; } = new() { Property = Border.BoxShadowProperty, Duration = TimeSpan.FromMilliseconds(350) };

/// <summary>
/// Initializes BoxShadows transitions for specified control.
/// </summary>
/// <typeparam name="TControl">The control type.</typeparam>
public static void Attach<TControl>() where TControl : Control {
TransitionAssist.DisableTransitionsProperty.Changed.AddClassHandler<TControl>(OnDisableTransitionsChanged);
Animatable.TransitionsProperty.Changed.AddClassHandler<TControl>(OnTransitionCollectionChanged);
}

private static void OnDisableTransitionsChanged<TControl>(TControl control, AvaloniaPropertyChangedEventArgs args)
where TControl : Control {
var transitions = control.GetValue(Animatable.TransitionsProperty);
if (transitions is null) return;

var disableTransitions = args.GetNewValue<bool>();
if (disableTransitions)
transitions.Remove(TargetTransition);
else
transitions.Add(TargetTransition);
}

private static void OnTransitionCollectionChanged<TControl>(TControl control, AvaloniaPropertyChangedEventArgs args)
where TControl : Control {
var disableTransitions = (bool)control.GetValue(TransitionAssist.DisableTransitionsProperty)!;
if (disableTransitions) return;

if (args.NewValue is Transitions transitions && !transitions.Contains(TargetTransition)) transitions.Add(TargetTransition);
}
}
10 changes: 0 additions & 10 deletions Material.Styles/Border.axaml

This file was deleted.

1 change: 0 additions & 1 deletion Material.Styles/MaterialToolKit.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,5 @@
</ResourceDictionary>
</Styles.Resources>

<StyleInclude Source="avares://Material.Styles/Border.axaml" />
<StyleInclude Source="avares://Material.Styles/UserControl.axaml" />
</Styles>
18 changes: 8 additions & 10 deletions Material.Styles/MaterialToolKit.xaml.cs
Original file line number Diff line number Diff line change
@@ -1,24 +1,22 @@
using System;
using Avalonia;
using Avalonia.Animation;
using Avalonia.Controls;
using Avalonia.Markup.Xaml;
using Avalonia.Markup.Xaml.Styling;
using Material.Styles.Additional;
using Material.Styles.Assists.Mixins;

namespace Material.Styles
{
public class MaterialToolKit : Avalonia.Styling.Styles
{
static MaterialToolKit()
{
namespace Material.Styles {
public class MaterialToolKit : Avalonia.Styling.Styles {
static MaterialToolKit() {
Animation.RegisterCustomAnimator<RelativePoint, RelativePointAnimator>();
MaterialBorderBoxShadowMixin.Attach<Border>();
}

public MaterialToolKit()
{
public MaterialToolKit() {
AvaloniaXamlLoader.Load(this);
if (AppContext.TryGetSwitch("MaterialThemeIncludeDataGrid", out var includeDataGrid) && includeDataGrid)
{
if (AppContext.TryGetSwitch("MaterialThemeIncludeDataGrid", out var includeDataGrid) && includeDataGrid) {
Add(new StyleInclude((Uri?)null) { Source = new Uri("avares://Material.Avalonia.DataGrid/DataGrid.xaml") });
}
}
Expand Down

0 comments on commit ee6cadc

Please sign in to comment.