Merge pull request #159 from irihitech/toolbar

Toolbar fix
This commit is contained in:
Dong Bin
2024-03-17 11:56:14 +08:00
committed by GitHub
3 changed files with 44 additions and 23 deletions

View File

@@ -26,6 +26,11 @@
Orientation="{Binding #Orientation.Value}"> Orientation="{Binding #Orientation.Value}">
<Button u:ToolBar.OverflowMode="Never" Content="Button 1" /> <Button u:ToolBar.OverflowMode="Never" Content="Button 1" />
<u:ToolBarSeparator /> <u:ToolBarSeparator />
<TextBox Width="100" VerticalAlignment="Center"></TextBox>
<StackPanel Orientation="Horizontal">
<RadioButton Content="A" VerticalAlignment="Center"></RadioButton>
<RadioButton Content="B" VerticalAlignment="Center"></RadioButton>
</StackPanel>
<Button u:ToolBar.OverflowMode="AsNeeded" Content="Button 2" /> <Button u:ToolBar.OverflowMode="AsNeeded" Content="Button 2" />
<Button u:ToolBar.OverflowMode="AsNeeded" Content="Button 3" /> <Button u:ToolBar.OverflowMode="AsNeeded" Content="Button 3" />
<ToggleButton Content="Toggle" /> <ToggleButton Content="Toggle" />

View File

@@ -28,6 +28,7 @@
<ControlTheme x:Key="{x:Type u:ToolBar}" TargetType="u:ToolBar"> <ControlTheme x:Key="{x:Type u:ToolBar}" TargetType="u:ToolBar">
<Setter Property="HorizontalAlignment" Value="Left"/> <Setter Property="HorizontalAlignment" Value="Left"/>
<Setter Property="VerticalAlignment" Value="Top"/> <Setter Property="VerticalAlignment" Value="Top"/>
<Setter Property="Background" Value="Transparent"/>
<Setter Property="ItemsPanel"> <Setter Property="ItemsPanel">
<ItemsPanelTemplate> <ItemsPanelTemplate>
<u:ToolBarPanel /> <u:ToolBarPanel />
@@ -36,12 +37,14 @@
<Setter Property="Template"> <Setter Property="Template">
<ControlTemplate TargetType="u:ToolBar"> <ControlTemplate TargetType="u:ToolBar">
<Border <Border
Padding="2" Name="PART_BackgroundBorder"
Margin="0" Padding="{TemplateBinding Padding}"
Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}"
HorizontalAlignment="{TemplateBinding HorizontalAlignment}" HorizontalAlignment="{TemplateBinding HorizontalAlignment}"
VerticalAlignment="{TemplateBinding VerticalAlignment}" VerticalAlignment="{TemplateBinding VerticalAlignment}"
CornerRadius="4" CornerRadius="4">
Theme="{DynamicResource CardBorder}">
<DockPanel LastChildFill="True"> <DockPanel LastChildFill="True">
<ContentPresenter <ContentPresenter
Name="PART_Header" Name="PART_Header"

View File

@@ -100,37 +100,50 @@ public class ToolBarPanel: StackPanel
protected override Size ArrangeOverride(Size finalSize) protected override Size ArrangeOverride(Size finalSize)
{ {
Children.Clear();
OverflowPanel?.Children.Clear();
var logicalChildren = _parent?.GetLogicalChildren().OfType<Control>().ToList(); var logicalChildren = _parent?.GetLogicalChildren().OfType<Control>().ToList();
if(logicalChildren is null) return finalSize; if(logicalChildren is null) return finalSize;
bool overflow = false; bool overflow = false;
foreach (var child in logicalChildren) for (int i = 0; i < logicalChildren.Count; i++)
{ {
if (ToolBar.GetIsOverflowItem(child)) var child = logicalChildren[i];
if(child is ToolBarSeparator s) s.IsVisible = true;
var isItemOverflow = ToolBar.GetIsOverflowItem(child);
if(isItemOverflow) overflow = true;
if (Children?.Contains(child) == true)
{ {
OverflowPanel?.Children.Add(child); if (isItemOverflow)
overflow = true; {
Children.Remove(child);
var overflowIndex = -1;
if (i > 1)
{
var last = logicalChildren[i - 1];
overflowIndex = OverflowPanel?.Children?.IndexOf(last) ?? -1;
}
OverflowPanel?.Children?.Insert(overflowIndex + 1, child);
}
} }
else else if (OverflowPanel?.Children?.Contains(child) == true)
{ {
Children.Add(child); if (!isItemOverflow)
} {
OverflowPanel.Children.Remove(child);
if (child is ToolBarSeparator s) var index = -1;
{ if (i > 1)
s.IsVisible = true; {
var last = logicalChildren[i - 1];
index = Children?.IndexOf(last) ?? -1;
}
Children?.Insert(index + 1, child);
}
} }
} }
var thisLast = this.Children.LastOrDefault(); if (this.Children?.LastOrDefault() is ToolBarSeparator s2)
if (thisLast is ToolBarSeparator s2)
{ {
s2.IsVisible = false; s2.IsVisible = false;
} }
if (OverflowPanel?.Children?.FirstOrDefault() is ToolBarSeparator s3)
var thatFirst = OverflowPanel?.Children.FirstOrDefault();
if (thatFirst is ToolBarSeparator s3)
{ {
s3.IsVisible = false; s3.IsVisible = false;
} }