1:Use BreadcrumbConstants.cs

2:Optimize MeasureOverride && ArrangeOverride
This commit is contained in:
sukuyedai
2025-08-10 18:53:40 +08:00
parent b9a22b49a1
commit 094f25289d
4 changed files with 9 additions and 49 deletions
@@ -7,30 +7,15 @@ internal class BreadcrumbStackPanel : Panel
{
protected override Size MeasureOverride(Size availableSize)
{
return MeasureOverrideNoExpanding(availableSize);
}
private Size MeasureOverrideNoExpanding(Size availableSize)
{
var layoutSlotSize = availableSize;
layoutSlotSize = layoutSlotSize.WithWidth(double.PositiveInfinity);
var hasVisibleChild = false;
var targetWidth = 0d;
var targetHeight = 0d;
var targetHeight = 0d;
var targetWidth = 0d;
foreach (var child in Children)
{
if (child is BreadcrumbItem box)
{
var isVisible = box.IsVisible;
if (isVisible && !hasVisibleChild)
{
hasVisibleChild = true;
}
box.Measure(layoutSlotSize);
var childDesiredSize = box.DesiredSize;
targetWidth += childDesiredSize.Width;
targetHeight = Math.Max(targetHeight, childDesiredSize.Height);
box.Measure(availableSize);
targetWidth += box.DesiredSize.Width;
targetHeight = Math.Max(targetHeight, box.DesiredSize.Height);
}
}
@@ -38,12 +23,6 @@ internal class BreadcrumbStackPanel : Panel
}
protected override Size ArrangeOverride(Size finalSize)
{
ArrangeOverrideNoExpanding(finalSize);
return finalSize;
}
private Size ArrangeOverrideNoExpanding(Size finalSize)
{
var previousChildSize = 0.0;
var offsetX = 0d;
@@ -52,19 +31,11 @@ internal class BreadcrumbStackPanel : Panel
{
if (child is BreadcrumbItem box)
{
if (!box.IsVisible)
{
continue;
}
previousChildSize = box.DesiredSize.Width;
box.Arrange(new Rect(new Point(offsetX, offsetY), box.DesiredSize));
offsetX += previousChildSize;
}
}
return finalSize;
}
}
@@ -2,5 +2,6 @@
internal static class BreadcrumbConstants
{
public const string TextPresenterPart = "RootLayout";
public const string FramePart = "PART_Frame";
public const string TextPresenterPart = "PART_ItemsPresenter";
}
@@ -4,10 +4,6 @@
xmlns:atom="https://atomui.net">
<atom:BoolToThicknessConverter x:Key="BoolToThicknessConverter" />
<atom:StringToTextBlockConverter x:Key="StringToTextBlockConverter" VerticalAlignment="Center" />
<!--
x:key表示,如果遇到atom:Breadcrumb,那就是我
TargetType="atom:Breadcrumb"表示本axaml中的所有属性均来自于atom:Breadcrumb class
-->
<ControlTheme x:Key="{x:Type atom:BreadcrumbItem}" TargetType="atom:BreadcrumbItem">
<Setter Property="Template">
<ControlTemplate>
@@ -3,28 +3,20 @@
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:atom="https://atomui.net">
<atom:BoolToThicknessConverter x:Key="BoolToThicknessConverter" />
<!--
x:key表示,如果遇到atom:Breadcrumb,那就是我
TargetType="atom:Breadcrumb"表示本axaml中的所有属性均来自于atom:Breadcrumb class
-->
<ControlTheme x:Key="{x:Type atom:Breadcrumb}" TargetType="atom:Breadcrumb">
<!--
把外部 ViewModel 里的集合 Breadcrumbs 绑进来。(在 Theme 里写死绑定是一种偷懒写法;实际可以删掉,让外部自己绑。)
<Setter Property="ItemsSource" Value="{TemplateBinding ItemsSource}" />,直接写在下面就会报错
-->
<Setter Property="HorizontalAlignment" Value="Left" />
<Setter Property="VerticalAlignment" Value="Center" />
<Setter Property="Foreground" Value="{DynamicResource {x:Static atom:BreadcrumbTokenKey.ItemColor}}" />
<Setter Property="IconSize" Value="{DynamicResource {x:Static atom:BreadcrumbTokenKey.IconSize}}" />
<Setter Property="Template">
<ControlTemplate>
<Border Name="FramePart"
<Border Name="{x:Static atom:BreadcrumbConstants.FramePart}"
CornerRadius="{TemplateBinding CornerRadius}"
Padding="{TemplateBinding Padding}"
ClipToBounds="True"
VerticalAlignment="Center"
HorizontalAlignment="Center">
<ItemsPresenter Name="PART_ItemsPresenter">
<ItemsPresenter Name="{x:Static atom:BreadcrumbConstants.TextPresenterPart}">
<ItemsPresenter.ItemsPanel>
<ItemsPanelTemplate>
<atom:BreadcrumbStackPanel />