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"> + +