From 956e7e3247fd4774bb56489d183c5ab0cbfdc0a4 Mon Sep 17 00:00:00 2001 From: NaBian <836904362@qq.com> Date: Mon, 29 Apr 2019 23:42:10 +0800 Subject: [PATCH] add basic files --- src/HandyControl_Net_GE45.sln.DotSettings | 2 + .../HandyControlDemo_Net_GE45.csproj | 15 +++++ .../HandyControlDemo_Shared/App.xaml.cs | 4 +- .../Resources/Img/DevOps/DevOps-Boards.png | Bin 0 -> 4908 bytes .../Resources/Img/DevOps/DevOps-Overview.png | Bin 0 -> 3583 bytes .../Resources/Img/DevOps/DevOps-Pipelines.png | Bin 0 -> 5412 bytes .../Resources/Img/DevOps/DevOps-Repos.png | Bin 0 -> 6848 bytes .../Resources/Img/DevOps/DevOps-TestPlans.png | Bin 0 -> 5354 bytes .../UserControl/Controls/SideMenuDemoCtl.xaml | 39 ++++++++++-- .../Styles/CalendarDemoCtl.xaml.cs | 3 +- .../Base/HeaderedSimpleItemsControl.cs | 16 +++++ .../Controls/Base/SimpleItemsControl.cs | 18 +++++- .../Controls/SideMenu/SideMenu.cs | 8 ++- .../Controls/SideMenu/SideMenuItem.cs | 55 ++++++++++++++++ .../Data/Enum/SideMenuItemRole.cs | 8 +++ .../Data/HandyControlConfig.cs | 9 +++ .../HandyControl_Shared.projitems | 5 ++ .../Themes/Styles/Base/SideMenuBaseStyle.xaml | 39 +++++++++++- .../Themes/Styles/Calendar.xaml | 4 +- .../Tools/Helper/ConfigHelper.cs | 60 ++++++++++++++++++ 20 files changed, 270 insertions(+), 15 deletions(-) create mode 100644 src/HandyControl_Net_GE45.sln.DotSettings create mode 100644 src/Shared/HandyControlDemo_Shared/Resources/Img/DevOps/DevOps-Boards.png create mode 100644 src/Shared/HandyControlDemo_Shared/Resources/Img/DevOps/DevOps-Overview.png create mode 100644 src/Shared/HandyControlDemo_Shared/Resources/Img/DevOps/DevOps-Pipelines.png create mode 100644 src/Shared/HandyControlDemo_Shared/Resources/Img/DevOps/DevOps-Repos.png create mode 100644 src/Shared/HandyControlDemo_Shared/Resources/Img/DevOps/DevOps-TestPlans.png create mode 100644 src/Shared/HandyControl_Shared/Controls/Base/HeaderedSimpleItemsControl.cs create mode 100644 src/Shared/HandyControl_Shared/Controls/SideMenu/SideMenuItem.cs create mode 100644 src/Shared/HandyControl_Shared/Data/Enum/SideMenuItemRole.cs create mode 100644 src/Shared/HandyControl_Shared/Data/HandyControlConfig.cs create mode 100644 src/Shared/HandyControl_Shared/Tools/Helper/ConfigHelper.cs 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 0000000000000000000000000000000000000000..5d14a4a830e15cd84ec13e9f1f549c8e17983878 GIT binary patch literal 4908 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 esYM8#!oLB{0BKr<7fjj!0000COu literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..e9e3d7e4fcd15cc3c04b487afa6382ab3a717ea5 GIT binary patch literal 3583 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 FV1jL`(RBa- literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..ad1da5b835ef4a99bf376e4b4ab0aa0d1a64b90e GIT binary patch literal 5412 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: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 + 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