diff --git a/demo/Ursa.Demo/Pages/TimelineDemo.axaml b/demo/Ursa.Demo/Pages/TimelineDemo.axaml
index 04d12b4..70bccc0 100644
--- a/demo/Ursa.Demo/Pages/TimelineDemo.axaml
+++ b/demo/Ursa.Demo/Pages/TimelineDemo.axaml
@@ -47,23 +47,26 @@
-
+ ItemsSource="{Binding Items}"
+ TimeMemberBinding="{ReflectionBinding Time}" />
+
diff --git a/demo/Ursa.Demo/ViewModels/TimelineDemoViewModel.cs b/demo/Ursa.Demo/ViewModels/TimelineDemoViewModel.cs
index 73e1335..54cb092 100644
--- a/demo/Ursa.Demo/ViewModels/TimelineDemoViewModel.cs
+++ b/demo/Ursa.Demo/ViewModels/TimelineDemoViewModel.cs
@@ -11,7 +11,6 @@ public class TimelineDemoViewModel: ViewModelBase
new()
{
Time = DateTime.Now,
- TimeFormat = "yyyy-MM-dd HH:mm:ss",
Description = "Item 1",
Header = "审核中",
ItemType = TimelineItemType.Success,
@@ -19,7 +18,6 @@ public class TimelineDemoViewModel: ViewModelBase
new()
{
Time = DateTime.Now,
- TimeFormat = "HH:mm:ss",
Description = "Item 2",
Header = "发布成功",
ItemType = TimelineItemType.Ongoing,
@@ -27,7 +25,6 @@ public class TimelineDemoViewModel: ViewModelBase
new()
{
Time = DateTime.Now,
- TimeFormat = "HH:mm:ss",
Description = "Item 3",
Header = "审核失败",
ItemType = TimelineItemType.Error,
diff --git a/src/Ursa.Themes.Semi/Controls/Timeline.axaml b/src/Ursa.Themes.Semi/Controls/Timeline.axaml
index dd7c25f..87d5e48 100644
--- a/src/Ursa.Themes.Semi/Controls/Timeline.axaml
+++ b/src/Ursa.Themes.Semi/Controls/Timeline.axaml
@@ -18,7 +18,7 @@
-
+
@@ -32,51 +32,64 @@
WarningBrush="{DynamicResource WarningTimelineIconForeground}" />
+
+
-
-
+
+
-
-
+ RowDefinitions="Auto, *">
+
+
+
+ ContentTemplate="{TemplateBinding HeaderTemplate}" />
+
+
+
+
+
+
+
+
@@ -86,12 +99,57 @@
-
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Ursa/Controls/Timeline/Timeline.cs b/src/Ursa/Controls/Timeline/Timeline.cs
index 3577226..f6809ca 100644
--- a/src/Ursa/Controls/Timeline/Timeline.cs
+++ b/src/Ursa/Controls/Timeline/Timeline.cs
@@ -69,6 +69,27 @@ public class Timeline: ItemsControl
set => SetValue(DescriptionTemplateProperty, value);
}
+ public static readonly StyledProperty TimeMemberBindingProperty = AvaloniaProperty.Register(
+ nameof(TimeMemberBinding));
+
+ [AssignBinding]
+ [InheritDataTypeFromItems(nameof(ItemsSource))]
+ public IBinding? TimeMemberBinding
+ {
+ get => GetValue(TimeMemberBindingProperty);
+ set => SetValue(TimeMemberBindingProperty, value);
+ }
+
+ public static readonly StyledProperty TimeFormatProperty = AvaloniaProperty.Register(
+ nameof(TimeFormat), defaultValue:"yyyy-MM-dd HH:mm:ss");
+
+ public string? TimeFormat
+ {
+ get => GetValue(TimeFormatProperty);
+ set => SetValue(TimeFormatProperty, value);
+ }
+
+
public static readonly StyledProperty ModeProperty = AvaloniaProperty.Register(
nameof(Mode));
@@ -124,6 +145,11 @@ public class Timeline: ItemsControl
{
t.Bind(ContentControl.ContentProperty, DescriptionMemberBinding);
}
+ if (TimeMemberBinding != null)
+ {
+ t.Bind(TimelineItem.TimeProperty, TimeMemberBinding);
+ }
+ t.SetCurrentValue(TimelineItem.TimeFormatProperty, TimeFormat);
t.SetCurrentValue(TimelineItem.IconTemplateProperty, IconTemplate);
t.SetCurrentValue(HeaderedContentControl.HeaderTemplateProperty, ItemTemplate);
t.SetCurrentValue(ContentControl.ContentTemplateProperty, DescriptionTemplate);
diff --git a/src/Ursa/Controls/Timeline/TimelineDisplayMode.cs b/src/Ursa/Controls/Timeline/TimelineDisplayMode.cs
index 1907672..9ecfcd9 100644
--- a/src/Ursa/Controls/Timeline/TimelineDisplayMode.cs
+++ b/src/Ursa/Controls/Timeline/TimelineDisplayMode.cs
@@ -6,4 +6,11 @@ public enum TimelineDisplayMode
Center,
Right,
Alternate,
+}
+
+public enum TimelineItemDisplayMode
+{
+ Left,
+ Right,
+ Separate,
}
\ No newline at end of file
diff --git a/src/Ursa/Controls/Timeline/TimelineItem.cs b/src/Ursa/Controls/Timeline/TimelineItem.cs
index 8f08983..4b63f70 100644
--- a/src/Ursa/Controls/Timeline/TimelineItem.cs
+++ b/src/Ursa/Controls/Timeline/TimelineItem.cs
@@ -1,6 +1,7 @@
using Avalonia;
using Avalonia.Controls;
using Avalonia.Controls.Metadata;
+using Avalonia.Controls.Presenters;
using Avalonia.Controls.Primitives;
using Avalonia.Controls.Templates;
using Avalonia.Data;
@@ -9,11 +10,30 @@ using Avalonia.Media;
namespace Ursa.Controls;
[PseudoClasses(PC_First, PC_Last, PC_EmptyIcon)]
+[TemplatePart(PART_Header, typeof(ContentPresenter))]
+[TemplatePart(PART_Icon, typeof(ContentPresenter))]
+[TemplatePart(PART_Content, typeof(ContentPresenter))]
+[TemplatePart(PART_Time, typeof(TextBlock))]
+[TemplatePart(PART_RootGrid, typeof(Grid))]
public class TimelineItem: HeaderedContentControl
{
public const string PC_First = ":first";
public const string PC_Last = ":last";
public const string PC_EmptyIcon = ":empty-icon";
+ public const string PC_AllLeft=":all-left";
+ public const string PC_AllRight=":all-right";
+ public const string PC_Separate = ":separate";
+ public const string PART_Header = "PART_Header";
+ public const string PART_Icon = "PART_Icon";
+ public const string PART_Content = "PART_Content";
+ public const string PART_Time = "PART_Time";
+ public const string PART_RootGrid = "PART_RootGrid";
+
+ private ContentPresenter? _headerPresenter;
+ private ContentPresenter? _iconPresenter;
+ private ContentPresenter? _contentPresenter;
+ private TextBlock? _timePresenter;
+ private Grid? _rootGrid;
public static readonly StyledProperty