using Avalonia; using Avalonia.Controls; using Avalonia.Controls.Metadata; using Avalonia.Layout; using Ursa.Common; namespace Ursa.Controls; [PseudoClasses(PC_FixedWidth)] public class Form: ItemsControl { public const string PC_FixedWidth = ":fixed-width"; public static readonly StyledProperty LabelWidthProperty = AvaloniaProperty.Register( nameof(LabelWidth)); /// /// Behavior: /// Fixed Width: all labels are with fixed length. /// Star: all labels are aligned by max length. /// Auto: labels are not aligned. /// public GridLength LabelWidth { get => GetValue(LabelWidthProperty); set => SetValue(LabelWidthProperty, value); } public static readonly StyledProperty LabelPositionProperty = AvaloniaProperty.Register( nameof(LabelPosition), defaultValue: Position.Top); public Position LabelPosition { get => GetValue(LabelPositionProperty); set => SetValue(LabelPositionProperty, value); } public static readonly StyledProperty LabelAlignmentProperty = AvaloniaProperty.Register( nameof(LabelAlignment), defaultValue: HorizontalAlignment.Left); public HorizontalAlignment LabelAlignment { get => GetValue(LabelAlignmentProperty); set => SetValue(LabelAlignmentProperty, value); } static Form() { LabelWidthProperty.Changed.AddClassHandler((x, args) => x.LabelWidthChanged(args)); } private void LabelWidthChanged(AvaloniaPropertyChangedEventArgs args) { var newValue = args.NewValue.Value; bool isFixed = newValue.IsStar || newValue.IsAbsolute; PseudoClasses.Set(PC_FixedWidth, isFixed); } protected override bool NeedsContainerOverride(object? item, int index, out object? recycleKey) { recycleKey = null; return item is not FormItem && item is not FormGroup; } protected override Control CreateContainerForItemOverride(object? item, int index, object? recycleKey) { if (item is not Control control) return new FormItem(); return new FormItem() { Content = control, [!FormItem.LabelProperty] = control[!FormItem.LabelProperty], [!FormItem.IsRequiredProperty] = control[!FormItem.IsRequiredProperty], [!FormItem.NoLabelProperty] = control[!FormItem.NoLabelProperty], }; } }