feat: make sure separator is from correct level.

This commit is contained in:
rabbitism
2024-03-03 00:09:30 +08:00
parent 4d1d45579a
commit 39bc26c28e
4 changed files with 39 additions and 12 deletions

View File

@@ -7,9 +7,11 @@
d:DesignHeight="450" d:DesignHeight="450"
x:Class="Ursa.Demo.Pages.BreadcrumbDemo"> x:Class="Ursa.Demo.Pages.BreadcrumbDemo">
<StackPanel> <StackPanel>
<u:Breadcrumb> <u:Breadcrumb >
<TextBlock Text="Hello"></TextBlock> <TextBlock Text="Hello"></TextBlock>
<u:BreadcrumbItem Content="World" Icon="?"></u:BreadcrumbItem> <u:BreadcrumbItem Icon="?" Separator=""></u:BreadcrumbItem>
<TextBlock Text="Avalonia"></TextBlock>
<TextBlock Text="Ursa"></TextBlock>
</u:Breadcrumb> </u:Breadcrumb>
</StackPanel> </StackPanel>
</UserControl> </UserControl>

View File

@@ -17,6 +17,7 @@
<StackPanel Orientation="Horizontal"> <StackPanel Orientation="Horizontal">
<ContentPresenter Content="{TemplateBinding Icon}" /> <ContentPresenter Content="{TemplateBinding Icon}" />
<ContentPresenter Name="PART_ContentPresenter" Content="{TemplateBinding Content}"/> <ContentPresenter Name="PART_ContentPresenter" Content="{TemplateBinding Content}"/>
<ContentPresenter Name="Separator" Content="{TemplateBinding Separator}"></ContentPresenter>
</StackPanel> </StackPanel>
</Border> </Border>
</ControlTemplate> </ControlTemplate>

View File

@@ -58,6 +58,15 @@ public class Breadcrumb: ItemsControl
set => SetValue(IconTemplateProperty, value); set => SetValue(IconTemplateProperty, value);
} }
public static readonly StyledProperty<int> MaxItemCountProperty = AvaloniaProperty.Register<Breadcrumb, int>(
nameof(MaxItemCount), defaultValue: 4);
public int MaxItemCount
{
get => GetValue(MaxItemCountProperty);
set => SetValue(MaxItemCountProperty, value);
}
static Breadcrumb() static Breadcrumb()
{ {
ItemsPanelProperty.OverrideDefaultValue<Breadcrumb>(_defaultPanel); ItemsPanelProperty.OverrideDefaultValue<Breadcrumb>(_defaultPanel);
@@ -79,20 +88,35 @@ public class Breadcrumb: ItemsControl
if (container is not BreadcrumbItem breadcrumbItem) return; if (container is not BreadcrumbItem breadcrumbItem) return;
if (!breadcrumbItem.IsSet(BreadcrumbItem.SeparatorProperty)) if (!breadcrumbItem.IsSet(BreadcrumbItem.SeparatorProperty))
{ {
SeparatorProperty.Changed.AddClassHandler<Breadcrumb, object?>((o, e) => if (GetSeparatorInstance(Separator) is { } a)
{ {
breadcrumbItem.Separator = e.NewValue.Value switch breadcrumbItem.Separator = a;
}
SeparatorProperty.Changed.AddClassHandler<Breadcrumb, object?>((_, args) =>
{ {
string s => s, if (GetSeparatorInstance(args.NewValue.Value) is { } b)
ITemplate<Control> t => t.Build(), breadcrumbItem.Separator = b;
_ => e.NewValue.Value?.ToString()
};
}); });
} }
bool b = breadcrumbItem.IsSet(BreadcrumbItem.IconProperty); if (!breadcrumbItem.IsSet(BreadcrumbItem.IconProperty) && IconBinding != null)
if(!breadcrumbItem.IsSet(BreadcrumbItem.IconProperty) && IconBinding != null)
{ {
breadcrumbItem[!BreadcrumbItem.IconProperty] = IconBinding; breadcrumbItem[!BreadcrumbItem.IconProperty] = IconBinding;
} }
if (!breadcrumbItem.IsSet(BreadcrumbItem.CommandProperty) && CommandBinding != null)
{
breadcrumbItem[!BreadcrumbItem.CommandProperty] = CommandBinding;
} }
if (!breadcrumbItem.IsSet(BreadcrumbItem.IconTemplateProperty) && IconTemplate != null)
{
breadcrumbItem.IconTemplate = IconTemplate;
}
}
private static object? GetSeparatorInstance(object? separator) => separator switch
{
null => null,
string s => s,
ITemplate<Control?> t => t.Build(),
_ => separator.ToString()
};
} }

View File

@@ -9,7 +9,7 @@ public class BreadcrumbItem: ContentControl
{ {
public static readonly StyledProperty<object?> SeparatorProperty = public static readonly StyledProperty<object?> SeparatorProperty =
AvaloniaProperty.Register<BreadcrumbItem, object?>( AvaloniaProperty.Register<BreadcrumbItem, object?>(
nameof(Separator), "/"); nameof(Separator));
public object? Separator public object? Separator
{ {