This commit is contained in:
rabbitism
2024-02-12 20:47:55 +08:00
parent f9802d222b
commit dc3c61dab5
4 changed files with 80 additions and 49 deletions

View File

@@ -11,46 +11,46 @@
x:CompileBindings="True" x:CompileBindings="True"
x:DataType="vm:NavMenuDemoViewModel" x:DataType="vm:NavMenuDemoViewModel"
mc:Ignorable="d"> mc:Ignorable="d">
<StackPanel> <ScrollViewer>
<TextBlock Text="{ReflectionBinding #menu2.SelectedItem.Header}"></TextBlock> <StackPanel>
<u:NavMenu Name="menu2"> <TextBlock Text="{ReflectionBinding #menu2.SelectedItem.Header}"></TextBlock>
<u:NavMenu Name="menu2">
<u:NavMenuItem Header="Menu 1"> <u:NavMenuItem Header="Menu 1">
<u:NavMenuItem.Icon> <u:NavMenuItem.Icon>
<Rectangle <Rectangle
Width="10" Width="10"
Height="10" Height="10"
Fill="Red" /> Fill="Red" />
</u:NavMenuItem.Icon> </u:NavMenuItem.Icon>
<u:NavMenuItem Header="Sub Menu 1"></u:NavMenuItem> <u:NavMenuItem Header="Sub Menu 1"></u:NavMenuItem>
<u:NavMenuItem Header="Sub Menu 2"></u:NavMenuItem> <u:NavMenuItem Header="Sub Menu 2"></u:NavMenuItem>
<u:NavMenuItem Header="Sub Menu 3"></u:NavMenuItem> <u:NavMenuItem Header="Sub Menu 3"></u:NavMenuItem>
</u:NavMenuItem> </u:NavMenuItem>
<u:NavMenuItem Header="Menu 2"> <u:NavMenuItem Header="Menu 2">
<u:NavMenuItem.Icon> <u:NavMenuItem.Icon>
<Rectangle <Rectangle
Width="20" Width="20"
Height="10" Height="10"
Fill="Red" /> Fill="Red" />
</u:NavMenuItem.Icon> </u:NavMenuItem.Icon>
</u:NavMenuItem> </u:NavMenuItem>
<u:NavMenuItem Header="Menu 3"> <u:NavMenuItem Header="Menu 3">
<u:NavMenuItem.Icon> <u:NavMenuItem.Icon>
<Rectangle <Rectangle
Width="30" Width="30"
Height="10" Height="10"
Fill="Red" /> Fill="Red" />
</u:NavMenuItem.Icon> </u:NavMenuItem.Icon>
</u:NavMenuItem> </u:NavMenuItem>
</u:NavMenu> </u:NavMenu>
<u:Divider Content="Divider" /> <u:Divider Content="Divider" />
<TextBlock Text="{ReflectionBinding #menu.SelectedItem.Header}" /> <TextBlock Text="{ReflectionBinding #menu.SelectedItem.Header}" />
<u:NavMenu <u:NavMenu
Name="menu" Name="menu"
ItemsSource="{Binding MenuItems}" ItemsSource="{Binding MenuItems}"
HeaderBinding="{Binding Header}" HeaderBinding="{Binding}"
SubMenuBinding="{Binding Children}" SubMenuBinding="{Binding Children}"
IconBinding="{Binding Header}"/> IconBinding="{Binding Header}"/>
</StackPanel> </StackPanel>
</ScrollViewer>
</UserControl> </UserControl>

View File

