diff --git a/src/Net_GE45/HandyControlDemo_Net_GE45/HandyControlDemo_Net_GE45.csproj b/src/Net_GE45/HandyControlDemo_Net_GE45/HandyControlDemo_Net_GE45.csproj
index 72fccc30..4e165a1b 100644
--- a/src/Net_GE45/HandyControlDemo_Net_GE45/HandyControlDemo_Net_GE45.csproj
+++ b/src/Net_GE45/HandyControlDemo_Net_GE45/HandyControlDemo_Net_GE45.csproj
@@ -430,6 +430,11 @@
Resources\Img\LeftMainContent\MainMenuControl_16x.png
+
+
+ Resources\fabric-icons.ttf
+
+
\ No newline at end of file
diff --git a/src/Shared/HandyControlDemo_Shared/HandyControlDemo_Shared.projitems b/src/Shared/HandyControlDemo_Shared/HandyControlDemo_Shared.projitems
index 472ed3f4..e7fe4d04 100644
--- a/src/Shared/HandyControlDemo_Shared/HandyControlDemo_Shared.projitems
+++ b/src/Shared/HandyControlDemo_Shared/HandyControlDemo_Shared.projitems
@@ -336,6 +336,10 @@
Designer
MSBuild:Compile
+
+ Designer
+ MSBuild:Compile
+
Designer
MSBuild:Compile
diff --git a/src/Shared/HandyControlDemo_Shared/Resources/Themes/Basic/Basic.xaml b/src/Shared/HandyControlDemo_Shared/Resources/Themes/Basic/Basic.xaml
index 6b2fbe74..927f257f 100644
--- a/src/Shared/HandyControlDemo_Shared/Resources/Themes/Basic/Basic.xaml
+++ b/src/Shared/HandyControlDemo_Shared/Resources/Themes/Basic/Basic.xaml
@@ -4,6 +4,7 @@
+
\ No newline at end of file
diff --git a/src/Shared/HandyControlDemo_Shared/Resources/Themes/Basic/Fonts.xaml b/src/Shared/HandyControlDemo_Shared/Resources/Themes/Basic/Fonts.xaml
new file mode 100644
index 00000000..700d0689
--- /dev/null
+++ b/src/Shared/HandyControlDemo_Shared/Resources/Themes/Basic/Fonts.xaml
@@ -0,0 +1,6 @@
+
+
+ pack://application:,,,/HandyControlDemo;component/Resources/fabric-icons.ttf#Fabric MDL2 Assets
+
+
diff --git a/src/Shared/HandyControlDemo_Shared/Resources/Themes/Styles/Style.xaml b/src/Shared/HandyControlDemo_Shared/Resources/Themes/Styles/Style.xaml
index d8cd940a..49831368 100644
--- a/src/Shared/HandyControlDemo_Shared/Resources/Themes/Styles/Style.xaml
+++ b/src/Shared/HandyControlDemo_Shared/Resources/Themes/Styles/Style.xaml
@@ -5,6 +5,7 @@
+
+
+
\ No newline at end of file
diff --git a/src/Shared/HandyControlDemo_Shared/Resources/fabric-icons.ttf b/src/Shared/HandyControlDemo_Shared/Resources/fabric-icons.ttf
new file mode 100644
index 00000000..9964e1a0
Binary files /dev/null and b/src/Shared/HandyControlDemo_Shared/Resources/fabric-icons.ttf differ
diff --git a/src/Shared/HandyControlDemo_Shared/UserControl/Controls/SideMenuDemoCtl.xaml b/src/Shared/HandyControlDemo_Shared/UserControl/Controls/SideMenuDemoCtl.xaml
index 0ffcf88e..1b9da3bf 100644
--- a/src/Shared/HandyControlDemo_Shared/UserControl/Controls/SideMenuDemoCtl.xaml
+++ b/src/Shared/HandyControlDemo_Shared/UserControl/Controls/SideMenuDemoCtl.xaml
@@ -6,31 +6,141 @@
Background="{DynamicResource RegionBrush}">
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Shared/HandyControl_Shared/Controls/SideMenu/SideMenu.cs b/src/Shared/HandyControl_Shared/Controls/SideMenu/SideMenu.cs
index d8fc2a07..d419a4cd 100644
--- a/src/Shared/HandyControl_Shared/Controls/SideMenu/SideMenu.cs
+++ b/src/Shared/HandyControl_Shared/Controls/SideMenu/SideMenu.cs
@@ -1,4 +1,5 @@
using System.Windows;
+using HandyControl.Data;
namespace HandyControl.Controls
{
@@ -6,6 +7,41 @@ namespace HandyControl.Controls
{
private SideMenuItem _selectedItem;
+ private SideMenuItem _selectedHeader;
+
+ public SideMenu()
+ {
+ AddHandler(SideMenuItem.SelectedEvent, new RoutedEventHandler(SideMenuItemSelected));
+ }
+
+ private void SideMenuItemSelected(object sender, RoutedEventArgs e)
+ {
+ if (e.OriginalSource is SideMenuItem item)
+ {
+ if (item.Role == SideMenuItemRole.Item)
+ {
+ if (_selectedItem != null)
+ {
+ _selectedItem.IsSelected = false;
+ }
+
+ _selectedItem = item;
+ _selectedItem.IsSelected = true;
+ }
+ else
+ {
+ if (_selectedHeader != null)
+ {
+ _selectedHeader.IsSelected = false;
+ }
+
+ _selectedHeader = item;
+ _selectedHeader.IsSelected = true;
+ _selectedHeader.SelectDefaultItem(_selectedItem);
+ }
+ }
+ }
+
protected override DependencyObject GetContainerForItemOverride() => new SideMenuItem();
protected override bool IsItemItsOwnContainerOverride(object item) => item is SideMenuItem;
diff --git a/src/Shared/HandyControl_Shared/Controls/SideMenu/SideMenuItem.cs b/src/Shared/HandyControl_Shared/Controls/SideMenu/SideMenuItem.cs
index c7802260..c5fa28f9 100644
--- a/src/Shared/HandyControl_Shared/Controls/SideMenu/SideMenuItem.cs
+++ b/src/Shared/HandyControl_Shared/Controls/SideMenu/SideMenuItem.cs
@@ -1,10 +1,14 @@
-using System.Windows;
+using System.Linq;
+using System.Windows;
+using System.Windows.Input;
using HandyControl.Data;
namespace HandyControl.Controls
{
public class SideMenuItem : HeaderedSimpleItemsControl, ISelectable
{
+ private bool _isMouseLeftButtonDown;
+
public static readonly DependencyProperty IconProperty = DependencyProperty.Register(
"Icon", typeof(object), typeof(SideMenuItem), new PropertyMetadata(default(object)));
@@ -35,21 +39,59 @@ namespace HandyControl.Controls
set => SetValue(IsSelectedProperty, value);
}
- private static readonly DependencyPropertyKey RolePropertyKey =
- DependencyProperty.RegisterReadOnly(nameof(Role), typeof(SideMenuItemRole), typeof(SideMenuItem),
- new PropertyMetadata(SideMenuItemRole.Header));
+ public static readonly DependencyProperty RoleProperty = DependencyProperty.Register(
+ "Role", typeof(SideMenuItemRole), typeof(SideMenuItem), new PropertyMetadata(default(SideMenuItemRole)));
- public static readonly DependencyProperty RoleProperty = RolePropertyKey.DependencyProperty;
-
- public SideMenuItemRole Role => (SideMenuItemRole) GetValue(RoleProperty);
+ public SideMenuItemRole Role
+ {
+ get => (SideMenuItemRole) GetValue(RoleProperty);
+ internal set => SetValue(RoleProperty, value);
+ }
protected override DependencyObject GetContainerForItemOverride() => new SideMenuItem();
protected override bool IsItemItsOwnContainerOverride(object item) => item is SideMenuItem;
- private void UpdateRole()
+ protected override void OnMouseLeave(MouseEventArgs e)
{
-
+ base.OnMouseLeave(e);
+
+ _isMouseLeftButtonDown = false;
+ }
+
+ protected override void OnMouseLeftButtonDown(MouseButtonEventArgs e)
+ {
+ base.OnMouseLeftButtonDown(e);
+
+ _isMouseLeftButtonDown = true;
+ }
+
+ protected override void OnMouseLeftButtonUp(MouseButtonEventArgs e)
+ {
+ base.OnMouseLeftButtonUp(e);
+
+ if (_isMouseLeftButtonDown)
+ {
+ if (!IsSelected)
+ {
+ IsSelected = true;
+ OnSelected(new RoutedEventArgs(SelectedEvent, this));
+ }
+ _isMouseLeftButtonDown = false;
+ }
+ }
+
+ internal void SelectDefaultItem(SideMenuItem menuItem)
+ {
+ if (Role == SideMenuItemRole.Header && ItemsHost.Children.Count > 0)
+ {
+ if (ItemsHost.Children.Contains(menuItem)) return;
+ var item = ItemsHost.Children.OfType().FirstOrDefault();
+ if (item != null && !item.IsSelected)
+ {
+ item.OnSelected(new RoutedEventArgs(SelectedEvent, item));
+ }
+ }
}
}
}
\ No newline at end of file
diff --git a/src/Shared/HandyControl_Shared/Themes/Styles/Base/SideMenuBaseStyle.xaml b/src/Shared/HandyControl_Shared/Themes/Styles/Base/SideMenuBaseStyle.xaml
index 66dccefc..720a9584 100644
--- a/src/Shared/HandyControl_Shared/Themes/Styles/Base/SideMenuBaseStyle.xaml
+++ b/src/Shared/HandyControl_Shared/Themes/Styles/Base/SideMenuBaseStyle.xaml
@@ -3,25 +3,83 @@
xmlns:controls="clr-namespace:HandyControl.Controls">
+
+