- Move SwitchKnob transitions from C# code to XAML theme using style selector
- Remove ConfigureTransitions, OnLoaded/OnUnloaded lifecycle management
- Fix Switch animation not smoothly transitioning back to circle on pointer release by deferring KnobSize update
- Move PixelPointTransition and RectTransition to Animations/Transitions directory
- Update TransitionsRefactoringPlan.md progress tracking
Remove code-behind theme classes, consolidate theme definitions into ResourceDictionary format,
add TransitionProvider and SharedTokenResourceValue infrastructure, and remove redundant styles.
- OnAttachedToVisualTree: re-subscribe Target.ScrollChanged with
idempotent -= before += to handle re-attach correctly
- OnDetachedFromVisualTree: unsubscribe ScrollChanged, Cancel+Dispose
_cancellationTokenSource (does not clear Target to support re-attach)
- OnClick: Dispose old CTS before creating new one
- MotionGhostControl: unsubscribe SizeChanged and reset _layout/
_maskCenterFrame to null, enabling correct re-initialization on
re-attach when Content changes while detached
- GradientColorPickerTrack: clear thumbs from LogicalChildren/
VisualChildren on detach, preventing stale thumbs on re-attach
when GradientValue becomes null while detached
- CollapseItem: reset InAnimating flag on detach, preventing the
control from being stuck in animating state after re-attach
- RangeInfoPickerInput: clear _topLevel reference on detach to
prevent holding a stale TopLevel (window) reference
- TreeViewItem: clear OwnerTreeView on detach to prevent stale
tree operations during detached period and avoid GC retention
- Card: simplify delegate instantiation style (cosmetic only)
Partially addresses issue 2.1 in docs/Issues/AtomUI_issues.md.
Remaining: AbstractBackTopFloatButtonHost, PopupConfirm,
NotificationCard, NavMenuItem, Collapse, Card token scope.
The code was already using named methods (OnFloatButtonGroupOpenRequest/
OnFloatButtonGroupCloseRequest) with CompositeDisposable cleanup.
Update tracking doc to reflect actual state.
- Add OnClick/OnClose internal properties to NotificationCard to carry
per-notification callbacks without capturing local variables
- Replace PointerPressed lambda with static OnNotificationPointerPressed
(zero closure allocation, reads callback from card.OnClick)
- Replace NotificationClosed lambda with instance OnNotificationClosed
(accesses _items via 'this', no local variable capture)
- Update AtomUI_issues.md: mark 1.2 as fixed, remove from P8 list
Modal methods (ShowMessageBoxModalAsync, ShowMessageModalAsync,
ShowDialogModalAsync x2): OpenAsync() awaits dialog close, so cleanup
is moved after await tsc.Task — no Closed subscription needed.
Non-modal methods (ShowMessageBoxAsync, ShowMessageAsync,
ShowDialogAsync x2): OpenAsync() returns after dialog is shown, so
Closed lambda is retained as the only close notification point.
The lambda is harmless: Closed fires exactly once, dialog is removed
from parent and GC'd immediately after, releasing the closure.
- Update AtomUI_issues.md: mark 1.1 as fixed, remove from P3 list
- Delete performance_memory_leak.md (tracking moved to AtomUI_issues.md)