完成 RangeCalendar 的Header 按钮状态设置

This commit is contained in:
polarboy
2024-09-07 19:44:24 +08:00
parent b660d26d65
commit 9bc03c841f
7 changed files with 88 additions and 16 deletions
+2 -2
View File
@@ -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;
@@ -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);
@@ -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;
}
}
+29 -1
View File
@@ -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;
}
}
}
}
@@ -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<RangeCalendarItem, bool> IsNextButtonVisibleProperty
= AvaloniaProperty.RegisterDirect<RangeCalendarItem, bool>(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();
}
}
@@ -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;
}
@@ -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);
}
}
}