90 lines
2.8 KiB
C#
90 lines
2.8 KiB
C#
using System.Windows;
|
|
using HandyControl.Data;
|
|
using HandyControl.Data.Enum;
|
|
|
|
namespace HandyControl.Controls
|
|
{
|
|
public class SideMenu : HeaderedSimpleItemsControl
|
|
{
|
|
private SideMenuItem _selectedItem;
|
|
|
|
private SideMenuItem _selectedHeader;
|
|
|
|
private bool _isItemSelected;
|
|
|
|
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;
|
|
_isItemSelected = true;
|
|
}
|
|
else
|
|
{
|
|
if (!Equals(item, _selectedHeader))
|
|
{
|
|
if (_selectedHeader != null)
|
|
{
|
|
_selectedHeader.IsSelected = false;
|
|
SwitchPanelArea(_selectedHeader);
|
|
}
|
|
|
|
_selectedHeader = item;
|
|
_selectedHeader.IsSelected = true;
|
|
SwitchPanelArea(_selectedHeader);
|
|
}
|
|
|
|
if (_isItemSelected)
|
|
{
|
|
_isItemSelected = false;
|
|
}
|
|
else
|
|
{
|
|
_selectedHeader.SelectDefaultItem();
|
|
_isItemSelected = false;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
private void SwitchPanelArea(SideMenuItem oldItem)
|
|
{
|
|
switch (ExpandMode)
|
|
{
|
|
case ExpandMode.ShowAll:
|
|
return;
|
|
case ExpandMode.ShowOne:
|
|
case ExpandMode.Accordion:
|
|
oldItem.SwitchPanelArea(oldItem.IsSelected);
|
|
break;
|
|
}
|
|
}
|
|
|
|
protected override DependencyObject GetContainerForItemOverride() => new SideMenuItem();
|
|
|
|
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)));
|
|
|
|
public ExpandMode ExpandMode
|
|
{
|
|
get => (ExpandMode) GetValue(ExpandModeProperty);
|
|
set => SetValue(ExpandModeProperty, value);
|
|
}
|
|
}
|
|
}
|