diff --git a/src/AtomUI.Controls/Calendar/CalendarItem.cs b/src/AtomUI.Controls/Calendar/CalendarItem.cs index 507b1a9b4..64ff69959 100644 --- a/src/AtomUI.Controls/Calendar/CalendarItem.cs +++ b/src/AtomUI.Controls/Calendar/CalendarItem.cs @@ -743,7 +743,7 @@ internal class CalendarItem : TemplatedControl } } - internal void HandleHeaderButtonClick(object? sender, RoutedEventArgs e) + protected internal virtual void HandleHeaderButtonClick(object? sender, RoutedEventArgs e) { if (Owner != null) { if (!Owner.HasFocusInternal) { @@ -1049,7 +1049,7 @@ internal class CalendarItem : TemplatedControl UpdateYearViewSelection(sender as CalendarButton); } - internal void HandleMonthCalendarButtonMouseUp(object? sender, PointerReleasedEventArgs e) + protected internal virtual void HandleMonthCalendarButtonMouseUp(object? sender, PointerReleasedEventArgs e) { _isMouseLeftButtonDownYearView = false; diff --git a/src/AtomUI.Controls/Calendar/CalendarTheme.cs b/src/AtomUI.Controls/Calendar/CalendarTheme.cs index 02a94f2c5..883ca9c37 100644 --- a/src/AtomUI.Controls/Calendar/CalendarTheme.cs +++ b/src/AtomUI.Controls/Calendar/CalendarTheme.cs @@ -2,7 +2,6 @@ using AtomUI.Theme.Styling; using Avalonia.Controls; using Avalonia.Controls.Templates; -using Avalonia.Layout; using Avalonia.Styling; namespace AtomUI.Controls; @@ -34,11 +33,10 @@ internal class CalendarTheme : BaseControlTheme CreateTemplateParentBinding(frame, Border.BackgroundProperty, Calendar.BackgroundProperty); CreateTemplateParentBinding(frame, Border.PaddingProperty, Calendar.PaddingProperty); - var rootLayout = new StackPanel() + var rootLayout = new Panel() { Name = RootPart, ClipToBounds = true, - Orientation = Orientation.Horizontal }; rootLayout.RegisterInNameScope(scope); diff --git a/src/AtomUI.Controls/Calendar/CalendarToken.cs b/src/AtomUI.Controls/Calendar/CalendarToken.cs index 0238a3717..76add13c5 100644 --- a/src/AtomUI.Controls/Calendar/CalendarToken.cs +++ b/src/AtomUI.Controls/Calendar/CalendarToken.cs @@ -123,6 +123,6 @@ internal class CalendarToken : AbstractControlDesignToken DayTitleHeight = new GridLength(40, GridUnitType.Pixel); HeaderMargin = new Thickness(0, 0, 0, _globalToken.MarginXS); CellLineHeight = CellHeight - 2; // 不知道为啥设置成一样,或者不设置文字有些靠下 - RangeCalendarSpacing = 40; + RangeCalendarSpacing = 15; } } \ No newline at end of file diff --git a/src/AtomUI.Controls/Calendar/RangeCalendar.cs b/src/AtomUI.Controls/Calendar/RangeCalendar.cs index 9b2882c40..88bc5e26d 100644 --- a/src/AtomUI.Controls/Calendar/RangeCalendar.cs +++ b/src/AtomUI.Controls/Calendar/RangeCalendar.cs @@ -1,4 +1,5 @@ -using Avalonia.Controls; +using Avalonia; +using Avalonia.Controls; using Avalonia.Controls.Primitives; namespace AtomUI.Controls; @@ -28,4 +29,31 @@ public class RangeCalendar : Calendar } } } + + protected override void OnPropertyChanged(AvaloniaPropertyChangedEventArgs change) + { + base.OnPropertyChanged(change); + if (change.Property == DisplayModeProperty) { + HandleDisplayModeChanged(); + } + } + + private void HandleDisplayModeChanged() + { + var secondaryMonthControl = SecondaryMonthControl; + if (secondaryMonthControl is not null) { + int columns = default; + if (DisplayMode == CalendarMode.Month) { + secondaryMonthControl.IsVisible = true; + columns = 2; + } else { + secondaryMonthControl.IsVisible = false; + columns = 1; + } + + if (Root is UniformGrid uniformGrid) { + uniformGrid.Columns = columns; + } + } + } } \ No newline at end of file diff --git a/src/AtomUI.Controls/Calendar/RangeCalendarItem.cs b/src/AtomUI.Controls/Calendar/RangeCalendarItem.cs index a66d87f17..26c7570b9 100644 --- a/src/AtomUI.Controls/Calendar/RangeCalendarItem.cs +++ b/src/AtomUI.Controls/Calendar/RangeCalendarItem.cs @@ -1,5 +1,7 @@ using Avalonia; using Avalonia.Controls; +using Avalonia.Input; +using Avalonia.Interactivity; namespace AtomUI.Controls; @@ -22,6 +24,19 @@ internal class RangeCalendarItem : CalendarItem get => _isPrimary; set => SetAndRaise(IsPrimaryProperty, ref _isPrimary, value); } + + private bool _isNextButtonVisible = true; + + internal static readonly DirectProperty IsNextButtonVisibleProperty + = AvaloniaProperty.RegisterDirect(nameof(IsNextButtonVisible), + o => o.IsNextButtonVisible, + (o, v) => o.IsNextButtonVisible = v); + + internal bool IsNextButtonVisible + { + get => _isNextButtonVisible; + set => SetAndRaise(IsNextButtonVisibleProperty, ref _isNextButtonVisible, value); + } #endregion @@ -35,12 +50,31 @@ internal class RangeCalendarItem : CalendarItem base.OnPropertyChanged(change); if (change.Property == IsPrimaryProperty) { UpdatePseudoClasses(); + SetupNextButtonVisible(); } } + + private void SetupNextButtonVisible() + { + IsNextButtonVisible = !IsPrimary || Owner?.DisplayMode == CalendarMode.Decade || + Owner?.DisplayMode == CalendarMode.Year; + } private void UpdatePseudoClasses() { PseudoClasses.Set(PrimaryCalendarPC, IsPrimary); PseudoClasses.Set(SecondaryCalendarPC, !IsPrimary); } + + protected internal override void HandleHeaderButtonClick(object? sender, RoutedEventArgs e) + { + base.HandleHeaderButtonClick(sender, e); + SetupNextButtonVisible(); + } + + protected internal override void HandleMonthCalendarButtonMouseUp(object? sender, PointerReleasedEventArgs e) + { + base.HandleMonthCalendarButtonMouseUp(sender, e); + SetupNextButtonVisible(); + } } \ No newline at end of file diff --git a/src/AtomUI.Controls/Calendar/RangeCalendarItemTheme.cs b/src/AtomUI.Controls/Calendar/RangeCalendarItemTheme.cs index fbbfcc013..1e2840558 100644 --- a/src/AtomUI.Controls/Calendar/RangeCalendarItemTheme.cs +++ b/src/AtomUI.Controls/Calendar/RangeCalendarItemTheme.cs @@ -21,16 +21,15 @@ internal class RangeCalendarItemTheme : CalendarItemTheme { var previousMonthButton = base.BuildPreviousMonthButton(); CreateTemplateParentBinding(previousMonthButton, IconButton.IsVisibleProperty, - RangeCalendarItem.IsPrimaryProperty); + RangeCalendarItem.IsNextButtonVisibleProperty, BindingMode.Default, + BoolConverters.Not); return previousMonthButton; } protected override IconButton BuildNextButton() { var nextButton = base.BuildNextButton(); - CreateTemplateParentBinding(nextButton, IconButton.IsVisibleProperty, RangeCalendarItem.IsPrimaryProperty, - BindingMode.Default, - BoolConverters.Not); + CreateTemplateParentBinding(nextButton, IconButton.IsVisibleProperty, RangeCalendarItem.IsNextButtonVisibleProperty); return nextButton; } diff --git a/src/AtomUI.Controls/Calendar/RangeCalendarTheme.cs b/src/AtomUI.Controls/Calendar/RangeCalendarTheme.cs index 7611203a7..9aca35cd8 100644 --- a/src/AtomUI.Controls/Calendar/RangeCalendarTheme.cs +++ b/src/AtomUI.Controls/Calendar/RangeCalendarTheme.cs @@ -1,8 +1,11 @@ using AtomUI.Theme; using AtomUI.Theme.Styling; using AtomUI.Utils; +using Avalonia; using Avalonia.Controls; +using Avalonia.Controls.Primitives; using Avalonia.Controls.Templates; +using Avalonia.Data; using Avalonia.Layout; using Avalonia.Styling; @@ -36,11 +39,11 @@ public class RangeCalendarTheme : BaseControlTheme CreateTemplateParentBinding(frame, Border.BackgroundProperty, RangeCalendar.BackgroundProperty); CreateTemplateParentBinding(frame, Border.PaddingProperty, RangeCalendar.PaddingProperty); - var rootLayout = new StackPanel() + var rootLayout = new UniformGrid() { Name = RootPart, ClipToBounds = true, - Orientation = Orientation.Horizontal, + Columns = 2 }; TokenResourceBinder.CreateTokenBinding(rootLayout, StackPanel.SpacingProperty, CalendarTokenResourceKey.RangeCalendarSpacing); rootLayout.RegisterInNameScope(scope); @@ -48,7 +51,7 @@ public class RangeCalendarTheme : BaseControlTheme var calendarItem = new RangeCalendarItem() { Name = CalendarItemPart, - HorizontalAlignment = HorizontalAlignment.Left + HorizontalAlignment = HorizontalAlignment.Stretch }; calendarItem.RegisterInNameScope(scope); @@ -58,11 +61,21 @@ public class RangeCalendarTheme : BaseControlTheme var secondaryCalendarItem = new RangeCalendarItem() { Name = SecondaryCalendarItemPart, - HorizontalAlignment = HorizontalAlignment.Right, + HorizontalAlignment = HorizontalAlignment.Stretch, IsPrimary = false }; secondaryCalendarItem.RegisterInNameScope(scope); + TokenResourceBinder.CreateTokenBinding(secondaryCalendarItem, RangeCalendarItem.MarginProperty, CalendarTokenResourceKey.RangeCalendarSpacing, + BindingPriority.Template, + v => + { + if (v is double dval) { + return new Thickness(dval, 0, 0, 0); + } + + return new Thickness(0); + }); rootLayout.Children.Add(secondaryCalendarItem); @@ -83,4 +96,4 @@ public class RangeCalendarTheme : BaseControlTheme commonStyle.Add(RangeCalendar.MinHeightProperty, CalendarTokenResourceKey.ItemPanelMinHeight); Add(commonStyle); } -} +} \ No newline at end of file