mirror of
https://github.com/AtomUI/AtomUI.git
synced 2026-10-22 17:35:30 +08:00
完成 RangeCalendar 的Header 按钮状态设置
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user