completed the branch

This commit is contained in:
NaBian committed 2019-05-04 22:17:10 +08:00
1 parent bb27ef7635
commit a7544f6171
15 files changed
+361 -25

No files matched your search

@@ -1,6 +1,7 @@
using System.Windows;
using System;
using System.Linq;
using System.Windows;
using HandyControl.Data;
using HandyControl.Data.Enum;
namespace HandyControl.Controls
{
@@ -15,6 +16,22 @@ namespace HandyControl.Controls
public SideMenu()
{
AddHandler(SideMenuItem.SelectedEvent, new RoutedEventHandler(SideMenuItemSelected));
Loaded += (s, e) => Init();
}
protected override void Refresh()
{
base.Refresh();
Init();
}
private void Init()
{
if (ItemsHost == null) return;
OnExpandModeChanged(ExpandMode);
}
private void SideMenuItemSelected(object sender, RoutedEventArgs e)
@@ -23,6 +40,8 @@ namespace HandyControl.Controls
{
if (item.Role == SideMenuItemRole.Item)
{
if (Equals(item, _selectedItem)) return;
if (_selectedItem != null)
{
_selectedItem.IsSelected = false;
@@ -30,6 +49,10 @@ namespace HandyControl.Controls
_selectedItem = item;
_selectedItem.IsSelected = true;
RaiseEvent(new FunctionEventArgs<object>(SelectionChangedEvent, this)
{
Info = e.OriginalSource
});
_isItemSelected = true;
}
else
@@ -38,20 +61,36 @@ namespace HandyControl.Controls
{
if (_selectedHeader != null)
{
if (ExpandMode == ExpandMode.Freedom && item.ItemsHost.IsVisible && !_isItemSelected)
{
item.IsSelected = false;
SwitchPanelArea(item);
return;
}
_selectedHeader.IsSelected = false;
SwitchPanelArea(_selectedHeader);
if (ExpandMode != ExpandMode.Freedom)
{
SwitchPanelArea(_selectedHeader);
}
}
_selectedHeader = item;
_selectedHeader.IsSelected = true;
SwitchPanelArea(_selectedHeader);
}
else if (ExpandMode == ExpandMode.Freedom && !_isItemSelected)
{
_selectedHeader.IsSelected = false;
SwitchPanelArea(_selectedHeader);
_selectedHeader = null;
}
if (_isItemSelected)
{
_isItemSelected = false;
}
else
else if(_selectedHeader != null)
{
_selectedHeader.SelectDefaultItem();
_isItemSelected = false;
@@ -67,6 +106,7 @@ namespace HandyControl.Controls
case ExpandMode.ShowAll:
return;
case ExpandMode.ShowOne:
case ExpandMode.Freedom:
case ExpandMode.Accordion:
oldItem.SwitchPanelArea(oldItem.IsSelected);
break;
@@ -78,12 +118,72 @@ namespace HandyControl.Controls
protected override bool IsItemItsOwnContainerOverride(object item) => item is SideMenuItem;
public static readonly DependencyProperty ExpandModeProperty = DependencyProperty.Register(
"ExpandMode", typeof(ExpandMode), typeof(SideMenu), new PropertyMetadata(default(ExpandMode)));
"ExpandMode", typeof(ExpandMode), typeof(SideMenu), new PropertyMetadata(default(ExpandMode), OnExpandModeChanged));
private static void OnExpandModeChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var ctl = (SideMenu) d;
var v = (ExpandMode) e.NewValue;
if (ctl.ItemsHost == null)
{
return;
}
ctl.OnExpandModeChanged(v);
}
private void OnExpandModeChanged(ExpandMode mode)
{
if (mode == ExpandMode.ShowAll)
{
ShowAll();
}
else if (mode == ExpandMode.ShowOne)
{
var sideMenuItem = ItemsHost.Children.OfType<SideMenuItem>().FirstOrDefault(item => item.IsSelected);
ShowSelectedOne(sideMenuItem);
}
}
public ExpandMode ExpandMode
{
get => (ExpandMode) GetValue(ExpandModeProperty);
set => SetValue(ExpandModeProperty, value);
}
public static readonly DependencyProperty PanelAreaLengthProperty = DependencyProperty.Register(
"PanelAreaLength", typeof(double), typeof(SideMenu), new PropertyMetadata(double.NaN));
public double PanelAreaLength
{
get => (double) GetValue(PanelAreaLengthProperty);
set => SetValue(PanelAreaLengthProperty, value);
}
private void ShowAll()
{
foreach (var sideMenuItem in ItemsHost.Children.OfType<SideMenuItem>())
{
sideMenuItem.SwitchPanelArea(true);
}
}
private void ShowSelectedOne(SideMenuItem item)
{
foreach (var sideMenuItem in ItemsHost.Children.OfType<SideMenuItem>())
{
sideMenuItem.SwitchPanelArea(Equals(sideMenuItem, item));
}
}
public static readonly RoutedEvent SelectionChangedEvent = EventManager.RegisterRoutedEvent(
"SelectionChanged", RoutingStrategy.Bubble, typeof(EventHandler<FunctionEventArgs<object>>), typeof(SideMenu));
public event EventHandler<FunctionEventArgs<object>> SelectionChanged
{
add => AddHandler(SelectionChangedEvent, value);
remove => RemoveHandler(SelectionChangedEvent, value);
}
}
}