mirror of
https://github.com/AtomUI/AtomUI.git
synced 2026-10-27 21:58:05 +08:00
1:Use BreadcrumbConstants.cs
2:Optimize MeasureOverride && ArrangeOverride
This commit is contained in:
@@ -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 />
|
||||
|
||||
Reference in New Issue
Block a user