diff --git a/src/AtomUI.Controls/AtomUIOSSControlThemesProvider.axaml b/src/AtomUI.Controls/AtomUIOSSControlThemesProvider.axaml
index a6f4a2864..5343e23bd 100644
--- a/src/AtomUI.Controls/AtomUIOSSControlThemesProvider.axaml
+++ b/src/AtomUI.Controls/AtomUIOSSControlThemesProvider.axaml
@@ -13,6 +13,7 @@
+
diff --git a/src/AtomUI.Controls/Collapse/Collapse.cs b/src/AtomUI.Controls/Collapse/Collapse.cs
index 13fb73aef..23edca3bc 100644
--- a/src/AtomUI.Controls/Collapse/Collapse.cs
+++ b/src/AtomUI.Controls/Collapse/Collapse.cs
@@ -1,4 +1,5 @@
using System.Reactive.Disposables;
+using AtomUI.Controls.Themes;
using AtomUI.Data;
using AtomUI.Theme;
using AtomUI.Theme.Data;
@@ -30,7 +31,7 @@ public enum CollapseExpandIconPosition
End
}
-[TemplatePart(CollapseTheme.ItemsPresenterPart, typeof(ItemsPresenter))]
+[TemplatePart(CollapseThemeConstants.ItemsPresenterPart, typeof(ItemsPresenter))]
public class Collapse : SelectingItemsControl,
IMotionAwareControl,
IControlSharedTokenResourcesHost,
diff --git a/src/AtomUI.Controls/Collapse/CollapseItem.cs b/src/AtomUI.Controls/Collapse/CollapseItem.cs
index ff2b937ea..5a691ee2c 100644
--- a/src/AtomUI.Controls/Collapse/CollapseItem.cs
+++ b/src/AtomUI.Controls/Collapse/CollapseItem.cs
@@ -1,9 +1,12 @@
using System.Diagnostics;
+using AtomUI.Controls.Themes;
+using AtomUI.Controls.Utils;
using AtomUI.IconPkg;
using AtomUI.IconPkg.AntDesign;
using AtomUI.MotionScene;
using AtomUI.Reflection;
using Avalonia;
+using Avalonia.Animation;
using Avalonia.Animation.Easings;
using Avalonia.Automation.Peers;
using Avalonia.Controls;
@@ -233,9 +236,9 @@ public class CollapseItem : HeaderedContentControl,
protected override void OnApplyTemplate(TemplateAppliedEventArgs e)
{
base.OnApplyTemplate(e);
- _motionActor = e.NameScope.Find(CollapseItemTheme.ContentMotionActorPart);
- _headerDecorator = e.NameScope.Find(CollapseItemTheme.HeaderDecoratorPart);
- _expandButton = e.NameScope.Find(CollapseItemTheme.ExpandButtonPart);
+ _motionActor = e.NameScope.Find(CollapseItemThemeConstants.ContentMotionActorPart);
+ _headerDecorator = e.NameScope.Find(CollapseItemThemeConstants.HeaderDecoratorPart);
+ _expandButton = e.NameScope.Find(CollapseItemThemeConstants.ExpandButtonPart);
// 必须放在这里,因为依赖 _motionActor 是否设置
_tempAnimationDisabled = true;
@@ -245,6 +248,7 @@ public class CollapseItem : HeaderedContentControl,
{
_expandButton.Click += (sender, args) => { IsSelected = !IsSelected; };
}
+ ConfigureTransitions();
}
protected override void OnAttachedToVisualTree(VisualTreeAttachmentEventArgs e)
@@ -292,6 +296,10 @@ public class CollapseItem : HeaderedContentControl,
SetupDefaultExpandIcon();
}
}
+ else if (change.Property == IsMotionEnabledProperty)
+ {
+ ConfigureTransitions();
+ }
}
private void HandleSelectedChanged()
@@ -359,4 +367,38 @@ public class CollapseItem : HeaderedContentControl,
return false;
}
+
+ private void ConfigureTransitions()
+ {
+ if (IsMotionEnabled)
+ {
+ if (_headerDecorator != null)
+ {
+ _headerDecorator.Transitions ??= new Transitions()
+ {
+ TransitionUtils.CreateTransition(Border.BorderThicknessProperty)
+ };
+ }
+
+ if (_expandButton != null)
+ {
+ _expandButton.Transitions ??= new Transitions()
+ {
+ TransitionUtils.CreateTransition(Visual.RenderTransformProperty)
+ };
+ }
+ }
+ else
+ {
+ if (_headerDecorator != null)
+ {
+ _headerDecorator.Transitions?.Clear();
+ }
+
+ if (_expandButton != null)
+ {
+ _expandButton.Transitions?.Clear();
+ }
+ }
+ }
}
\ No newline at end of file
diff --git a/src/AtomUI.Controls/Collapse/CollapseItemTheme.cs b/src/AtomUI.Controls/Collapse/CollapseItemTheme.cs
deleted file mode 100644
index 97a5f5b74..000000000
--- a/src/AtomUI.Controls/Collapse/CollapseItemTheme.cs
+++ /dev/null
@@ -1,386 +0,0 @@
-using AtomUI.Controls.Utils;
-using AtomUI.IconPkg;
-using AtomUI.MotionScene;
-using AtomUI.Theme;
-using AtomUI.Theme.Styling;
-using AtomUI.Utils;
-using Avalonia;
-using Avalonia.Animation;
-using Avalonia.Controls;
-using Avalonia.Controls.Documents;
-using Avalonia.Controls.Presenters;
-using Avalonia.Controls.Primitives;
-using Avalonia.Controls.Templates;
-using Avalonia.Data;
-using Avalonia.Data.Converters;
-using Avalonia.Input;
-using Avalonia.Layout;
-using Avalonia.Media;
-using Avalonia.Media.Transformation;
-using Avalonia.Styling;
-
-namespace AtomUI.Controls;
-
-[ControlThemeProvider]
-internal class CollapseItemTheme : BaseControlTheme
-{
- public const string MainLayoutPart = "PART_MainLayout";
- public const string ExpandButtonPart = "PART_ExpandButton";
- public const string HeaderPresenterPart = "PART_HeaderPresenter";
- public const string HeaderDecoratorPart = "PART_HeaderDecorator";
- public const string ContentPresenterPart = "PART_ContentPresenter";
- public const string AddOnContentPresenterPart = "PART_AddOnContentPresenter";
- public const string ContentMotionActorPart = "PART_ContentMotionActor";
-
- public CollapseItemTheme() : base(typeof(CollapseItem))
- {
- }
-
- protected override IControlTemplate BuildControlTemplate()
- {
- return new FuncControlTemplate((collapseItem, scope) =>
- {
- var mainLayout = new DockPanel
- {
- Name = MainLayoutPart,
- LastChildFill = true
- };
-
- BuildHeader(collapseItem, mainLayout, scope);
- var motionActor = new MotionActorControl
- {
- Name = ContentMotionActorPart
- };
- motionActor.SetCurrentValue(Visual.IsVisibleProperty, false);
- var contentPresenter = new ContentPresenter
- {
- Name = ContentPresenterPart
- };
- motionActor.Child = contentPresenter;
- CreateTemplateParentBinding(contentPresenter, ContentPresenter.ContentProperty,
- ContentControl.ContentProperty,
- BindingMode.Default,
- new FuncValueConverter