AutoSettingUI/
├── src/
│ ├── AutoSettingUI.Core/ # Attributes, interfaces, models — no UI dependency
│ │ ├── Attributes/ # [SettingUI], [Title], [Range], [Hide], [SubHeader],
│ │ │ # [ItemsSource], [ControlBinding], [MainHeader]
│ │ ├── Interfaces/ # ISettingDescriptorProvider, IPropertyValueAccessor,
│ │ │ # ReflectionPropertyAccessor
│ │ ├── Models/ # SettingClassDescriptor, PropertyDescriptor,
│ │ │ # SubSectionInfo, NavigationNode
│ │ └── Providers/ # ReflectionSettingDescriptorProvider (non-AOT fallback)
│ │
│ ├── AutoSettingUI.Generator/ # Roslyn Incremental Source Generator
│ │ └── Incremental/
│ │ └── AutoSettingGenerator.cs
│ │
│ └── Extensions/
│ ├── AutoSettingUI.Avalonia/ # AvaloniaAutoSettingPanel (plain Avalonia)
│ ├── AutoSettingUI.Ursa/ # UrsaAutoSettingPanel (Ursa-themed Avalonia)
│ └── AutoSettingUI.WPF/ # WpfAutoSettingPanel + WpfControlFactory
│
├── AutoSettingUI.Extension.Shared/ # Shared code between all UI frameworks
│ ├── ControlFactoryBase.cs # Base class for control factories
│ ├── DelegateCommandBase.cs # Base class for delegate commands
│ ├── ValidationHelper.cs # Shared validation logic
│ └── ExtendedControlHelper.cs # Helper for ControlBindingAttribute
│
└── Demo/
├── AutoSettingUI.Avalonia.Demo/
├── AutoSettingUI.Ursa.Demo/
└── AutoSettingUI.Wpf.Demo/
AutoSettingUI.Generator (netstandard2.0, Analyzer)
└── purely compile-time, produces GeneratedSettingProvider.g.cs
AutoSettingUI.Core (net9.0, AOT-compatible)
└── (no dependencies)
AutoSettingUI.Extension.Shared (net9.0, AOT-compatible)
└── AutoSettingUI.Core
AutoSettingUI.Avalonia
├── AutoSettingUI.Core
├── AutoSettingUI.Extension.Shared
└── AutoSettingUI.Generator [Analyzer]
AutoSettingUI.Ursa
├── AutoSettingUI.Core
├── AutoSettingUI.Extension.Shared
└── AutoSettingUI.Generator [Analyzer]
AutoSettingUI.WPF
├── AutoSettingUI.Core
├── AutoSettingUI.Extension.Shared
└── AutoSettingUI.Generator [Analyzer]
The AutoSettingUI.Extension.Shared project contains code shared across all UI frameworks:
Provides unified validation logic for property values:
- Required field validation
- String length validation (MinLength/MaxLength)
- Pattern matching (Regex)
- Numeric range validation (MinValue/MaxValue)
- Custom validation method invocation
Simplifies creating controls from ControlBindingAttribute:
- Factory method invocation (static and instance methods)
- Control instantiation via reflection
- Binding property resolution
Base class providing common functionality:
- Property value access via
IPropertyValueAccessor - Dynamic read-only state evaluation
- CanExecute delegate evaluation
- Type resolution from name strings
- Compile time — The Roslyn Source Generator scans for classes with
[SettingUI]and emitsGeneratedSettingProvider.g.csinto the consuming project. - Startup — The panel control calls
InitializeProvider(). If noDescriptorProvideris injected, it falls back to the reflection-basedReflectionSettingDescriptorProvider. - Rendering —
BuildForm()walks allTargets, callsGetDescriptor(targetType)to get aSettingClassDescriptor, then constructs UI controls for eachPropertyDescriptor. - Reading/writing values —
IPropertyValueAccessor.GetValue/SetValueis called for every property interaction (noPropertyInfoinvolved in the AOT-generated path).