From 0b520bff8dbe58c57fd04dc14abbcf90e351b167 Mon Sep 17 00:00:00 2001 From: chinboy Date: Sun, 10 May 2026 22:03:38 +0800 Subject: [PATCH] refactor: standardize property names for visibility and mode across components --- .../ShowCases/ProgressBarShowCase.axaml | 6 +- .../Views/DataDisplay/BadgeShowCase.axaml | 4 +- .../Views/DataDisplay/DataGridShowCase.axaml | 10 +- .../Views/DataDisplay/EmptyShowCase.axaml | 2 +- .../DataDisplay/InfoFlyoutShowCase.axaml | 24 +- .../DataDisplay/TimelineShowCase.axaml.cs | 6 +- .../Views/DataDisplay/TooltipShowCase.axaml | 24 +- .../Views/DataEntry/ColorPickerShowCase.axaml | 24 +- .../Views/DataEntry/FormShowCase.axaml.cs | 2 +- .../Views/DataEntry/SliderShowCase.axaml | 4 +- .../Views/Feedback/PopupConfirmShowCase.axaml | 2 +- .../Views/Feedback/SpinShowCase.axaml | 12 +- .../ShowCases/Views/Layout/GridShowCase.axaml | 2 +- .../Views/Layout/SpaceShowCase.axaml | 2 +- .../Navigation/DropdownButtonShowCase.axaml | 12 +- docs/ColorPickerPopupRefactoringPlan.md | 242 ---- docs/DialogWindowOverlayArchitecturePlan.md | 820 ------------ docs/UnusedImportsScanReport.md | 1187 ----------------- docs/todos/api-design-inconsistencies.md | 231 ++-- .../Badge/AbstractCountBadge.cs | 18 +- src/AtomUI.Controls/Badge/AbstractDotBadge.cs | 4 +- src/AtomUI.Controls/Empty/AbstractEmpty.cs | 12 +- .../FloatButton/AbstractFloatButtonHost.cs | 4 +- .../Form/Validators/AbstractFormValidator.cs | 4 +- .../Form/Validators/FormAssertValidator.cs | 2 +- .../Form/Validators/FormNotNullValidator.cs | 2 +- .../Validators/FormStringLengthValidator.cs | 2 +- .../Validators/FormStringNotEmptyValidator.cs | 2 +- .../Form/Validators/FormUrlValidator.cs | 2 +- src/AtomUI.Controls/Grid/Row.cs | 14 +- .../IShadowMaskInfoProvider.cs | 2 +- .../AbstractArrowDecoratedBox.cs | 18 +- .../ProgressBar/AbstractCircleProgress.cs | 14 +- .../ProgressBar/AbstractGeneralProgressBar.cs | 20 +- .../AbstractGeneralStepsProgressBar.cs | 16 +- .../ProgressBar/AbstractLineProgress.cs | 4 +- .../ProgressBar/AbstractProgressBar.cs | 34 +- src/AtomUI.Controls/Spin/AbstractSpin.cs | 10 +- .../Timeline/AbstractTimeline.cs | 6 +- .../Timeline/AbstractTimelineItem.cs | 8 +- src/AtomUI.Controls/Timeline/TimeLineEnums.cs | 4 +- .../Timeline/TimelineItemPanel.cs | 30 +- .../Watermark/Glyphs/WatermarkGlyph.cs | 20 +- .../Glyphs/WatermarkGlyphExtension.cs | 8 +- src/AtomUI.Controls/Watermark/Watermark.cs | 4 +- .../AbstractColorPicker.cs | 54 +- .../ColorPicker.cs | 4 +- .../ColorPickerPseudoClass.cs | 6 + .../AbstractColorPickerSliderTrack.cs | 26 +- .../ColorSlider/ColorSlider.cs | 2 +- .../ColorSlider/GradientColorSlider.cs | 2 +- .../GradientColorPicker.cs | 4 +- .../Themes/AbstractColorPickerTheme.axaml | 8 +- .../Themes/ColorBlockTheme.axaml | 10 +- .../Themes/ColorPickerTheme.axaml | 8 +- .../Themes/ColorSlider/ColorSliderTheme.axaml | 2 +- .../ColorSlider/ColorSliderThumbTheme.axaml | 2 +- .../Themes/ColorView/ColorPickerInput.axaml | 10 +- .../Themes/ColorView/ColorSpectrumTheme.axaml | 6 +- .../Themes/GradientColorPickerTheme.axaml | 6 +- .../Column/DataGridColumn.Privates.cs | 2 +- .../Column/DataGridColumn.cs | 18 +- .../Column/DataGridColumnHeader.Sorting.cs | 24 +- .../Column/Filters/DataGridFilterIndicator.cs | 22 +- .../Filters/DataGridMenuFilterFlyout.cs | 2 +- .../Filters/DataGridTreeFilterFlyout.cs | 2 +- .../DataGrid.Columns.cs | 2 +- .../DataGrid.Privates.cs | 6 +- .../DataGrid.cs | 24 +- .../Themes/DataGridColumnHeaderTheme.axaml | 28 +- .../Themes/DataGridTheme.axaml | 4 +- ...taGridMenuFilterFlyoutPresenterTheme.axaml | 2 +- ...taGridTreeFilterFlyoutPresenterTheme.axaml | 2 +- .../Badge/CountBadge.cs | 2 +- src/AtomUI.Desktop.Controls/Badge/DotBadge.cs | 2 +- .../ButtonSpinner/ButtonSpinner.cs | 40 +- .../ButtonSpinnerDecoratedBox.cs | 12 +- .../Themes/ButtonSpinnerTheme.axaml | 2 +- .../Buttons/DropdownButton.cs | 14 +- .../Buttons/SplitButton.cs | 14 +- src/AtomUI.Desktop.Controls/Card/Card.cs | 14 +- .../Card/Themes/CardTheme.axaml | 2 +- .../DatePicker/DatePicker.cs | 6 +- .../DatePicker/DatePickerPresenter.cs | 32 +- .../DatePicker/RangeDatePicker.cs | 6 +- .../DatePicker/RangeDatePickerPresenter.cs | 2 +- .../Themes/DatePickerPresenterTheme.axaml | 2 +- ...alMonthRangeDatePickerPresenterTheme.axaml | 2 +- .../TimedRangeDatePickerPresenterTheme.axaml | 2 +- src/AtomUI.Desktop.Controls/Dialog/Dialog.cs | 14 +- src/AtomUI.Desktop.Controls/Drawer/Drawer.cs | 12 +- .../Drawer/DrawerContainer.cs | 14 +- .../FloatButton/BackTopFloatButtonHost.cs | 2 +- .../FloatButton/FloatButtonHost.cs | 2 +- .../FloatButton/FloatButtonItemsControl.cs | 2 +- .../Themes/FloatButtonItemsControlTheme.axaml | 6 +- src/AtomUI.Desktop.Controls/Flyouts/Flyout.cs | 38 +- .../Flyouts/FlyoutHost.cs | 12 +- .../Flyouts/MenuFlyout.cs | 4 +- .../Flyouts/MenuFlyoutPresenter.cs | 14 +- .../Themes/MenuFlyoutPresenterTheme.axaml | 2 +- .../Themes/TreeViewFlyoutPresenterTheme.axaml | 2 +- .../Flyouts/TreeViewFlyout.cs | 2 +- .../Flyouts/TreeViewFlyoutPresenter.cs | 10 +- src/AtomUI.Desktop.Controls/Form/Form.cs | 10 +- .../Input/SearchEditDecoratedBox.cs | 10 +- .../Themes/SearchEditDecoratedBoxTheme.axaml | 2 +- .../Input/Themes/SearchEditTheme.axaml | 2 +- .../ListView/Themes/ListViewTheme.axaml | 2 +- .../Mentions/Themes/MentionsTheme.axaml | 2 +- .../Themes/NumericUpDownTheme.axaml | 4 +- src/AtomUI.Desktop.Controls/Popup/Popup.cs | 4 +- .../Popup/ShadowsAwareContainer.cs | 24 +- .../Themes/ArrowDecoratedBoxTheme.axaml | 2 +- .../InfoPickerInput/InfoPickerInput.cs | 34 +- .../Themes/InfoPickerInputTheme.axaml | 4 +- .../Themes/RangeInfoPickerInputTheme.axaml | 2 +- .../Themes/AbstractCircleProgressTheme.axaml | 2 +- .../Themes/AbstractLineProgressTheme.axaml | 2 +- .../ProgressBar/Themes/ProgressBarTheme.axaml | 2 +- .../Themes/StepsProgressBarTheme.axaml | 2 +- src/AtomUI.Desktop.Controls/Slider/Slider.cs | 10 +- .../Slider/SliderTrack.cs | 18 +- .../Slider/Themes/SliderTheme.axaml | 2 +- .../Spin/Themes/SpinTheme.axaml | 2 +- .../SplitView/Themes/SplitViewTheme.axaml | 16 +- .../TabControl/TabControlScrollViewer.cs | 2 +- .../TabStrip/TabStripScrollViewer.cs | 2 +- .../TimePicker/RangeTimePicker.cs | 6 +- .../Themes/TimePickerPresenterTheme.axaml | 2 +- .../TimePicker/TimePicker.cs | 6 +- .../TimePicker/TimePickerPresenter.cs | 22 +- .../Tooltip/ToolTip.cs | 22 +- .../Tooltip/ToolTipPseudoClass.cs | 6 + .../Tour/Themes/TourTheme.axaml | 4 +- src/AtomUI.Desktop.Controls/Tour/Tour.cs | 34 +- src/AtomUI.Desktop.Controls/Tour/TourStep.cs | 10 +- .../Tour/TourStepOption.cs | 4 +- .../Tour/TourStepsView.cs | 12 +- .../Transfer/AbstractTransfer.cs | 24 +- .../DefaultList/UploadTextListItemTheme.axaml | 2 +- .../UploadPictureUploadingContentTheme.axaml | 2 +- ...oadPictureShapeUploadingContentTheme.axaml | 2 +- .../Themes/WindowDrawnDecorationsTheme.axaml | 2 +- 144 files changed, 796 insertions(+), 2984 deletions(-) delete mode 100644 docs/ColorPickerPopupRefactoringPlan.md delete mode 100644 docs/DialogWindowOverlayArchitecturePlan.md delete mode 100644 docs/UnusedImportsScanReport.md create mode 100644 src/AtomUI.Desktop.Controls.ColorPicker/ColorPickerPseudoClass.cs create mode 100644 src/AtomUI.Desktop.Controls/Tooltip/ToolTipPseudoClass.cs diff --git a/controlgallery/AtomUIGallery/ShowCases/ProgressBarShowCase.axaml b/controlgallery/AtomUIGallery/ShowCases/ProgressBarShowCase.axaml index 7620206a2..0623908a4 100644 --- a/controlgallery/AtomUIGallery/ShowCases/ProgressBarShowCase.axaml +++ b/controlgallery/AtomUIGallery/ShowCases/ProgressBarShowCase.axaml @@ -25,7 +25,7 @@ - + @@ -47,7 +47,7 @@ - + @@ -65,7 +65,7 @@ Title="Dynamic" Description="A dynamic progress bar is better."> - + Sub diff --git a/controlgallery/AtomUIGallery/ShowCases/Views/DataDisplay/BadgeShowCase.axaml b/controlgallery/AtomUIGallery/ShowCases/Views/DataDisplay/BadgeShowCase.axaml index 9e814b2db..56f387b25 100644 --- a/controlgallery/AtomUIGallery/ShowCases/Views/DataDisplay/BadgeShowCase.axaml +++ b/controlgallery/AtomUIGallery/ShowCases/Views/DataDisplay/BadgeShowCase.axaml @@ -16,7 +16,7 @@ Background="rgb(191,191,191)" CornerRadius="8" /> - + + IsZeroVisible="True" /> diff --git a/controlgallery/AtomUIGallery/ShowCases/Views/DataDisplay/DataGridShowCase.axaml b/controlgallery/AtomUIGallery/ShowCases/Views/DataDisplay/DataGridShowCase.axaml index e75f8d453..7dfe2254b 100644 --- a/controlgallery/AtomUIGallery/ShowCases/Views/DataDisplay/DataGridShowCase.axaml +++ b/controlgallery/AtomUIGallery/ShowCases/Views/DataDisplay/DataGridShowCase.axaml @@ -140,7 +140,7 @@ Binding="{Binding Address}" CanUserSort="True" - FilterMultiple="True" + IsMultipleFilterEnabled="True" SupportedSortDirections="Ascending"> @@ -234,7 +234,7 @@ Binding="{Binding Address}" CanUserSort="True" - FilterMultiple="True" + IsMultipleFilterEnabled="True" SupportedSortDirections="Ascending"> @@ -286,7 +286,7 @@ + IsMultipleFilterEnabled="True"> @@ -304,7 +304,7 @@ Binding="{Binding Address}" CanUserSort="True" - FilterMultiple="True"> + IsMultipleFilterEnabled="True"> @@ -358,7 +358,7 @@ Description="Add border, title and footer for table." IsOccupyEntireRow="True"> Header diff --git a/controlgallery/AtomUIGallery/ShowCases/Views/DataDisplay/EmptyShowCase.axaml b/controlgallery/AtomUIGallery/ShowCases/Views/DataDisplay/EmptyShowCase.axaml index dec084fac..4de73fbf0 100644 --- a/controlgallery/AtomUIGallery/ShowCases/Views/DataDisplay/EmptyShowCase.axaml +++ b/controlgallery/AtomUIGallery/ShowCases/Views/DataDisplay/EmptyShowCase.axaml @@ -38,7 +38,7 @@ - + diff --git a/controlgallery/AtomUIGallery/ShowCases/Views/DataDisplay/InfoFlyoutShowCase.axaml b/controlgallery/AtomUIGallery/ShowCases/Views/DataDisplay/InfoFlyoutShowCase.axaml index ed583e42c..59b4585e4 100644 --- a/controlgallery/AtomUIGallery/ShowCases/Views/DataDisplay/InfoFlyoutShowCase.axaml +++ b/controlgallery/AtomUIGallery/ShowCases/Views/DataDisplay/InfoFlyoutShowCase.axaml @@ -222,7 +222,7 @@ @@ -235,7 +235,7 @@ @@ -248,7 +248,7 @@ @@ -261,7 +261,7 @@ @@ -274,7 +274,7 @@ @@ -287,7 +287,7 @@ @@ -300,7 +300,7 @@ @@ -313,7 +313,7 @@ @@ -326,7 +326,7 @@ @@ -339,7 +339,7 @@ @@ -352,7 +352,7 @@ @@ -365,7 +365,7 @@ diff --git a/controlgallery/AtomUIGallery/ShowCases/Views/DataDisplay/TimelineShowCase.axaml.cs b/controlgallery/AtomUIGallery/ShowCases/Views/DataDisplay/TimelineShowCase.axaml.cs index 8f3976ce9..323a34230 100644 --- a/controlgallery/AtomUIGallery/ShowCases/Views/DataDisplay/TimelineShowCase.axaml.cs +++ b/controlgallery/AtomUIGallery/ShowCases/Views/DataDisplay/TimelineShowCase.axaml.cs @@ -42,15 +42,15 @@ public partial class TimelineShowCase : ReactiveUserControl { if (radioButton == ModeLeft && ModeLeft.IsChecked == true) { - LabelTimeline.Mode = TimeLineMode.Left; + LabelTimeline.Mode = TimelineMode.Left; } else if (radioButton == ModeRight && ModeRight.IsChecked == true) { - LabelTimeline.Mode = TimeLineMode.Right; + LabelTimeline.Mode = TimelineMode.Right; } else if (radioButton == ModeAlternate && ModeAlternate.IsChecked == true) { - LabelTimeline.Mode = TimeLineMode.Alternate; + LabelTimeline.Mode = TimelineMode.Alternate; } } } diff --git a/controlgallery/AtomUIGallery/ShowCases/Views/DataDisplay/TooltipShowCase.axaml b/controlgallery/AtomUIGallery/ShowCases/Views/DataDisplay/TooltipShowCase.axaml index 33a73f328..4d04d4bb8 100644 --- a/controlgallery/AtomUIGallery/ShowCases/Views/DataDisplay/TooltipShowCase.axaml +++ b/controlgallery/AtomUIGallery/ShowCases/Views/DataDisplay/TooltipShowCase.axaml @@ -131,80 +131,80 @@ prompt text LeftEdgeAlignedTop prompt text Left prompt text LeftEdgeAlignedBottom prompt text TopEdgeAlignedLeft prompt text Top prompt text TopEdgeAlignedRight prompt text RightEdgeAlignedTop prompt text Right prompt text RightEdgeAlignedBottom prompt text BottomEdgeAlignedLeft prompt text Bottom prompt text BottomEdgeAlignedRight diff --git a/controlgallery/AtomUIGallery/ShowCases/Views/DataEntry/ColorPickerShowCase.axaml b/controlgallery/AtomUIGallery/ShowCases/Views/DataEntry/ColorPickerShowCase.axaml index 9733f4698..66d158e69 100644 --- a/controlgallery/AtomUIGallery/ShowCases/Views/DataEntry/ColorPickerShowCase.axaml +++ b/controlgallery/AtomUIGallery/ShowCases/Views/DataEntry/ColorPickerShowCase.axaml @@ -18,17 +18,17 @@ - + - + - + @@ -37,7 +37,7 @@ Title="Line Gradient" Description="Set the color to a single or a gradient color via mode."> - + @@ -52,8 +52,8 @@ Title="Rendering Trigger Text" Description="Renders the default text of the trigger, effective when showText is true. When customizing text, you can use showText as a function to return custom text."> - - + + @@ -61,7 +61,7 @@ Title="Disabled" Description="Set to disabled state."> - + - - + + @@ -110,9 +110,9 @@ Title="Color Format" Description="Encoding formats, support HEX, HSB, RGB."> - - - + + + diff --git a/controlgallery/AtomUIGallery/ShowCases/Views/DataEntry/FormShowCase.axaml.cs b/controlgallery/AtomUIGallery/ShowCases/Views/DataEntry/FormShowCase.axaml.cs index 1c9aa09a3..8eba832ec 100644 --- a/controlgallery/AtomUIGallery/ShowCases/Views/DataEntry/FormShowCase.axaml.cs +++ b/controlgallery/AtomUIGallery/ShowCases/Views/DataEntry/FormShowCase.axaml.cs @@ -270,7 +270,7 @@ public class CustomizeGenderFormItem : FormItem public class PriceValidator : AbstractFormValidator { - protected override async Task NotifyValidateAsync(string fieldName, object? value, CancellationToken cancellationToken) + protected override async Task ValidateCoreAsync(string fieldName, object? value, CancellationToken cancellationToken) { var price = value as PriceInfo; return await Task.FromResult(price != null && price.Value > 0); diff --git a/controlgallery/AtomUIGallery/ShowCases/Views/DataEntry/SliderShowCase.axaml b/controlgallery/AtomUIGallery/ShowCases/Views/DataEntry/SliderShowCase.axaml index 3e4ad16e2..2e294615e 100644 --- a/controlgallery/AtomUIGallery/ShowCases/Views/DataEntry/SliderShowCase.axaml +++ b/controlgallery/AtomUIGallery/ShowCases/Views/DataEntry/SliderShowCase.axaml @@ -121,7 +121,7 @@ Maximum="100" Minimum="0" TickFrequency="1" - Included="False" + IsIncluded="False" Value="20" /> diff --git a/controlgallery/AtomUIGallery/ShowCases/Views/Feedback/PopupConfirmShowCase.axaml b/controlgallery/AtomUIGallery/ShowCases/Views/Feedback/PopupConfirmShowCase.axaml index a3ab19fe9..f464cf09e 100644 --- a/controlgallery/AtomUIGallery/ShowCases/Views/Feedback/PopupConfirmShowCase.axaml +++ b/controlgallery/AtomUIGallery/ShowCases/Views/Feedback/PopupConfirmShowCase.axaml @@ -15,7 +15,7 @@ OkText="Ok" CancelText="Cancel" Placement="Top" - IsShowArrow="True"> + IsArrowVisible="True"> Delete diff --git a/controlgallery/AtomUIGallery/ShowCases/Views/Feedback/SpinShowCase.axaml b/controlgallery/AtomUIGallery/ShowCases/Views/Feedback/SpinShowCase.axaml index 840c58afd..b4159359c 100644 --- a/controlgallery/AtomUIGallery/ShowCases/Views/Feedback/SpinShowCase.axaml +++ b/controlgallery/AtomUIGallery/ShowCases/Views/Feedback/SpinShowCase.axaml @@ -45,23 +45,23 @@ diff --git a/controlgallery/AtomUIGallery/ShowCases/Views/Layout/GridShowCase.axaml b/controlgallery/AtomUIGallery/ShowCases/Views/Layout/GridShowCase.axaml index ad671e15e..f53ad470b 100644 --- a/controlgallery/AtomUIGallery/ShowCases/Views/Layout/GridShowCase.axaml +++ b/controlgallery/AtomUIGallery/ShowCases/Views/Layout/GridShowCase.axaml @@ -144,7 +144,7 @@ Vertical - + col-6 diff --git a/controlgallery/AtomUIGallery/ShowCases/Views/Layout/SpaceShowCase.axaml b/controlgallery/AtomUIGallery/ShowCases/Views/Layout/SpaceShowCase.axaml index a0f6d1ac2..eda07f57d 100644 --- a/controlgallery/AtomUIGallery/ShowCases/Views/Layout/SpaceShowCase.axaml +++ b/controlgallery/AtomUIGallery/ShowCases/Views/Layout/SpaceShowCase.axaml @@ -34,7 +34,7 @@ OkText="Ok" CancelText="Cancel" Placement="Top" - IsShowArrow="True"> + IsArrowVisible="True"> Confirm diff --git a/controlgallery/AtomUIGallery/ShowCases/Views/Navigation/DropdownButtonShowCase.axaml b/controlgallery/AtomUIGallery/ShowCases/Views/Navigation/DropdownButtonShowCase.axaml index 1ac0e4350..b14b8d7fe 100644 --- a/controlgallery/AtomUIGallery/ShowCases/Views/Navigation/DropdownButtonShowCase.axaml +++ b/controlgallery/AtomUIGallery/ShowCases/Views/Navigation/DropdownButtonShowCase.axaml @@ -106,7 +106,7 @@ - BottomLeft @@ -121,7 +121,7 @@ - Bottom @@ -136,7 +136,7 @@ - BottomRight @@ -151,7 +151,7 @@ - TopLeft @@ -166,7 +166,7 @@ - Top @@ -181,7 +181,7 @@ - TopRight diff --git a/docs/ColorPickerPopupRefactoringPlan.md b/docs/ColorPickerPopupRefactoringPlan.md deleted file mode 100644 index 61bf60005..000000000 --- a/docs/ColorPickerPopupRefactoringPlan.md +++ /dev/null @@ -1,242 +0,0 @@ -# ColorPicker Popup 重构方案:TriggerType 与箭头管理 - -## 背景 - -ColorPicker 已完成从 Flyout 到直接 Popup 的基本迁移(删除了 `AbstractColorPickerFlyout`、`ColorPickerFlyout`、`GradientColorPickerFlyout`),但 TriggerType 的实现和箭头管理做得不好: - -- TriggerType 当前通过简单的 `OnClick`/`OnPointerEntered`/`OnPointerExited` 重写实现,缺少延迟定时器、全局指针追踪、焦点范围检测 -- 箭头缺少 `IsShowArrowEffective`、`ArrowPosition`、翻转追踪等关键逻辑 -- `IsLightDismissEnabled` 硬编码为 `True`,应根据 TriggerType 动态设置 - -## 参考实现 - -- `FlyoutStateHelper.cs` — TriggerType 的完整实现模式(定时器 + InputManager + 范围检测) -- `Flyout.cs` — 箭头管理模式(IsShowArrowEffective / ArrowPosition / flip tracking) -- `PopupUtils.cs` — 箭头计算工具方法 - -## 重构内容 - -### 1. TriggerType 重写 - -**当前问题**: -- Hover 模式没有 `MouseEnterDelay`/`MouseLeaveDelay` 定时器 -- Hover 模式没有通过 `InputManager.Process` 订阅全局指针移动来检测指针是否在 Popup 内 -- Focus 模式没有根级 PointerPressed 处理(点击外部关闭) -- Focus 模式没有焦点范围检测(`IsFocusWithinFlyoutScope`) -- Click 模式没有正确设置 `IsLightDismissEnabled` - -**方案**:在 `AbstractColorPicker` 中内联 `FlyoutStateHelper` 的核心逻辑: - -```csharp -// 新增属性 -public static readonly StyledProperty MouseEnterDelayProperty = - AvaloniaProperty.Register(nameof(MouseEnterDelay), 200); - -public static readonly StyledProperty MouseLeaveDelayProperty = - AvaloniaProperty.Register(nameof(MouseLeaveDelay), 200); - -// 新增字段 -private DispatcherTimer? _mouseEnterDelayTimer; -private DispatcherTimer? _mouseLeaveDelayTimer; -private IDisposable? _popupPointerSubscription; -private TopLevel? _registeredTopLevel; -private bool _isPickerShowing; -``` - -**Hover 模式实现要点**: -1. 监听 `IsPointerOverProperty` 变化(通过 `GetObservable`) -2. 指针进入 → 启动 `_mouseEnterDelayTimer`,到期后打开 Popup -3. 指针离开 anchor → 检查 Popup 内是否有指针,没有则启动 `_mouseLeaveDelayTimer` -4. Popup 打开后 → 通过 `InputManager.Process` 订阅全局指针移动事件 -5. 全局指针移动 → hit test 判断是否在 flyout scope 内(anchor 或 popup child) -6. 离开 scope → 启动关闭定时器;回到 scope → 取消关闭定时器 - -**Click 模式实现要点**: -1. 设置 `IsLightDismissEnabled = true`(仅 Click 模式需要) -2. 通过 `AddHandler(PointerPressedEvent, ..., handledEventsToo: true)` 处理点击 -3. 点击时 toggle `IsPickerOpen` - -**Focus 模式实现要点**: -1. 监听 `GotFocus` → 打开 Popup -2. 监听 `LostFocus` → `Dispatcher.Post` 延迟检查焦点是否仍在 flyout scope 内 -3. Popup 打开后 → 注册根级 `PointerPressedEvent`(Tunnel 路由) -4. 根级点击 → 判断点击目标是否在 flyout scope 内,不在则关闭 -5. Flyout scope = anchor 及其子元素 + popup child 及其逻辑子元素 - -**Scope 检测方法**: -```csharp -private bool IsVisualInPickerScope(Visual visual) -{ - // 在 anchor 内 - if (visual == this || this.IsVisualAncestorOf(visual)) - return true; - // 在 popup 内 - if (_popup is { Child: Visual popupChild } && - (visual == popupChild || popupChild.IsLogicalAncestorOf(visual))) - return true; - return false; -} -``` - -**生命周期管理**: -- `OnAttachedToVisualTree` → `SetupTriggerHandler()` -- `OnDetachedFromVisualTree` → 停止所有定时器、取消订阅、清理 -- `TriggerTypeProperty` 变化 → 重新 `SetupTriggerHandler()` - -**删除当前的**: -- `OnClick()` 重写中的 TriggerType 逻辑 -- `OnPointerEntered()` / `OnPointerExited()` 重写 -- `_isPointerInPopup` 字段 -- `HandlePopupPointerEntered` / `HandlePopupPointerExited` -- `ClosePickerWithDelayIfNeeded()` -- `HandleGotFocus` / `HandleLostFocus` 中的简单实现 - -### 2. 箭头管理重写 - -**当前问题**: -- 没有 `IsShowArrowEffective` 计算(某些 Placement 不支持箭头) -- 没有 `ArrowPosition` 属性(箭头方向) -- 没有翻转追踪(Popup 被翻转时箭头方向需要跟着翻转) -- Theme 模板中 `ArrowDecoratedBox` 没有绑定 `ArrowPosition` 和 `IsShowArrow` - -**方案**:参照 `Flyout.cs` 的模式: - -```csharp -// 新增内部属性 -internal static readonly DirectProperty IsShowArrowEffectiveProperty = ...; -internal static readonly DirectProperty IsPopupHorizontalFlippedProperty = ...; -internal static readonly DirectProperty IsPopupVerticalFlippedProperty = ...; -internal static readonly StyledProperty ArrowPositionProperty = - ArrowDecoratedBox.ArrowPositionProperty.AddOwner(); -``` - -**箭头计算逻辑**: -```csharp -private void ConfigureShowArrowEffective() -{ - if (!IsShowArrow) - { - IsShowArrowEffective = false; - } - else - { - var placement = Placement; - IsShowArrowEffective = PopupUtils.CanEnabledArrow(placement, PlacementAnchor, PlacementGravity); - } -} - -private void ConfigureArrowPosition() -{ - var placement = Placement; - var arrowPosition = PopupUtils.CalculateArrowPosition(placement, PlacementAnchor, PlacementGravity); - if (arrowPosition.HasValue) - { - arrowPosition = ArrowPositionUtils.FlipArrowPosition( - arrowPosition.Value, IsPopupHorizontalFlipped, IsPopupVerticalFlipped); - SetCurrentValue(ArrowPositionProperty, arrowPosition); - } -} -``` - -**触发时机**: -- `IsShowArrowProperty` / `PlacementProperty` / `PlacementGravityProperty` 变化 → `ConfigureShowArrowEffective()` -- `PlacementProperty` / `IsPopupHorizontalFlippedProperty` / `IsPopupVerticalFlippedProperty` 变化 → `ConfigureArrowPosition()` - -**Popup 翻转绑定**(在 `OnApplyTemplate` 中): -```csharp -this[!IsPopupHorizontalFlippedProperty] = _popup[!PopupControl.IsHorizontalFlippedProperty]; -this[!IsPopupVerticalFlippedProperty] = _popup[!PopupControl.IsVerticalFlippedProperty]; -``` - -### 3. Theme 模板修复 - -**ColorPickerTheme.axaml / GradientColorPickerTheme.axaml**: - -```xml - - - -``` - -**关键变化**: -- `IsLightDismissEnabled` → TemplateBinding(动态,由 TriggerType 决定) -- `ShouldUseOverlayLayer` → TemplateBinding(新增公共属性) -- 新增 `PlacementGravity`、`IsPointAtCenter` 绑定 -- `ArrowDecoratedBox` 新增 `IsShowArrow` 和 `ArrowPosition` 绑定 - -### 4. 新增公共属性 - -```csharp -public static readonly StyledProperty ShouldUseOverlayPopupProperty = - AvaloniaProperty.Register(nameof(ShouldUseOverlayPopup), true); - -public static readonly StyledProperty IsLightDismissEnabledProperty = - AvaloniaProperty.Register(nameof(IsLightDismissEnabled), true); - -public static readonly StyledProperty PlacementAnchorProperty = - Popup.PlacementAnchorProperty.AddOwner(); -``` - -`IsLightDismissEnabled` 在 `SetupTriggerHandler()` 中根据 TriggerType 自动设置: -```csharp -SetCurrentValue(IsLightDismissEnabledProperty, TriggerType == FlyoutTriggerType.Click); -``` - -### 5. 命名清理 - -| 旧名称 | 新名称 | 说明 | -|--------|--------|------| -| `NotifyFlyoutOpened()` | `NotifyPickerOpened()` | 子类重写点 | -| `NotifyFlyoutClosed()` | `NotifyPickerClosed()` | 子类重写点 | -| `ClosePickerFlyout()` | `ClosePicker()` | 公共 API | -| `UpdatePseudoClasses` 中 `:flyout-open` | 保持不变 | 兼容现有样式 | - -### 6. Popup Overlay 配置 - -Hover 模式下需要特殊配置以避免 Popup overlay 拦截指针事件: -```csharp -if (_popup != null) -{ - _popup.OverlayInputPassThroughElement = this; - _popup.OverlayDismissEventPassThrough = true; -} -``` - -这确保: -- 指针事件能穿透 overlay 到达 anchor(不会因为 overlay 导致 PointerExited) -- overlay 的 dismiss 事件不会直接关闭 Popup(由我们的逻辑控制关闭时机) - -## 实现步骤 - -1. 在 `AbstractColorPicker` 中添加新属性(MouseEnterDelay、MouseLeaveDelay、箭头相关、ShouldUseOverlayPopup、IsLightDismissEnabled) -2. 删除当前的 TriggerType 简单实现(OnClick/OnPointerEntered/OnPointerExited 等) -3. 实现 `SetupTriggerHandler()` + 三种模式的完整逻辑 -4. 实现箭头管理(ConfigureShowArrowEffective / ConfigureArrowPosition) -5. 更新 `OnApplyTemplate` 中的 Popup 绑定(翻转追踪、overlay 配置) -6. 更新两个 Theme AXAML 模板 -7. 重命名 `NotifyFlyoutOpened`/`NotifyFlyoutClosed` → `NotifyPickerOpened`/`NotifyPickerClosed` -8. 更新 `ColorPicker.cs` 和 `GradientColorPicker.cs` 中的重写方法名 -9. 构建验证 - -## 验证清单 - -- [ ] Click 模式:点击打开/关闭,点击外部关闭(light dismiss) -- [ ] Hover 模式:延迟打开,指针移到 Popup 内不关闭,离开后延迟关闭 -- [ ] Focus 模式:获得焦点打开,失去焦点关闭,点击外部关闭 -- [ ] 箭头:正确显示/隐藏,方向正确,翻转后方向跟随 -- [ ] IsPointAtCenter:箭头指向 anchor 中心 -- [ ] 窗口失活时关闭 -- [ ] Disabled 状态不响应触发 -- [ ] GradientColorPicker 同样正常工作 diff --git a/docs/DialogWindowOverlayArchitecturePlan.md b/docs/DialogWindowOverlayArchitecturePlan.md deleted file mode 100644 index 1d54be6e1..000000000 --- a/docs/DialogWindowOverlayArchitecturePlan.md +++ /dev/null @@ -1,820 +0,0 @@ -# Dialog Window/Overlay implementation plan for release/6.0 - -## 背景与目标 - -`release/5.0` 的 `Dialog` 是一套完整的弹窗系统:外部通过 `Dialog`、`DialogOptions`、`ShowDialog*` 静态 API、`IDialog`、`IDialogHostProvider` 等接口使用;内部根据 `DialogHostType` 分为 `Window Dialog` 与 `Overlay Dialog` 两种承载方式。 - -`release/6.0` 已引入新的 `Window` 架构与新的 `Popup`/Overlay 架构: - -- `Window` 模板内使用 `VisualLayerManager`、`FullscreenPopoverLayer`、新的标题栏和新的 resizer。 -- `Popup` 移除了旧的 `PopupBuddyLayer`/`OverlayPopupContent`,改为 Avalonia 12 的 PopupHost/OverlayPopupHost 路线,并通过 `PopupMotionActor`、`ShadowsAwareContainer`、`ShouldUseOverlayLayer` 统一动画与阴影。 - -本计划的目标是基于 `release/6.0` 的新架构重新完成: - -1. `Window Dialog` -2. `Overlay Dialog` - -同时保持 `release/5.0` 的外部接口、交互语义和 UI 效果不变。 - -重要原则:以 `release/5.0` 的对外 API、行为语义和 UI 效果为基线,在 `release/6.0` 新 `Window` 和新 `Popup` 架构上重新实现 Dialog。 - -## 必须保持不变的对外行为 - -### Public API - -需要保持或恢复以下 API: - -- `Dialog` -- `DialogOptions` -- `DialogHostType` -- `DialogPlacement` 中的 `DialogHorizontalAnchor`、`DialogVerticalAnchor` -- `DialogStandardButton` / `DialogStandardButtons` -- `DialogButton` -- `DialogButtonRole` -- `IDialog` -- `IDialogActionResult` -- `IDialogAwareDataContext` -- `IDialogHost` -- `IDialogHostProvider` -- `Dialog.ShowDialog*` -- `Dialog.ShowDialogModal*` -- `Dialog.ShowDialogAsync*` -- `Dialog.ShowDialogModalAsync*` - -为了“接口不变”,需要提供这些静态 API。内部实现不再依赖 `GlobalDialogManager`:Window 类型基于新 `Window`,Overlay 类型基于新 `Popup` 自己的 OverlayLayer。 - -### 行为语义 - -以下行为需要与 `release/5.0` 保持一致: - -- `DialogHostType.Window` 使用独立窗口承载。 -- `DialogHostType.Overlay` 在当前 `TopLevel` 的 overlay 层内承载。 -- `IsModal=true` 时,异步打开应等待 Dialog 关闭后完成。 -- `IsModal=false` 时,异步打开应在 Host 显示后完成,关闭结果通过回调或事件获取。 -- `Open()` 仍通过局部 Dispatcher frame 实现同步等待。 -- `Accept()` 设置 `Result = DialogCode.Accepted` 并触发关闭。 -- `Reject()` 设置 `Result = DialogCode.Rejected` 并触发关闭。 -- `Done(object? result)` 设置结果并关闭。 -- `Closing` 可取消关闭。 -- `IsConfirmLoading=true` 时禁止确认关闭,并同步到确认类按钮 loading 状态。 -- `IDialogAwareDataContext.NotifyAttachedToDialog/NotifyDetachedFromDialog/NotifyClosed` 生命周期保持。 -- `CustomButtons` 打开前后动态增删保持同步。 -- `ButtonsConfigure` 在按钮同步后仍可配置按钮。 -- light dismiss、遮罩事件穿透、父窗口关闭时关闭 Dialog 的语义保持。 - -### UI 效果 - -需要保持 Ant Design 5.0 Dialog 视觉效果: - -- header/content/footer padding、间距、字体、背景和阴影继续由 `DialogToken` 控制。 -- Overlay Dialog 保持圆角、阴影、modal mask、标题栏、关闭按钮、最大化按钮、resize handle、拖拽移动。 -- Window Dialog 保持与 AtomUI Window 一致的新标题栏、系统平台适配和窗口阴影,同时保留 Dialog footer/button box。 -- `DialogButtonBox` 的按钮布局、本地化文本、默认按钮、Esc 按钮、确认按钮 loading 不变。 - -## 架构取舍 - -实现时需要遵循以下取舍: - -- 可从 5.0 拿回 API、按钮系统、Token、Localization 和视觉模板结构。 -- 不直接拿回 5.0 的旧 `GlobalDialogManager`、旧 `DialogLayer`、旧 `ManagedDialogPositioner` 作为最终架构。 -- 以 6.0 的 `Window` 和新 `Popup`/OverlayPopupHost 作为底座。 -- Window Dialog 不复制或修改 Window 的复杂 ControlTheme,直接使用新 `Window` 的原生模板能力,通过设置 Window `Content` / `ContentTemplate` 承载 Dialog 自己的内容包装控件。 - -因此实现重点是将 5.0 的 API 和视觉行为重新映射到 6.0 的 Window/Popup 架构。 - -## 总体架构 - -### 组件关系 - -```text -Dialog -├── public API / lifecycle / events / result -├── static ShowDialog* APIs -├── DialogOpenState -├── Relay bindings to host -│ -├── Window Dialog -│ └── DialogHost : AtomUI.Desktop.Controls.Window -│ ├── uses release/6.0 Window chrome/titlebar/resizer -│ ├── owns DialogButtonBox footer -│ └── relays close/minimize/maximize/footer/loading/buttons -│ -└── Overlay Dialog - └── OverlayDialogHost : ContentControl - ├── hosted as Popup content - ├── Popup.ShouldUseOverlayLayer = true - ├── optional OverlayDialogMask - ├── OverlayDialogHeader - ├── DialogButtonBox footer - ├── OverlayDialogResizer - └── drag/maximize/restore/z-index/motion -``` - -### Host 创建策略 - -`Dialog.OpenAsync` 根据 `DialogHostType` 分发: - -```text -DialogHostType.Window - TopLevel parent = TopLevel.GetTopLevel(PlacementTarget) - DialogHost host = CreateDialogHost(parent, this) - host.SetChild(ContentControl) - relay Dialog properties - host.Show() or ShowDialog-like modal loop - -DialogHostType.Overlay - Popup popup = CreateOverlayPopup(PlacementTarget or topLevel) - popup.ShouldUseOverlayLayer = true - OverlayDialogHost host = CreateOverlayDialogHost(popup, this) - host is assigned as popup child/content - relay Dialog properties - popup.IsOpen = true -``` - -`Dialog` 自身继续不参与 measure/arrange,仍作为逻辑控制器存在。 - -## Window Dialog 设计 - -### 承载类 - -保留: - -```csharp -internal class DialogHost : Window, IDialogHost, IStyleHost, IMotionAwareControl -``` - -但需要明确它是基于 `release/6.0` 新 `Window` 的 Dialog 特化,而不是 5.0 旧 Window 模板副本。 - -### Window 属性同步 - -`Dialog` 打开 Window Host 时需要同步: - -- `Title` -- `TitleIcon` 到 Window 的 `Icon`/`Logo` 或 DialogHost 自定义 title content -- `Content` -- `ContentTemplate` -- `Width` -- `Height` -- `MinWidth` -- `MinHeight` -- `MaxWidth` -- `MaxHeight` -- `Topmost` -- `IsResizable` -- `IsClosable` -- `IsMaximizable` -- `IsMinimizable` -- `IsModal` -- `IsMotionEnabled` -- `IsLoading` -- `IsConfirmLoading` -- `StandardButtons` -- `DefaultStandardButton` -- `EscapeStandardButton` -- `IsFooterVisible` - -`IsModal=true` 时: - -- `EffectiveMinimizable=false` -- Window host 不显示 minimize caption button -- 关闭通过 Dialog `Closing` 事件统一拦截 - -### Window Content 包装策略 - -Window 的 ControlTheme 处理跨平台 CSD、标题栏、阴影、resizer、`VisualLayerManager`、`FullscreenPopoverLayer` 等复杂逻辑。Window Dialog 不应复制、覆盖或修改 Window 的 ControlTheme。 - -首选方案:`DialogHost` 继续继承 release/6.0 的 `Window`,并直接使用 Window 原有 `ControlTheme`。Dialog 专属 UI 通过设置 Window 的 `Content` 和 `ContentTemplate` 实现。 - -建议新增内部内容包装控件,例如: - -```text -DialogWindowContent -├── Skeleton loading wrapper -├── user content presenter -└── DialogButtonBox footer -``` - -`DialogHost.SetChild(Control? control)` 不应直接把用户内容设置给 Window `Content`,而应: - -1. 保存用户内容和 `ContentTemplate`。 -2. 创建/更新 `DialogWindowContent`。 -3. 将 `DialogWindowContent` 设置为 Window `Content`。 -4. 由 `DialogWindowContent` 内部承载用户内容、loading skeleton、footer 和 button box。 - -包装控件可以是内部 `TemplatedControl` 或轻量 `ContentControl`: - -- 若需要 token style 和 template selector,使用 `TemplatedControl`。 -- 若实现足够简单,可使用 `ContentControl` + 专用 `ControlTheme`。 - -包装控件需要暴露或接收: - -- `DialogContent` -- `DialogContentTemplate` -- `IsLoading` -- `IsConfirmLoading` -- `IsFooterVisible` -- `IsEffectiveFooterVisible` -- `StandardButtons` -- `DefaultStandardButton` -- `EscapeStandardButton` -- `CustomButtons` -- `IsMotionEnabled` - -它的模板只负责 Dialog 内容区: - -```xml - - - - - - - - -``` - -这样 Window Dialog 可以完整复用新 Window 的 ControlTheme,并把 Dialog 的 header/footer/content 逻辑限制在 Window content 区域内,避免后续 Window 模板变化导致 DialogHost 模板同步成本。 - -`DialogHostTheme.axaml` 应尽量保持很薄: - -- 只 `BasedOn` 新 `WindowTheme`。 -- 设置 DialogHost 默认属性,例如 `SizeToContent`、`Padding`、caption button 可见性。 -- 不定义完整 `ControlTemplate`。 -- 不选择 Window 内部复杂 template part,除非该 part 是稳定公开常量。 - -### Dialog 定位抽象 - -不要使用 `release/5.0` 的 `ManagedDialogPositioner`。它为旧 Popup/DialogLayer 场景处理了大量 anchor、gravity、screen constraint、flip 等复杂逻辑,但 Dialog 当前只需要 Ant Design Dialog 的启动位置和 offset 语义。Window 类型已经可以直接设置窗口位置;Popup 类型固定使用 Dialog 自己的 `CustomPopupPlacementCallback`,不考虑通用 `Placement`,因为 Dialog 的 Overlay 场景里 placement 没有实际意义。 - -建议抽象一个轻量定位接口,统一 Window Dialog 和 Overlay Dialog 的定位输入,但分别适配不同宿主: - -```csharp -internal interface IDialogPlacementController -{ - void Attach(Dialog dialog, IDialogHost host, TopLevel topLevel, Control placementTarget); - void Detach(); - void UpdatePlacement(); - void NotifyHostMeasured(Size hostSize, Rect ownerBounds); -} -``` - -或使用更小的计算型接口: - -```csharp -internal interface IDialogPlacementCalculator -{ - Point Calculate(Dialog dialog, Size hostSize, Size ownerSize); -} -``` - -推荐组合: - -- `DialogPlacementCalculator`:只负责根据 `HorizontalStartupLocation`、`VerticalStartupLocation`、`HorizontalOffset`、`VerticalOffset` 计算 logical offset。 -- `WindowDialogPlacementController`:把 logical offset 转成 screen/device position,并设置 `DialogHost.Position`。 -- `PopupDialogPlacementController`:维护 Dialog offset,并安装 Dialog 专用 `CustomPopupPlacementCallback`;callback 根据当前 offset 返回固定 top-left placement。 - -这样定位策略只写一份,宿主适配逻辑分开,避免把 Window 和 Popup 坐标系混在一起。 - -### Window Dialog 定位 - -Window Dialog 直接设置 Window 位置,不使用 `ManagedDialogPositioner`: - -- startup location 只负责初始位置。 -- `HorizontalStartupLocation` / `VerticalStartupLocation` 计算 `OffsetX` / `OffsetY`。 -- Window host 测量完成后调用 `NotifyDialogHostMeasured(Size, Rect)`。 -- `Rect` 来源: - - 优先使用 owner 所在 screen working area。 - - 无 owner screen 时使用 primary screen working area。 -- 计算完成后设置 `DialogHost.Position`。 - -`WindowDialogPlacementController.UpdatePlacement()`: - -```text -Window host: - logical point = owner screen top-left + OffsetX/Y - device point = logical point * DesktopScaling - host.Position = device point -``` - -Window 类型不需要 placement callback,也不需要复杂避让逻辑。后续如果要支持 owner window 移动时跟随,只在 `WindowDialogPlacementController` 中订阅 owner position/size 变化即可。 - -### Window Dialog 关闭 - -`DialogHost.OnClosing` 必须拦截用户关闭: - -- 非程序关闭或 caption close button 关闭时取消 `WindowClosingEventArgs`。 -- 转发到 `Dialog.NotifyDialogHostCloseRequest()`。 -- 由 `Dialog.NotifyClose()` 统一触发 `Closing`、`Accepted`、`Rejected`、`Finished`、`Closed`。 - -程序关闭时由 `DialogOpenState.Dispose()` 调用 `host.Close(callback)`。 - -## Overlay Dialog 设计 - -### Popup OverlayLayer 承载策略 - -Overlay Dialog 应直接使用 `Popup` 自己的 OverlayLayer,不引入 `ScopeAwareOverlayLayer`。 - -```text -Dialog -└── Popup - ├── ShouldUseOverlayLayer = true - ├── PlacementTarget = Dialog.PlacementTarget or TopLevel root/content - ├── CustomPopupPlacementCallback = Dialog-specific callback - └── Child/Content = OverlayDialogHost -``` - -这样 Overlay Dialog 的层级、PopupHost、OverlayPopupHost、motion/shadow 基础设施都由新 Popup 架构负责。 - -`Dialog` 不应直接查找或注入 overlay layer。它只创建和配置 `Popup`,由 `Popup` 内部决定使用 OverlayPopupHost 还是 PopupRoot。 - -### Overlay Host 结构 - -承载类: - -```csharp -internal class OverlayDialogHost : ContentControl, IDialogHost, IMotionAwareControl -``` - -内部职责: - -- 作为 `Popup` 的内容控件存在。 -- 通过持有 owner `Popup` 或由 `DialogOpenState` 管理 popup open/close。 -- 管理 `OverlayDialogMask` -- 管理 `OverlayDialogHeader` -- 管理 `DialogButtonBox` -- 管理 `OverlayDialogResizer` -- 管理拖拽、最大化、还原 -- 管理 z-index -- 管理打开/关闭动画 -- 管理 footer 自动显隐 - -### Overlay mask - -`IsModal=true`: - -- 在 `OverlayDialogHost` 内显示 mask。 -- Popup 内容容器应按 owner `TopLevel.ClientSize` 或 placement target root bounds 拉满,使 mask 覆盖当前 Popup OverlayLayer 可视区域。 -- mask 拦截 pointer wheel 和 pointer press。 -- `IsLightDismissEnabled=true` 时点击 mask 触发 `Dialog.NotifyClose()`。 - -`IsModal=false`: - -- 不显示阻塞 mask。 -- host 自身保留阴影。 -- 点击外部不关闭,除非显式配置 light dismiss。 - -### Overlay 事件穿透 - -保持 5.0 的语义: - -- `OverlayDismissEventPassThrough=true` 时,mask 点击关闭后将 pointer event 转发给 `OverlayInputPassThroughElement` 或原始命中元素。 -- 如果 release/6.0/Avalonia 12 的 raw input API 不再允许旧方式直接复用,需要实现局部兼容层,不改变公开属性。 - -### Overlay 定位与尺寸 - -Overlay Dialog 不使用旧 `ManagedDialogPositioner`。使用 Popup owner 的可用尺寸: - -- `TopLevel.ClientSize` -- 或 `PlacementTarget` 所在 visual root/client bounds -- 作为 `NotifyDialogHostMeasured` 的 bounds - -通用 `DialogPlacementCalculator` 定位规则: - -- `HorizontalStartupLocation.Left` -> `OffsetX=0` -- `HorizontalStartupLocation.Center` -> `(ownerWidth - hostWidth) / 2` -- `HorizontalStartupLocation.Right` -> `ownerWidth - hostWidth` -- `HorizontalStartupLocation.Custom` -> `HorizontalOffset.Resolve(ownerWidth)` -- vertical 同理 - -拖拽时: - -- 更新 `OffsetX` / `OffsetY`,由 `OverlayDialogHost` 在自己的 full-overlay panel 内重新 arrange frame。 -- 不回写 `HorizontalStartupLocation` / `VerticalStartupLocation`。 - -Popup Dialog 固定使用自己的 `CustomPopupPlacementCallback`: - -- 不使用 Popup 的普通 `Placement` 语义。 -- 要考虑 Dialog offset:接口实现负责设置/更新 offset。 -- callback 只处理 Dialog 的 top-left 位置。 -- callback 根据当前 offset 定位 Dialog。 -- callback 不实现 5.0 `ManagedDialogPositioner` 那种复杂 flip/constraint 算法。 - -```text -PopupDialogPlacementController.UpdatePlacement() - offset = DialogPlacementCalculator.Calculate(...) - popup.InvalidatePosition() - -DialogCustomPopupPlacementCallback(ownerSize, hostSize, current offset) - returns top-left custom placement from offset -``` - -最大化时: - -- 保存 `_originPosition` 和 `_latestSize`。 -- `WindowState=Maximized` 后 dialog frame 填满 popup owner 可视区域。 -- `CornerRadius=0`。 -- resizer 隐藏。 - -还原时: - -- 恢复最大化前位置和尺寸。 - -### Overlay 与新 Popup 架构的关系 - -Overlay Dialog 不应复活旧 `PopupBuddyLayer` 或旧 `DialogLayer`。 - -Overlay Dialog 直接使用新 Popup 架构: - -- `Popup.ShouldUseOverlayLayer=true` -- `Popup.PlacementTarget = Dialog.PlacementTarget ?? topLevel/root` -- `Popup` 负责 OverlayLayer/OverlayPopupHost 生命周期。 -- `OverlayDialogHost` 负责 Dialog mask、frame、drag、resize、maximize/restore。 -- `PopupMotionActor`/`MotionActor` 的动画调度模式可以复用,但 Dialog 当前也可继续使用 host transitions,前提是视觉不变。 -- `ShadowsAwareContainer` 的阴影测量思路可以参考,但 Dialog 当前可继续通过 `ShadowFrame` + token shadow 实现,避免影响 UI。 - -Popup 配置必须满足: - -- `Popup.ShouldUseOverlayLayer=true` -- `Popup.IsLightDismissEnabled=false`,light dismiss 由 Dialog mask 统一处理。 -- `Popup.StaysOpen=true` 或等价设置,避免 Popup 自己绕过 Dialog 生命周期关闭。 -- `Popup` close/cancel 事件必须转发到 `Dialog.NotifyClose()`,不能直接销毁。 -- Popup content 的 root 尺寸应覆盖 owner 可视区域,以支持 modal mask。 -- Popup 定位固定通过 Dialog 专用 `CustomPopupPlacementCallback` 实现:controller 设置 offset,callback 根据 offset 定位;不使用通用 `Placement`,不使用 `ManagedDialogPositioner`。 - -## Dialog.OpenAsync 实现计划 - -### 打开流程 - -`OpenAsync` 应补齐为: - -```text -if already open/opening -> return -resolve placementTarget -resolve topLevel -create host by DialogHostType -set child/content -relay properties and token bindings -subscribe parent closed/detached/raw input if needed -create DialogOpenState -set IsOpen=true under ignore scope -host.Show() -raise Opened -if IsModal: - await close task -else: - return after show -``` - -需要内部增加 close completion: - -```csharp -TaskCompletionSource _closeTcs -``` - -或放入 `DialogOpenState`。 - -### 关闭流程 - -`NotifyClose` 应: - -1. 检查 `IsConfirmLoading` 和 `_closing`。 -2. 触发 `Closing`,允许取消。 -3. 根据 `Result` 触发 `Accepted` / `Rejected`。 -4. 触发 `Finished`。 -5. dispose open state: - - 从 overlay layer 移除 mask 和 host,播放关闭动画。 - - 或关闭 Window host。 - - 解除所有 bindings/subscriptions。 -6. 设置 `IsOpen=false`。 -7. 触发 `Closed`。 -8. 通知 `IDialogAwareDataContext.NotifyClosed()`。 -9. 完成 modal await 的 task。 - -### 属性 relay - -`Dialog` 到 host 使用 `BindUtils.RelayBind`,避免手动同步遗漏。 - -Window Host 和 Overlay Host 共同 relay: - -- title/icon -- content/template -- size -- modal -- resizable -- closable -- maximizable -- minimizable/effective minimizable -- drag movable -- motion -- loading -- confirm loading -- footer visible -- standard buttons -- default/escape button -- topmost - -Overlay-only: - -- light dismiss -- overlay event pass-through -- overlay input pass-through element -- offset x/y - -Window-only: - -- Window titlebar caption button visibility -- owner/parent relation -- startup position - -## Static API 恢复计划 - -恢复 `Dialog.StaticAPI.cs`,但内部实现改为: - -```text -FindDialogPlacementRoot(topLevel) - topLevel ?? Window.GetMainWindow() - throw if null - -CreateDialog(content, dataContext, options) - same mapping as release/5.0 - -ShowDialog(...) - dialog.PlacementTarget = options.PlacementTarget ?? topLevel/root content - return dialog.Open() - -ShowDialogAsync(...) - attach Closed callback - await dialog.OpenAsync(...) -``` - -不再要求 `GlobalDialogManager` 存在。 - -兼容点: - -- 如果用户传入 AtomUI `Window` 或普通 Avalonia `TopLevel`,Overlay Dialog 都通过 `Popup` 自己解析 OverlayLayer。 -- 如果 Popup 无法在当前 TopLevel 创建 overlay host,应抛出明确异常。 - -## 文件级实施清单 - -### 建议的实现策略 - -以 `release/5.0` 为行为基线,在 `release/6.0` 上实现: - -1. 备份/对照 `release/5.0:src/AtomUI.Desktop.Controls/Dialog` 作为行为基线。 -2. 保留可直接复用且无架构冲突的文件: - - `DialogToken.cs` - - `Localization/en_US.cs` - - `Localization/zh_CN.cs` - - `ButtonBox/*`,但需要按 6.0 Button/Theme API 验证 - - `DialogActionResult.cs` - - `DialogFinishedEventArgs.cs` - - `DialogManagerEventArgs.cs` - - `DialogHostType.cs` - - `DialogPlacement.cs` - - `IDialog*.cs` -3. 实现以下核心文件: - - `Dialog.cs` - - `Dialog.StaticAPI.cs` - - `WindowHost/DialogHost.cs` - - `OverlayHost/OverlayDialogHost.cs` - - `OverlayHost/OverlayDialogMask.cs` - - `Themes/DialogHostTheme.axaml` - - `Themes/OverlayDialogHostTheme.axaml` -4. 不恢复旧架构文件: - - `GlobalDialogManager.cs` - - `DialogPositioning/ManagedDialogPositioner.cs` - - `DialogPositioning/IDialogPositioner.cs` - - 旧 `DialogLayer` 相关实现 -5. 新增轻量定位抽象: - - `DialogPositioning/IDialogPlacementCalculator.cs` - - `DialogPositioning/DialogPlacementCalculator.cs` - - `DialogPositioning/WindowDialogPlacementController.cs` - - `DialogPositioning/PopupDialogPlacementController.cs` - - `DialogPositioning/DialogCustomPopupPlacementCallback.cs` - -### Dialog 主流程 - -- `src/AtomUI.Desktop.Controls/Dialog/Dialog.cs` - - 以 5.0 `Dialog` public surface 为基线重写。 - - 实现 Host 创建方法:`CreateDialogHost`、`CreateOverlayDialogHost`。 - - 实现 `Open()`、`OpenAsync()`、`NotifyClose()`、modal/non-modal close completion。 - - 实现 `UpdateHostSizing`,定位委托给轻量 `IDialogPlacementController`。 - - 实现 `Closed` 与 data context closed notification。 - -- `src/AtomUI.Desktop.Controls/Dialog/DialogPositioning/*` - - 不恢复 5.0 复杂 positioner。 - - 新增轻量 `DialogPlacementCalculator` 计算 logical offset。 - - 新增 Window/Popup 两个 controller,分别设置 Window position 和 Dialog 专用 Popup placement callback。 - -- `src/AtomUI.Desktop.Controls/Dialog/Dialog.StaticAPI.cs` - - 从 release/5.0 恢复静态 API 签名。 - - 改用 release/6.0 overlay/window root 解析。 - -- `src/AtomUI.Desktop.Controls/Dialog/IDialogHost.cs` - - 保持 public surface 不破坏。 - - 如果必须新增内部方法,优先通过 internal extension 或具体 host 类型实现,避免破坏接口。 - -### Window Dialog - -- `src/AtomUI.Desktop.Controls/Dialog/WindowHost/DialogHost.cs` - - 对齐新 `Window` 标题栏和 caption button 属性。 - - 补齐 position 更新。 - - 确认 `Close(Action?)` 会执行 callback。 - - 确认 button/footer/loading relay。 - - 通过内部 `DialogWindowContent` 设置 Window `Content`,不直接修改 Window ControlTheme。 - -- `src/AtomUI.Desktop.Controls/Dialog/Themes/DialogHostTheme.axaml` - - 保持薄主题,基于 release/6.0 `WindowTheme`。 - - 不复制 Window `ControlTemplate`。 - - 不插入 Window 内部 footer。 - - 只设置 Window/DialogHost 级默认属性。 - -- `src/AtomUI.Desktop.Controls/Dialog/WindowHost/DialogWindowContent.cs` - - 新增内部内容包装控件。 - - 承载用户内容、`Skeleton` loading、footer 和 `DialogButtonBox`。 - - 向 `DialogHost` 回调按钮点击和按钮同步事件。 - -- `src/AtomUI.Desktop.Controls/Dialog/Themes/DialogWindowContentTheme.axaml` - - 新增包装控件主题。 - - 使用 `DialogTokenResource ContentPadding`、`FooterPadding`、`FooterMarginTop`、`FooterBg`。 - - 视觉效果与 5.0 Window Dialog content/footer 一致。 - -### Overlay Dialog - -- `src/AtomUI.Desktop.Controls/Dialog/OverlayHost/OverlayDialogHost.cs` - - 改为作为 `Popup` 内容控件承载。 - - 补齐 show/close 动画与 popup open/close 协调。 - - 补齐 drag/maximize/restore resize 边界。 - - 补齐 z-index 更新。 - - 补齐 footer/loading/button 同步。 - -- `src/AtomUI.Desktop.Controls/Dialog/OverlayHost/OverlayDialogPopup.cs` 或 Dialog 内部 popup factory - - 新增或封装 Overlay Dialog 专用 Popup 创建逻辑。 - - 设置 `ShouldUseOverlayLayer=true`。 - - 设置 placement target、placement、stays open/light dismiss 策略。 - - 将 `OverlayDialogHost` 作为 popup content。 - -- `src/AtomUI.Desktop.Controls/Dialog/OverlayHost/OverlayDialogMask.cs` - - 确认 modal mask 覆盖 Popup owner 可视区域。 - - 确认 light dismiss 和 pointer wheel 拦截。 - -- `src/AtomUI.Desktop.Controls/Dialog/OverlayHost/OverlayDialogResizer.cs` - - 确认 resize 事件与 `WindowState=Maximized` 互斥。 - -- `src/AtomUI.Desktop.Controls/Dialog/Themes/OverlayDialogHostTheme.axaml` - - 保持现有视觉。 - - 必要时引入 `MotionActor`,但不改变 UI。 - -### ButtonBox / Token / Localization - -- `src/AtomUI.Desktop.Controls/Dialog/ButtonBox/DialogButtonBox.cs` - - 保持 release/5.0 行为。 - - 验证标准按钮顺序、角色分组、默认按钮和 escape 按钮。 - -- `src/AtomUI.Desktop.Controls/Dialog/DialogToken.cs` - - 保持现有 token,不硬编码颜色和尺寸。 - -- `src/AtomUI.Desktop.Controls/Dialog/Localization/*.cs` - - 保持按钮文本本地化。 - -## 实施阶段 - -### 阶段 1:恢复外部 API 与打开/关闭骨架 - -目标: - -- 以 release/5.0 为基线重建 `Dialog.cs` 和 `Dialog.StaticAPI.cs`。 -- 实现 `Dialog.OpenAsync` 的 Host 创建分发。 -- 补齐 `DialogOpenState` close completion。 -- 能打开和关闭最小 Window Dialog / Overlay Dialog。 - -验收: - -- `ShowDialog` 可同步返回 `DialogCode.Accepted/Rejected`。 -- `ShowDialogAsync` 非 modal 打开后返回,并可通过 closed callback 拿到 result。 -- `ShowDialogModalAsync` 等待关闭后返回 result。 - -### 阶段 2:Window Dialog 接入新 Window - -目标: - -- `DialogHost` 完整使用 release/6.0 新 Window 行为。 -- 新增 `DialogWindowContent` 包装控件,使用 Window `Content` / `ContentTemplate` 承载 Dialog 内容和 footer。 -- `DialogHostTheme.axaml` 保持薄主题,不复制 Window `ControlTemplate`。 -- 标题栏、caption buttons、resize、平台外观正常。 - -验收: - -- Window Dialog 与普通 `Window` 的标题栏风格一致。 -- footer 按钮显示、隐藏、loading 正常。 -- modal Window 不显示 minimize。 -- 关闭按钮触发 Dialog 生命周期,而不是绕过 `Closing`。 - -### 阶段 3:Overlay Dialog 接入 Popup OverlayLayer - -目标: - -- Overlay Dialog 不依赖 `GlobalDialogManager`。 -- 通过 `Popup.ShouldUseOverlayLayer=true` 使用 Popup 自己的 OverlayLayer。 -- 支持 mask、light dismiss、drag、resize、maximize/restore、z-index。 - -验收: - -- Overlay Dialog 居中显示。 -- overlay mask 覆盖当前 Popup owner 可视区域。 -- resize/maximize/restore 视觉与 release/5.0 一致。 -- 多个 overlay dialog 层级正确。 - -### 阶段 4:定位、尺寸和 transform 兼容 - -目标: - -- 支持 `HorizontalStartupLocation` / `VerticalStartupLocation`。 -- 支持 `HorizontalOffset` / `VerticalOffset`。 -- 支持 Window 和 Overlay 的不同坐标系。 -- 抽象轻量 `IDialogPlacementCalculator` / `IDialogPlacementController`。 -- Window 类型直接设置 `Window.Position`。 -- Popup 类型由 controller 设置 offset,并通过 Dialog 专用 `CustomPopupPlacementCallback` 根据 offset 定位,不考虑通用 `Placement`。 -- 保留 `InheritsTransform` 对 host sizing 的影响。 - -验收: - -- top/center/bottom、left/center/right、custom offset 都正确。 -- owner window 移动或不同 screen working area 下 Window Dialog 初始位置正确。 -- Overlay Dialog 不越出 Popup owner 可视区域的基本边界。 -- 不引入 5.0 `ManagedDialogPositioner`。 - -### 阶段 5:行为回归 - -目标: - -- ButtonBox 行为与 release/5.0 一致。 -- Loading/ConfirmLoading 行为一致。 -- DataContext notification 一致。 -- light dismiss 和 event pass-through 一致。 - -验收: - -- 标准按钮角色触发正确 result。 -- `Closing` 可取消关闭。 -- `IsConfirmLoading` 阻止确认关闭。 -- `NotifyClosed` 在最终关闭后触发。 - -### 阶段 6:测试和 Gallery 验证 - -建议补充或执行: - -- 单元测试: - - `DialogStandardButtons.Count` - - `DialogButtonBox` 标准按钮构建和 role 分组 - - `Closing` cancel - - `Accept/Reject/Done` result - -- 交互验证: - - Overlay modal - - Overlay non-modal - - Overlay light dismiss - - Overlay resize/maximize/restore - - Window modal - - Window non-modal - - 自定义按钮 - - confirm loading - - loading skeleton - -- Gallery: - - 如现有 Gallery 无 Dialog showcase,需要补一个最小 showcase,覆盖 Window/Overlay 两种 host。 - -## 风险与注意事项 - -1. **不要恢复旧 PopupBuddyLayer 架构** - release/6.0 已迁移到 Avalonia 12 的 PopupHost/OverlayPopupHost 方向,Dialog 不应重新引入旧 Popup buddy layer。 - -2. **不要恢复 GlobalDialogManager 依赖** - 静态 API 可以恢复,但内部 Window Dialog 使用新 `Window`,Overlay Dialog 使用新 `Popup` 自己的 OverlayLayer。 - -3. **WindowTheme 模板复制需要谨慎** - Window 的 ControlTheme 很复杂,Window Dialog 不应复制或修改它。DialogHost 应复用 Window 原主题,把 Dialog 专属内容放进 Window `Content` 包装控件中。 - -4. **Overlay 坐标系与 Window 坐标系不同** - Window 使用 screen/device pixel position;Overlay 使用 layer logical coordinates。不要混用。 - -5. **不要恢复 ManagedDialogPositioner** - 5.0 的 positioner 异常复杂,不适合新架构。Window 直接设置位置;Popup 由 controller 设置 offset,再由 Dialog 专用 `CustomPopupPlacementCallback` 根据 offset 定位。需要复用的是“启动位置和 offset 语义”,不是旧 positioner 实现。 - -6. **Modal async 语义容易回归** - `OpenAsync` 对 modal/non-modal 的完成时机必须严格与 release/5.0 保持一致。 - -7. **Avalonia 12 internal API** - `release/6.0` 已有若干 reflection extension。新增反射前必须确认是否已有可复用扩展,避免重复和脆弱依赖。 - -## 完成标准 - -完成后应满足: - -- 5.0 Dialog 外部 API 源码兼容。 -- Window Dialog 基于 release/6.0 新 `Window`。 -- Overlay Dialog 基于 release/6.0 新 `Popup` OverlayLayer 架构。 -- Dialog UI 与 release/5.0 效果一致。 -- 不引入旧 `GlobalDialogManager`、旧 `DialogLayer`、旧 `PopupBuddyLayer`。 -- 不破坏 `Popup`、`Window`、`Message`、`Notification`、`Tour` 等现有 overlay/layer 使用者。 diff --git a/docs/UnusedImportsScanReport.md b/docs/UnusedImportsScanReport.md deleted file mode 100644 index a59f3ead9..000000000 --- a/docs/UnusedImportsScanReport.md +++ /dev/null @@ -1,1187 +0,0 @@ -# 未使用导入扫描报告 - -> 扫描时间:2026-05-10 -> 扫描范围:`src/` 下所有项目 -> 方法:C# using 使用词边界匹配最后命名空间段;AXAML xmlns 检查前缀在文件体中是否出现 - -## AXAML 未使用的 xmlns(7 个) - -| 文件 | 未使用的 xmlns | -|---|---| -| `ColorSlider/AbstractColorPickerSliderTrackTheme.axaml` | `xmlns:atom="https://atomui.net"` | -| `DataGrid/Themes/DataGridTheme.axaml` | `xmlns:dataGridLocalization="clr-namespace:AtomUI.Desktop.Controls.DataGridLocalization"` | -| `HeaderedContentControl/Themes/HeaderedContentControlTheme.axaml` | `xmlns:atom="https://atomui.net"` | -| `ImagePreviewer/Themes/ImagePreviewerTheme.axaml` | `xmlns:imagepreviewlang="using:AtomUI.Desktop.Controls.ImagePreviewerLang"` | -| `Upload/Themes/PictureList/UploadPicturePendingContentTheme.axaml` | `xmlns:uploadlang="using:AtomUI.Desktop.Controls.UploadLang"` | -| `Upload/Themes/PictureShapeList/UploadPictureShapeUploadingContentTheme.axaml` | `xmlns:uploadlang="using:AtomUI.Desktop.Controls.UploadLang"` | -| `Upload/Themes/UploadDefaultDropAreaTheme.axaml` | `xmlns:uploadlang="using:AtomUI.Desktop.Controls.UploadLang"` | - -## C# 未使用的 using(1121 个) - -已排除 `Avalonia.*`、`System.*`、`Microsoft.*`、`SkiaSharp`、`ReactiveUI`、`DynamicData` 等框架命名空间(这些可能通过子命名空间隐式使用,误报率高)。 - -| 项目 | 数量 | -|---|---| -| AtomUI.Desktop.Controls | 853 | -| AtomUI.Controls | 84 | -| AtomUI.Desktop.Controls.DataGrid | 76 | -| AtomUI.Core | 51 | -| AtomUI.Desktop.Controls.ColorPicker | 35 | -| AtomUI.Controls.Shared | 14 | -| AtomUI.Native | 2 | -| AtomUI.Icons.Shared | 2 | -| AtomUI.Icons.AntDesign | 2 | -| AtomUI.Fonts.AlibabaSans | 2 | - -### 详细列表 - -### AtomUI.Desktop.Controls (853) - -- `AdornerLayer/AdornerLayerToken.cs:1` — `using AtomUI.Desktop.Controls.DesignTokens;` -- `AdornerLayer/AdornerLayerToken.cs:2` — `using AtomUI.Theme;` -- `AdornerLayer/AdornerLayerToken.cs:3` — `using AtomUI.Theme.TokenSystem;` -- `Alert/Alert.cs:2` — `using AtomUI.Theme;` -- `Alert/AlertToken.cs:1` — `using AtomUI.Desktop.Controls.DesignTokens;` -- `Alert/AlertToken.cs:2` — `using AtomUI.Theme;` -- `Alert/AlertToken.cs:3` — `using AtomUI.Theme.TokenSystem;` -- `AutoComplete/AbstractAutoComplete.cs:8` — `using AtomUI.Controls.Utils;` -- `AutoComplete/AbstractAutoComplete.cs:9` — `using AtomUI.Desktop.Controls.Primitives;` -- `AutoComplete/AbstractAutoComplete.cs:10` — `using AtomUI.Input;` -- `AutoComplete/AbstractAutoComplete.cs:11` — `using AtomUI.Theme;` -- `AutoComplete/AutoCompleteOption.cs:1` — `using AtomUI.Controls;` -- `AutoComplete/AutoCompleteTextAreaBox.cs:1` — `using AtomUI.Desktop.Controls.Themes;` -- `AutoComplete/AutoCompleteTextAreaBox.cs:2` — `using AtomUI.Desktop.Controls.Utils;` -- `AutoComplete/AutoCompleteToken.cs:1` — `using AtomUI.Desktop.Controls.DesignTokens;` -- `AutoComplete/AutoCompleteToken.cs:2` — `using AtomUI.Theme;` -- `AutoComplete/AutoCompleteToken.cs:3` — `using AtomUI.Theme.TokenSystem;` -- `AutoComplete/DataLoad/CompleteOptionsLoadResult.cs:1` — `using AtomUI.Controls;` -- `AutoComplete/IAutoCompleteOption.cs:1` — `using AtomUI.Controls.Data;` -- `Avatar/Avatar.cs:1` — `using AtomUI.Controls.Commons;` -- `Avatar/Avatar.cs:2` — `using AtomUI.Theme;` -- `Avatar/AvatarGroup.cs:3` — `using AtomUI.Theme;` -- `Avatar/AvatarGroup.cs:4` — `using AtomUI.Utils;` -- `Avatar/AvatarToken.cs:1` — `using AtomUI.Desktop.Controls.DesignTokens;` -- `Avatar/AvatarToken.cs:2` — `using AtomUI.Theme;` -- `Avatar/AvatarToken.cs:3` — `using AtomUI.Theme.TokenSystem;` -- `Badge/BadgeToken.cs:2` — `using AtomUI.Theme;` -- `Badge/BadgeToken.cs:3` — `using AtomUI.Theme.TokenSystem;` -- `Badge/CountBadge.cs:1` — `using AtomUI.Controls.Commons;` -- `Badge/CountBadge.cs:2` — `using AtomUI.Theme;` -- `Badge/CountBadgeAdorner.cs:1` — `using AtomUI.Controls.Commons;` -- `Badge/DotBadge.cs:1` — `using AtomUI.Controls.Commons;` -- `Badge/DotBadge.cs:2` — `using AtomUI.Theme;` -- `Badge/DotBadgeAdorner.cs:1` — `using AtomUI.Controls.Commons;` -- `Badge/RibbonBadge.cs:1` — `using AtomUI.Controls.Commons;` -- `Badge/RibbonBadge.cs:2` — `using AtomUI.Theme;` -- `Badge/RibbonBadgeAdorner.cs:1` — `using AtomUI.Controls.Commons;` -- `Breadcrumb/Breadcrumb.cs:2` — `using AtomUI.Controls;` -- `Breadcrumb/Breadcrumb.cs:3` — `using AtomUI.Theme;` -- `Breadcrumb/BreadcrumbItem.cs:2` — `using AtomUI.Animations;` -- `Breadcrumb/BreadcrumbToken.cs:2` — `using AtomUI.Theme;` -- `Breadcrumb/BreadcrumbToken.cs:3` — `using AtomUI.Theme.TokenSystem;` -- `ButtonSpinner/ButtonSpinner.cs:1` — `using AtomUI.Controls;` -- `ButtonSpinner/ButtonSpinner.cs:2` — `using AtomUI.Desktop.Controls.Primitives;` -- `ButtonSpinner/ButtonSpinner.cs:3` — `using AtomUI.Theme;` -- `ButtonSpinner/ButtonSpinnerDecoratedBox.cs:1` — `using AtomUI.Animations;` -- `ButtonSpinner/ButtonSpinnerHandle.cs:1` — `using AtomUI.Controls;` -- `ButtonSpinner/ButtonSpinnerHandle.cs:2` — `using AtomUI.Controls.Utils;` -- `ButtonSpinner/ButtonSpinnerToken.cs:2` — `using AtomUI.Media;` -- `ButtonSpinner/ButtonSpinnerToken.cs:3` — `using AtomUI.Theme;` -- `ButtonSpinner/ButtonSpinnerToken.cs:4` — `using AtomUI.Theme.TokenSystem;` -- `Buttons/Button.cs:2` — `using AtomUI.Animations;` -- `Buttons/Button.cs:4` — `using AtomUI.Controls.Primitives;` -- `Buttons/Button.cs:5` — `using AtomUI.Theme;` -- `Buttons/ButtonToken.cs:1` — `using AtomUI.Desktop.Controls.DesignTokens;` -- `Buttons/ButtonToken.cs:2` — `using AtomUI.Media;` -- `Buttons/ButtonToken.cs:3` — `using AtomUI.Theme;` -- `Buttons/ButtonToken.cs:4` — `using AtomUI.Theme.Styling;` -- `Buttons/ButtonToken.cs:5` — `using AtomUI.Theme.TokenSystem;` -- `Buttons/DropdownButton.cs:2` — `using AtomUI.Data;` -- `Buttons/DropdownButton.cs:3` — `using AtomUI.Icons.AntDesign;` -- `Buttons/HyperLinkButton.cs:1` — `using AtomUI.Controls.Commons;` -- `Buttons/HyperLinkButton.cs:2` — `using AtomUI.Theme;` -- `Buttons/IconButton.cs:1` — `using AtomUI.Controls.Commons;` -- `Buttons/IconButton.cs:2` — `using AtomUI.Theme;` -- `Buttons/SplitButton.cs:4` — `using AtomUI.Controls.Utils;` -- `Buttons/SplitButton.cs:5` — `using AtomUI.Data;` -- `Buttons/SplitButton.cs:6` — `using AtomUI.Icons.AntDesign;` -- `Buttons/SplitButton.cs:7` — `using AtomUI.Theme;` -- `Buttons/SplitButton.cs:8` — `using AtomUI.Utils;` -- `Buttons/Themes/ButtonTheme.cs:1` — `using AtomUI.Controls.Converters;` -- `Buttons/ToggleIconButton.cs:1` — `using AtomUI.Controls.Commons;` -- `Buttons/ToggleIconButton.cs:2` — `using AtomUI.Theme;` -- `Calendar/BaseCalendarDayButton.cs:2` — `using AtomUI.Animations;` -- `Calendar/Calendar.cs:9` — `using AtomUI.Theme;` -- `Calendar/Calendar.cs:10` — `using AtomUI.Utils;` -- `Calendar/CalendarItem.cs:4` — `using AtomUI.Collections.Pooled;` -- `Calendar/CalendarItem.cs:6` — `using AtomUI.Data;` -- `Calendar/CalendarToken.cs:2` — `using AtomUI.Media;` -- `Calendar/CalendarToken.cs:3` — `using AtomUI.Theme;` -- `Calendar/CalendarToken.cs:4` — `using AtomUI.Theme.TokenSystem;` -- `Calendar/DateTimeHelper.cs:3` — `using AtomUI.Theme;` -- `Card/Card.cs:2` — `using AtomUI.Animations;` -- `Card/Card.cs:4` — `using AtomUI.Theme;` -- `Card/CardActionPanel.cs:2` — `using AtomUI.Animations;` -- `Card/CardGridContent.cs:2` — `using AtomUI.Controls;` -- `Card/CardGridItem.cs:1` — `using AtomUI.Animations;` -- `Card/CardGridItem.cs:2` — `using AtomUI.Controls;` -- `Card/CardToken.cs:1` — `using AtomUI.Desktop.Controls.DesignTokens;` -- `Card/CardToken.cs:2` — `using AtomUI.Media;` -- `Card/CardToken.cs:3` — `using AtomUI.Theme;` -- `Card/CardToken.cs:4` — `using AtomUI.Theme.TokenSystem;` -- `Carousel/Carousel.cs:1` — `using AtomUI.Controls;` -- `Carousel/Carousel.cs:2` — `using AtomUI.Theme;` -- `Carousel/CarouselPageIndicator.cs:1` — `using AtomUI.Animations;` -- `Carousel/CarouselPageIndicator.cs:2` — `using AtomUI.Controls;` -- `Carousel/CarouselPagination.cs:1` — `using AtomUI.Controls;` -- `Carousel/CarouselToken.cs:1` — `using AtomUI.Desktop.Controls.DesignTokens;` -- `Carousel/CarouselToken.cs:2` — `using AtomUI.Theme;` -- `Carousel/CarouselToken.cs:3` — `using AtomUI.Theme.TokenSystem;` -- `Carousel/VirtualizingCarouselPanel.cs:3` — `using AtomUI.Utils;` -- `Cascader/Cascader.cs:5` — `using AtomUI.Controls;` -- `Cascader/Cascader.cs:6` — `using AtomUI.Controls.Primitives;` -- `Cascader/Cascader.cs:7` — `using AtomUI.Desktop.Controls.DataLoad;` -- `Cascader/Cascader.cs:8` — `using AtomUI.Input;` -- `Cascader/Cascader.cs:9` — `using AtomUI.Theme;` -- `Cascader/CascaderOption.cs:2` — `using AtomUI.Controls;` -- `Cascader/CascaderToken.cs:1` — `using AtomUI.Desktop.Controls.DesignTokens;` -- `Cascader/CascaderToken.cs:2` — `using AtomUI.Theme;` -- `Cascader/CascaderToken.cs:3` — `using AtomUI.Theme.TokenSystem;` -- `Cascader/CascaderView.cs:3` — `using AtomUI.Controls;` -- `Cascader/CascaderView.cs:4` — `using AtomUI.Controls.Primitives;` -- `Cascader/CascaderView.cs:5` — `using AtomUI.Desktop.Controls.DataLoad;` -- `Cascader/CascaderView.cs:6` — `using AtomUI.Theme;` -- `Cascader/CascaderViewFilterListItemData.cs:1` — `using AtomUI.Controls.Data;` -- `Cascader/CascaderViewItem.cs:1` — `using AtomUI.Animations;` -- `Cascader/CascaderViewItem.cs:2` — `using AtomUI.Controls;` -- `Cascader/CascaderViewLevelList.cs:2` — `using AtomUI.Controls;` -- `Cascader/DataLoad/CascaderItemLoadResult.cs:1` — `using AtomUI.Controls;` -- `Cascader/DefaultCascaderItemFilter.cs:1` — `using AtomUI.Controls.Utils;` -- `Cascader/Themes/CascaderViewItemTheme.cs:1` — `using AtomUI.Desktop.Controls.Converters;` -- `CheckBox/CheckBox.cs:1` — `using AtomUI.Controls.Commons;` -- `CheckBox/CheckBox.cs:2` — `using AtomUI.Theme;` -- `CheckBox/CheckBoxGroup.cs:1` — `using AtomUI.Controls.Commons;` -- `CheckBox/CheckBoxGroup.cs:2` — `using AtomUI.Theme;` -- `CheckBox/CheckBoxItemsControl.cs:1` — `using AtomUI.Controls.Commons;` -- `CheckBox/CheckBoxToken.cs:1` — `using AtomUI.Desktop.Controls.DesignTokens;` -- `CheckBox/CheckBoxToken.cs:2` — `using AtomUI.Theme;` -- `CheckBox/CheckBoxToken.cs:3` — `using AtomUI.Theme.TokenSystem;` -- `Collapse/Collapse.cs:2` — `using AtomUI.Theme;` -- `Collapse/CollapseItem.cs:2` — `using AtomUI.Animations;` -- `Collapse/CollapseItem.cs:3` — `using AtomUI.Controls;` -- `Collapse/CollapseItem.cs:4` — `using AtomUI.Icons.AntDesign;` -- `Collapse/CollapseItem.cs:5` — `using AtomUI.MotionScene;` -- `Collapse/CollapseToken.cs:2` — `using AtomUI.Theme;` -- `Collapse/CollapseToken.cs:3` — `using AtomUI.Theme.TokenSystem;` -- `ComboBox/ComboBox.cs:3` — `using AtomUI.Theme;` -- `ComboBox/ComboBoxHandle.cs:1` — `using AtomUI.Controls;` -- `ComboBox/ComboBoxReflectionExtensions.cs:3` — `using AtomUI.Reflection;` -- `ComboBox/ComboBoxToken.cs:2` — `using AtomUI.Theme;` -- `ComboBox/ComboBoxToken.cs:3` — `using AtomUI.Theme.TokenSystem;` -- `DatePicker/CalendarView/CalendarDayButton.cs:2` — `using AtomUI.Animations;` -- `DatePicker/CalendarView/CalendarItem.cs:4` — `using AtomUI.Collections.Pooled;` -- `DatePicker/CalendarView/CalendarItem.cs:6` — `using AtomUI.Data;` -- `DatePicker/DatePicker.cs:2` — `using AtomUI.Data;` -- `DatePicker/DatePicker.cs:3` — `using AtomUI.Desktop.Controls.CalendarView;` -- `DatePicker/DatePicker.cs:4` — `using AtomUI.Desktop.Controls.Localization;` -- `DatePicker/DatePicker.cs:5` — `using AtomUI.Desktop.Controls.Primitives;` -- `DatePicker/DatePicker.cs:6` — `using AtomUI.Icons.AntDesign;` -- `DatePicker/DatePicker.cs:7` — `using AtomUI.Media;` -- `DatePicker/DatePicker.cs:8` — `using AtomUI.Theme;` -- `DatePicker/DatePickerToken.cs:2` — `using AtomUI.Media;` -- `DatePicker/DatePickerToken.cs:3` — `using AtomUI.Theme;` -- `DatePicker/DatePickerToken.cs:4` — `using AtomUI.Theme.TokenSystem;` -- `DatePicker/Localization/en_US.cs:2` — `using AtomUI.Theme.Language;` -- `DatePicker/Localization/zh_CN.cs:2` — `using AtomUI.Theme.Language;` -- `DatePicker/RangeDatePicker.cs:2` — `using AtomUI.Data;` -- `DatePicker/RangeDatePicker.cs:3` — `using AtomUI.Desktop.Controls.CalendarView;` -- `DatePicker/RangeDatePicker.cs:4` — `using AtomUI.Desktop.Controls.Localization;` -- `DatePicker/RangeDatePicker.cs:5` — `using AtomUI.Desktop.Controls.Primitives;` -- `DatePicker/RangeDatePicker.cs:6` — `using AtomUI.Icons.AntDesign;` -- `DatePicker/RangeDatePicker.cs:7` — `using AtomUI.Media;` -- `DatePicker/RangeDatePicker.cs:8` — `using AtomUI.Theme;` -- `DatePicker/Themes/CalendarView/CalendarItemTheme.cs:1` — `using AtomUI.Controls.Converters;` -- `DatePicker/Themes/DatePickerPresenterTheme.cs:1` — `using AtomUI.Controls.Converters;` -- `Descriptions/DescriptionBorderedCell.cs:1` — `using AtomUI.Controls;` -- `Descriptions/DescriptionDefaultItem.cs:1` — `using AtomUI.Controls;` -- `Descriptions/Descriptions.cs:5` — `using AtomUI.Controls;` -- `Descriptions/Descriptions.cs:6` — `using AtomUI.Data;` -- `Descriptions/Descriptions.cs:7` — `using AtomUI.Desktop.Controls.Themes;` -- `Descriptions/Descriptions.cs:8` — `using AtomUI.Theme;` -- `Descriptions/DescriptionsToken.cs:1` — `using AtomUI.Desktop.Controls.DesignTokens;` -- `Descriptions/DescriptionsToken.cs:2` — `using AtomUI.Theme;` -- `Descriptions/DescriptionsToken.cs:3` — `using AtomUI.Theme.TokenSystem;` -- `DesktopControlThemesProvider.cs:1` — `using AtomUI.Theme;` -- `Dialog/ButtonBox/DialogButtonBox.cs:3` — `using AtomUI.Controls;` -- `Dialog/ButtonBox/DialogButtonBox.cs:4` — `using AtomUI.Theme;` -- `Dialog/ButtonBox/DialogCaptionButton.cs:1` — `using AtomUI.Animations;` -- `Dialog/Dialog.StaticAPI.cs:1` — `using AtomUI.Controls.Primitives;` -- `Dialog/Dialog.cs:5` — `using AtomUI.Controls;` -- `Dialog/Dialog.cs:6` — `using AtomUI.Reflection;` -- `Dialog/Dialog.cs:7` — `using AtomUI.Theme;` -- `Dialog/DialogToken.cs:1` — `using AtomUI.Desktop.Controls.DesignTokens;` -- `Dialog/DialogToken.cs:2` — `using AtomUI.Theme;` -- `Dialog/DialogToken.cs:3` — `using AtomUI.Theme.TokenSystem;` -- `Dialog/Localization/en_US.cs:2` — `using AtomUI.Theme.Language;` -- `Dialog/Localization/zh_CN.cs:2` — `using AtomUI.Theme.Language;` -- `Dialog/OverlayHost/OverlayDialogHeader.cs:2` — `using AtomUI.Animations;` -- `Dialog/OverlayHost/OverlayDialogHeader.cs:3` — `using AtomUI.Controls;` -- `Dialog/OverlayHost/OverlayDialogHost.cs:3` — `using AtomUI.Controls;` -- `Dialog/OverlayHost/OverlayDialogHost.cs:4` — `using AtomUI.Controls.Primitives;` -- `Dialog/OverlayHost/OverlayDialogHost.cs:5` — `using AtomUI.Data;` -- `Dialog/OverlayHost/OverlayDialogHost.cs:6` — `using AtomUI.Theme.Styling;` -- `Dialog/OverlayHost/OverlayDialogMask.cs:1` — `using AtomUI.Controls;` -- `Dialog/OverlayHost/OverlayDialogResizeEventArgs.cs:1` — `using AtomUI.Controls;` -- `Dialog/OverlayHost/OverlayDialogResizer.cs:1` — `using AtomUI.Controls;` -- `Dialog/Themes/OverlayDialogHostTheme.cs:1` — `using AtomUI.Desktop.Controls.Converters;` -- `Dialog/WindowHost/DialogHost.cs:4` — `using AtomUI.Controls;` -- `Dialog/WindowHost/DialogHost.cs:5` — `using AtomUI.Native;` -- `Dialog/WindowHost/DialogWindowContent.cs:2` — `using AtomUI.Controls;` -- `Dialog/WindowHost/DialogWindowContent.cs:3` — `using AtomUI.Theme;` -- `Drawer/Drawer.cs:3` — `using AtomUI.Controls;` -- `Drawer/Drawer.cs:4` — `using AtomUI.Controls.Primitives;` -- `Drawer/Drawer.cs:5` — `using AtomUI.Data;` -- `Drawer/Drawer.cs:6` — `using AtomUI.Desktop.Controls.DesignTokens;` -- `Drawer/Drawer.cs:7` — `using AtomUI.Theme;` -- `Drawer/Drawer.cs:8` — `using AtomUI.Utils;` -- `Drawer/DrawerContainer.cs:2` — `using AtomUI.Controls;` -- `Drawer/DrawerContainer.cs:3` — `using AtomUI.Controls.Primitives;` -- `Drawer/DrawerContainer.cs:4` — `using AtomUI.MotionScene;` -- `Drawer/DrawerInfoContainer.cs:1` — `using AtomUI.Animations;` -- `Drawer/DrawerInfoContainer.cs:3` — `using AtomUI.Controls;` -- `Drawer/DrawerToken.cs:1` — `using AtomUI.Desktop.Controls.DesignTokens;` -- `Drawer/DrawerToken.cs:2` — `using AtomUI.Media;` -- `Drawer/DrawerToken.cs:3` — `using AtomUI.Theme;` -- `Drawer/DrawerToken.cs:4` — `using AtomUI.Theme.TokenSystem;` -- `Empty/Empty.cs:1` — `using AtomUI.Controls.Commons;` -- `Empty/Empty.cs:2` — `using AtomUI.Theme;` -- `Empty/EmptyToken.cs:2` — `using AtomUI.Theme;` -- `Empty/EmptyToken.cs:3` — `using AtomUI.Theme.TokenSystem;` -- `Expander/Expander.cs:3` — `using AtomUI.Icons.AntDesign;` -- `Expander/Expander.cs:4` — `using AtomUI.MotionScene;` -- `Expander/Expander.cs:5` — `using AtomUI.Theme;` -- `Expander/ExpanderToken.cs:2` — `using AtomUI.Theme;` -- `Expander/ExpanderToken.cs:3` — `using AtomUI.Theme.TokenSystem;` -- `FloatButton/BackTopFloatButton.cs:1` — `using AtomUI.Controls.Commons;` -- `FloatButton/BackTopFloatButtonHost.cs:2` — `using AtomUI.Controls.Commons;` -- `FloatButton/FloatButton.cs:1` — `using AtomUI.Controls.Commons;` -- `FloatButton/FloatButton.cs:2` — `using AtomUI.Theme;` -- `FloatButton/FloatButtonGroup.cs:3` — `using AtomUI.Controls.Commons;` -- `FloatButton/FloatButtonGroup.cs:4` — `using AtomUI.Controls.Primitives;` -- `FloatButton/FloatButtonGroup.cs:5` — `using AtomUI.Controls.Utils;` -- `FloatButton/FloatButtonGroup.cs:6` — `using AtomUI.Icons.AntDesign;` -- `FloatButton/FloatButtonGroup.cs:7` — `using AtomUI.MotionScene;` -- `FloatButton/FloatButtonGroup.cs:8` — `using AtomUI.Theme;` -- `FloatButton/FloatButtonGroupHost.cs:4` — `using AtomUI.Controls.Primitives;` -- `FloatButton/FloatButtonGroupHost.cs:5` — `using AtomUI.Data;` -- `FloatButton/FloatButtonGroupHost.cs:6` — `using AtomUI.Theme;` -- `FloatButton/FloatButtonHost.cs:2` — `using AtomUI.Controls.Commons;` -- `FloatButton/FloatButtonHost.cs:3` — `using AtomUI.Theme;` -- `FloatButton/FloatButtonToken.cs:1` — `using AtomUI.Desktop.Controls.DesignTokens;` -- `FloatButton/FloatButtonToken.cs:2` — `using AtomUI.Theme;` -- `FloatButton/FloatButtonToken.cs:3` — `using AtomUI.Theme.TokenSystem;` -- `Flyouts/Flyout.cs:3` — `using AtomUI.Data;` -- `Flyouts/Flyout.cs:4` — `using AtomUI.Desktop.Controls.DesignTokens;` -- `Flyouts/Flyout.cs:5` — `using AtomUI.MotionScene;` -- `Flyouts/Flyout.cs:6` — `using AtomUI.Theme.Styling;` -- `Flyouts/FlyoutHost.cs:2` — `using AtomUI.Controls;` -- `Flyouts/FlyoutHost.cs:3` — `using AtomUI.Controls.Utils;` -- `Flyouts/FlyoutHost.cs:4` — `using AtomUI.Data;` -- `Flyouts/FlyoutHost.cs:5` — `using AtomUI.MotionScene;` -- `Flyouts/FlyoutHost.cs:6` — `using AtomUI.Theme;` -- `Flyouts/FlyoutHostToken.cs:2` — `using AtomUI.Media;` -- `Flyouts/FlyoutHostToken.cs:3` — `using AtomUI.Theme;` -- `Flyouts/FlyoutHostToken.cs:4` — `using AtomUI.Theme.TokenSystem;` -- `Flyouts/FlyoutStateHelper.cs:2` — `using AtomUI.Controls;` -- `Flyouts/MenuFlyout.cs:4` — `using AtomUI.Controls;` -- `Flyouts/MenuFlyout.cs:5` — `using AtomUI.Data;` -- `Flyouts/MenuFlyout.cs:6` — `using AtomUI.Desktop.Controls.DesignTokens;` -- `Flyouts/MenuFlyoutPresenter.cs:3` — `using AtomUI.Theme;` -- `Flyouts/PopupFlyoutBaseReflectionExtensions.cs:4` — `using AtomUI.Reflection;` -- `Flyouts/TreeFlyoutToken.cs:1` — `using AtomUI.Desktop.Controls.DesignTokens;` -- `Flyouts/TreeFlyoutToken.cs:2` — `using AtomUI.Theme;` -- `Flyouts/TreeFlyoutToken.cs:3` — `using AtomUI.Theme.TokenSystem;` -- `Flyouts/TreeViewFlyout.cs:4` — `using AtomUI.Controls;` -- `Flyouts/TreeViewFlyout.cs:5` — `using AtomUI.Data;` -- `Flyouts/TreeViewFlyout.cs:6` — `using AtomUI.Desktop.Controls.DesignTokens;` -- `Flyouts/TreeViewFlyoutPresenter.cs:1` — `using AtomUI.Controls;` -- `Flyouts/TreeViewFlyoutPresenter.cs:2` — `using AtomUI.Theme;` -- `Form/Form.cs:4` — `using AtomUI.Controls;` -- `Form/Form.cs:5` — `using AtomUI.Theme;` -- `Form/FormItem.cs:3` — `using AtomUI.Controls;` -- `Form/FormItem.cs:4` — `using AtomUI.Data;` -- `Form/FormItem.cs:5` — `using AtomUI.Icons.AntDesign;` -- `Form/FormItem.cs:6` — `using AtomUI.Theme;` -- `Form/FormItemDecorator.cs:2` — `using AtomUI.Controls;` -- `Form/FormItemDecorator.cs:3` — `using AtomUI.Data;` -- `Form/FormToken.cs:1` — `using AtomUI.Desktop.Controls.DesignTokens;` -- `Form/FormToken.cs:2` — `using AtomUI.Theme;` -- `Form/FormToken.cs:3` — `using AtomUI.Theme.TokenSystem;` -- `GroupBox/GroupBox.cs:2` — `using AtomUI.Theme;` -- `GroupBox/GroupBoxToken.cs:2` — `using AtomUI.Theme;` -- `GroupBox/GroupBoxToken.cs:3` — `using AtomUI.Theme.TokenSystem;` -- `ImagePreviewer/AbstractImagePreviewer.cs:6` — `using AtomUI.Controls;` -- `ImagePreviewer/AbstractImagePreviewer.cs:7` — `using AtomUI.Data;` -- `ImagePreviewer/AbstractImagePreviewer.cs:8` — `using AtomUI.Theme;` -- `ImagePreviewer/AbstractImagePreviewer.cs:9` — `using AtomUI.Utils;` -- `ImagePreviewer/ImagePreviewRenderer.cs:1` — `using AtomUI.Controls.Utils;` -- `ImagePreviewer/ImagePreviewRenderer.cs:2` — `using AtomUI.Data;` -- `ImagePreviewer/ImagePreviewerCover.cs:1` — `using AtomUI.Animations;` -- `ImagePreviewer/ImagePreviewerCover.cs:3` — `using AtomUI.Controls;` -- `ImagePreviewer/ImagePreviewerDialog.cs:1` — `using AtomUI.Controls;` -- `ImagePreviewer/ImagePreviewerDialog.cs:2` — `using AtomUI.Utils;` -- `ImagePreviewer/ImagePreviewerToken.cs:1` — `using AtomUI.Desktop.Controls.DesignTokens;` -- `ImagePreviewer/ImagePreviewerToken.cs:2` — `using AtomUI.Media;` -- `ImagePreviewer/ImagePreviewerToken.cs:3` — `using AtomUI.Theme;` -- `ImagePreviewer/ImagePreviewerToken.cs:4` — `using AtomUI.Theme.TokenSystem;` -- `ImagePreviewer/ImageViewer.cs:1` — `using AtomUI.Animations;` -- `ImagePreviewer/ImageViewer.cs:2` — `using AtomUI.Controls;` -- `ImagePreviewer/ImageViewer.cs:3` — `using AtomUI.Utils;` -- `ImagePreviewer/Localization/en_US.cs:2` — `using AtomUI.Theme.Language;` -- `ImagePreviewer/Localization/zh_CN.cs:2` — `using AtomUI.Theme.Language;` -- `Input/InputClearIconButton.cs:1` — `using AtomUI.Icons.AntDesign;` -- `Input/LineEdit.cs:3` — `using AtomUI.Controls.Commons;` -- `Input/LineEdit.cs:4` — `using AtomUI.Theme;` -- `Input/LineEditToken.cs:2` — `using AtomUI.Theme;` -- `Input/LineEditToken.cs:3` — `using AtomUI.Theme.TokenSystem;` -- `Input/ResizeHandle.cs:1` — `using AtomUI.Controls;` -- `Input/RevealButton.cs:1` — `using AtomUI.Icons.AntDesign;` -- `Input/SearchButton.cs:1` — `using AtomUI.Controls;` -- `Input/TextArea.cs:3` — `using AtomUI.Controls.Commons;` -- `Input/TextArea.cs:4` — `using AtomUI.Desktop.Controls.Utils;` -- `Input/TextArea.cs:5` — `using AtomUI.Theme;` -- `Input/TextAreaToken.cs:1` — `using AtomUI.Desktop.Controls.DesignTokens;` -- `Input/TextAreaToken.cs:2` — `using AtomUI.Theme.TokenSystem;` -- `Input/TextBox.cs:2` — `using AtomUI.Desktop.Controls.Themes;` -- `Input/TextBox.cs:3` — `using AtomUI.Icons.AntDesign;` -- `Input/Utils/TextBoxReflectionExtensions.cs:4` — `using AtomUI.Reflection;` -- `Input/Utils/TextLayoutReflectionExtensions.cs:4` — `using AtomUI.Reflection;` -- `ListBox/DefaultListBoxItemFilter.cs:1` — `using AtomUI.Controls.Data;` -- `ListBox/DefaultListBoxItemFilter.cs:2` — `using AtomUI.Controls.Utils;` -- `ListBox/ListBox.cs:3` — `using AtomUI.Controls.Data;` -- `ListBox/ListBox.cs:4` — `using AtomUI.Theme;` -- `ListBox/ListBox.cs:5` — `using AtomUI.Utils;` -- `ListBox/ListBoxItem.cs:1` — `using AtomUI.Animations;` -- `ListBox/ListBoxItem.cs:3` — `using AtomUI.Controls.Data;` -- `ListBox/ListBoxToken.cs:1` — `using AtomUI.Desktop.Controls.DesignTokens;` -- `ListBox/ListBoxToken.cs:2` — `using AtomUI.Theme;` -- `ListBox/ListBoxToken.cs:3` — `using AtomUI.Theme.TokenSystem;` -- `ListView/ListCollectionViewChangedEventArgs.cs:1` — `using AtomUI.Controls.Data;` -- `ListView/ListDefaultFilter.cs:1` — `using AtomUI.Controls.Data;` -- `ListView/ListView.Pagination.cs:3` — `using AtomUI.Controls;` -- `ListView/ListView.Pagination.cs:4` — `using AtomUI.Controls.Data;` -- `ListView/ListView.Pagination.cs:5` — `using AtomUI.Data;` -- `ListView/ListView.Selecting.cs:5` — `using AtomUI.Controls;` -- `ListView/ListView.Selecting.cs:6` — `using AtomUI.Controls.Data;` -- `ListView/ListView.Selecting.cs:7` — `using AtomUI.Controls.Utils;` -- `ListView/ListView.Selecting.cs:8` — `using AtomUI.Utils;` -- `ListView/ListView.Virtualizing.cs:1` — `using AtomUI.Controls;` -- `ListView/ListView.Virtualizing.cs:2` — `using AtomUI.Controls.Data;` -- `ListView/ListView.cs:3` — `using AtomUI.Controls;` -- `ListView/ListView.cs:4` — `using AtomUI.Controls.Data;` -- `ListView/ListView.cs:5` — `using AtomUI.Controls.Utils;` -- `ListView/ListView.cs:6` — `using AtomUI.Theme;` -- `ListView/ListView.cs:7` — `using AtomUI.Utils;` -- `ListView/ListViewItem.cs:1` — `using AtomUI.Animations;` -- `ListView/ListViewItem.cs:2` — `using AtomUI.Controls;` -- `ListView/ListViewSelectionModel.cs:4` — `using AtomUI.Collections;` -- `ListView/ListViewSelectionModel.cs:5` — `using AtomUI.Desktop.Controls.Primitives;` -- `ListView/ListViewToken.cs:2` — `using AtomUI.Theme;` -- `ListView/ListViewToken.cs:3` — `using AtomUI.Theme.TokenSystem;` -- `MarqueeLabel/MarqueeLabel.cs:1` — `using AtomUI.Controls.Commons;` -- `MarqueeLabel/MarqueeLabel.cs:2` — `using AtomUI.Data;` -- `MarqueeLabel/MarqueeLabel.cs:3` — `using AtomUI.Desktop.Controls.DesignTokens;` -- `MarqueeLabel/MarqueeLabel.cs:4` — `using AtomUI.Theme;` -- `MarqueeLabel/MarqueeLabelToken.cs:1` — `using AtomUI.Desktop.Controls.DesignTokens;` -- `MarqueeLabel/MarqueeLabelToken.cs:2` — `using AtomUI.Theme;` -- `MarqueeLabel/MarqueeLabelToken.cs:3` — `using AtomUI.Theme.TokenSystem;` -- `Mentions/DataLoad/MentionOptionsLoadResult.cs:1` — `using AtomUI.Controls;` -- `Mentions/MentionTextArea.cs:1` — `using AtomUI.Desktop.Controls.Utils;` -- `Mentions/Mentions.cs:8` — `using AtomUI.Controls;` -- `Mentions/Mentions.cs:9` — `using AtomUI.Controls.Utils;` -- `Mentions/Mentions.cs:10` — `using AtomUI.Desktop.Controls.DataLoad;` -- `Mentions/Mentions.cs:11` — `using AtomUI.Desktop.Controls.Primitives;` -- `Mentions/Mentions.cs:12` — `using AtomUI.Desktop.Controls.Themes;` -- `Mentions/Mentions.cs:13` — `using AtomUI.Icons.AntDesign;` -- `Mentions/Mentions.cs:14` — `using AtomUI.Input;` -- `Mentions/Mentions.cs:15` — `using AtomUI.Theme;` -- `Mentions/MentionsToken.cs:1` — `using AtomUI.Desktop.Controls.DesignTokens;` -- `Mentions/MentionsToken.cs:2` — `using AtomUI.Theme;` -- `Mentions/MentionsToken.cs:3` — `using AtomUI.Theme.TokenSystem;` -- `Menu/ContextMenu.cs:3` — `using AtomUI.MotionScene;` -- `Menu/ContextMenu.cs:4` — `using AtomUI.Theme;` -- `Menu/ContextMenuReflectionExtensions.cs:4` — `using AtomUI.Reflection;` -- `Menu/MenuItem.cs:1` — `using AtomUI.Animations;` -- `Menu/MenuItem.cs:3` — `using AtomUI.Reflection;` -- `Menu/MenuItemData.cs:1` — `using AtomUI.Controls;` -- `Menu/MenuSeparator.cs:1` — `using AtomUI.Theme;` -- `Menu/MenuToken.cs:1` — `using AtomUI.Desktop.Controls.DesignTokens;` -- `Menu/MenuToken.cs:2` — `using AtomUI.Theme;` -- `Menu/MenuToken.cs:3` — `using AtomUI.Theme.Styling;` -- `Menu/MenuToken.cs:4` — `using AtomUI.Theme.TokenSystem;` -- `Menu/Themes/MenuItemTheme.cs:1` — `using AtomUI.Controls.Converters;` -- `Menu/Themes/MenuItemTheme.cs:2` — `using AtomUI.Desktop.Controls.Converters;` -- `Message/MessageCard.cs:2` — `using AtomUI.Icons.AntDesign;` -- `Message/MessageCard.cs:3` — `using AtomUI.MotionScene;` -- `Message/MessageCard.cs:4` — `using AtomUI.Theme;` -- `Message/MessageToken.cs:2` — `using AtomUI.Theme;` -- `Message/MessageToken.cs:3` — `using AtomUI.Theme.TokenSystem;` -- `Message/WindowMessageManager.cs:2` — `using AtomUI.Controls;` -- `Message/WindowMessageManager.cs:3` — `using AtomUI.Theme;` -- `MessageBox/MessageBox.cs:3` — `using AtomUI.Controls;` -- `MessageBox/MessageBox.cs:4` — `using AtomUI.Controls.Primitives;` -- `MessageBox/MessageBox.cs:5` — `using AtomUI.Data;` -- `MessageBox/MessageBox.cs:6` — `using AtomUI.Icons.AntDesign;` -- `MessageBox/MessageBox.cs:7` — `using AtomUI.Theme;` -- `MessageBox/MessageBoxToken.cs:1` — `using AtomUI.Desktop.Controls.DesignTokens;` -- `MessageBox/MessageBoxToken.cs:2` — `using AtomUI.Theme;` -- `MessageBox/MessageBoxToken.cs:3` — `using AtomUI.Theme.TokenSystem;` -- `NavMenu/DefaultNavMenuInteractionHandler.cs:1` — `using AtomUI.Input;` -- `NavMenu/Header/BaseNavMenuItemHeader.cs:1` — `using AtomUI.Animations;` -- `NavMenu/Header/BaseNavMenuItemHeader.cs:2` — `using AtomUI.Controls;` -- `NavMenu/Header/HorizontalNavMenuItemHeader.cs:1` — `using AtomUI.Animations;` -- `NavMenu/Header/HorizontalNavMenuItemHeader.cs:2` — `using AtomUI.Desktop.Controls.Themes;` -- `NavMenu/Header/InlineNavMenuItemHeader.cs:1` — `using AtomUI.Animations;` -- `NavMenu/INavMenu.cs:1` — `using AtomUI.Controls.Primitives;` -- `NavMenu/INavMenuItem.cs:1` — `using AtomUI.Controls;` -- `NavMenu/InlineNavMenuInteractionHandler.cs:1` — `using AtomUI.Input;` -- `NavMenu/NavMenu.cs:4` — `using AtomUI.Controls;` -- `NavMenu/NavMenu.cs:5` — `using AtomUI.Controls.Primitives;` -- `NavMenu/NavMenu.cs:6` — `using AtomUI.Data;` -- `NavMenu/NavMenu.cs:7` — `using AtomUI.Theme;` -- `NavMenu/NavMenuItem.cs:2` — `using AtomUI.Controls;` -- `NavMenu/NavMenuItem.cs:3` — `using AtomUI.Data;` -- `NavMenu/NavMenuItem.cs:4` — `using AtomUI.Desktop.Controls.Themes;` -- `NavMenu/NavMenuItem.cs:5` — `using AtomUI.Exceptions;` -- `NavMenu/NavMenuItem.cs:6` — `using AtomUI.Input;` -- `NavMenu/NavMenuItem.cs:7` — `using AtomUI.MotionScene;` -- `NavMenu/NavMenuNode.cs:2` — `using AtomUI.Controls;` -- `NavMenu/NavMenuToken.cs:2` — `using AtomUI.Media;` -- `NavMenu/NavMenuToken.cs:3` — `using AtomUI.Theme;` -- `NavMenu/NavMenuToken.cs:4` — `using AtomUI.Theme.TokenSystem;` -- `NavMenu/Themes/BaseNavMenuItemHeaderTheme.cs:1` — `using AtomUI.Controls.Converters;` -- `Notifications/NotificationCard.cs:2` — `using AtomUI.Icons.AntDesign;` -- `Notifications/NotificationCard.cs:3` — `using AtomUI.MotionScene;` -- `Notifications/NotificationCard.cs:4` — `using AtomUI.Theme;` -- `Notifications/NotificationMotions.cs:1` — `using AtomUI.MotionScene;` -- `Notifications/NotificationToken.cs:2` — `using AtomUI.Theme;` -- `Notifications/NotificationToken.cs:3` — `using AtomUI.Theme.TokenSystem;` -- `Notifications/WindowNotificationManager.cs:2` — `using AtomUI.Controls;` -- `Notifications/WindowNotificationManager.cs:3` — `using AtomUI.Theme;` -- `NumericUpDown/NumericUpDown.cs:4` — `using AtomUI.Controls.Commons;` -- `NumericUpDown/NumericUpDown.cs:5` — `using AtomUI.Icons.AntDesign;` -- `NumericUpDown/NumericUpDown.cs:6` — `using AtomUI.Theme;` -- `NumericUpDown/NumericUpDownToken.cs:2` — `using AtomUI.Theme;` -- `NumericUpDown/NumericUpDownToken.cs:3` — `using AtomUI.Theme.TokenSystem;` -- `OptionButtonGroup/OptionButton.cs:1` — `using AtomUI.Controls.Commons;` -- `OptionButtonGroup/OptionButton.cs:2` — `using AtomUI.Theme;` -- `OptionButtonGroup/OptionButtonGroup.cs:1` — `using AtomUI.Controls.Commons;` -- `OptionButtonGroup/OptionButtonGroup.cs:2` — `using AtomUI.Theme;` -- `OptionButtonGroup/OptionButtonToken.cs:1` — `using AtomUI.Desktop.Controls.DesignTokens;` -- `OptionButtonGroup/OptionButtonToken.cs:2` — `using AtomUI.Theme;` -- `OptionButtonGroup/OptionButtonToken.cs:3` — `using AtomUI.Theme.Styling;` -- `OptionButtonGroup/OptionButtonToken.cs:4` — `using AtomUI.Theme.TokenSystem;` -- `OptionButtonGroup/OptionButtonToken.cs:5` — `using AtomUI.Utils;` -- `Pagination/AbstractPagination.cs:1` — `using AtomUI.Controls;` -- `Pagination/Localization/en_US.cs:2` — `using AtomUI.Desktop.Controls.Localization;` -- `Pagination/Localization/en_US.cs:3` — `using AtomUI.Theme.Language;` -- `Pagination/Localization/zh_CN.cs:2` — `using AtomUI.Theme.Language;` -- `Pagination/Pagination.cs:2` — `using AtomUI.Data;` -- `Pagination/Pagination.cs:3` — `using AtomUI.Icons.AntDesign;` -- `Pagination/Pagination.cs:4` — `using AtomUI.Theme;` -- `Pagination/PaginationNav.cs:1` — `using AtomUI.Controls;` -- `Pagination/PaginationNavItem.cs:1` — `using AtomUI.Animations;` -- `Pagination/PaginationNavItem.cs:3` — `using AtomUI.Controls;` -- `Pagination/PaginationToken.cs:1` — `using AtomUI.Desktop.Controls.DesignTokens;` -- `Pagination/PaginationToken.cs:2` — `using AtomUI.Theme;` -- `Pagination/PaginationToken.cs:3` — `using AtomUI.Theme.TokenSystem;` -- `Pagination/QuickJumperBar.cs:1` — `using AtomUI.Controls;` -- `Pagination/SimplePagination.cs:2` — `using AtomUI.Theme;` -- `Popup/Popup.cs:4` — `using AtomUI.Data;` -- `Popup/Popup.cs:5` — `using AtomUI.Desktop.Controls.DesignTokens;` -- `Popup/Popup.cs:6` — `using AtomUI.Media;` -- `Popup/Popup.cs:7` — `using AtomUI.MotionScene;` -- `Popup/Popup.cs:8` — `using AtomUI.Theme.Styling;` -- `Popup/Popup.cs:9` — `using AtomUI.Utils;` -- `Popup/PopupHostToken.cs:1` — `using AtomUI.Desktop.Controls.DesignTokens;` -- `Popup/PopupHostToken.cs:2` — `using AtomUI.Media;` -- `Popup/PopupHostToken.cs:3` — `using AtomUI.Theme.TokenSystem;` -- `Popup/PopupMotionActor.cs:1` — `using AtomUI.Controls.Primitives;` -- `Popup/PopupReflectionExtensions.cs:5` — `using AtomUI.Reflection;` -- `Popup/PopupUtils.cs:2` — `using AtomUI.MotionScene;` -- `Popup/PopupUtils.cs:3` — `using AtomUI.Utils;` -- `Popup/ShadowsAwareContainer.cs:1` — `using AtomUI.Controls;` -- `Popup/ShadowsAwareContainer.cs:2` — `using AtomUI.Data;` -- `Popup/ShadowsAwareContainer.cs:3` — `using AtomUI.Media;` -- `PopupConfirm/PopupConfirmContainer.cs:2` — `using AtomUI.Theme;` -- `PopupConfirm/PopupConfirmFlyout.cs:3` — `using AtomUI.Data;` -- `PopupConfirm/PopupConfirmToken.cs:2` — `using AtomUI.Theme;` -- `PopupConfirm/PopupConfirmToken.cs:3` — `using AtomUI.Theme.TokenSystem;` -- `Primitives/AddOnDecoratedBox/AddOnDecoratedBox.cs:1` — `using AtomUI.Animations;` -- `Primitives/AddOnDecoratedBox/AddOnDecoratedBox.cs:2` — `using AtomUI.Controls;` -- `Primitives/AddOnDecoratedBox/AddOnDecoratedBox.cs:3` — `using AtomUI.Desktop.Controls.Primitives.Themes;` -- `Primitives/AddOnDecoratedBox/AddOnDecoratedBoxToken.cs:2` — `using AtomUI.Theme;` -- `Primitives/AddOnDecoratedBox/AddOnDecoratedBoxToken.cs:3` — `using AtomUI.Theme.TokenSystem;` -- `Primitives/AddOnDecoratedBox/IAddOnDecoratedBox.cs:1` — `using AtomUI.Controls;` -- `Primitives/ArrowDecoratedBox/ArrowDecoratedBox.cs:2` — `using AtomUI.Theme;` -- `Primitives/ArrowDecoratedBox/ArrowDecoratedBoxToken.cs:2` — `using AtomUI.Media;` -- `Primitives/ArrowDecoratedBox/ArrowDecoratedBoxToken.cs:3` — `using AtomUI.Theme;` -- `Primitives/ArrowDecoratedBox/ArrowDecoratedBoxToken.cs:4` — `using AtomUI.Theme.TokenSystem;` -- `Primitives/CandidateList/CandidateList.cs:1` — `using AtomUI.Controls;` -- `Primitives/CandidateList/CandidateList.cs:2` — `using AtomUI.Controls.Data;` -- `Primitives/CandidateList/CandidateList.cs:3` — `using AtomUI.Desktop.Controls.Themes;` -- `Primitives/IndicatorScrollViewer/IndicatorScrollViewer.cs:1` — `using AtomUI.Animations;` -- `Primitives/IndicatorScrollViewer/IndicatorScrollViewer.cs:2` — `using AtomUI.Theme;` -- `Primitives/IndicatorScrollViewer/IndicatorScrollViewerToken.cs:1` — `using AtomUI.Desktop.Controls.Primitives.DesignTokens;` -- `Primitives/IndicatorScrollViewer/IndicatorScrollViewerToken.cs:2` — `using AtomUI.Theme;` -- `Primitives/IndicatorScrollViewer/IndicatorScrollViewerToken.cs:3` — `using AtomUI.Theme.TokenSystem;` -- `Primitives/InfoPickerInput/InfoPickerInput.cs:3` — `using AtomUI.Desktop.Controls.Primitives.Themes;` -- `Primitives/InfoPickerInput/InfoPickerInput.cs:4` — `using AtomUI.Theme;` -- `Primitives/InfoPickerInput/InfoPickerInputToken.cs:2` — `using AtomUI.Theme;` -- `Primitives/InfoPickerInput/InfoPickerInputToken.cs:3` — `using AtomUI.Theme.TokenSystem;` -- `Primitives/InfoPickerInput/PickerClearUpButton.cs:2` — `using AtomUI.Desktop.Controls.Primitives.Themes;` -- `Primitives/InfoPickerInput/RangeInfoPickerInput.cs:2` — `using AtomUI.Desktop.Controls.Primitives.Themes;` -- `Primitives/SizeTypeAwareIconPresenter/SizeTypeAwareIconPresenter.cs:1` — `using AtomUI.Controls;` -- `ProgressBar/CircleProgress.cs:1` — `using AtomUI.Controls.Commons;` -- `ProgressBar/CircleProgress.cs:2` — `using AtomUI.Theme;` -- `ProgressBar/DashboardProgress.cs:1` — `using AtomUI.Controls.Commons;` -- `ProgressBar/DashboardProgress.cs:2` — `using AtomUI.Theme;` -- `ProgressBar/ProgressBar.cs:1` — `using AtomUI.Controls.Commons;` -- `ProgressBar/ProgressBar.cs:2` — `using AtomUI.Theme;` -- `ProgressBar/ProgressBarToken.cs:1` — `using AtomUI.Desktop.Controls.DesignTokens;` -- `ProgressBar/ProgressBarToken.cs:2` — `using AtomUI.Theme;` -- `ProgressBar/ProgressBarToken.cs:3` — `using AtomUI.Theme.TokenSystem;` -- `ProgressBar/StepsProgressBar.cs:1` — `using AtomUI.Controls.Commons;` -- `ProgressBar/StepsProgressBar.cs:2` — `using AtomUI.Theme;` -- `QRCode/Localization/en_US.cs:2` — `using AtomUI.Theme.Language;` -- `QRCode/Localization/zh_CN.cs:2` — `using AtomUI.Theme.Language;` -- `QRCode/QRCode.cs:1` — `using AtomUI.Controls.Commons;` -- `QRCode/QRCode.cs:2` — `using AtomUI.Theme;` -- `QRCode/QRCodeToken.cs:2` — `using AtomUI.Theme;` -- `QRCode/QRCodeToken.cs:3` — `using AtomUI.Theme.TokenSystem;` -- `RadioButton/RadioButton.cs:1` — `using AtomUI.Controls.Commons;` -- `RadioButton/RadioButton.cs:2` — `using AtomUI.Theme;` -- `RadioButton/RadioButtonGroup.cs:1` — `using AtomUI.Controls.Commons;` -- `RadioButton/RadioButtonGroup.cs:2` — `using AtomUI.Theme;` -- `RadioButton/RadioButtonToken.cs:1` — `using AtomUI.Desktop.Controls.DesignTokens;` -- `RadioButton/RadioButtonToken.cs:2` — `using AtomUI.Theme;` -- `RadioButton/RadioButtonToken.cs:3` — `using AtomUI.Theme.TokenSystem;` -- `Rate/Rate.cs:1` — `using AtomUI.Controls.Commons;` -- `Rate/Rate.cs:2` — `using AtomUI.Theme;` -- `Rate/RateToken.cs:1` — `using AtomUI.Desktop.Controls.DesignTokens;` -- `Rate/RateToken.cs:2` — `using AtomUI.Theme;` -- `Rate/RateToken.cs:3` — `using AtomUI.Theme.Palette;` -- `Rate/RateToken.cs:4` — `using AtomUI.Theme.TokenSystem;` -- `Result/Result.cs:1` — `using AtomUI.Controls.Commons;` -- `Result/Result.cs:2` — `using AtomUI.Theme;` -- `Result/ResultToken.cs:1` — `using AtomUI.Desktop.Controls.DesignTokens;` -- `Result/ResultToken.cs:2` — `using AtomUI.Theme;` -- `Result/ResultToken.cs:3` — `using AtomUI.Theme.TokenSystem;` -- `ScrollViewer/ScrollBar.cs:1` — `using AtomUI.Controls;` -- `ScrollViewer/ScrollBar.cs:2` — `using AtomUI.Controls.Commons;` -- `ScrollViewer/ScrollBar.cs:3` — `using AtomUI.Theme;` -- `ScrollViewer/ScrollBarThumb.cs:1` — `using AtomUI.Controls.Commons;` -- `ScrollViewer/ScrollViewer.cs:1` — `using AtomUI.Controls.Commons;` -- `ScrollViewer/ScrollViewer.cs:2` — `using AtomUI.Theme;` -- `ScrollViewer/ScrollViewerToken.cs:1` — `using AtomUI.Desktop.Controls.DesignTokens;` -- `ScrollViewer/ScrollViewerToken.cs:2` — `using AtomUI.Media;` -- `ScrollViewer/ScrollViewerToken.cs:3` — `using AtomUI.Theme;` -- `ScrollViewer/ScrollViewerToken.cs:4` — `using AtomUI.Theme.TokenSystem;` -- `Segmented/Segmented.cs:1` — `using AtomUI.Controls.Commons;` -- `Segmented/Segmented.cs:2` — `using AtomUI.Theme;` -- `Segmented/SegmentedItem.cs:1` — `using AtomUI.Controls.Commons;` -- `Segmented/SegmentedItem.cs:2` — `using AtomUI.Theme;` -- `Segmented/SegmentedToken.cs:1` — `using AtomUI.Desktop.Controls.DesignTokens;` -- `Segmented/SegmentedToken.cs:2` — `using AtomUI.Theme;` -- `Segmented/SegmentedToken.cs:3` — `using AtomUI.Theme.TokenSystem;` -- `Select/AbstractSelect.cs:4` — `using AtomUI.Controls;` -- `Select/AbstractSelect.cs:5` — `using AtomUI.Desktop.Controls.Themes;` -- `Select/AbstractSelect.cs:6` — `using AtomUI.Icons.AntDesign;` -- `Select/DataLoad/SelectOptionsLoadResult.cs:1` — `using AtomUI.Controls;` -- `Select/Select.AsyncOptionsLoad.cs:1` — `using AtomUI.Controls;` -- `Select/Select.cs:2` — `using AtomUI.Controls.Utils;` -- `Select/Select.cs:3` — `using AtomUI.Desktop.Controls.Themes;` -- `Select/Select.cs:4` — `using AtomUI.Theme;` -- `Select/Select.cs:5` — `using AtomUI.Utils;` -- `Select/SelectCandidateList.cs:2` — `using AtomUI.Controls;` -- `Select/SelectCandidateList.cs:3` — `using AtomUI.Controls.Data;` -- `Select/SelectCandidateList.cs:4` — `using AtomUI.Desktop.Controls.Primitives;` -- `Select/SelectCandidateList.cs:5` — `using AtomUI.Desktop.Controls.Themes;` -- `Select/SelectHandle.cs:1` — `using AtomUI.Controls;` -- `Select/SelectOption.cs:1` — `using AtomUI.Controls.Data;` -- `Select/SelectResultOptionsBox.cs:1` — `using AtomUI.Controls;` -- `Select/SelectTag.cs:1` — `using AtomUI.Controls;` -- `Select/SelectTagAwareTextBox.cs:2` — `using AtomUI.Controls;` -- `Select/SelectToken.cs:1` — `using AtomUI.Desktop.Controls.DesignTokens;` -- `Select/SelectToken.cs:2` — `using AtomUI.Theme;` -- `Select/SelectToken.cs:3` — `using AtomUI.Theme.TokenSystem;` -- `Separator/Separator.cs:1` — `using AtomUI.Controls.Commons;` -- `Separator/Separator.cs:2` — `using AtomUI.Theme;` -- `Separator/SeparatorToken.cs:2` — `using AtomUI.Theme;` -- `Separator/SeparatorToken.cs:3` — `using AtomUI.Theme.TokenSystem;` -- `Skeleton/AbstractSkeleton.cs:2` — `using AtomUI.Animations;` -- `Skeleton/AbstractSkeleton.cs:3` — `using AtomUI.Controls;` -- `Skeleton/AbstractSkeleton.cs:4` — `using AtomUI.Data;` -- `Skeleton/Skeleton.cs:2` — `using AtomUI.Controls;` -- `Skeleton/Skeleton.cs:3` — `using AtomUI.Theme;` -- `Skeleton/SkeletonAvatar.cs:1` — `using AtomUI.Controls;` -- `Skeleton/SkeletonAvatar.cs:2` — `using AtomUI.Theme;` -- `Skeleton/SkeletonButton.cs:1` — `using AtomUI.Theme;` -- `Skeleton/SkeletonElement.cs:1` — `using AtomUI.Controls;` -- `Skeleton/SkeletonInput.cs:1` — `using AtomUI.Theme;` -- `Skeleton/SkeletonParagraph.cs:1` — `using AtomUI.Theme;` -- `Skeleton/SkeletonTitle.cs:1` — `using AtomUI.Theme;` -- `Skeleton/SkeletonToken.cs:1` — `using AtomUI.Desktop.Controls.DesignTokens;` -- `Skeleton/SkeletonToken.cs:2` — `using AtomUI.Theme;` -- `Skeleton/SkeletonToken.cs:3` — `using AtomUI.Theme.TokenSystem;` -- `Slider/Slider.cs:2` — `using AtomUI.Controls;` -- `Slider/Slider.cs:3` — `using AtomUI.Input;` -- `Slider/Slider.cs:4` — `using AtomUI.Media;` -- `Slider/Slider.cs:5` — `using AtomUI.Theme;` -- `Slider/Slider.cs:6` — `using AtomUI.Utils;` -- `Slider/SliderThumb.cs:2` — `using AtomUI.Controls;` -- `Slider/SliderToken.cs:2` — `using AtomUI.Media;` -- `Slider/SliderToken.cs:3` — `using AtomUI.Theme;` -- `Slider/SliderToken.cs:4` — `using AtomUI.Theme.TokenSystem;` -- `Slider/SliderTrack.cs:2` — `using AtomUI.Animations;` -- `Slider/SliderTrack.cs:4` — `using AtomUI.Controls;` -- `Slider/SliderTrack.cs:5` — `using AtomUI.Media;` -- `Slider/SliderTrack.cs:6` — `using AtomUI.Utils;` -- `Space/CompactSpace.cs:3` — `using AtomUI.Controls;` -- `Space/CompactSpace.cs:4` — `using AtomUI.Reflection;` -- `Space/CompactSpace.cs:5` — `using AtomUI.Theme;` -- `Space/CompactSpaceAddOn.cs:1` — `using AtomUI.Controls;` -- `Space/CompactSpaceAddOn.cs:2` — `using AtomUI.Theme;` -- `Space/CompactSpaceItem.cs:2` — `using AtomUI.Data;` -- `Space/CompactSpaceSize.cs:2` — `using AtomUI.Utils;` -- `Space/Space.cs:5` — `using AtomUI.Controls;` -- `Space/Space.cs:6` — `using AtomUI.Data;` -- `Space/Space.cs:7` — `using AtomUI.Desktop.Controls.DesignTokens;` -- `Space/Space.cs:8` — `using AtomUI.Theme;` -- `Space/Space.cs:9` — `using AtomUI.Utils;` -- `Space/SpaceToken.cs:1` — `using AtomUI.Desktop.Controls.DesignTokens;` -- `Space/SpaceToken.cs:2` — `using AtomUI.Theme;` -- `Space/SpaceToken.cs:3` — `using AtomUI.Theme.TokenSystem;` -- `Spin/Spin.cs:1` — `using AtomUI.Controls.Commons;` -- `Spin/Spin.cs:2` — `using AtomUI.Theme;` -- `Spin/SpinIndicator.cs:1` — `using AtomUI.Controls.Commons;` -- `Spin/SpinIndicator.cs:2` — `using AtomUI.Theme;` -- `Spin/SpinToken.cs:2` — `using AtomUI.Theme;` -- `Spin/SpinToken.cs:3` — `using AtomUI.Theme.TokenSystem;` -- `SplitView/SplitView.cs:1` — `using AtomUI.Animations;` -- `SplitView/SplitView.cs:3` — `using AtomUI.Theme;` -- `SplitView/SplitViewToken.cs:1` — `using AtomUI.Desktop.Controls.DesignTokens;` -- `SplitView/SplitViewToken.cs:2` — `using AtomUI.Theme;` -- `SplitView/SplitViewToken.cs:3` — `using AtomUI.Theme.TokenSystem;` -- `Splitter/Splitter.cs:3` — `using AtomUI.Theme;` -- `Splitter/SplitterHandle.cs:1` — `using AtomUI.Controls;` -- `Splitter/SplitterHandle.cs:2` — `using AtomUI.Icons.AntDesign;` -- `Splitter/SplitterPanel.cs:2` — `using AtomUI.Controls;` -- `Splitter/SplitterPanel.cs:3` — `using AtomUI.Data;` -- `Splitter/SplitterPanel.cs:4` — `using AtomUI.Desktop.Controls.DesignTokens;` -- `Splitter/SplitterToken.cs:1` — `using AtomUI.Desktop.Controls.DesignTokens;` -- `Splitter/SplitterToken.cs:2` — `using AtomUI.Theme;` -- `Splitter/SplitterToken.cs:3` — `using AtomUI.Theme.TokenSystem;` -- `Statistic/AbstractStatistic.cs:1` — `using AtomUI.Controls;` -- `Statistic/AbstractStatistic.cs:2` — `using AtomUI.Reflection;` -- `Statistic/AbstractStatistic.cs:3` — `using AtomUI.Theme;` -- `Statistic/StatisticCountUp.cs:1` — `using AtomUI.Theme;` -- `Statistic/StatisticToken.cs:1` — `using AtomUI.Desktop.Controls.DesignTokens;` -- `Statistic/StatisticToken.cs:2` — `using AtomUI.Theme;` -- `Statistic/StatisticToken.cs:3` — `using AtomUI.Theme.TokenSystem;` -- `Steps/Steps.cs:3` — `using AtomUI.Controls;` -- `Steps/Steps.cs:4` — `using AtomUI.Theme;` -- `Steps/StepsItem.cs:1` — `using AtomUI.Animations;` -- `Steps/StepsItem.cs:2` — `using AtomUI.Controls;` -- `Steps/StepsItemIndicator.cs:1` — `using AtomUI.Animations;` -- `Steps/StepsItemIndicator.cs:3` — `using AtomUI.Controls;` -- `Steps/StepsItemIndicator.cs:4` — `using AtomUI.Media;` -- `Steps/StepsToken.cs:1` — `using AtomUI.Desktop.Controls.DesignTokens;` -- `Steps/StepsToken.cs:2` — `using AtomUI.Theme;` -- `Steps/StepsToken.cs:3` — `using AtomUI.Theme.TokenSystem;` -- `Switch/ToggleSwitch.cs:1` — `using AtomUI.Animations;` -- `Switch/ToggleSwitch.cs:2` — `using AtomUI.Controls;` -- `Switch/ToggleSwitch.cs:3` — `using AtomUI.Theme;` -- `Switch/ToggleSwitchToken.cs:1` — `using AtomUI.Desktop.Controls.DesignTokens;` -- `Switch/ToggleSwitchToken.cs:2` — `using AtomUI.Media;` -- `Switch/ToggleSwitchToken.cs:3` — `using AtomUI.Theme;` -- `Switch/ToggleSwitchToken.cs:4` — `using AtomUI.Theme.TokenSystem;` -- `TabControl/BaseTabControl.cs:3` — `using AtomUI.Controls;` -- `TabControl/BaseTabControl.cs:4` — `using AtomUI.Theme;` -- `TabControl/ScrollContentPresenterReflectionExtensions.cs:4` — `using AtomUI.Reflection;` -- `TabControl/TabControlToken.cs:2` — `using AtomUI.Theme;` -- `TabControl/TabControlToken.cs:3` — `using AtomUI.Theme.TokenSystem;` -- `TabControl/TabItem.cs:1` — `using AtomUI.Animations;` -- `TabControl/TabItem.cs:3` — `using AtomUI.Controls;` -- `TabControl/TabItem.cs:4` — `using AtomUI.Controls.Utils;` -- `TabControl/TabItem.cs:5` — `using AtomUI.Icons.AntDesign;` -- `TabControl/TabItemData.cs:1` — `using AtomUI.Controls;` -- `TabControl/TabStrip/BaseTabStrip.cs:2` — `using AtomUI.Theme;` -- `TabControl/TabStrip/TabStripItem.cs:2` — `using AtomUI.Animations;` -- `TabControl/TabStrip/TabStripItem.cs:4` — `using AtomUI.Controls.Utils;` -- `TabControl/TabStrip/TabStripItem.cs:5` — `using AtomUI.Icons.AntDesign;` -- `TabControl/Themes/BaseTabItemTheme.cs:1` — `using AtomUI.Controls.Converters;` -- `TabControl/Themes/TabStrip/BaseTabStripItemTheme.cs:1` — `using AtomUI.Controls.Converters;` -- `Tag/Tag.cs:1` — `using AtomUI.Controls.Commons;` -- `Tag/Tag.cs:2` — `using AtomUI.Theme;` -- `Tag/TagToken.cs:1` — `using AtomUI.Desktop.Controls.DesignTokens;` -- `Tag/TagToken.cs:2` — `using AtomUI.Media;` -- `Tag/TagToken.cs:3` — `using AtomUI.Theme;` -- `Tag/TagToken.cs:4` — `using AtomUI.Theme.TokenSystem;` -- `TextBlock/HyperLinkTextBlock.cs:2` — `using AtomUI.Animations;` -- `TextBlock/HyperLinkTextBlock.cs:3` — `using AtomUI.Controls;` -- `TextBlock/SelectableTextBlock.cs:1` — `using AtomUI.Data;` -- `TextBlock/SelectableTextBlock.cs:2` — `using AtomUI.Media.TextFormatting;` -- `TextBlock/SelectableTextBlock.cs:3` — `using AtomUI.Theme.Styling;` -- `TextBlock/SelectableTextBlock.cs:4` — `using AtomUI.Utils;` -- `TextBlock/TextBlockReflectionExtensions.cs:4` — `using AtomUI.Reflection;` -- `ThemeManagerBuilderExtensions.cs:2` — `using AtomUI.Controls;` -- `ThemeManagerBuilderExtensions.cs:3` — `using AtomUI.MotionScene;` -- `ThemeManagerBuilderExtensions.cs:4` — `using AtomUI.Theme;` -- `ThemeManagerBuilderExtensions.cs:5` — `using AtomUI.Theme.Language;` -- `TimePicker/Localization/en_US.cs:2` — `using AtomUI.Theme.Language;` -- `TimePicker/Localization/zh_CN.cs:2` — `using AtomUI.Theme.Language;` -- `TimePicker/RangeTimePicker.cs:2` — `using AtomUI.Desktop.Controls.Primitives;` -- `TimePicker/RangeTimePicker.cs:3` — `using AtomUI.Icons.AntDesign;` -- `TimePicker/RangeTimePicker.cs:4` — `using AtomUI.Media;` -- `TimePicker/RangeTimePicker.cs:5` — `using AtomUI.Theme;` -- `TimePicker/TimePicker.cs:2` — `using AtomUI.Controls.Utils;` -- `TimePicker/TimePicker.cs:3` — `using AtomUI.Data;` -- `TimePicker/TimePicker.cs:4` — `using AtomUI.Desktop.Controls.Primitives;` -- `TimePicker/TimePicker.cs:5` — `using AtomUI.Icons.AntDesign;` -- `TimePicker/TimePicker.cs:6` — `using AtomUI.Media;` -- `TimePicker/TimePicker.cs:7` — `using AtomUI.Theme;` -- `TimePicker/TimePickerToken.cs:2` — `using AtomUI.Theme;` -- `TimePicker/TimePickerToken.cs:3` — `using AtomUI.Theme.TokenSystem;` -- `TimePicker/TimeView/DateTimePickerPanel.cs:3` — `using AtomUI.Data;` -- `TimePicker/TimeView/DateTimePickerPanel.cs:4` — `using AtomUI.Desktop.Controls.Localization;` -- `TimePicker/TimeView/DateTimePickerPanel.cs:5` — `using AtomUI.Utils;` -- `TimePicker/TimeView/TimeView.cs:2` — `using AtomUI.Controls;` -- `TimePicker/TimeView/TimeView.cs:3` — `using AtomUI.Controls.Utils;` -- `TimePicker/TimeView/TimeView.cs:4` — `using AtomUI.Data;` -- `TimePicker/TimeView/TimeView.cs:5` — `using AtomUI.Theme.Styling;` -- `TimePicker/TimeView/TimeViewCell.cs:1` — `using AtomUI.Animations;` -- `Timeline/Timeline.cs:1` — `using AtomUI.Controls;` -- `Timeline/Timeline.cs:2` — `using AtomUI.Controls.Commons;` -- `Timeline/Timeline.cs:3` — `using AtomUI.Icons.AntDesign;` -- `Timeline/Timeline.cs:4` — `using AtomUI.Theme;` -- `Timeline/TimelineItem.cs:1` — `using AtomUI.Controls.Commons;` -- `Timeline/TimelineItem.cs:2` — `using AtomUI.Theme;` -- `Timeline/TimelineToken.cs:1` — `using AtomUI.Desktop.Controls.DesignTokens;` -- `Timeline/TimelineToken.cs:2` — `using AtomUI.Theme;` -- `Timeline/TimelineToken.cs:3` — `using AtomUI.Theme.TokenSystem;` -- `Tooltip/ToolTip.cs:3` — `using AtomUI.Controls;` -- `Tooltip/ToolTip.cs:4` — `using AtomUI.Theme.Palette;` -- `Tooltip/ToolTipService.cs:2` — `using AtomUI.Controls;` -- `Tooltip/ToolTipService.cs:3` — `using AtomUI.Input;` -- `Tooltip/ToolTipToken.cs:2` — `using AtomUI.Media;` -- `Tooltip/ToolTipToken.cs:3` — `using AtomUI.Theme;` -- `Tooltip/ToolTipToken.cs:4` — `using AtomUI.Theme.TokenSystem;` -- `TopLevel/TopLevelReflectionExtensions.cs:3` — `using AtomUI.Reflection;` -- `Tour/Localization/en_US.cs:2` — `using AtomUI.Theme.Language;` -- `Tour/Localization/zh_CN.cs:2` — `using AtomUI.Theme.Language;` -- `Tour/Tour.cs:4` — `using AtomUI.Controls;` -- `Tour/Tour.cs:5` — `using AtomUI.Data;` -- `Tour/Tour.cs:6` — `using AtomUI.Desktop.Controls.DesignTokens;` -- `Tour/Tour.cs:7` — `using AtomUI.Theme;` -- `Tour/TourIndicator.cs:1` — `using AtomUI.Controls;` -- `Tour/TourLayer.cs:1` — `using AtomUI.Controls.Primitives;` -- `Tour/TourStep.cs:1` — `using AtomUI.Controls;` -- `Tour/TourStepsView.cs:1` — `using AtomUI.Controls;` -- `Tour/TourStepsView.cs:2` — `using AtomUI.Data;` -- `Tour/TourToken.cs:1` — `using AtomUI.Desktop.Controls.DesignTokens;` -- `Tour/TourToken.cs:2` — `using AtomUI.Media;` -- `Tour/TourToken.cs:3` — `using AtomUI.Theme;` -- `Tour/TourToken.cs:4` — `using AtomUI.Theme.TokenSystem;` -- `Transfer/AbstractTransfer.cs:1` — `using AtomUI.Controls;` -- `Transfer/AbstractTransfer.cs:2` — `using AtomUI.Controls.Utils;` -- `Transfer/AbstractTransfer.cs:3` — `using AtomUI.Icons.AntDesign;` -- `Transfer/AbstractTransfer.cs:4` — `using AtomUI.Theme;` -- `Transfer/ITransferTreeView.cs:1` — `using AtomUI.Controls;` -- `Transfer/ITransferView.cs:2` — `using AtomUI.Controls;` -- `Transfer/ListTransfer.cs:1` — `using AtomUI.Controls;` -- `Transfer/Localization/en_US.cs:2` — `using AtomUI.Theme.Language;` -- `Transfer/Localization/zh_CN.cs:2` — `using AtomUI.Theme.Language;` -- `Transfer/TransferItemDecorator.cs:2` — `using AtomUI.Controls;` -- `Transfer/TransferItemDecorator.cs:3` — `using AtomUI.Data;` -- `Transfer/TransferItemsRemovedEventArgs.cs:1` — `using AtomUI.Controls;` -- `Transfer/TransferListView.cs:3` — `using AtomUI.Controls.Data;` -- `Transfer/TransferListViewSelectionModel.cs:4` — `using AtomUI.Collections;` -- `Transfer/TransferListViewSelectionModel.cs:5` — `using AtomUI.Controls.Data;` -- `Transfer/TransferListViewSelectionModel.cs:6` — `using AtomUI.Desktop.Controls.Primitives;` -- `Transfer/TransferSelectDropdown.cs:2` — `using AtomUI.Data;` -- `Transfer/TransferSelectionChangedEventArgs.cs:1` — `using AtomUI.Controls;` -- `Transfer/TransferToken.cs:1` — `using AtomUI.Desktop.Controls.DesignTokens;` -- `Transfer/TransferToken.cs:2` — `using AtomUI.Theme;` -- `Transfer/TransferToken.cs:3` — `using AtomUI.Theme.TokenSystem;` -- `Transfer/TransferTreeView.cs:2` — `using AtomUI.Controls;` -- `Transfer/TreeTransfer.cs:1` — `using AtomUI.Controls;` -- `Transfer/TreeTransfer.cs:2` — `using AtomUI.Controls.Data;` -- `TreeSelect/TreeSelect.cs:4` — `using AtomUI.Controls;` -- `TreeSelect/TreeSelect.cs:5` — `using AtomUI.Controls.Primitives;` -- `TreeSelect/TreeSelect.cs:6` — `using AtomUI.Theme;` -- `TreeSelect/TreeSelectToken.cs:1` — `using AtomUI.Desktop.Controls.DesignTokens;` -- `TreeSelect/TreeSelectToken.cs:2` — `using AtomUI.Theme;` -- `TreeSelect/TreeSelectToken.cs:3` — `using AtomUI.Theme.TokenSystem;` -- `TreeSelect/TreeSelectTreeView.cs:1` — `using AtomUI.Controls;` -- `TreeView/DataLoad/TreeItemLoadResult.cs:1` — `using AtomUI.Controls;` -- `TreeView/DefaultTreeViewInteractionHandler.cs:1` — `using AtomUI.Controls;` -- `TreeView/DragPreviewAdorner.cs:2` — `using AtomUI.Desktop.Controls.DesignTokens;` -- `TreeView/ITreeItemNode.cs:1` — `using AtomUI.Controls;` -- `TreeView/NodeSwitcherButton.cs:3` — `using AtomUI.Animations;` -- `TreeView/NodeSwitcherButton.cs:4` — `using AtomUI.Controls;` -- `TreeView/NodeSwitcherButton.cs:5` — `using AtomUI.Controls.Utils;` -- `TreeView/NodeSwitcherButton.cs:6` — `using AtomUI.Icons.AntDesign;` -- `TreeView/TreeItemNode.cs:2` — `using AtomUI.Controls;` -- `TreeView/TreeView.DragAndDrop.cs:2` — `using AtomUI.Controls;` -- `TreeView/TreeView.DragAndDrop.cs:3` — `using AtomUI.Utils;` -- `TreeView/TreeView.cs:6` — `using AtomUI.Controls.Primitives;` -- `TreeView/TreeView.cs:7` — `using AtomUI.MotionScene;` -- `TreeView/TreeView.cs:8` — `using AtomUI.Theme;` -- `TreeView/TreeViewItem.cs:3` — `using AtomUI.Controls.Utils;` -- `TreeView/TreeViewItem.cs:4` — `using AtomUI.MotionScene;` -- `TreeView/TreeViewItemHeader.cs:3` — `using AtomUI.Animations;` -- `TreeView/TreeViewItemHeader.cs:4` — `using AtomUI.Controls;` -- `TreeView/TreeViewToken.cs:2` — `using AtomUI.Theme;` -- `TreeView/TreeViewToken.cs:3` — `using AtomUI.Theme.TokenSystem;` -- `Upload/AbstractUploadListItem.cs:1` — `using AtomUI.Animations;` -- `Upload/AbstractUploadListItem.cs:2` — `using AtomUI.Controls;` -- `Upload/AbstractUploadPictureContent.cs:1` — `using AtomUI.Animations;` -- `Upload/AbstractUploadPictureContent.cs:2` — `using AtomUI.Controls;` -- `Upload/DefaultList/UploadTextListItemHeader.cs:1` — `using AtomUI.Animations;` -- `Upload/DefaultList/UploadTextListItemHeader.cs:2` — `using AtomUI.Controls;` -- `Upload/Localization/en_US.cs:2` — `using AtomUI.Theme.Language;` -- `Upload/Localization/zh_CN.cs:2` — `using AtomUI.Theme.Language;` -- `Upload/Upload.cs:4` — `using AtomUI.Controls;` -- `Upload/Upload.cs:5` — `using AtomUI.Theme;` -- `Upload/UploadDefaultDropArea.cs:1` — `using AtomUI.Animations;` -- `Upload/UploadDefaultDropArea.cs:3` — `using AtomUI.Controls;` -- `Upload/UploadDefaultDropArea.cs:4` — `using AtomUI.Icons.AntDesign;` -- `Upload/UploadEventArgs.cs:1` — `using AtomUI.Controls;` -- `Upload/UploadList.cs:1` — `using AtomUI.Controls;` -- `Upload/UploadTaskInfo.cs:1` — `using AtomUI.Controls;` -- `Upload/UploadToken.cs:1` — `using AtomUI.Desktop.Controls.DesignTokens;` -- `Upload/UploadToken.cs:2` — `using AtomUI.Theme;` -- `Upload/UploadToken.cs:3` — `using AtomUI.Theme.TokenSystem;` -- `Upload/UploadTriggerContent.cs:1` — `using AtomUI.Animations;` -- `Upload/UploadTriggerContent.cs:2` — `using AtomUI.Controls;` -- `Upload/UploadTriggerContent.cs:3` — `using AtomUI.Controls.Utils;` -- `Upload/UploadTriggerContent.cs:4` — `using AtomUI.Desktop.Controls.Utils;` -- `Upload/UploadTriggerContent.cs:5` — `using AtomUI.Input;` -- `Window/FullscreenPopoverLayer.cs:2` — `using AtomUI.Theme;` -- `Window/MacStandardWindowButtons.cs:2` — `using AtomUI.Native;` -- `Window/Window.cs:3` — `using AtomUI.Media;` -- `Window/Window.cs:4` — `using AtomUI.Native;` -- `Window/Window.cs:5` — `using AtomUI.Utils;` -- `Window/WindowMediaQueryIndicator.cs:1` — `using AtomUI.Controls;` -- `Window/WindowResizer.cs:1` — `using AtomUI.Controls;` -- `Window/WindowToken.cs:1` — `using AtomUI.Desktop.Controls.DesignTokens;` -- `Window/WindowToken.cs:2` — `using AtomUI.Theme.TokenSystem;` -- `WindowTitleBar/CaptionButton.cs:1` — `using AtomUI.Animations;` -- `WindowTitleBar/CaptionButton.cs:3` — `using AtomUI.Theme;` -- `WindowTitleBar/CaptionButtonGroup.cs:3` — `using AtomUI.Controls;` -- `WindowTitleBar/CaptionButtonGroup.cs:4` — `using AtomUI.Data;` -- `WindowTitleBar/CaptionButtonGroup.cs:5` — `using AtomUI.Native.Windows;` -- `WindowTitleBar/WindowTitleBar.cs:3` — `using AtomUI.Animations;` -- `WindowTitleBar/WindowTitleBar.cs:4` — `using AtomUI.Controls;` -- `WindowTitleBar/WindowTitleBar.cs:5` — `using AtomUI.Theme;` -- `WindowTitleBar/WindowTitleBarToken.cs:1` — `using AtomUI.Desktop.Controls.DesignTokens;` -- `WindowTitleBar/WindowTitleBarToken.cs:2` — `using AtomUI.Media;` -- `WindowTitleBar/WindowTitleBarToken.cs:3` — `using AtomUI.Theme;` -- `WindowTitleBar/WindowTitleBarToken.cs:4` — `using AtomUI.Theme.TokenSystem;` -- `WindowTitleBar/WindowsCaptionButton.cs:2` — `using AtomUI.Utils;` - -### AtomUI.Controls (84) - -- `Avatar/AbstractAvatar.cs:2` — `using AtomUI.Media;` -- `Badge/AbstractRibbonBadgeAdorner.cs:2` — `using AtomUI.Media;` -- `Badge/BadgeColorUtils.cs:1` — `using AtomUI.Theme.Palette;` -- `Buttons/AbstractHyperLinkButton.cs:1` — `using AtomUI.Animations;` -- `Buttons/AbstractIconButton.cs:3` — `using AtomUI.Animations;` -- `Buttons/AbstractIconButton.cs:4` — `using AtomUI.Reflection;` -- `CheckBox/CheckBoxIndicator.cs:2` — `using AtomUI.Controls.Primitives;` -- `CommonControlThemesProvider.cs:1` — `using AtomUI.Theme;` -- `FloatButton/AbstractBackTopFloatButton.cs:1` — `using AtomUI.Icons.AntDesign;` -- `FloatButton/AbstractBackTopFloatButton.cs:2` — `using AtomUI.MotionScene;` -- `FloatButton/AbstractFloatButton.cs:1` — `using AtomUI.Animations;` -- `FloatButton/AbstractFloatButton.cs:2` — `using AtomUI.Controls.Primitives;` -- `FloatButton/AbstractFloatButton.cs:3` — `using AtomUI.Icons.AntDesign;` -- `FloatButton/AbstractFloatButtonHost.cs:2` — `using AtomUI.Controls.Primitives;` -- `Form/FormSubmittedEventArgs.cs:1` — `using AtomUI.Controls;` -- `Grid/GridColSpanInfo.cs:3` — `using AtomUI.Controls;` -- `Grid/GridGutter.cs:3` — `using AtomUI.Controls;` -- `Grid/GridGutterInfo.cs:2` — `using AtomUI.Controls;` -- `Icon/IconPresenter.cs:2` — `using AtomUI.Data;` -- `Icon/IconToken.cs:1` — `using AtomUI.Controls.DesignTokens;` -- `Icon/IconToken.cs:2` — `using AtomUI.Theme.TokenSystem;` -- `ItemsControl/ItemCollectionReflectionExtensions.cs:3` — `using AtomUI.Reflection;` -- `ItemsControl/ItemsControlReflectionExtensions.cs:4` — `using AtomUI.Reflection;` -- `ItemsControl/ItemsSourceViewReflectionExtensions.cs:4` — `using AtomUI.Reflection;` -- `MarqueeLabel/AbstractMarqueeLabel.cs:1` — `using AtomUI.Utils;` -- `OptionButtonGroup/AbstractOptionButton.cs:2` — `using AtomUI.Animations;` -- `OptionButtonGroup/AbstractOptionButton.cs:3` — `using AtomUI.Controls.Primitives;` -- `OptionButtonGroup/AbstractOptionButton.cs:4` — `using AtomUI.Controls.Utils;` -- `OptionButtonGroup/AbstractOptionButton.cs:5` — `using AtomUI.Utils;` -- `OptionButtonGroup/AbstractOptionButtonGroup.cs:2` — `using AtomUI.Controls.Utils;` -- `OptionButtonGroup/OptionButtonPointerEventArgs.cs:1` — `using AtomUI.Controls.Commons;` -- `OptionButtonGroup/OptionCheckedChangedEventArgs.cs:1` — `using AtomUI.Controls.Commons;` -- `Primitives/DashedBorder.cs:1` — `using AtomUI.Controls.Utils;` -- `Primitives/Motions/LayoutAwareMotionActor.cs:1` — `using AtomUI.MotionScene;` -- `Primitives/Motions/MotionGhostControl.cs:2` — `using AtomUI.Controls.Utils;` -- `Primitives/Motions/MotionGhostControl.cs:3` — `using AtomUI.Media;` -- `Primitives/TextSearchReflectionExtensions.cs:4` — `using AtomUI.Controls.Utils;` -- `Primitives/TextSearchReflectionExtensions.cs:5` — `using AtomUI.Reflection;` -- `Primitives/TopLevelReflectionExtensions.cs:3` — `using AtomUI.Reflection;` -- `Primitives/VisualLayers/VisualLayerManagerReflectionExtensions.cs:4` — `using AtomUI.Reflection;` -- `ProgressBar/AbstractCircleProgress.cs:1` — `using AtomUI.Icons.AntDesign;` -- `ProgressBar/AbstractCircleProgress.cs:2` — `using AtomUI.Media;` -- `ProgressBar/AbstractCircleProgress.cs:3` — `using AtomUI.Utils;` -- `ProgressBar/AbstractGeneralCircleProgress.cs:1` — `using AtomUI.Media;` -- `ProgressBar/AbstractGeneralDashboardProgress.cs:1` — `using AtomUI.Media;` -- `ProgressBar/AbstractGeneralProgressBar.cs:1` — `using AtomUI.Data;` -- `ProgressBar/AbstractGeneralProgressBar.cs:2` — `using AtomUI.Media;` -- `ProgressBar/AbstractGeneralProgressBar.cs:3` — `using AtomUI.Utils;` -- `ProgressBar/AbstractGeneralProgressBar.cs:4` — `using AtomUI.Theme.Styling;` -- `ProgressBar/AbstractGeneralStepsProgressBar.cs:1` — `using AtomUI.Data;` -- `ProgressBar/AbstractGeneralStepsProgressBar.cs:2` — `using AtomUI.Theme.Styling;` -- `ProgressBar/AbstractGeneralStepsProgressBar.cs:3` — `using AtomUI.Utils;` -- `ProgressBar/AbstractLineProgress.cs:1` — `using AtomUI.Icons.AntDesign;` -- `ProgressBar/AbstractLineProgress.cs:2` — `using AtomUI.Media;` -- `ProgressBar/AbstractLineProgress.cs:3` — `using AtomUI.Utils;` -- `ProgressBar/AbstractProgressBar.cs:1` — `using AtomUI.Animations;` -- `ProgressBar/AbstractProgressBar.cs:2` — `using AtomUI.Utils;` -- `RadioButton/RadioIndicator.cs:2` — `using AtomUI.Controls.Primitives;` -- `RadioButton/RadioIndicator.cs:3` — `using AtomUI.Media;` -- `Rate/AbstractRate.cs:2` — `using AtomUI.Icons.AntDesign;` -- `Rate/AbstractRate.cs:3` — `using AtomUI.Utils;` -- `Rate/RateCharacter.cs:2` — `using AtomUI.Media;` -- `Rate/RateItem.cs:2` — `using AtomUI.Animations;` -- `Result/AbstractResult.cs:7` — `using AtomUI.Icons.AntDesign;` -- `ScrollViewer/AbstractScrollBarThumb.cs:1` — `using AtomUI.Animations;` -- `ScrollViewer/AbstractScrollViewer.cs:1` — `using AtomUI.Animations;` -- `ScrollViewer/ScrollBarReflectionExtensions.cs:4` — `using AtomUI.Reflection;` -- `Separator/AbstractSeparator.cs:2` — `using AtomUI.Utils;` -- `Spin/AbstractSpinIndicator.cs:2` — `using AtomUI.Utils;` -- `Switch/AbstractToggleSwitch.cs:2` — `using AtomUI.Animations;` -- `Switch/AbstractToggleSwitch.cs:3` — `using AtomUI.Controls.Primitives;` -- `Switch/AbstractToggleSwitch.cs:4` — `using AtomUI.Data;` -- `Switch/AbstractToggleSwitch.cs:5` — `using AtomUI.Media;` -- `Switch/AbstractToggleSwitch.cs:6` — `using AtomUI.Utils;` -- `Switch/SwitchKnob.cs:1` — `using AtomUI.Animations;` -- `Switch/SwitchKnob.cs:2` — `using AtomUI.Media;` -- `Switch/SwitchKnob.cs:3` — `using AtomUI.Utils;` -- `Tag/AbstractTag.cs:2` — `using AtomUI.Icons.AntDesign;` -- `Tag/AbstractTag.cs:3` — `using AtomUI.Theme;` -- `Tag/AbstractTag.cs:4` — `using AtomUI.Theme.Palette;` -- `ThemeManagerBuildExtensions.cs:1` — `using AtomUI.Theme;` -- `ThemeManagerBuildExtensions.cs:2` — `using AtomUI.Theme.Language;` -- `Watermark/Watermark.cs:3` — `using AtomUI.Controls.Primitives;` -- `Watermark/Watermark.cs:4` — `using AtomUI.Utils;` - -### AtomUI.Desktop.Controls.DataGrid (76) - -- `AtomUIDataGridThemesProvider.cs:1` — `using AtomUI.Theme;` -- `Cell/DataGridCell.cs:8` — `using AtomUI.Controls;` -- `Cell/DataGridCell.cs:9` — `using AtomUI.Data;` -- `Cell/DataGridCellsPresenter.cs:8` — `using AtomUI.Desktop.Controls.Utils;` -- `Cell/DataGridCellsPresenter.cs:9` — `using AtomUI.Utils;` -- `Column/DataGridAbstractTextColumn.cs:2` — `using AtomUI.Desktop.Controls.Utils;` -- `Column/DataGridBoundColumn.cs:7` — `using AtomUI.Desktop.Controls.Utils;` -- `Column/DataGridBoundColumn.cs:8` — `using AtomUI.Utils;` -- `Column/DataGridCheckBoxColumn.cs:8` — `using AtomUI.Desktop.Controls.Utils;` -- `Column/DataGridColumn.Privates.cs:8` — `using AtomUI.Desktop.Controls.Data;` -- `Column/DataGridColumn.cs:9` — `using AtomUI.Utils;` -- `Column/DataGridColumnGroupHeader.cs:1` — `using AtomUI.Controls;` -- `Column/DataGridColumnHeader.Filter.cs:7` — `using AtomUI.Desktop.Controls.Data;` -- `Column/DataGridColumnHeader.Sorting.cs:8` — `using AtomUI.Desktop.Controls.Data;` -- `Column/DataGridColumnHeader.Sorting.cs:9` — `using AtomUI.Desktop.Controls.Utils;` -- `Column/DataGridColumnHeader.cs:8` — `using AtomUI.Animations;` -- `Column/DataGridColumnHeader.cs:9` — `using AtomUI.Controls;` -- `Column/DataGridColumnHeader.cs:10` — `using AtomUI.Desktop.Controls.Utils;` -- `Column/DataGridColumnHeader.cs:11` — `using AtomUI.Utils;` -- `Column/DataGridHeaderViewItem.cs:1` — `using AtomUI.Data;` -- `Column/DataGridNumericColumn.cs:3` — `using AtomUI.Data;` -- `Column/DataGridOperationButtons.cs:2` — `using AtomUI.Controls;` -- `Column/DataGridRowExpander.cs:1` — `using AtomUI.Animations;` -- `Column/DataGridRowExpander.cs:2` — `using AtomUI.Controls;` -- `Column/DataGridRowExpander.cs:3` — `using AtomUI.Data;` -- `Column/DataGridRowReorderHandle.cs:3` — `using AtomUI.Animations;` -- `Column/DataGridRowReorderHandle.cs:4` — `using AtomUI.Controls;` -- `Column/DataGridRowReorderHandle.cs:5` — `using AtomUI.Desktop.Controls.Utils;` -- `Column/Filters/DataGridFilterIndicator.cs:3` — `using AtomUI.Controls;` -- `Column/Filters/DataGridFilterIndicator.cs:4` — `using AtomUI.Desktop.Controls.Data;` -- `Column/Filters/DataGridFilterIndicator.cs:5` — `using AtomUI.Data;` -- `Column/Filters/DataGridFilterIndicator.cs:6` — `using AtomUI.Desktop.Controls.Localization;` -- `Column/Filters/DataGridFilterIndicator.cs:7` — `using AtomUI.Icons.AntDesign;` -- `Column/Filters/DataGridMenuFilterFlyout.cs:1` — `using AtomUI.Controls;` -- `Column/Filters/DataGridMenuFilterFlyout.cs:2` — `using AtomUI.MotionScene;` -- `Column/Filters/DataGridTreeFilterFlyout.cs:1` — `using AtomUI.Controls;` -- `Column/Filters/DataGridTreeFilterFlyout.cs:2` — `using AtomUI.MotionScene;` -- `Data/DataGridCollectionView.cs:12` — `using AtomUI.Controls;` -- `Data/DataGridCollectionView.cs:13` — `using AtomUI.Utils;` -- `Data/DataGridDataConnection.cs:12` — `using AtomUI.Utils;` -- `Data/DataGridFilterDescription.cs:2` — `using AtomUI.Utils;` -- `Data/DataGridPathGroupDescription.cs:8` — `using AtomUI.Utils;` -- `Data/DataGridSortDescription.cs:9` — `using AtomUI.Utils;` -- `DataGrid.Columns.cs:12` — `using AtomUI.Desktop.Controls.Data;` -- `DataGrid.Columns.cs:13` — `using AtomUI.Desktop.Controls.Utils;` -- `DataGrid.Columns.cs:14` — `using AtomUI.Utils;` -- `DataGrid.Privates.cs:12` — `using AtomUI.Desktop.Controls.Data;` -- `DataGrid.Privates.cs:13` — `using AtomUI.Desktop.Controls.Utils;` -- `DataGrid.Privates.cs:14` — `using AtomUI.Utils;` -- `DataGrid.Rows.cs:10` — `using AtomUI.Desktop.Controls.Data;` -- `DataGrid.Rows.cs:11` — `using AtomUI.Utils;` -- `DataGrid.cs:9` — `using AtomUI.Controls;` -- `DataGrid.cs:10` — `using AtomUI.Desktop.Controls.Data;` -- `DataGrid.cs:11` — `using AtomUI.Theme;` -- `DataGrid.cs:12` — `using AtomUI.Utils;` -- `DataGridLength.cs:8` — `using AtomUI.Utils;` -- `DataGridToken.cs:1` — `using AtomUI.Desktop.Controls.DesignTokens;` -- `DataGridToken.cs:2` — `using AtomUI.Media;` -- `DataGridToken.cs:3` — `using AtomUI.Theme;` -- `DataGridToken.cs:4` — `using AtomUI.Theme.TokenSystem;` -- `IndexToValueTable.cs:7` — `using AtomUI.Desktop.Controls.Utils;` -- `Localization/en_US.cs:2` — `using AtomUI.Theme.Language;` -- `Localization/zh_CN.cs:2` — `using AtomUI.Theme.Language;` -- `Row/DataGridRow.Privates.cs:12` — `using AtomUI.Controls;` -- `Row/DataGridRow.Privates.cs:13` — `using AtomUI.Utils;` -- `Row/DataGridRow.cs:6` — `using AtomUI.Animations;` -- `Row/DataGridRow.cs:7` — `using AtomUI.Utils;` -- `Row/DataGridRowGroupHeader.cs:8` — `using AtomUI.Desktop.Controls.Utils;` -- `Row/DataGridRowGroupInfo.cs:6` — `using AtomUI.Desktop.Controls.Data;` -- `Row/DataGridRowsPresenter.cs:7` — `using AtomUI.Desktop.Controls.Data;` -- `Row/DataGridRowsPresenter.cs:8` — `using AtomUI.Utils;` -- `ThemeManagerBuilderExtensions.cs:1` — `using AtomUI.Theme;` -- `ThemeManagerBuilderExtensions.cs:2` — `using AtomUI.Theme.Language;` -- `Themes/DataGridTheme.cs:1` — `using AtomUI.Controls.Converters;` -- `Themes/DataGridTheme.cs:2` — `using AtomUI.Desktop.Controls.Converters;` -- `Utils/DataGridValueConverter.cs:7` — `using AtomUI.Utils;` - -### AtomUI.Core (51) - -- `Animations/AnimatableReflectionExtensions.cs:3` — `using AtomUI.Reflection;` -- `Animations/Transitions/AbstractNotifiableTransition.cs:2` — `using AtomUI.Utils;` -- `ApplicationExtensions.cs:2` — `using AtomUI.Theme.Language;` -- `ApplicationExtensions.cs:3` — `using AtomUI.Theme.Styling;` -- `Controls/AnimationUtils.cs:2` — `using AtomUI.Animations;` -- `Controls/AnimationUtils.cs:3` — `using AtomUI.Theme.Styling;` -- `Controls/FocusManagerReflectionExtensions.cs:3` — `using AtomUI.Reflection;` -- `Controls/ItemCollectionReflectionExtensions.cs:4` — `using AtomUI.Reflection;` -- `Controls/RawPointerEventTypeReflectionExtensions.cs:3` — `using AtomUI.Reflection;` -- `Controls/VisualReflectionExtensions.cs:4` — `using AtomUI.Reflection;` -- `Data/DynamicResourceReflectionExtension.cs:3` — `using AtomUI.Reflection;` -- `Data/SharedTokenResourceValue.cs:2` — `using AtomUI.Theme.Styling;` -- `Data/TokenFinderUtils.cs:2` — `using AtomUI.Theme;` -- `Data/TokenFinderUtils.cs:3` — `using AtomUI.Theme.TokenSystem;` -- `Dimension.cs:3` — `using AtomUI.Utils;` -- `Input/IInputRootRefectionExtensions.cs:3` — `using AtomUI.Reflection;` -- `Language/LanguageResourceExtension.cs:2` — `using AtomUI.Data;` -- `Media/ColorExtensions.cs:2` — `using AtomUI.Utils;` -- `Media/CommonShapeBuilder.cs:1` — `using AtomUI.Utils;` -- `Media/TextFormatting/TextParagraphPropertiesReflectionExtensions.cs:4` — `using AtomUI.Reflection;` -- `Media/TransformParser.cs:2` — `using AtomUI.Utils;` -- `Theme/ControlTokenResourcesHost.cs:2` — `using AtomUI.Data;` -- `Theme/IThemeConfigProvider.cs:1` — `using AtomUI.Theme.TokenSystem;` -- `Theme/IThemeManagerBuilder.cs:2` — `using AtomUI.Theme.Language;` -- `Theme/IThemeManagerBuilder.cs:3` — `using AtomUI.Theme.Styling;` -- `Theme/Palette/PaletteGenerator.cs:2` — `using AtomUI.Utils;` -- `Theme/Styling/AbstractThemeVariantCalculator.cs:2` — `using AtomUI.Theme.TokenSystem;` -- `Theme/Styling/DarkThemeVariantCalculator.cs:2` — `using AtomUI.Theme.Palette;` -- `Theme/Styling/DarkThemeVariantCalculator.cs:3` — `using AtomUI.Theme.TokenSystem;` -- `Theme/Styling/DefaultThemeVariantCalculator.cs:2` — `using AtomUI.Theme.Palette;` -- `Theme/Styling/DefaultThemeVariantCalculator.cs:3` — `using AtomUI.Theme.TokenSystem;` -- `Theme/Theme.cs:2` — `using AtomUI.Theme.Styling;` -- `Theme/Theme.cs:3` — `using AtomUI.Theme.TokenSystem;` -- `Theme/ThemeAlgorithm.cs:2` — `using AtomUI.Utils;` -- `Theme/ThemeConfigProvider.cs:2` — `using AtomUI.Theme.Styling;` -- `Theme/ThemeConfigProvider.cs:3` — `using AtomUI.Theme.TokenSystem;` -- `Theme/ThemeDefinitionReader.cs:3` — `using AtomUI.Theme.TokenSystem;` -- `Theme/ThemeManager.cs:2` — `using AtomUI.Controls;` -- `Theme/ThemeManager.cs:3` — `using AtomUI.Theme.Language;` -- `Theme/ThemeManager.cs:4` — `using AtomUI.Theme.Styling;` -- `Theme/ThemeManagerBuilder.cs:3` — `using AtomUI.Theme.Styling;` -- `Theme/TokenSystem/AbstractControlDesignToken.cs:3` — `using AtomUI.Theme.Styling;` -- `Theme/TokenSystem/AbstractDesignToken.cs:3` — `using AtomUI.Theme.Styling;` -- `Theme/TokenSystem/TokenDefinitions/DesignToken.cs:2` — `using AtomUI.Media;` -- `Theme/TokenSystem/TokenDefinitions/DesignToken.cs:3` — `using AtomUI.Theme.Palette;` -- `Theme/TokenSystem/TokenDefinitions/DesignToken.cs:4` — `using AtomUI.Theme.Styling;` -- `Utils/AvaloniaPropertyReflectionExtensions.cs:2` — `using AtomUI.Reflection;` -- `Utils/MotionAwareControlExtensions.cs:1` — `using AtomUI.Controls;` -- `Utils/MotionAwareControlExtensions.cs:2` — `using AtomUI.Data;` -- `Utils/MotionAwareControlExtensions.cs:3` — `using AtomUI.Theme.Styling;` -- `Utils/ThemeAlgorithmTypeConverter.cs:3` — `using AtomUI.Theme;` - -### AtomUI.Desktop.Controls.ColorPicker (35) - -- `AbstractColorPicker.cs:2` — `using AtomUI.Animations;` -- `AbstractColorPicker.cs:4` — `using AtomUI.Media;` -- `AbstractColorPicker.cs:5` — `using AtomUI.Theme;` -- `AtomUIColorPickerThemesProvider.cs:1` — `using AtomUI.Theme;` -- `ColorBlock.cs:1` — `using AtomUI.Controls;` -- `ColorBlock.cs:2` — `using AtomUI.Desktop.Controls.Primitives;` -- `ColorPickerPalette.cs:1` — `using AtomUI.Controls;` -- `ColorPickerPaletteGroup.cs:1` — `using AtomUI.Controls;` -- `ColorPickerToken.cs:1` — `using AtomUI.Desktop.Controls.DesignTokens;` -- `ColorPickerToken.cs:2` — `using AtomUI.Theme;` -- `ColorPickerToken.cs:3` — `using AtomUI.Theme.TokenSystem;` -- `ColorSlider/ColorSlider.cs:1` — `using AtomUI.Collections.Pooled;` -- `ColorSlider/ColorSlider.cs:2` — `using AtomUI.Desktop.Controls.Primitives;` -- `ColorSlider/ColorSlider.cs:3` — `using AtomUI.Desktop.Controls.Themes;` -- `ColorSlider/ColorSliderThumb.cs:2` — `using AtomUI.Desktop.Controls.Themes;` -- `ColorSlider/ColorSliderThumb.cs:3` — `using AtomUI.Utils;` -- `ColorSlider/GradientColorSlider.cs:1` — `using AtomUI.Desktop.Controls.Themes;` -- `ColorSlider/GradientColorSlider.cs:2` — `using AtomUI.Utils;` -- `ColorView/AbstractColorPickerView.cs:1` — `using AtomUI.Controls;` -- `ColorView/AbstractColorPickerView.cs:2` — `using AtomUI.Desktop.Controls.Themes;` -- `ColorView/AbstractColorPickerView.cs:3` — `using AtomUI.Theme;` -- `ColorView/AbstractColorPickerView.cs:4` — `using AtomUI.Theme.Palette;` -- `ColorView/ColorPickerInput.cs:1` — `using AtomUI.Desktop.Controls.Themes;` -- `ColorView/ColorSpectrum.cs:4` — `using AtomUI.Collections.Pooled;` -- `ColorView/ColorSpectrum.cs:5` — `using AtomUI.Desktop.Controls.Primitives;` -- `ColorView/ColorSpectrum.cs:6` — `using AtomUI.Desktop.Controls.Themes;` -- `Localization/en_US.cs:1` — `using AtomUI.Desktop.Controls.Localization;` -- `Localization/en_US.cs:2` — `using AtomUI.Theme.Language;` -- `Localization/zh_CN.cs:1` — `using AtomUI.Desktop.Controls.Localization;` -- `Localization/zh_CN.cs:2` — `using AtomUI.Theme.Language;` -- `PaletteColorItem.cs:1` — `using AtomUI.Animations;` -- `ThemeManagerBuilderExtensions.cs:1` — `using AtomUI.Theme;` -- `ThemeManagerBuilderExtensions.cs:2` — `using AtomUI.Theme.Language;` -- `Utils/ColorPickerHelpers.cs:4` — `using AtomUI.Collections.Pooled;` -- `Utils/Rgb.cs:4` — `using AtomUI.Media;` - -### AtomUI.Controls.Shared (14) - -- `ApplicationExtensions.cs:1` — `using AtomUI.Theme;` -- `ApplicationExtensions.cs:2` — `using AtomUI.Theme.Language;` -- `Data/ListCollectionViews/IListFilterDescription.cs:1` — `using AtomUI.Controls.Utils;` -- `Data/ListCollectionViews/ListCollectionView.cs:7` — `using AtomUI.Utils;` -- `Data/ListCollectionViews/ListFilterDescription.cs:1` — `using AtomUI.Controls.Utils;` -- `Data/ListCollectionViews/ListGroupDescription.cs:2` — `using AtomUI.Controls.Utils;` -- `Data/ListCollectionViews/ListSortDescription.cs:4` — `using AtomUI.Utils;` -- `EntityKey.cs:2` — `using AtomUI.Utils;` -- `Utils/BorderRenderHelper.cs:1` — `using AtomUI.Media;` -- `Utils/BorderRenderHelper.cs:2` — `using AtomUI.Utils;` -- `Utils/RoundRectGeometryBuilder.cs:1` — `using AtomUI.Utils;` -- `WaveSpirit/RoundRectWavePainter.cs:1` — `using AtomUI.Controls.Utils;` -- `WaveSpirit/WaveSpiritAwareControlExtensions.cs:1` — `using AtomUI.Data;` -- `WaveSpirit/WaveSpiritAwareControlExtensions.cs:2` — `using AtomUI.Theme.Styling;` - -### AtomUI.Fonts.AlibabaSans (2) - -- `ThemeManagerBuilderExtensions.cs:1` — `using AtomUI.Fonts.AlibabaSans;` -- `ThemeManagerBuilderExtensions.cs:2` — `using AtomUI.Theme;` - -### AtomUI.Icons.AntDesign (2) - -- `AntDesignIcon.cs:1` — `using AtomUI.Controls;` -- `AntDesignIconProvider.cs:2` — `using AtomUI.Controls;` - -### AtomUI.Icons.Shared (2) - -- `DefaultIconPackageGenerator.cs:4` — `using AtomUI.Controls;` -- `IconFileInfo.cs:1` — `using AtomUI.Controls;` - -### AtomUI.Native (2) - -- `MacOS/WindowUtils.MacOS.cs:2` — `using AtomUI.Native.MacOS;` -- `WindowExtensions.cs:4` — `using AtomUI.Native.Windows;` diff --git a/docs/todos/api-design-inconsistencies.md b/docs/todos/api-design-inconsistencies.md index be940db71..30a0cd805 100644 --- a/docs/todos/api-design-inconsistencies.md +++ b/docs/todos/api-design-inconsistencies.md @@ -1,34 +1,35 @@ # API 设计一致性分析报告 -> 扫描时间:2026-05-10 +> 扫描时间:2026-05-10(修订) > 扫描范围:AtomUI.slnx 中所有项目 -> 分析维度:属性命名、方法/重写模式、枚举/类型、AXAML 模板 +> 分析维度:属性命名、方法/重写模式、枚举/类型、AXAML 模板、伪类与 Part 常量 --- ## P0 — 拼写错误 / 命名错误 -### 1. `ChoosingStatueChanged` → `ChoosingStatusChanged` +### 1. `ChoosingStatue` → `ChoosingStatus`(21+ 处,覆盖 7 个文件) 单词拼写错误:`Statue`(雕像)应为 `Status`(状态)。 -**涉及文件(事件定义):** +**事件定义:** -| 文件 | 行号 | 当前命名 | -|---|---|---| -| `src/AtomUI.Desktop.Controls/TimePicker/TimePickerPresenter.cs` | 129 | `ChoosingStatueChanged` | -| `src/AtomUI.Desktop.Controls/DatePicker/DatePickerPresenter.cs` | 119 | `ChoosingStatueChanged` | +| 文件 | 当前命名 | +|---|---| +| `src/AtomUI.Desktop.Controls/TimePicker/TimePickerPresenter.cs` | `ChoosingStatueChanged`(事件,多处) | +| `src/AtomUI.Desktop.Controls/DatePicker/DatePickerPresenter.cs` | `ChoosingStatueChanged`(事件)+ `EmitChoosingStatueChanged`(方法) | -**涉及文件(事件订阅/处理方法):** +**事件订阅 / 处理方法:** -| 文件 | 行号 | 当前命名 | -|---|---|---| -| `src/AtomUI.Desktop.Controls/TimePicker/TimePicker.cs` | 159, 170 | `HandleChoosingStatueChanged` | -| `src/AtomUI.Desktop.Controls/TimePicker/RangeTimePicker.cs` | 209, 220 | `HandleChoosingStatueChanged` | -| `src/AtomUI.Desktop.Controls/DatePicker/DatePicker.cs` | 183, 194 | `HandleChoosingStatueChanged` | -| `src/AtomUI.Desktop.Controls/DatePicker/RangeDatePicker.cs` | 178, 201 | `HandleChoosingStatueChanged` | +| 文件 | 当前命名 | +|---|---| +| `src/AtomUI.Desktop.Controls/TimePicker/TimePicker.cs` | `HandleChoosingStatueChanged` | +| `src/AtomUI.Desktop.Controls/TimePicker/RangeTimePicker.cs` | `HandleChoosingStatueChanged` | +| `src/AtomUI.Desktop.Controls/DatePicker/DatePicker.cs` | `HandleChoosingStatueChanged` | +| `src/AtomUI.Desktop.Controls/DatePicker/RangeDatePicker.cs` | `HandleChoosingStatueChanged` | +| `src/AtomUI.Desktop.Controls/DatePicker/RangeDatePickerPresenter.cs` | `EmitChoosingStatueChanged` 调用 | -**修复方案:** 全局重命名为 `ChoosingStatusChanged` / `HandleChoosingStatusChanged`。属于公共 API 破坏性变更,需发 breaking change 说明。 +**修复方案:** 全局重命名为 `ChoosingStatusChanged` / `HandleChoosingStatusChanged` / `EmitChoosingStatusChanged`。属于公共 API 破坏性变更,需发 breaking change 说明。 --- @@ -43,28 +44,19 @@ | `src/AtomUI.Controls/Timeline/TimelineToken.cs` | `TimelineToken`(Token 类) | | 目录名 | `Timeline/` | -**修复方案:** 将枚举重命名为 `TimelineMode`。属于公共 API 破坏性变更。 +**修复方案:** 将枚举重命名为 `TimelineMode`,文件重命名为 `TimelineEnums.cs`。属于公共 API 破坏性变更。 --- -### 3. 重复的 ToolTip 目录 - -存在两个目录,包含同名文件: - -| 目录 | 大小写 | -|---|---| -| `src/AtomUI.Desktop.Controls/ToolTip/` | PascalCase "Tip" | -| `src/AtomUI.Desktop.Controls/Tooltip/` | lowercase "tip" | - -两个目录都包含 `ToolTip.cs`、`ToolTipService.cs`、`ToolTipToken.cs` 和 `Themes/` 子目录。 - -**修复方案:** 合并为一个目录,保留 `Tooltip/`(与 Avalonia 一致)。 +> **说明:** 原报告中"重复 ToolTip 目录"条目已失效 —— 当前仅存 `src/AtomUI.Desktop.Controls/Tooltip/`,无重复。 --- -## P1 — 布尔属性缺少 `Is` 前缀(14 处) +## P1 — 布尔属性缺少 `Is` 前缀(共 22 处) -Avalonia/WPF 规范要求布尔属性使用 `Is`、`Has`、`Can`、`Should` 前缀。以下属性不符合规范: +Avalonia/WPF 规范要求布尔属性使用 `Is`、`Has`、`Can`、`Should` 前缀。 + +### 1.1 裸动词 / 裸名词布尔属性(15 处) | 文件 | 行号 | 当前命名 | 建议命名 | |---|---|---|---| @@ -84,25 +76,54 @@ Avalonia/WPF 规范要求布尔属性使用 `Is`、`Has`、`Can`、`Should` 前 | `src/AtomUI.Desktop.Controls/Transfer/AbstractTransfer.cs` | 312 | `ToTargetButtonEnabledProperty` | `IsToTargetButtonEnabledProperty` | | `src/AtomUI.Desktop.Controls/Transfer/AbstractTransfer.cs` | 317 | `ToSourceButtonEnabledProperty` | `IsToSourceButtonEnabledProperty` | -**额外说明:** `IsShow*` 模式(如 `IsShowArrow`、`IsShowDescription`)虽然能工作,但在 Avalonia 惯例中更自然的写法是 `IsArrowVisible`、`IsDescriptionVisible`。这属于风格偏好,影响范围更广,可单独评估。 +### 1.2 `IsShow*` 反模式 → `Is*Visible`(10 处) + +Avalonia 惯例:可见性用 `Is{Subject}Visible` 而非 `IsShow{Subject}`。 + +| 文件 | 当前命名 | 建议命名 | +|---|---|---| +| `src/AtomUI.Controls/Empty/AbstractEmpty.cs` | `IsShowDescriptionProperty` | `IsDescriptionVisibleProperty` | +| `src/AtomUI.Controls/ProgressBar/AbstractProgressBar.cs` | `IsShowProgressInfoProperty` | `IsProgressInfoVisibleProperty` | +| `src/AtomUI.Controls/Spin/AbstractSpin.cs` | `IsShowTipProperty` | `IsTipVisibleProperty` | +| `src/AtomUI.Controls/Primitives/ArrowDecoratedBox/AbstractArrowDecoratedBox.cs` | `IsShowArrowProperty` | `IsArrowVisibleProperty` | +| `src/AtomUI.Controls/Badge/AbstractCountBadge.cs` | `IsShowZeroProperty` | `IsZeroVisibleProperty` | +| `src/AtomUI.Desktop.Controls.ColorPicker/AbstractColorPicker.cs` | `IsShowArrowProperty` | `IsArrowVisibleProperty` | +| `src/AtomUI.Desktop.Controls.ColorPicker/AbstractColorPicker.cs` | `IsShowTextProperty` | `IsTextVisibleProperty` | +| `src/AtomUI.Desktop.Controls.DataGrid/DataGrid.cs` | `IsShowFrameBorderProperty` | `IsFrameBorderVisibleProperty` | +| `src/AtomUI.Desktop.Controls.DataGrid/DataGrid.cs` | `ShowSorterTooltipProperty` | `IsSorterTooltipVisibleProperty` | +| `src/AtomUI.Desktop.Controls/Input/SearchEditDecoratedBox.cs:18` | `SearchButtonLoadingProperty` | `IsSearchButtonLoadingProperty` | + +### 1.3 动词前缀缺 `Is`(7 处) + +| 文件 | 行号 | 当前命名 | 建议命名 | +|---|---|---|---| +| `src/AtomUI.Desktop.Controls.ColorPicker/ColorSlider/AbstractColorPickerSliderTrack.cs` | 45 | `IgnoreThumbDragProperty` | `IsThumbDragIgnoredProperty` | +| `src/AtomUI.Desktop.Controls.ColorPicker/ColorSlider/AbstractColorPickerSliderTrack.cs` | 48 | `DeferThumbDragProperty` | `IsThumbDragDeferredProperty` | +| `src/AtomUI.Desktop.Controls.DataGrid/Column/Filters/DataGridFilterIndicator.cs` | 18 | `FilterMultipleProperty` | `IsMultipleFilterEnabledProperty` | + +**总体修复策略:** 所有都是公共 API 破坏性变更,建议随下一个大版本批量处理,提供 `[Obsolete]` 过渡别名 1~2 个版本。 --- ## P2 — 方法/重写模式不一致 -### 1. `Notify*` vs `On*` vs `Handle*` 混用 +### 2.1 `Notify*` vs `On*` vs `Handle*` 混用 主流模式是 `Notify*`(60+ 处),但存在例外: | 文件 | 行号 | 当前命名 | 建议 | |---|---|---|---| -| `src/AtomUI.Controls/Primitives/Thumb.cs` | 59-67 | `OnDragStarted` / `OnDragDelta` / `OnDragCompleted` | `NotifyDragStarted` 等 | +| `src/AtomUI.Controls/Primitives/Thumb.cs` | 59-67 | `OnDragStarted` / `OnDragDelta` / `OnDragCompleted` | 保留(WPF/Avalonia 标准) | | `src/AtomUI.Controls/Badge/AbstractCountBadge.cs` | 197 | `HandleDecoratedTargetChanged` | `NotifyDecoratedTargetChanged` | | `src/AtomUI.Controls/Badge/AbstractDotBadge.cs` | 178 | `HandleDecoratedTargetChanged` | `NotifyDecoratedTargetChanged` | -> 注:`Thumb` 的 `On*` 命名是 WPF/Avalonia 标准模式,可能有意保留。需确认。 +### 2.2 事件触发方法不一致:`Emit*` vs 直接 `Invoke` -### 2. `CreatePickerPresenter` vs `CreatePresenter` +少数 Presenter 通过 `EmitXxxChanged()` 方法触发事件(`DatePickerPresenter` 中的 `EmitChoosingStatueChanged`),其他 Presenter 直接内联 `XxxChanged?.Invoke(...)`。两种风格并存且没有统一规则。 + +**建议:** 选一种风格统一(推荐内部触发封装为 `RaiseXxxChanged` 或 `OnXxxChanged` 虚方法,便于子类钩入)。 + +### 2.3 `CreatePickerPresenter` vs `CreatePresenter` 同一概念(创建弹出层 Presenter)有两种命名: @@ -112,9 +133,9 @@ Avalonia/WPF 规范要求布尔属性使用 `Is`、`Has`、`Can`、`Should` 前 | `src/AtomUI.Desktop.Controls.DataGrid/Column/Filters/DataGridTreeFilterFlyout.cs:30` | `CreatePresenter()` | | `src/AtomUI.Desktop.Controls.DataGrid/Column/Filters/DataGridMenuFilterFlyout.cs:20` | `CreatePresenter()` | -**建议:** 统一为 `CreatePresenter()`(更通用)。 +**建议:** 统一为 `CreatePresenter()`。 -### 3. `abstract` 与 `Notify*` 命名语义冲突 +### 2.4 `abstract` 与 `Notify*` 命名语义冲突 `Notify*` 前缀暗示可选重写的钩子(virtual),但以下方法是 `abstract`(强制重写): @@ -125,12 +146,12 @@ Avalonia/WPF 规范要求布尔属性使用 `Is`、`Has`、`Can`、`Should` 前 **建议:** `Create*` 用于强制重写(abstract),`Notify*` 用于可选重写(virtual)。 -### 4. Dispose/Cleanup 模式不统一 +### 2.5 Dispose/Cleanup 模式不统一 清理逻辑散布在不同位置: -- 部分控件在 `OnApplyTemplate` 中替换旧订阅 +- 部分控件在 `OnApplyTemplate` 中手工解/绑 - 部分控件在 `DetachedFromVisualTree` 事件中清理 -- 部分控件使用 `CompositeDisposable`(如 `AbstractFloatButtonHost`) +- 部分控件使用 `CompositeDisposable`(如 `AbstractFloatButtonHost`、`IconPresenter`) - 没有控件在自身实现 `IDisposable` - `CancellationTokenSource` 内联释放,无统一模式 @@ -140,7 +161,7 @@ Avalonia/WPF 规范要求布尔属性使用 `Is`、`Has`、`Can`、`Should` 前 ## P3 — 枚举/类型碎片化 -### 1. Status 枚举碎片化(7 个独立枚举) +### 3.1 Status 枚举碎片化(7 个独立枚举) | 枚举 | 文件 | 成员 | |---|---|---| @@ -152,7 +173,7 @@ Avalonia/WPF 规范要求布尔属性使用 `Is`、`Has`、`Can`、`Should` 前 | `QRCodeStatus` | `AtomUI.Controls/QRCode/QRCodeEnums.cs` | Active, Expired, Loading, Scanned | | `StepsItemStatus` | `AtomUI.Desktop.Controls/Steps/Steps.cs` | Wait, Process, Finish, Error | -**语义碎片化:** +**语义碎片:** | 概念 | 分散为 | |---|---| @@ -162,56 +183,54 @@ Avalonia/WPF 规范要求布尔属性使用 `Is`、`Has`、`Can`、`Should` 前 **建议:** 提取公共 `ControlStatus` 基础枚举(Default, Success, Warning, Error, Info, Processing),特殊状态由各控件扩展。 -### 2. Placement 枚举碎片化(6 个独立枚举) +### 3.2 Placement 枚举碎片化(6 个独立枚举) -| 枚举 | 文件 | 成员 | -|---|---|---| -| `FloatButtonPlacement` | `AtomUI.Controls/FloatButton/...` | Top, Bottom, Left, Right, TopLeft, TopRight, BottomLeft, BottomRight, Center | -| `DrawerPlacement` | `AtomUI.Desktop.Controls/Drawer/...` | Left, Top, Right, Bottom | -| `AutoCompletePlacementMode` | `AtomUI.Desktop.Controls/AutoComplete/...` | Top, Bottom | -| `MentionsPlacementMode` | `AtomUI.Desktop.Controls/Mentions/...` | Top, Bottom | -| `TourPlacementMode` | `AtomUI.Desktop.Controls/Tour/...` | Center, Left, LeftTop, LeftBottom, Right, RightTop, RightBottom, Top, TopLeft, TopRight, Bottom, BottomLeft, BottomRight | -| `SelectPopupPlacement` | `AtomUI.Desktop.Controls/Select/...` | TopEdgeAlignedLeft, TopEdgeAlignedRight, BottomEdgeAlignedLeft, BottomEdgeAlignedRight | +| 枚举 | 成员 | +|---|---| +| `FloatButtonPlacement` | Top, Bottom, Left, Right, TopLeft, TopRight, BottomLeft, BottomRight, Center | +| `DrawerPlacement` | Left, Top, Right, Bottom | +| `AutoCompletePlacementMode` | Top, Bottom | +| `MentionsPlacementMode` | Top, Bottom | +| `TourPlacementMode` | Center, Left, LeftTop, LeftBottom, Right, RightTop, RightBottom, Top, TopLeft, TopRight, Bottom, BottomLeft, BottomRight | +| `SelectPopupPlacement` | TopEdgeAlignedLeft, TopEdgeAlignedRight, BottomEdgeAlignedLeft, BottomEdgeAlignedRight | **命名不一致:** `Placement` vs `PlacementMode` vs `PopupPlacement`。 -**建议:** 对于 Top/Bottom 类弹出位置,统一使用 `PopupPlacementMode`;对于 8 方位 + Center,使用 `Placement`(已有 `Avalonia.Controls.PlacementMode` 可复用)。 +**建议:** Top/Bottom 类用 `PopupPlacementMode`;8 方位 + Center 用 `Placement`(可复用 `Avalonia.Controls.PlacementMode`)。 -### 3. `CountBadgeSize` 应复用共享 `SizeType` +### 3.3 `CountBadgeSize` 应复用共享 `SizeType` -| 枚举 | 文件 | 成员 | -|---|---|---| -| `CountBadgeSize` | `AtomUI.Controls/Badge/AbstractCountBadge.cs` | Default, Small | -| `SizeType`(共享) | `AtomUI.Core/Common.cs` | Large, Middle, Small | +| 枚举 | 成员 | +|---|---| +| `CountBadgeSize`(`AbstractCountBadge.cs`) | Default, Small | +| `SizeType`(`AtomUI.Core/Common.cs`) | Large, Middle, Small | -`CountBadgeSize` 只有 `Default` 和 `Small`,完全可以复用 `SizeType`。 +`CountBadgeSize` 完全可以复用 `SizeType`。 -### 4. Token 类访问修饰符不一致 +### 3.4 Token 类访问修饰符不一致 | Token 类 | 访问修饰符 | |---|---| -| `ColorPickerToken` | `public` | +| `ColorPickerToken`(`src/AtomUI.Desktop.Controls.ColorPicker/ColorPickerToken.cs`) | `public` | | 其他 80+ Token 类 | `internal` | -**文件:** `src/AtomUI.Desktop.Controls.ColorPicker/ColorPickerToken.cs` +**建议:** 若无外部消费需要,统一为 `internal`;若必须公开,将 80+ 其余 Token 也公开以保持一致。需要先确认设计意图。 -**建议:** 统一为 `internal`(Token 类是实现细节,不应暴露给外部)。 +### 3.5 `DataGridSortDirections` 复数命名 -### 5. `DataGridSortDirections` 复数命名 +`[Flags]` 枚举使用复数 `DataGridSortDirections`,但其他 `[Flags]` 枚举(`DataGridGridLinesVisibility`、`DataGridHeadersVisibility`、`DataGridPaginationVisibility`)使用单数。 -`[Flags]` 枚举使用复数 `DataGridSortDirections`,但其他 `[Flags]` 枚举(如 `DataGridGridLinesVisibility`)使用单数。 +**文件:** `src/AtomUI.Desktop.Controls.DataGrid/DataGridEnumerations.cs:90` -**文件:** `src/AtomUI.Desktop.Controls.DataGrid/DataGridEnumerations.cs` - -**建议:** 统一使用单数。 +**建议:** 重命名为 `DataGridSortDirection` 保持单数统一。 --- -## P4 — AXAML 模板不一致 +## P4 — AXAML 模板 / 伪类 / Part 常量不一致 -### 1. PART_ 命名不一致 +### 4.1 PART_ 前缀缺失 -主流控件全部使用 `PART_` 前缀(577 处),但以下控件使用裸名: +主流控件全部使用 `PART_` 前缀(577+ 处),但以下控件使用裸名: **ColorPicker 主题:** @@ -220,6 +239,8 @@ Avalonia/WPF 规范要求布尔属性使用 `Is`、`Has`、`Can`、`Should` 前 | `ColorPicker/Themes/ColorBlockTheme.axaml` | `ColorPreviewFrame`, `ColorPreview`, `EmptyColorFrame` | | `ColorPicker/Themes/ColorPickerTheme.axaml` | `Frame`, `ColorText` | | `ColorPicker/Themes/GradientColorPickerTheme.axaml` | `Frame`, `ColorText` | +| `ColorPicker/Themes/ColorView/ColorPickerInput.axaml` | `RootLayout`, `HsvValuePanel`, `RgbValuePanel` | +| `ColorPicker/Themes/ColorView/ColorSpectrumTheme.axaml` | `Frame` | **DataGrid 主题:** @@ -234,29 +255,44 @@ Avalonia/WPF 规范要求布尔属性使用 `Is`、`Has`、`Can`、`Should` 前 |---|---| | `FloatButton/Themes/FloatButtonItemsControlTheme.axaml` | `ItemsLayout` | -**建议:** 全部加上 `PART_` 前缀,与 Avalonia 规范一致。 +**建议:** 全部加上 `PART_` 前缀。 -### 2. `:active` vs `:pressed` 伪类不一致 +### 4.2 Part 常量覆盖率不足 -| 文件 | 伪类 | -|---|---| -| `ColorPicker/Themes/ColorSlider/ColorSliderThumbTheme.axaml:39` | `^:active` | -| 其他所有主题 | `^:pressed` | +全解决方案 137 个文件直接出现 `"PART_..."` 字面量,但只有 75 处定义为 `const string * = "PART_*"`。绝大多数控件仍硬编码 part 名(例如 `Input/SearchEditDecoratedBox.cs` 的 `e.NameScope.Find