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

View File

@@ -13,7 +13,12 @@ public class NavMenuDemoViewModel: ObservableObject
{
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 = "Contributing", Children =
{

View File

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

View File

@@ -11,6 +11,12 @@ using Avalonia.VisualTree;
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)]
public class NavMenuItem: HeaderedSelectingItemsControl
{
@@ -145,7 +151,10 @@ public class NavMenuItem: HeaderedSelectingItemsControl
protected override void OnPointerPressed(PointerPressedEventArgs e)
{
base.OnPointerPressed(e);
SelectItem(this);
if (this.ItemCount == 0)
{
SelectItem(this);
}
Command?.Execute(CommandParameter);
e.Handled = true;
}
@@ -165,6 +174,14 @@ public class NavMenuItem: HeaderedSelectingItemsControl
if (this.Parent is NavMenuItem menuItem)
{
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)
{