diff --git a/src/HandyControl_Net_GE45.sln.DotSettings b/src/HandyControl_Net_GE45.sln.DotSettings new file mode 100644 index 00000000..df567fc2 --- /dev/null +++ b/src/HandyControl_Net_GE45.sln.DotSettings @@ -0,0 +1,2 @@ + + True \ No newline at end of file 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 57e96763..72fccc30 100644 --- a/src/Net_GE45/HandyControlDemo_Net_GE45/HandyControlDemo_Net_GE45.csproj +++ b/src/Net_GE45/HandyControlDemo_Net_GE45/HandyControlDemo_Net_GE45.csproj @@ -411,6 +411,21 @@ TextTemplatingFileGenerator MessageToken.cs + + Resources\Img\DevOps\DevOps-Boards.png + + + Resources\Img\DevOps\DevOps-Overview.png + + + Resources\Img\DevOps\DevOps-Pipelines.png + + + Resources\Img\DevOps\DevOps-Repos.png + + + Resources\Img\DevOps\DevOps-TestPlans.png + Resources\Img\LeftMainContent\MainMenuControl_16x.png diff --git a/src/Shared/HandyControlDemo_Shared/App.xaml.cs b/src/Shared/HandyControlDemo_Shared/App.xaml.cs index 493daf1e..b597e60c 100644 --- a/src/Shared/HandyControlDemo_Shared/App.xaml.cs +++ b/src/Shared/HandyControlDemo_Shared/App.xaml.cs @@ -20,7 +20,7 @@ namespace HandyControlDemo base.OnStartup(e); GlobalData.Init(); - Thread.CurrentThread.CurrentUICulture = new CultureInfo(GlobalData.Config.Lang); + ConfigHelper.Instance.SetLang(GlobalData.Config.Lang); if (GlobalData.Config.Skin != SkinType.Default) { @@ -28,7 +28,7 @@ namespace HandyControlDemo } #if !Core - BlurWindow.SystemVersionInfo = CommonHelper.GetSystemVersionInfo(); + ConfigHelper.Instance.SetSystemVersionInfo(CommonHelper.GetSystemVersionInfo()); #endif } diff --git a/src/Shared/HandyControlDemo_Shared/Resources/Img/DevOps/DevOps-Boards.png b/src/Shared/HandyControlDemo_Shared/Resources/Img/DevOps/DevOps-Boards.png new file mode 100644 index 00000000..5d14a4a8 Binary files /dev/null and b/src/Shared/HandyControlDemo_Shared/Resources/Img/DevOps/DevOps-Boards.png differ diff --git a/src/Shared/HandyControlDemo_Shared/Resources/Img/DevOps/DevOps-Overview.png b/src/Shared/HandyControlDemo_Shared/Resources/Img/DevOps/DevOps-Overview.png new file mode 100644 index 00000000..e9e3d7e4 Binary files /dev/null and b/src/Shared/HandyControlDemo_Shared/Resources/Img/DevOps/DevOps-Overview.png differ diff --git a/src/Shared/HandyControlDemo_Shared/Resources/Img/DevOps/DevOps-Pipelines.png b/src/Shared/HandyControlDemo_Shared/Resources/Img/DevOps/DevOps-Pipelines.png new file mode 100644 index 00000000..ad1da5b8 Binary files /dev/null and b/src/Shared/HandyControlDemo_Shared/Resources/Img/DevOps/DevOps-Pipelines.png differ diff --git a/src/Shared/HandyControlDemo_Shared/Resources/Img/DevOps/DevOps-Repos.png b/src/Shared/HandyControlDemo_Shared/Resources/Img/DevOps/DevOps-Repos.png new file mode 100644 index 00000000..379d17eb Binary files /dev/null and b/src/Shared/HandyControlDemo_Shared/Resources/Img/DevOps/DevOps-Repos.png differ diff --git a/src/Shared/HandyControlDemo_Shared/Resources/Img/DevOps/DevOps-TestPlans.png b/src/Shared/HandyControlDemo_Shared/Resources/Img/DevOps/DevOps-TestPlans.png new file mode 100644 index 00000000..686d0730 Binary files /dev/null and b/src/Shared/HandyControlDemo_Shared/Resources/Img/DevOps/DevOps-TestPlans.png differ diff --git a/src/Shared/HandyControlDemo_Shared/UserControl/Controls/SideMenuDemoCtl.xaml b/src/Shared/HandyControlDemo_Shared/UserControl/Controls/SideMenuDemoCtl.xaml index ea74ef00..0ffcf88e 100644 --- a/src/Shared/HandyControlDemo_Shared/UserControl/Controls/SideMenuDemoCtl.xaml +++ b/src/Shared/HandyControlDemo_Shared/UserControl/Controls/SideMenuDemoCtl.xaml @@ -1,11 +1,38 @@  + xmlns:controls="clr-namespace:HandyControl.Controls;assembly=HandyControl" + xmlns:interactivity="clr-namespace:HandyControl.Interactivity;assembly=HandyControl" + Background="{DynamicResource RegionBrush}"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - diff --git a/src/Shared/HandyControlDemo_Shared/UserControl/Styles/CalendarDemoCtl.xaml.cs b/src/Shared/HandyControlDemo_Shared/UserControl/Styles/CalendarDemoCtl.xaml.cs index 42e98aa2..e0c14d30 100644 --- a/src/Shared/HandyControlDemo_Shared/UserControl/Styles/CalendarDemoCtl.xaml.cs +++ b/src/Shared/HandyControlDemo_Shared/UserControl/Styles/CalendarDemoCtl.xaml.cs @@ -1,5 +1,4 @@ - -namespace HandyControlDemo.UserControl +namespace HandyControlDemo.UserControl { public partial class CalendarDemoCtl { diff --git a/src/Shared/HandyControl_Shared/Controls/Base/HeaderedSimpleItemsControl.cs b/src/Shared/HandyControl_Shared/Controls/Base/HeaderedSimpleItemsControl.cs new file mode 100644 index 00000000..cd5750bb --- /dev/null +++ b/src/Shared/HandyControl_Shared/Controls/Base/HeaderedSimpleItemsControl.cs @@ -0,0 +1,16 @@ +using System.Windows; + +namespace HandyControl.Controls +{ + public class HeaderedSimpleItemsControl : SimpleItemsControl + { + public static readonly DependencyProperty HeaderProperty = DependencyProperty.Register( + "Header", typeof(object), typeof(HeaderedSimpleItemsControl), new PropertyMetadata(default(object))); + + public object Header + { + get => GetValue(HeaderProperty); + set => SetValue(HeaderProperty, value); + } + } +} \ No newline at end of file diff --git a/src/Shared/HandyControl_Shared/Controls/Base/SimpleItemsControl.cs b/src/Shared/HandyControl_Shared/Controls/Base/SimpleItemsControl.cs index 0f301ffb..b347b244 100644 --- a/src/Shared/HandyControl_Shared/Controls/Base/SimpleItemsControl.cs +++ b/src/Shared/HandyControl_Shared/Controls/Base/SimpleItemsControl.cs @@ -5,6 +5,7 @@ using System.ComponentModel; using System.Windows; using System.Windows.Controls; using System.Windows.Markup; +using HandyControl.Data; namespace HandyControl.Controls { @@ -33,7 +34,14 @@ namespace HandyControl.Controls public SimpleItemsControl() { var items = new ObservableCollection(); - items.CollectionChanged += OnItemsChanged; + items.CollectionChanged += (s, e) => + { + if (e.NewItems != null && e.NewItems.Count > 0) + { + SetValue(HasItemsPropertyKey, true); + } + OnItemsChanged(s, e); + }; Items = items; } @@ -118,6 +126,14 @@ namespace HandyControl.Controls protected virtual void OnItemContainerStyleChanged(DependencyPropertyChangedEventArgs e) => Refresh(); + internal static readonly DependencyPropertyKey HasItemsPropertyKey = + DependencyProperty.RegisterReadOnly(nameof(HasItems), typeof(bool), typeof(SimpleItemsControl), + new PropertyMetadata(ValueBoxes.FalseBox)); + + public static readonly DependencyProperty HasItemsProperty = HasItemsPropertyKey.DependencyProperty; + + public bool HasItems => (bool) GetValue(HasItemsProperty); + protected virtual void Refresh() { if (ItemsHost == null) return; diff --git a/src/Shared/HandyControl_Shared/Controls/SideMenu/SideMenu.cs b/src/Shared/HandyControl_Shared/Controls/SideMenu/SideMenu.cs index 0ca00085..d8fc2a07 100644 --- a/src/Shared/HandyControl_Shared/Controls/SideMenu/SideMenu.cs +++ b/src/Shared/HandyControl_Shared/Controls/SideMenu/SideMenu.cs @@ -1,9 +1,13 @@ -using System.Windows.Controls; +using System.Windows; namespace HandyControl.Controls { - public class SideMenu : Control + public class SideMenu : HeaderedSimpleItemsControl { + private SideMenuItem _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 new file mode 100644 index 00000000..c7802260 --- /dev/null +++ b/src/Shared/HandyControl_Shared/Controls/SideMenu/SideMenuItem.cs @@ -0,0 +1,55 @@ +using System.Windows; +using HandyControl.Data; + +namespace HandyControl.Controls +{ + public class SideMenuItem : HeaderedSimpleItemsControl, ISelectable + { + public static readonly DependencyProperty IconProperty = DependencyProperty.Register( + "Icon", typeof(object), typeof(SideMenuItem), new PropertyMetadata(default(object))); + + public object Icon + { + get => GetValue(IconProperty); + set => SetValue(IconProperty, value); + } + + protected virtual void OnSelected(RoutedEventArgs e) => RaiseEvent(e); + + public static readonly RoutedEvent SelectedEvent = + EventManager.RegisterRoutedEvent("Selected", RoutingStrategy.Bubble, + typeof(RoutedEventHandler), typeof(SideMenuItem)); + + public event RoutedEventHandler Selected + { + add => AddHandler(SelectedEvent, value); + remove => RemoveHandler(SelectedEvent, value); + } + + public static readonly DependencyProperty IsSelectedProperty = DependencyProperty.Register( + "IsSelected", typeof(bool), typeof(SideMenuItem), new PropertyMetadata(ValueBoxes.FalseBox)); + + public bool IsSelected + { + get => (bool) GetValue(IsSelectedProperty); + 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 = RolePropertyKey.DependencyProperty; + + public SideMenuItemRole Role => (SideMenuItemRole) GetValue(RoleProperty); + + protected override DependencyObject GetContainerForItemOverride() => new SideMenuItem(); + + protected override bool IsItemItsOwnContainerOverride(object item) => item is SideMenuItem; + + private void UpdateRole() + { + + } + } +} \ No newline at end of file diff --git a/src/Shared/HandyControl_Shared/Data/Enum/SideMenuItemRole.cs b/src/Shared/HandyControl_Shared/Data/Enum/SideMenuItemRole.cs new file mode 100644 index 00000000..75b6a1fc --- /dev/null +++ b/src/Shared/HandyControl_Shared/Data/Enum/SideMenuItemRole.cs @@ -0,0 +1,8 @@ +namespace HandyControl.Data +{ + public enum SideMenuItemRole + { + Header, + Item + } +} \ No newline at end of file diff --git a/src/Shared/HandyControl_Shared/Data/HandyControlConfig.cs b/src/Shared/HandyControl_Shared/Data/HandyControlConfig.cs new file mode 100644 index 00000000..88702c88 --- /dev/null +++ b/src/Shared/HandyControl_Shared/Data/HandyControlConfig.cs @@ -0,0 +1,9 @@ +namespace HandyControl.Data +{ + public class HandyControlConfig + { + public SystemVersionInfo SystemVersionInfo { get; set; } + + public string Lang { get; set; } + } +} \ No newline at end of file diff --git a/src/Shared/HandyControl_Shared/HandyControl_Shared.projitems b/src/Shared/HandyControl_Shared/HandyControl_Shared.projitems index be5d95ac..1a7ed268 100644 --- a/src/Shared/HandyControl_Shared/HandyControl_Shared.projitems +++ b/src/Shared/HandyControl_Shared/HandyControl_Shared.projitems @@ -25,6 +25,7 @@ + @@ -78,6 +79,7 @@ + @@ -113,6 +115,7 @@ + @@ -124,6 +127,7 @@ + @@ -222,6 +226,7 @@ + diff --git a/src/Shared/HandyControl_Shared/Themes/Styles/Base/SideMenuBaseStyle.xaml b/src/Shared/HandyControl_Shared/Themes/Styles/Base/SideMenuBaseStyle.xaml index a86b5d6c..66dccefc 100644 --- a/src/Shared/HandyControl_Shared/Themes/Styles/Base/SideMenuBaseStyle.xaml +++ b/src/Shared/HandyControl_Shared/Themes/Styles/Base/SideMenuBaseStyle.xaml @@ -2,8 +2,45 @@ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:controls="clr-namespace:HandyControl.Controls"> - + diff --git a/src/Shared/HandyControl_Shared/Themes/Styles/Calendar.xaml b/src/Shared/HandyControl_Shared/Themes/Styles/Calendar.xaml index e3525efa..d4b717bb 100644 --- a/src/Shared/HandyControl_Shared/Themes/Styles/Calendar.xaml +++ b/src/Shared/HandyControl_Shared/Themes/Styles/Calendar.xaml @@ -1,6 +1,7 @@  + xmlns:controls="clr-namespace:HandyControl.Controls" + xmlns:tools="clr-namespace:HandyControl.Tools"> @@ -232,6 +233,7 @@ + diff --git a/src/Shared/HandyControl_Shared/Tools/Helper/ConfigHelper.cs b/src/Shared/HandyControl_Shared/Tools/Helper/ConfigHelper.cs new file mode 100644 index 00000000..ed1ab456 --- /dev/null +++ b/src/Shared/HandyControl_Shared/Tools/Helper/ConfigHelper.cs @@ -0,0 +1,60 @@ +using System; +using System.ComponentModel; +using System.Globalization; +using System.Runtime.CompilerServices; +using System.Windows; +using System.Windows.Markup; +using HandyControl.Controls; +using HandyControl.Data; + +namespace HandyControl.Tools +{ + public class ConfigHelper : INotifyPropertyChanged + { + private ConfigHelper() + { + + } + + public static ConfigHelper Instance = new Lazy(() => new ConfigHelper()).Value; + + private XmlLanguage _lang = XmlLanguage.GetLanguage("zh-cn"); + + public XmlLanguage Lang + { + get => _lang; + set + { + if (!_lang.IetfLanguageTag.Equals(value.IetfLanguageTag)) + { + _lang = value; + OnPropertyChanged(); + } + } + } + + public void SetSystemVersionInfo(SystemVersionInfo info) + { + BlurWindow.SystemVersionInfo = info; + } + + public void SetLang(string lang) + { + Application.Current.Dispatcher.Thread.CurrentUICulture = new CultureInfo(lang); + Lang = XmlLanguage.GetLanguage(lang); + } + + public void SetConfig(HandyControlConfig config) + { + SetSystemVersionInfo(config.SystemVersionInfo); + SetLang(config.Lang); + } + + public event PropertyChangedEventHandler PropertyChanged; + + protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) + { + PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); + } + } +} \ No newline at end of file