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"
x:Class="Ursa.Demo.Pages.BreadcrumbDemo">
<StackPanel>
<u:Breadcrumb>
<u:Breadcrumb >
<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>
</StackPanel>
</UserControl>

View File

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

View File

@@ -57,6 +57,15 @@ public class Breadcrumb: ItemsControl
get => GetValue(IconTemplateProperty);
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()
{
@@ -79,20 +88,35 @@ public class Breadcrumb: ItemsControl
if (container is not BreadcrumbItem breadcrumbItem) return;
if (!breadcrumbItem.IsSet(BreadcrumbItem.SeparatorProperty))
{
SeparatorProperty.Changed.AddClassHandler<Breadcrumb, object?>((o, e) =>
if (GetSeparatorInstance(Separator) is { } a)
{
breadcrumbItem.Separator = e.NewValue.Value switch
{
string s => s,
ITemplate<Control> t => t.Build(),
_ => e.NewValue.Value?.ToString()
};
breadcrumbItem.Separator = a;
}
SeparatorProperty.Changed.AddClassHandler<Breadcrumb, object?>((_, args) =>
{
if (GetSeparatorInstance(args.NewValue.Value) is { } b)
breadcrumbItem.Separator = b;
});
}
bool b = breadcrumbItem.IsSet(BreadcrumbItem.IconProperty);
if(!breadcrumbItem.IsSet(BreadcrumbItem.IconProperty) && IconBinding != null)
if (!breadcrumbItem.IsSet(BreadcrumbItem.IconProperty) && IconBinding != null)
{
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 =
AvaloniaProperty.Register<BreadcrumbItem, object?>(
nameof(Separator), "/");
nameof(Separator));
public object? Separator
{