From 76248707c670c0b5f347f165ad083b0ac168e29f Mon Sep 17 00:00:00 2001 From: NaBian <836904362@qq.com> Date: Sat, 27 Apr 2019 23:32:15 +0800 Subject: [PATCH 1/6] init demo --- .../HandyControlDemo_Net_GE45.csproj | 3 +++ .../HandyControlDemo_Shared/Data/MessageToken.cs | 2 ++ .../HandyControlDemo_Shared/Data/MessageToken.tt | 3 ++- .../HandyControlDemo_Shared.projitems | 7 +++++++ .../Properties/Langs/Lang.Designer.cs | 9 +++++++++ .../Properties/Langs/Lang.en.resx | 3 +++ .../Properties/Langs/Lang.resx | 3 +++ .../Img/LeftMainContent/MainMenuControl_16x.png | Bin 0 -> 155 bytes .../UserControl/Controls/SideMenuDemoCtl.xaml | 11 +++++++++++ .../UserControl/Controls/SideMenuDemoCtl.xaml.cs | 10 ++++++++++ .../UserControl/Main/LeftMainContent.xaml | 7 ++++++- .../Controls/SideMenu/SideMenu.cs | 9 +++++++++ .../HandyControl_Shared.projitems | 9 +++++++++ .../Themes/Styles/Base/SideMenuBaseStyle.xaml | 9 +++++++++ .../Themes/Styles/SideMenu.xaml | 12 ++++++++++++ .../HandyControl_Shared/Themes/Styles/Style.xaml | 1 + 16 files changed, 96 insertions(+), 2 deletions(-) create mode 100644 src/Shared/HandyControlDemo_Shared/Resources/Img/LeftMainContent/MainMenuControl_16x.png create mode 100644 src/Shared/HandyControlDemo_Shared/UserControl/Controls/SideMenuDemoCtl.xaml create mode 100644 src/Shared/HandyControlDemo_Shared/UserControl/Controls/SideMenuDemoCtl.xaml.cs create mode 100644 src/Shared/HandyControl_Shared/Controls/SideMenu/SideMenu.cs create mode 100644 src/Shared/HandyControl_Shared/Themes/Styles/Base/SideMenuBaseStyle.xaml create mode 100644 src/Shared/HandyControl_Shared/Themes/Styles/SideMenu.xaml 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 4d5aaea8..57e96763 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,9 @@ TextTemplatingFileGenerator MessageToken.cs + + Resources\Img\LeftMainContent\MainMenuControl_16x.png + diff --git a/src/Shared/HandyControlDemo_Shared/Data/MessageToken.cs b/src/Shared/HandyControlDemo_Shared/Data/MessageToken.cs index e6f29fbc..9567de5c 100644 --- a/src/Shared/HandyControlDemo_Shared/Data/MessageToken.cs +++ b/src/Shared/HandyControlDemo_Shared/Data/MessageToken.cs @@ -92,6 +92,8 @@ public static readonly string DialogDemoCtl = nameof(DialogDemoCtl); + public static readonly string SideMenuDemoCtl = nameof(SideMenuDemoCtl); + public static readonly string ButtonDemoCtl = nameof(ButtonDemoCtl); public static readonly string RepeatButtonDemoCtl = nameof(RepeatButtonDemoCtl); diff --git a/src/Shared/HandyControlDemo_Shared/Data/MessageToken.tt b/src/Shared/HandyControlDemo_Shared/Data/MessageToken.tt index e9e4d4b7..13e61674 100644 --- a/src/Shared/HandyControlDemo_Shared/Data/MessageToken.tt +++ b/src/Shared/HandyControlDemo_Shared/Data/MessageToken.tt @@ -48,7 +48,8 @@ var controlList = new List "NotifyIconDemoCtl", "BadgeDemoCtl", "GravatarDemoCtl", - "DialogDemoCtl" + "DialogDemoCtl", + "SideMenuDemoCtl" }; var styleList = new List { diff --git a/src/Shared/HandyControlDemo_Shared/HandyControlDemo_Shared.projitems b/src/Shared/HandyControlDemo_Shared/HandyControlDemo_Shared.projitems index bcdb7a3a..472ed3f4 100644 --- a/src/Shared/HandyControlDemo_Shared/HandyControlDemo_Shared.projitems +++ b/src/Shared/HandyControlDemo_Shared/HandyControlDemo_Shared.projitems @@ -146,6 +146,9 @@ ShieldDemoCtl.xaml + + SideMenuDemoCtl.xaml + StepBarDemoCtl.xaml @@ -505,6 +508,10 @@ Designer MSBuild:Compile + + Designer + MSBuild:Compile + Designer MSBuild:Compile diff --git a/src/Shared/HandyControlDemo_Shared/Properties/Langs/Lang.Designer.cs b/src/Shared/HandyControlDemo_Shared/Properties/Langs/Lang.Designer.cs index 41ef454d..c4a75fbe 100644 --- a/src/Shared/HandyControlDemo_Shared/Properties/Langs/Lang.Designer.cs +++ b/src/Shared/HandyControlDemo_Shared/Properties/Langs/Lang.Designer.cs @@ -1158,6 +1158,15 @@ namespace HandyControlDemo.Properties.Langs { } } + /// + /// 查找类似 侧边菜单 的本地化字符串。 + /// + public static string SideMenu { + get { + return ResourceManager.GetString("SideMenu", resourceCulture); + } + } + /// /// 查找类似 滑块 的本地化字符串。 /// diff --git a/src/Shared/HandyControlDemo_Shared/Properties/Langs/Lang.en.resx b/src/Shared/HandyControlDemo_Shared/Properties/Langs/Lang.en.resx index 0cbadb2c..5cad6050 100644 --- a/src/Shared/HandyControlDemo_Shared/Properties/Langs/Lang.en.resx +++ b/src/Shared/HandyControlDemo_Shared/Properties/Langs/Lang.en.resx @@ -576,4 +576,7 @@ Show in the main window + + SideMenu + \ No newline at end of file diff --git a/src/Shared/HandyControlDemo_Shared/Properties/Langs/Lang.resx b/src/Shared/HandyControlDemo_Shared/Properties/Langs/Lang.resx index 64783b77..72ded0fb 100644 --- a/src/Shared/HandyControlDemo_Shared/Properties/Langs/Lang.resx +++ b/src/Shared/HandyControlDemo_Shared/Properties/Langs/Lang.resx @@ -576,4 +576,7 @@ 在主窗口显示 + + 侧边菜单 + \ No newline at end of file diff --git a/src/Shared/HandyControlDemo_Shared/Resources/Img/LeftMainContent/MainMenuControl_16x.png b/src/Shared/HandyControlDemo_Shared/Resources/Img/LeftMainContent/MainMenuControl_16x.png new file mode 100644 index 0000000000000000000000000000000000000000..16d105afeb666332ddece3244da29351657ba7d0 GIT binary patch literal 155 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9F5he4R}c>anMprEg( zi(^Pd+|fynTnq{vEVZ}){nx*GH2b2jmWg0?qMqEe#ECO@RxdF9%<+J2?}BN|m=rE5 zG$kfTpX9ZX;ZE5dIxBa>=kpKFvVFAgaJb0x&3fDO + + + diff --git a/src/Shared/HandyControlDemo_Shared/UserControl/Controls/SideMenuDemoCtl.xaml.cs b/src/Shared/HandyControlDemo_Shared/UserControl/Controls/SideMenuDemoCtl.xaml.cs new file mode 100644 index 00000000..021ff249 --- /dev/null +++ b/src/Shared/HandyControlDemo_Shared/UserControl/Controls/SideMenuDemoCtl.xaml.cs @@ -0,0 +1,10 @@ +namespace HandyControlDemo.UserControl +{ + public partial class SideMenuDemoCtl + { + public SideMenuDemoCtl() + { + InitializeComponent(); + } + } +} diff --git a/src/Shared/HandyControlDemo_Shared/UserControl/Main/LeftMainContent.xaml b/src/Shared/HandyControlDemo_Shared/UserControl/Main/LeftMainContent.xaml index a6d448a2..d3b4c74d 100644 --- a/src/Shared/HandyControlDemo_Shared/UserControl/Main/LeftMainContent.xaml +++ b/src/Shared/HandyControlDemo_Shared/UserControl/Main/LeftMainContent.xaml @@ -193,7 +193,7 @@ - + @@ -393,6 +393,11 @@ + + + + + diff --git a/src/Shared/HandyControl_Shared/Controls/SideMenu/SideMenu.cs b/src/Shared/HandyControl_Shared/Controls/SideMenu/SideMenu.cs new file mode 100644 index 00000000..0ca00085 --- /dev/null +++ b/src/Shared/HandyControl_Shared/Controls/SideMenu/SideMenu.cs @@ -0,0 +1,9 @@ +using System.Windows.Controls; + +namespace HandyControl.Controls +{ + public class SideMenu : Control + { + + } +} diff --git a/src/Shared/HandyControl_Shared/HandyControl_Shared.projitems b/src/Shared/HandyControl_Shared/HandyControl_Shared.projitems index d3e3f040..be5d95ac 100644 --- a/src/Shared/HandyControl_Shared/HandyControl_Shared.projitems +++ b/src/Shared/HandyControl_Shared/HandyControl_Shared.projitems @@ -77,6 +77,7 @@ + @@ -439,6 +440,10 @@ Designer MSBuild:Compile + + Designer + MSBuild:Compile + Designer MSBuild:Compile @@ -639,6 +644,10 @@ Designer MSBuild:Compile + + Designer + MSBuild:Compile + Designer MSBuild:Compile diff --git a/src/Shared/HandyControl_Shared/Themes/Styles/Base/SideMenuBaseStyle.xaml b/src/Shared/HandyControl_Shared/Themes/Styles/Base/SideMenuBaseStyle.xaml new file mode 100644 index 00000000..a86b5d6c --- /dev/null +++ b/src/Shared/HandyControl_Shared/Themes/Styles/Base/SideMenuBaseStyle.xaml @@ -0,0 +1,9 @@ + + + + + diff --git a/src/Shared/HandyControl_Shared/Themes/Styles/SideMenu.xaml b/src/Shared/HandyControl_Shared/Themes/Styles/SideMenu.xaml new file mode 100644 index 00000000..97399e7d --- /dev/null +++ b/src/Shared/HandyControl_Shared/Themes/Styles/SideMenu.xaml @@ -0,0 +1,12 @@ + + + + + + + + + diff --git a/src/Shared/HandyControl_Shared/Themes/Styles/Style.xaml b/src/Shared/HandyControl_Shared/Themes/Styles/Style.xaml index 6f0df42e..5a971e9d 100644 --- a/src/Shared/HandyControl_Shared/Themes/Styles/Style.xaml +++ b/src/Shared/HandyControl_Shared/Themes/Styles/Style.xaml @@ -62,6 +62,7 @@ + \ No newline at end of file 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 2/6] 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 From 0cd8529b6c9ddf2dc5046eeeeb7c7bd8c102f05f Mon Sep 17 00:00:00 2001 From: NaBian <836904362@qq.com> Date: Wed, 1 May 2019 22:46:16 +0800 Subject: [PATCH 3/6] style building --- .../HandyControlDemo_Net_GE45.csproj | 5 + .../HandyControlDemo_Shared.projitems | 4 + .../Resources/Themes/Basic/Basic.xaml | 1 + .../Resources/Themes/Basic/Fonts.xaml | 6 + .../Resources/Themes/Styles/Style.xaml | 6 + .../Resources/fabric-icons.ttf | Bin 0 -> 89700 bytes .../UserControl/Controls/SideMenuDemoCtl.xaml | 112 +++++++++++++++++- .../Controls/SideMenu/SideMenu.cs | 36 ++++++ .../Controls/SideMenu/SideMenuItem.cs | 60 ++++++++-- .../Themes/Styles/Base/SideMenuBaseStyle.xaml | 85 +++++++++++-- 10 files changed, 293 insertions(+), 22 deletions(-) create mode 100644 src/Shared/HandyControlDemo_Shared/Resources/Themes/Basic/Fonts.xaml create mode 100644 src/Shared/HandyControlDemo_Shared/Resources/fabric-icons.ttf 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 0000000000000000000000000000000000000000..9964e1a09d7cc35f25c07cbd471abfae70b8a32e GIT binary patch literal 89700 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
{!ct@ObTKAIv;UEyI~- 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 literal 0 HcmV?d00001 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"> + + + + + + diff --git a/src/Shared/HandyControl_Shared/Tools/Helper/ConfigHelper.cs b/src/Shared/HandyControl_Shared/Tools/Helper/ConfigHelper.cs index ed1ab456..915f0869 100644 --- a/src/Shared/HandyControl_Shared/Tools/Helper/ConfigHelper.cs +++ b/src/Shared/HandyControl_Shared/Tools/Helper/ConfigHelper.cs @@ -1,7 +1,9 @@ using System; using System.ComponentModel; using System.Globalization; +#if !netle40 using System.Runtime.CompilerServices; +#endif using System.Windows; using System.Windows.Markup; using HandyControl.Controls; @@ -28,7 +30,7 @@ namespace HandyControl.Tools if (!_lang.IetfLanguageTag.Equals(value.IetfLanguageTag)) { _lang = value; - OnPropertyChanged(); + OnPropertyChanged(nameof(Lang)); } } } @@ -52,9 +54,16 @@ namespace HandyControl.Tools public event PropertyChangedEventHandler PropertyChanged; - protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) +#if netle40 + protected virtual void OnPropertyChanged(string propertyName) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } +#else + protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) + { + PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); + } +#endif } } \ No newline at end of file