@@ -13,7 +13,12 @@ public class NavMenuDemoViewModel: ObservableObject
{ {
new MenuItem { Header = "Introduction" , Children = new MenuItem { Header = "Introduction" , Children =
{ {
new MenuItem() { Header = "Getting Started" }, new MenuItem() { Header = "Getting Started", Children =
{
new MenuItem() { Header = "Code of Conduct" },
new MenuItem() { Header = "How to Contribute" },
new MenuItem() { Header = "Development Workflow" },
}},
new MenuItem() { Header = "Design Principles" }, new MenuItem() { Header = "Design Principles" },
new MenuItem() { Header = "Contributing", Children = new MenuItem() { Header = "Contributing", Children =
{ {

View File

@@ -7,7 +7,9 @@
<Setter Property="Grid.IsSharedSizeScope" Value="True" /> <Setter Property="Grid.IsSharedSizeScope" Value="True" />
<Setter Property="Template"> <Setter Property="Template">
<ControlTemplate TargetType="u:NavMenu"> <ControlTemplate TargetType="u:NavMenu">
<ItemsPresenter ItemsPanel="{TemplateBinding ItemsPanel}" /> <ScrollViewer HorizontalScrollBarVisibility="Disabled" VerticalScrollBarVisibility="Auto">
<ItemsPresenter ItemsPanel="{TemplateBinding ItemsPanel}" />
</ScrollViewer>
</ControlTemplate> </ControlTemplate>
</Setter> </Setter>
</ControlTheme> </ControlTheme>
@@ -15,19 +17,22 @@
<ControlTheme x:Key="{x:Type u:NavMenuItem}" TargetType="u:NavMenuItem"> <ControlTheme x:Key="{x:Type u:NavMenuItem}" TargetType="u:NavMenuItem">
<Setter Property="Template"> <Setter Property="Template">
<ControlTemplate TargetType="u:NavMenuItem"> <ControlTemplate TargetType="u:NavMenuItem">
<Grid RowDefinitions="Auto, *"> <Grid RowDefinitions="Auto, *" Background="{TemplateBinding Background}">
<Grid Grid.Row="0"> <Grid Grid.Row="0">
<Grid.ColumnDefinitions> <Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" SharedSizeGroup="Icon" /> <ColumnDefinition Width="Auto" SharedSizeGroup="Icon" />
<ColumnDefinition Width="*" /> <ColumnDefinition Width="*" SharedSizeGroup="Header" />
<ColumnDefinition Width="Auto" SharedSizeGroup="Expander" />
</Grid.ColumnDefinitions> </Grid.ColumnDefinitions>
<ContentPresenter <ContentPresenter
HorizontalAlignment="Left" HorizontalAlignment="Left"
Background="Aqua" Padding="8"
Background="Transparent"
Content="{TemplateBinding Icon}" /> Content="{TemplateBinding Icon}" />
<ContentPresenter <ContentPresenter
Grid.Column="1" Grid.Column="1"
Background="LightYellow" Padding="0 8"
Background="Transparent"
Content="{TemplateBinding Header}" /> Content="{TemplateBinding Header}" />
</Grid> </Grid>
<ItemsPresenter <ItemsPresenter
@@ -38,5 +43,9 @@
</Grid> </Grid>
</ControlTemplate> </ControlTemplate>
</Setter> </Setter>
<Style Selector="^:selected">
<Setter Property="Background" Value="{DynamicResource NavigationMenuItemSelectedBackground}" />
</Style>
</ControlTheme> </ControlTheme>
</ResourceDictionary> </ResourceDictionary>

View File

@@ -11,6 +11,12 @@ using Avalonia.VisualTree;
namespace Ursa.Controls; namespace Ursa.Controls;
/// <summary>
/// Navigation Menu Item
/// <para>Note:</para>
/// <para>collapsed: Entire menu is collapsed, only first level icon is displayed. Submenus are in popup. </para>
/// <para>closed: When menu is not in collapsed mode, represents whether submenu is hidden. </para>
/// </summary>
[PseudoClasses(PC_Highlighted, PC_Collapsed, PC_Closed, PC_FirstLevel, PC_Selector)] [PseudoClasses(PC_Highlighted, PC_Collapsed, PC_Closed, PC_FirstLevel, PC_Selector)]
public class NavMenuItem: HeaderedSelectingItemsControl public class NavMenuItem: HeaderedSelectingItemsControl
{ {
@@ -145,7 +151,10 @@ public class NavMenuItem: HeaderedSelectingItemsControl
protected override void OnPointerPressed(PointerPressedEventArgs e) protected override void OnPointerPressed(PointerPressedEventArgs e)
{ {
base.OnPointerPressed(e); base.OnPointerPressed(e);
SelectItem(this); if (this.ItemCount == 0)
{
SelectItem(this);
}
Command?.Execute(CommandParameter); Command?.Execute(CommandParameter);
e.Handled = true; e.Handled = true;
} }
@@ -165,6 +174,14 @@ public class NavMenuItem: HeaderedSelectingItemsControl
if (this.Parent is NavMenuItem menuItem) if (this.Parent is NavMenuItem menuItem)
{ {
menuItem.SelectItem(item); menuItem.SelectItem(item);
var items = menuItem.LogicalChildren.OfType<NavMenuItem>();
foreach (var child in items)
{
if (child != this)
{
child.ClearSelection();
}
}
} }
else if (this.Parent is NavMenu menu) else if (this.Parent is NavMenu menu)
{ {