Refactor DatePickerTheme

This commit is contained in:
CHINBOY
2025-06-14 20:27:21 +08:00
parent bd7568b839
commit 66508f18b6
23 changed files with 46 additions and 278 deletions
@@ -25,5 +25,4 @@
<ProjectReference Include="../AtomUI.Theme/AtomUI.Theme.csproj" />
<ProjectReference Include="../AtomUI.Generator/AtomUI.Generator.csproj" OutputItemType="Analyzer" ReferenceOutputAssembly="false" PrivateAssets="all" />
</ItemGroup>
</Project>
@@ -21,7 +21,7 @@ public class DateSelectedEventArgs : EventArgs
}
}
[TemplatePart(DatePickerCalendarThemeConstants.CalendarItemPart, typeof(CalendarItem))]
[TemplatePart(CalendarThemeConstants.CalendarItemPart, typeof(CalendarItem))]
internal class Calendar : TemplatedControl
{
internal const int RowsPerMonth = 7;
@@ -1431,7 +1431,7 @@ internal class Calendar : TemplatedControl
protected override void OnApplyTemplate(TemplateAppliedEventArgs e)
{
base.OnApplyTemplate(e);
CalendarItem = e.NameScope.Find<CalendarItem>(DatePickerCalendarThemeConstants.CalendarItemPart);
CalendarItem = e.NameScope.Find<CalendarItem>(CalendarThemeConstants.CalendarItemPart);
if (SelectedDate is not null)
{
@@ -115,7 +115,7 @@ internal sealed class CalendarButton : AvaloniaButton
protected override void OnAttachedToLogicalTree(LogicalTreeAttachmentEventArgs e)
{
base.OnAttachedToLogicalTree(e);
ConfigureTransitions();
SetupTransitions();
}
/// <summary>
@@ -128,7 +128,7 @@ internal sealed class CalendarButton : AvaloniaButton
UpdatePseudoClasses();
}
private void ConfigureTransitions()
private void SetupTransitions()
{
if (IsMotionEnabled)
{
@@ -229,7 +229,7 @@ internal sealed class CalendarButton : AvaloniaButton
{
if (change.Property == IsMotionEnabledProperty)
{
ConfigureTransitions();
SetupTransitions();
}
}
}
@@ -195,7 +195,7 @@ internal sealed class CalendarDayButton : AvaloniaButton,
UpdatePseudoClasses();
}
private void ConfigureTransitions()
private void SetupTransitions()
{
if (IsMotionEnabled)
{
@@ -301,7 +301,7 @@ internal sealed class CalendarDayButton : AvaloniaButton,
{
base.OnAttachedToLogicalTree(e);
_resourceBindingsDisposable = new CompositeDisposable();
ConfigureTransitions();
SetupTransitions();
}
protected override void OnDetachedFromLogicalTree(LogicalTreeAttachmentEventArgs e)
@@ -325,7 +325,7 @@ internal sealed class CalendarDayButton : AvaloniaButton,
{
if (change.Property == IsMotionEnabledProperty)
{
ConfigureTransitions();
SetupTransitions();
}
}
}
@@ -342,7 +342,7 @@ internal class CalendarItem : TemplatedControl,
protected override void OnApplyTemplate(TemplateAppliedEventArgs e)
{
base.OnApplyTemplate(e);
HeaderButton = e.NameScope.Get<HeadTextButton>(CalendarItemThemeConstants.HeaderButtonPart);
HeaderButton = e.NameScope.Get<HeadTextButton>(CalendarItemThemeConstants.HeaderButtonPart);
PreviousButton = e.NameScope.Get<IconButton>(CalendarItemThemeConstants.PreviousButtonPart);
PreviousMonthButton =
e.NameScope.Get<IconButton>(CalendarItemThemeConstants.PreviousMonthButtonPart);
@@ -4,6 +4,8 @@ namespace AtomUI.Controls.CalendarView;
internal class DualMonthRangeCalendar : RangeCalendar
{
protected override Type StyleKeyOverride => typeof(DualMonthRangeCalendar);
internal override void ResetStates()
{
base.ResetStates();
@@ -20,6 +20,8 @@ public class RangeDateSelectedEventArgs : EventArgs
internal class RangeCalendar : Calendar
{
protected override Type StyleKeyOverride => typeof(RangeCalendar);
#region 公共属性定义
public static readonly StyledProperty<DateTime?> SecondarySelectedDateProperty =
+2 -2
View File
@@ -256,13 +256,13 @@ public class DatePicker : InfoPickerInput,
{
SelectedDateTime = DefaultDateTime;
}
Text = FormatDateTime(SelectedDateTime);
if (InfoIcon is null)
{
SetValue(InfoIconProperty, AntDesignIconPackage.CalendarOutlined(), BindingPriority.Template);
}
Text = FormatDateTime(SelectedDateTime);
}
protected override void OnPropertyChanged(AvaloniaPropertyChangedEventArgs change)
@@ -1,4 +1,5 @@
using Avalonia.Controls;
using AtomUI.Controls.Themes;
using Avalonia.Controls;
using Avalonia.Controls.Primitives;
namespace AtomUI.Controls;
@@ -12,6 +13,6 @@ internal class DatePickerFlyoutPresenter : FlyoutPresenter
protected override void OnApplyTemplate(TemplateAppliedEventArgs e)
{
base.OnApplyTemplate(e);
DatePickerPresenter = e.NameScope.Get<DatePickerPresenter>(DatePickerFlyoutPresenterTheme.DatePickerPresenterPart);
DatePickerPresenter = e.NameScope.Get<DatePickerPresenter>(DatePickerFlyoutPresenterThemeConstants.DatePickerPresenterPart);
}
}
@@ -1,30 +0,0 @@
using AtomUI.Theme.Styling;
using Avalonia.Controls;
using Avalonia.Controls.Templates;
namespace AtomUI.Controls;
[ControlThemeProvider]
internal class DatePickerFlyoutPresenterTheme : ArrowDecoratedBoxTheme
{
public const string DatePickerPresenterPart = "PART_DatePickerPresenter";
public DatePickerFlyoutPresenterTheme()
: this(typeof(DatePickerFlyoutPresenter))
{
}
protected DatePickerFlyoutPresenterTheme(Type targetType) : base(targetType)
{
}
protected override Control BuildContent(INameScope scope)
{
var datePickerPresenter = new DatePickerPresenter()
{
Name = DatePickerPresenterPart,
};
datePickerPresenter.RegisterInNameScope(scope);
return datePickerPresenter;
}
}
@@ -1,5 +1,6 @@
using System.Reactive.Disposables;
using AtomUI.Controls.CalendarView;
using AtomUI.Controls.Themes;
using AtomUI.Theme;
using AtomUI.Theme.Data;
using AtomUI.Theme.Styling;
@@ -194,11 +195,11 @@ internal class DatePickerPresenter : PickerPresenterBase,
protected override void OnApplyTemplate(TemplateAppliedEventArgs e)
{
base.OnApplyTemplate(e);
_nowButton = e.NameScope.Get<Button>(DatePickerPresenterTheme.NowButtonPart);
_todayButton = e.NameScope.Get<Button>(DatePickerPresenterTheme.TodayButtonPart);
_confirmButton = e.NameScope.Get<Button>(DatePickerPresenterTheme.ConfirmButtonPart);
_calendarView = e.NameScope.Get<PickerCalendar>(DatePickerPresenterTheme.CalendarViewPart);
_timeView = e.NameScope.Find<TimeView>(DatePickerPresenterTheme.TimeViewPart);
_nowButton = e.NameScope.Get<Button>(DatePickerPresenterThemeConstants.NowButtonPart);
_todayButton = e.NameScope.Get<Button>(DatePickerPresenterThemeConstants.TodayButtonPart);
_confirmButton = e.NameScope.Get<Button>(DatePickerPresenterThemeConstants.ConfirmButtonPart);
_calendarView = e.NameScope.Get<PickerCalendar>(DatePickerPresenterThemeConstants.CalendarViewPart);
_timeView = e.NameScope.Find<TimeView>(DatePickerPresenterThemeConstants.TimeViewPart);
SetupButtonStatus();
if (_calendarView is not null)
{
@@ -1,147 +0,0 @@
using AtomUI.Controls.DatePickerLang;
using AtomUI.Controls.Localization;
using AtomUI.Theme;
using AtomUI.Theme.Data;
using AtomUI.Theme.Styling;
using Avalonia.Controls;
using Avalonia.Controls.Templates;
using Avalonia.Layout;
using Avalonia.Styling;
using PickerCalendar = AtomUI.Controls.CalendarView.Calendar;
namespace AtomUI.Controls;
[ControlThemeProvider]
internal class DatePickerPresenterTheme : BaseControlTheme
{
public const string MainLayoutPart = "PART_MainLayout";
public const string NowButtonPart = "PART_NowButton";
public const string TodayButtonPart = "PART_TodayButton";
public const string ConfirmButtonPart = "PART_ConfirmButton";
public const string ButtonsLayoutPart = "PART_ButtonsLayout";
public const string ButtonsFramePart = "PART_ButtonsFrame";
public const string CalendarViewPart = "PART_CalendarView";
public const string TimeViewPart = "PART_TimeView";
public DatePickerPresenterTheme() : this(typeof(DatePickerPresenter))
{
}
public DatePickerPresenterTheme(Type targetType) : base(targetType)
{
}
protected override IControlTemplate BuildControlTemplate()
{
return new FuncControlTemplate<DatePickerPresenter>((presenter, scope) =>
{
var mainLayout = new DockPanel()
{
Name = MainLayoutPart,
LastChildFill = true
};
var calendarView = BuildCalendarView(presenter, scope);
var buttonsContainerFrame = new Border()
{
Name = ButtonsFramePart
};
CreateTemplateParentBinding(buttonsContainerFrame, Border.BorderThicknessProperty, DatePickerPresenter.BorderThicknessProperty);
var buttonsPanel = BuildButtons(presenter, scope);
CreateTemplateParentBinding(buttonsContainerFrame, Border.IsVisibleProperty, DatePickerPresenter.ButtonsPanelVisibleProperty);
buttonsContainerFrame.Child = buttonsPanel;
DockPanel.SetDock(buttonsContainerFrame, Dock.Bottom);
mainLayout.Children.Add(buttonsContainerFrame);
mainLayout.Children.Add(calendarView);
return mainLayout;
});
}
protected virtual Control BuildCalendarView(DatePickerPresenter presenter, INameScope scope)
{
var calendarLayout = new StackPanel()
{
Orientation = Orientation.Horizontal
};
var calendarView = new PickerCalendar()
{
Name = CalendarViewPart,
};
CreateTemplateParentBinding(calendarView, PickerCalendar.SelectedDateProperty, DatePickerPresenter.SelectedDateTimeProperty);
CreateTemplateParentBinding(calendarView, PickerCalendar.IsMotionEnabledProperty, DatePickerPresenter.IsMotionEnabledProperty);
calendarView.RegisterInNameScope(scope);
calendarLayout.Children.Add(calendarView);
var timeView = new TimeView()
{
Name = TimeViewPart,
VerticalAlignment = VerticalAlignment.Top,
};
CreateTemplateParentBinding(timeView, TimeView.ClockIdentifierProperty, DatePickerPresenter.ClockIdentifierProperty);
CreateTemplateParentBinding(timeView, TimeView.IsVisibleProperty, DatePickerPresenter.IsShowTimeProperty);
timeView.RegisterInNameScope(scope);
calendarLayout.Children.Add(timeView);
return calendarLayout;
}
protected virtual Panel BuildButtons(DatePickerPresenter presenter, INameScope scope)
{
var buttonsPanel = new Panel()
{
Name = ButtonsLayoutPart
};
var nowButton = new Button
{
ButtonType = ButtonType.Link,
Name = NowButtonPart,
HorizontalAlignment = HorizontalAlignment.Left,
SizeType = SizeType.Small
};
LanguageResourceBinder.CreateBinding(nowButton, Button.ContentProperty, DatePickerLangResourceKey.Now);
nowButton.RegisterInNameScope(scope);
buttonsPanel.Children.Add(nowButton);
var todayButton = new Button
{
ButtonType = ButtonType.Link,
Name = TodayButtonPart,
HorizontalAlignment = HorizontalAlignment.Left,
SizeType = SizeType.Small
};
LanguageResourceBinder.CreateBinding(todayButton, Button.ContentProperty, DatePickerLangResourceKey.Today);
todayButton.RegisterInNameScope(scope);
buttonsPanel.Children.Add(todayButton);
var confirmButton = new Button
{
Name = ConfirmButtonPart,
ButtonType = ButtonType.Primary,
SizeType = SizeType.Small,
HorizontalAlignment = HorizontalAlignment.Right
};
LanguageResourceBinder.CreateBinding(confirmButton, Button.ContentProperty, CommonLangResourceKey.OkText);
confirmButton.RegisterInNameScope(scope);
buttonsPanel.Children.Add(confirmButton);
return buttonsPanel;
}
protected override void BuildStyles()
{
var buttonsFrameStyle = new Style(selector => selector.Nesting().Template().Name(ButtonsFramePart));
buttonsFrameStyle.Add(Border.BorderBrushProperty, SharedTokenKey.ColorBorderSecondary);
Add(buttonsFrameStyle);
var buttonsPanelStyle = new Style(selector => selector.Nesting().Template().Name(ButtonsLayoutPart));
buttonsPanelStyle.Add(Panel.MarginProperty, DatePickerTokenKey.ButtonsPanelMargin);
Add(buttonsPanelStyle);
var timeViewStyle = new Style(selector => selector.Nesting().Template().Name(TimeViewPart));
timeViewStyle.Add(TimePicker.PaddingProperty, DatePickerTokenKey.PanelContentPadding);
Add(timeViewStyle);
}
}
@@ -1,31 +0,0 @@
using AtomUI.Controls.CalendarView;
using AtomUI.Theme.Styling;
using Avalonia.Controls;
using Avalonia.Controls.Templates;
namespace AtomUI.Controls;
[ControlThemeProvider]
internal class DualMonthRangeDatePickerPresenterTheme : DatePickerPresenterTheme
{
public DualMonthRangeDatePickerPresenterTheme() : this(typeof(DualMonthRangeDatePickerPresenter))
{
}
public DualMonthRangeDatePickerPresenterTheme(Type targetType) : base(targetType)
{
}
protected override Control BuildCalendarView(DatePickerPresenter presenter, INameScope scope)
{
var calendarView = new DualMonthRangeCalendar()
{
Name = CalendarViewPart,
};
CreateTemplateParentBinding(calendarView, DualMonthRangeCalendar.IsMotionEnabledProperty, DualMonthRangeDatePickerPresenter.IsMotionEnabledProperty);
CreateTemplateParentBinding(calendarView, DualMonthRangeCalendar.SelectedDateProperty, DualMonthRangeDatePickerPresenter.SelectedDateTimeProperty);
CreateTemplateParentBinding(calendarView, DualMonthRangeCalendar.SecondarySelectedDateProperty, DualMonthRangeDatePickerPresenter.SecondarySelectedDateTimeProperty);
calendarView.RegisterInNameScope(scope);
return calendarView;
}
}
@@ -559,11 +559,9 @@ public class RangeDatePicker : RangeInfoPickerInput,
protected override void OnApplyTemplate(TemplateAppliedEventArgs e)
{
base.OnApplyTemplate(e);
if (InfoIcon is null)
{
SetValue(InfoIconProperty, AntDesignIconPackage.CalendarOutlined(), BindingPriority.Template);
}
}
}
@@ -1,30 +0,0 @@
using AtomUI.Theme.Styling;
using Avalonia.Controls;
using Avalonia.Controls.Templates;
namespace AtomUI.Controls;
[ControlThemeProvider]
internal class RangeDatePickerFlyoutPresenterTheme : ArrowDecoratedBoxTheme
{
public const string PickerPresenterContentPart = "PART_PickerPresenterContent";
public RangeDatePickerFlyoutPresenterTheme()
: this(typeof(RangeDatePickerFlyoutPresenter))
{
}
protected RangeDatePickerFlyoutPresenterTheme(Type targetType) : base(targetType)
{
}
protected override Control BuildContent(INameScope scope)
{
var datePickerPresenter = new RangeDatePickerPresenter()
{
Name = PickerPresenterContentPart,
};
datePickerPresenter.RegisterInNameScope(scope);
return datePickerPresenter;
}
}
@@ -3,9 +3,11 @@
xmlns:atom="https://atomui.net"
xmlns:calendarview="using:AtomUI.Controls.CalendarView"
xmlns:datePickerLang="using:AtomUI.Controls.DatePickerLang"
xmlns:localization="clr-namespace:AtomUI.Controls.Localization"
x:Class="AtomUI.Controls.Themes.DatePickerPresenterTheme"
TargetType="atom:DatePickerPresenter">
<Setter Property="Template">
<ControlTemplate>
<ControlTemplate TargetType="atom:DatePickerPresenter">
<DockPanel Name="{x:Static atom:DatePickerPresenterThemeConstants.MainLayoutPart}"
LastChildFill="True">
<Border Name="{x:Static atom:DatePickerPresenterThemeConstants.ButtonsFramePart}"
@@ -30,7 +32,7 @@
ButtonType="Primary"
HorizontalAlignment="Right"
SizeType="Small"
Content="{DynamicResource {x:Static datePickerLang:DatePickerLangResourceKey.Today}}" />
Content="{DynamicResource {x:Static localization:CommonLangResourceKey.OkText}}" />
</Panel>
</Border>
<StackPanel Orientation="Horizontal">
@@ -40,6 +42,7 @@
IsMotionEnabled="{TemplateBinding IsMotionEnabled}" />
<atom:TimeView Name="{x:Static atom:DatePickerPresenterThemeConstants.TimeViewPart}"
VerticalAlignment="Top"
IsMotionEnabled="{TemplateBinding IsMotionEnabled}"
ClockIdentifier="{TemplateBinding ClockIdentifier}"
IsVisible="{TemplateBinding IsShowTime}" />
</StackPanel>
@@ -1,5 +1,6 @@
<ResourceDictionary xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:atom="https://atomui.net"
xmlns:themes="using:AtomUI.Controls.Themes"
xmlns:calendarview="using:AtomUI.Controls.CalendarView">
<ResourceDictionary.MergedDictionaries>
@@ -9,15 +10,15 @@
<ResourceInclude Source="CalendarView/DualMonthRangeCalendarTheme.axaml"/>
<ResourceInclude Source="CalendarView/DualMonthCalendarItemTheme.axaml"/>
<!-- <ResourceInclude Source="CalendarView/DualMonthCalendarItemTheme.axaml"/> -->
<!-- <ResourceInclude Source="CalendarView/RangeCalendarTheme.axaml"/> -->
<!-- <ResourceInclude Source="DatePickerFlyoutPresenterTheme.axaml"/> -->
<!-- <ResourceInclude Source="DualMonthRangeDatePickerPresenterTheme.axaml"/> -->
<!-- <ResourceInclude Source="RangeDatePickerFlyoutPresenterTheme.axaml"/> -->
<!-- <ResourceInclude Source="TimedRangeDatePickerPresenterTheme.axaml"/> -->
<ResourceInclude Source="DatePickerFlyoutPresenterTheme.axaml"/>
<ResourceInclude Source="DualMonthRangeDatePickerPresenterTheme.axaml"/>
<ResourceInclude Source="RangeDatePickerFlyoutPresenterTheme.axaml"/>
<ResourceInclude Source="TimedRangeDatePickerPresenterTheme.axaml"/>
<ResourceInclude Source="DatePickerTheme.axaml"/>
<ResourceInclude Source="RangeDatePickerTheme.axaml"/>
</ResourceDictionary.MergedDictionaries>
<themes:CalendarTheme x:Key="{x:Type calendarview:Calendar}" TargetType="calendarview:Calendar"/>
<themes:CalendarItemTheme x:Key="{x:Type calendarview:CalendarItem}" TargetType="calendarview:CalendarItem"/>
<themes:DatePickerPresenterTheme x:Key="{x:Type atom:DatePickerPresenter}" TargetType="atom:DatePickerPresenter"/>
</ResourceDictionary>
@@ -4,7 +4,8 @@
xmlns:themes="using:AtomUI.Controls.Themes"
xmlns:atom="https://atomui.net"
xmlns:calendarview="using:AtomUI.Controls.CalendarView"
xmlns:datePickerLang="using:AtomUI.Controls.DatePickerLang">
xmlns:datePickerLang="using:AtomUI.Controls.DatePickerLang"
xmlns:localization="clr-namespace:AtomUI.Controls.Localization">
<ControlTheme x:Key="{x:Type atom:DualMonthRangeDatePickerPresenter}"
TargetType="atom:DualMonthRangeDatePickerPresenter">
<ControlTheme.BasedOn>
@@ -36,7 +37,7 @@
ButtonType="Primary"
HorizontalAlignment="Right"
SizeType="Small"
Content="{DynamicResource {x:Static datePickerLang:DatePickerLangResourceKey.Today}}" />
Content="{DynamicResource {x:Static localization:CommonLangResourceKey.OkText}}" />
</Panel>
</Border>
<StackPanel Orientation="Horizontal">
@@ -4,7 +4,8 @@
xmlns:atom="https://atomui.net"
xmlns:themes="using:AtomUI.Controls.Themes"
xmlns:calendarview="using:AtomUI.Controls.CalendarView"
xmlns:datePickerLang="using:AtomUI.Controls.DatePickerLang">
xmlns:datePickerLang="using:AtomUI.Controls.DatePickerLang"
xmlns:localization="clr-namespace:AtomUI.Controls.Localization">
<ControlTheme x:Key="{x:Type atom:TimedRangeDatePickerPresenter}"
TargetType="atom:TimedRangeDatePickerPresenter">
<ControlTheme.BasedOn>
@@ -36,7 +37,7 @@
ButtonType="Primary"
HorizontalAlignment="Right"
SizeType="Small"
Content="{DynamicResource {x:Static datePickerLang:DatePickerLangResourceKey.Today}}" />
Content="{DynamicResource {x:Static localization:CommonLangResourceKey.OkText}}" />
</Panel>
</Border>
<StackPanel Orientation="Horizontal">
@@ -17,11 +17,8 @@ namespace AtomUI.Theme
themes.Add(new AtomUI.Controls.CircleProgressTheme());
themes.Add(new AtomUI.Controls.ContextMenuTheme());
themes.Add(new AtomUI.Controls.DashboardProgressTheme());
themes.Add(new AtomUI.Controls.DatePickerFlyoutPresenterTheme());
themes.Add(new AtomUI.Controls.DatePickerPresenterTheme());
themes.Add(new AtomUI.Controls.DrawerContainerTheme());
themes.Add(new AtomUI.Controls.DrawerInfoContainerTheme());
themes.Add(new AtomUI.Controls.DualMonthRangeDatePickerPresenterTheme());
themes.Add(new AtomUI.Controls.EmptyIndicatorTheme());
themes.Add(new AtomUI.Controls.ExpanderTheme());
themes.Add(new AtomUI.Controls.GroupBoxTheme());
@@ -44,7 +41,6 @@ namespace AtomUI.Theme
themes.Add(new AtomUI.Controls.OptionButtonGroupTheme());
themes.Add(new AtomUI.Controls.OptionButtonTheme());
themes.Add(new AtomUI.Controls.ProgressBarTheme());
themes.Add(new AtomUI.Controls.RangeDatePickerFlyoutPresenterTheme());
themes.Add(new AtomUI.Controls.SegmentedItemTheme());
themes.Add(new AtomUI.Controls.SegmentedTheme());
themes.Add(new AtomUI.Controls.SeparatorTheme());
@@ -47,6 +47,7 @@
EmbedMode="True"
IsEnableClearButton="False"
IsEnableRevealButton="False"
Width="{TemplateBinding PreferredInputWidth}"
DataValidationErrors.Errors="{TemplateBinding DataValidationErrors.Errors}"
Foreground="{TemplateBinding InputTextBrush}"
SizeType="{TemplateBinding SizeType}"
@@ -69,6 +70,7 @@
EmbedMode="True"
IsEnableClearButton="False"
IsEnableRevealButton="False"
Width="{TemplateBinding PreferredInputWidth}"
DataValidationErrors.Errors="{TemplateBinding DataValidationErrors.Errors}"
Foreground="{TemplateBinding InputTextBrush}"
SizeType="{TemplateBinding SizeType}"
@@ -311,8 +311,7 @@ internal class DateTimePickerPanel : Panel,
break;
}
}
children.MoveRange(0, numCountsToMove, children.Count);
children.MoveRange(0, numCountsToMove, children.Count - 1);
var scrollHeight = _extent.Height - Viewport.Height;
if (ShouldLoop && value.Y >= scrollHeight - _extentOne)
@@ -84,7 +84,7 @@
<Setter Property="ItemHeight" Value="{DynamicResource {x:Static atom:TimePickerTokenKey.ItemHeight}}" />
<Style Selector="^ /template/ atom|TextBlock#HeaderTextPart">
<Style Selector="^ /template/ atom|TextBlock#PART_HeaderText">
<Setter Property="Height" Value="{DynamicResource {x:Static atom:TimePickerTokenKey.ItemHeight}}" />
<Setter Property="HorizontalAlignment" Value="Center" />
<Setter Property="VerticalAlignment" Value="Center" />