From 4f9b77d56757650f416c933ddd1f866c8e0f0b49 Mon Sep 17 00:00:00 2001 From: NaBian <836904362@qq.com> Date: Thu, 19 Nov 2020 23:40:47 +0800 Subject: [PATCH 1/3] delete tagpanel --- .../UserControl/Controls/TagDemoCtl.xaml | 24 +++++++++--------- .../UserControl/Controls/TagDemoCtl.xaml.cs | 18 ++++++------- .../Controls/Tag/TagContainer.cs | 22 ++++++++++++++++ .../HandyControl_Shared.projitems | 1 + .../Themes/Styles/Base/TagBaseStyle.xaml | 25 +++++++++++++++++++ .../Themes/Styles/Tag.xaml | 2 ++ 6 files changed, 71 insertions(+), 21 deletions(-) create mode 100644 src/Shared/HandyControl_Shared/Controls/Tag/TagContainer.cs diff --git a/src/Shared/HandyControlDemo_Shared/UserControl/Controls/TagDemoCtl.xaml b/src/Shared/HandyControlDemo_Shared/UserControl/Controls/TagDemoCtl.xaml index e6cb2880..7926ed2d 100644 --- a/src/Shared/HandyControlDemo_Shared/UserControl/Controls/TagDemoCtl.xaml +++ b/src/Shared/HandyControlDemo_Shared/UserControl/Controls/TagDemoCtl.xaml @@ -6,17 +6,17 @@ xmlns:ex="clr-namespace:HandyControlDemo.Tools.Extension" xmlns:hc="https://handyorg.github.io/handycontrol"> - - - - - - - - - - - - + + + + + + + + + + + + diff --git a/src/Shared/HandyControlDemo_Shared/UserControl/Controls/TagDemoCtl.xaml.cs b/src/Shared/HandyControlDemo_Shared/UserControl/Controls/TagDemoCtl.xaml.cs index f3251b74..60662402 100644 --- a/src/Shared/HandyControlDemo_Shared/UserControl/Controls/TagDemoCtl.xaml.cs +++ b/src/Shared/HandyControlDemo_Shared/UserControl/Controls/TagDemoCtl.xaml.cs @@ -11,14 +11,14 @@ namespace HandyControlDemo.UserControl InitializeComponent(); } - private void TagPanel_OnAddTagButtonClick(object sender, EventArgs e) - { - if (sender is TagPanel panel) - { - var tag = new Tag(); - LangProvider.SetLang(tag, ContentProperty, LangKeys.SubTitle); - panel.Children.Add(tag); - } - } + //private void TagPanel_OnAddTagButtonClick(object sender, EventArgs e) + //{ + // if (sender is TagPanel panel) + // { + // var tag = new Tag(); + // LangProvider.SetLang(tag, ContentProperty, LangKeys.SubTitle); + // panel.Children.Add(tag); + // } + //} } } diff --git a/src/Shared/HandyControl_Shared/Controls/Tag/TagContainer.cs b/src/Shared/HandyControl_Shared/Controls/Tag/TagContainer.cs new file mode 100644 index 00000000..2d1ea37b --- /dev/null +++ b/src/Shared/HandyControl_Shared/Controls/Tag/TagContainer.cs @@ -0,0 +1,22 @@ +using System.Windows; +using System.Windows.Controls; +using HandyControl.Data; + +namespace HandyControl.Controls +{ + public class TagContainer : ItemsControl + { + public static readonly DependencyProperty IsToolBarVisibleProperty = DependencyProperty.Register( + "IsToolBarVisible", typeof(bool), typeof(TagContainer), new PropertyMetadata(ValueBoxes.FalseBox)); + + public bool IsToolBarVisible + { + get => (bool) GetValue(IsToolBarVisibleProperty); + set => SetValue(IsToolBarVisibleProperty, value); + } + + protected override DependencyObject GetContainerForItemOverride() => new Tag(); + + protected override bool IsItemItsOwnContainerOverride(object item) => item is Tag; + } +} \ 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 e92e18b9..758248d4 100644 --- a/src/Shared/HandyControl_Shared/HandyControl_Shared.projitems +++ b/src/Shared/HandyControl_Shared/HandyControl_Shared.projitems @@ -72,6 +72,7 @@ + diff --git a/src/Shared/HandyControl_Shared/Themes/Styles/Base/TagBaseStyle.xaml b/src/Shared/HandyControl_Shared/Themes/Styles/Base/TagBaseStyle.xaml index 192f5573..3694716d 100644 --- a/src/Shared/HandyControl_Shared/Themes/Styles/Base/TagBaseStyle.xaml +++ b/src/Shared/HandyControl_Shared/Themes/Styles/Base/TagBaseStyle.xaml @@ -77,4 +77,29 @@ + + \ No newline at end of file diff --git a/src/Shared/HandyControl_Shared/Themes/Styles/Tag.xaml b/src/Shared/HandyControl_Shared/Themes/Styles/Tag.xaml index 8de82ac7..75595a29 100644 --- a/src/Shared/HandyControl_Shared/Themes/Styles/Tag.xaml +++ b/src/Shared/HandyControl_Shared/Themes/Styles/Tag.xaml @@ -8,4 +8,6 @@ + - - - - - - - - - - - - + + + + + + + + + + + + + + + diff --git a/src/Shared/HandyControlDemo_Shared/UserControl/Controls/TagDemoCtl.xaml.cs b/src/Shared/HandyControlDemo_Shared/UserControl/Controls/TagDemoCtl.xaml.cs index 60662402..aaeb7890 100644 --- a/src/Shared/HandyControlDemo_Shared/UserControl/Controls/TagDemoCtl.xaml.cs +++ b/src/Shared/HandyControlDemo_Shared/UserControl/Controls/TagDemoCtl.xaml.cs @@ -1,8 +1,4 @@ -using System; -using HandyControl.Controls; -using HandyControlDemo.Properties.Langs; - -namespace HandyControlDemo.UserControl +namespace HandyControlDemo.UserControl { public partial class TagDemoCtl { @@ -10,15 +6,5 @@ namespace HandyControlDemo.UserControl { InitializeComponent(); } - - //private void TagPanel_OnAddTagButtonClick(object sender, EventArgs e) - //{ - // if (sender is TagPanel panel) - // { - // var tag = new Tag(); - // LangProvider.SetLang(tag, ContentProperty, LangKeys.SubTitle); - // panel.Children.Add(tag); - // } - //} } } diff --git a/src/Shared/HandyControlDemo_Shared/ViewModel/Controls/TagDemoViewModel.cs b/src/Shared/HandyControlDemo_Shared/ViewModel/Controls/TagDemoViewModel.cs new file mode 100644 index 00000000..bd6f4e75 --- /dev/null +++ b/src/Shared/HandyControlDemo_Shared/ViewModel/Controls/TagDemoViewModel.cs @@ -0,0 +1,13 @@ +using HandyControlDemo.Data; +using HandyControlDemo.Service; + +namespace HandyControlDemo.ViewModel +{ + public class TagDemoViewModel : DemoViewModelBase + { + public TagDemoViewModel(DataService dataService) + { + DataList = dataService.GetDemoDataList(10); + } + } +} \ No newline at end of file diff --git a/src/Shared/HandyControlDemo_Shared/ViewModel/ViewModelLocator.cs b/src/Shared/HandyControlDemo_Shared/ViewModel/ViewModelLocator.cs index 6c1ba828..271bf4cc 100644 --- a/src/Shared/HandyControlDemo_Shared/ViewModel/ViewModelLocator.cs +++ b/src/Shared/HandyControlDemo_Shared/ViewModel/ViewModelLocator.cs @@ -38,6 +38,7 @@ namespace HandyControlDemo.ViewModel SimpleIoc.Default.Register(); SimpleIoc.Default.Register(); SimpleIoc.Default.Register(); + SimpleIoc.Default.Register(); } public static ViewModelLocator Instance => new Lazy(() => @@ -97,6 +98,8 @@ namespace HandyControlDemo.ViewModel public SplitButtonDemoViewModel SplitButtonDemo => SimpleIoc.Default.GetInstance(); + public TagDemoViewModel TagDemo => SimpleIoc.Default.GetInstance(); + #endregion } } \ No newline at end of file diff --git a/src/Shared/HandyControl_Shared/Controls/Tag/Tag.cs b/src/Shared/HandyControl_Shared/Controls/Tag/Tag.cs index f8dec4e3..6e175a63 100644 --- a/src/Shared/HandyControl_Shared/Controls/Tag/Tag.cs +++ b/src/Shared/HandyControl_Shared/Controls/Tag/Tag.cs @@ -1,4 +1,5 @@ using System; +using System.ComponentModel; using System.Windows; using System.Windows.Controls; using System.Windows.Input; @@ -52,6 +53,64 @@ namespace HandyControl.Controls set => SetValue(IsSelectedProperty, ValueBoxes.BooleanBox(value)); } + public static readonly DependencyProperty HeaderProperty = DependencyProperty.Register( + "Header", typeof(object), typeof(Tag), new PropertyMetadata(default, OnHeaderChanged)); + + private static void OnHeaderChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) + { + var ctrl = (Tag)d; + + ctrl.SetValue(HasHeaderPropertyKey, e.NewValue != null ? ValueBoxes.TrueBox : ValueBoxes.FalseBox); + ctrl.OnHeaderChanged(e.OldValue, e.NewValue); + } + + protected virtual void OnHeaderChanged(object oldHeader, object newHeader) + { + RemoveLogicalChild(oldHeader); + AddLogicalChild(newHeader); + } + + public object Header + { + get => GetValue(HeaderProperty); + set => SetValue(HeaderProperty, value); + } + + internal static readonly DependencyPropertyKey HasHeaderPropertyKey = DependencyProperty.RegisterReadOnly( + "HasHeader", typeof(bool), typeof(Tag), new PropertyMetadata(ValueBoxes.FalseBox)); + + public static readonly DependencyProperty HasHeaderProperty = HasHeaderPropertyKey.DependencyProperty; + + [Bindable(false), Browsable(false)] + public bool HasHeader => (bool) GetValue(HasHeaderProperty); + + public static readonly DependencyProperty HeaderStringFormatProperty = DependencyProperty.Register( + "HeaderStringFormat", typeof(string), typeof(Tag), new PropertyMetadata(default(string))); + + public string HeaderStringFormat + { + get => (string) GetValue(HeaderStringFormatProperty); + set => SetValue(HeaderStringFormatProperty, value); + } + + public static readonly DependencyProperty HeaderTemplateSelectorProperty = DependencyProperty.Register( + "HeaderTemplateSelector", typeof(DataTemplateSelector), typeof(Tag), new PropertyMetadata(default(DataTemplateSelector))); + + public DataTemplateSelector HeaderTemplateSelector + { + get => (DataTemplateSelector) GetValue(HeaderTemplateSelectorProperty); + set => SetValue(HeaderTemplateSelectorProperty, value); + } + + public static readonly DependencyProperty HeaderTemplateProperty = DependencyProperty.Register( + "HeaderTemplate", typeof(DataTemplate), typeof(Tag), new PropertyMetadata(default(DataTemplate))); + + public DataTemplate HeaderTemplate + { + get => (DataTemplate) GetValue(HeaderTemplateProperty); + set => SetValue(HeaderTemplateProperty, value); + } + public static readonly RoutedEvent SelectedEvent = EventManager.RegisterRoutedEvent("Selected", RoutingStrategy.Bubble, typeof(EventHandler), typeof(Tag)); public event EventHandler Selected diff --git a/src/Shared/HandyControl_Shared/Controls/Tag/TagContainer.cs b/src/Shared/HandyControl_Shared/Controls/Tag/TagContainer.cs index 2d1ea37b..d569bee4 100644 --- a/src/Shared/HandyControl_Shared/Controls/Tag/TagContainer.cs +++ b/src/Shared/HandyControl_Shared/Controls/Tag/TagContainer.cs @@ -1,20 +1,10 @@ using System.Windows; using System.Windows.Controls; -using HandyControl.Data; namespace HandyControl.Controls { public class TagContainer : ItemsControl { - public static readonly DependencyProperty IsToolBarVisibleProperty = DependencyProperty.Register( - "IsToolBarVisible", typeof(bool), typeof(TagContainer), new PropertyMetadata(ValueBoxes.FalseBox)); - - public bool IsToolBarVisible - { - get => (bool) GetValue(IsToolBarVisibleProperty); - set => SetValue(IsToolBarVisibleProperty, value); - } - protected override DependencyObject GetContainerForItemOverride() => new Tag(); protected override bool IsItemItsOwnContainerOverride(object item) => item is Tag; diff --git a/src/Shared/HandyControl_Shared/Controls/Tag/TagPanel.cs b/src/Shared/HandyControl_Shared/Controls/Tag/TagPanel.cs deleted file mode 100644 index dd0ac447..00000000 --- a/src/Shared/HandyControl_Shared/Controls/Tag/TagPanel.cs +++ /dev/null @@ -1,91 +0,0 @@ -using System; -using System.Windows; -using System.Windows.Controls; -using System.Windows.Media.Animation; -using HandyControl.Data; -using HandyControl.Interactivity; -using HandyControl.Tools; - -namespace HandyControl.Controls -{ - public class TagPanel : WrapPanel - { - private Button _addTagButton; - - private bool _isInternalAction; - - public TagPanel() - { - var behavior = new FluidMoveBehavior - { - AppliesTo = FluidMoveScope.Children, - Duration = new Duration(TimeSpan.FromMilliseconds(200)), - EaseY = new PowerEase(), - EaseX = new PowerEase() - }; - var collection = Interaction.GetBehaviors(this); - collection.Add(behavior); - - AddHandler(Controls.Tag.ClosedEvent, new RoutedEventHandler(Tag_OnClosed)); - } - - private void Tag_OnClosed(object sender, RoutedEventArgs e) => Children.Remove(e.OriginalSource as Tag); - - public static readonly RoutedEvent AddTagButtonClickEvent = EventManager.RegisterRoutedEvent("AddTagButtonClick", RoutingStrategy.Bubble, typeof(EventHandler), typeof(TagPanel)); - - public event EventHandler AddTagButtonClick - { - add => AddHandler(AddTagButtonClickEvent, value); - remove => RemoveHandler(AddTagButtonClickEvent, value); - } - - public static readonly DependencyProperty ShowAddButtonProperty = DependencyProperty.Register( - "ShowAddButton", typeof(bool), typeof(TagPanel), new PropertyMetadata(ValueBoxes.FalseBox)); - - public bool ShowAddButton - { - get => (bool) GetValue(ShowAddButtonProperty); - set => SetValue(ShowAddButtonProperty, ValueBoxes.BooleanBox(value)); - } - - public static readonly DependencyProperty TagMarginProperty = DependencyProperty.Register( - "TagMargin", typeof(Thickness), typeof(TagPanel), new PropertyMetadata(new Thickness(5))); - - public Thickness TagMargin - { - get => (Thickness) GetValue(TagMarginProperty); - set => SetValue(TagMarginProperty, value); - } - - protected override void OnVisualChildrenChanged(DependencyObject visualAdded, DependencyObject visualRemoved) - { - if (!(visualAdded is Tag tag)) return; - base.OnVisualChildrenChanged(visualAdded, visualRemoved); - - tag.Margin = TagMargin; - if (_isInternalAction) return; - if (ShowAddButton) - { - _isInternalAction = true; - if (!Children.Contains(_addTagButton)) - { - _addTagButton = new Button - { - Style = ResourceHelper.GetResource - - \ No newline at end of file From 0d91919b14b31656485c6639368724fed64e9e9c Mon Sep 17 00:00:00 2001 From: NaBian <836904362@qq.com> Date: Sat, 21 Nov 2020 22:52:56 +0800 Subject: [PATCH 3/3] completed the branch --- .../UserControl/Controls/TagDemoCtl.xaml | 18 ++++++-- .../ViewModel/Controls/TagDemoViewModel.cs | 43 +++++++++++++++++-- .../ViewModel/ViewModelLocator.cs | 2 +- .../Controls/Tag/TagContainer.cs | 43 ++++++++++++++++++- .../Themes/Styles/Base/TagBaseStyle.xaml | 14 +++--- 5 files changed, 106 insertions(+), 14 deletions(-) diff --git a/src/Shared/HandyControlDemo_Shared/UserControl/Controls/TagDemoCtl.xaml b/src/Shared/HandyControlDemo_Shared/UserControl/Controls/TagDemoCtl.xaml index de559222..d1744bb2 100644 --- a/src/Shared/HandyControlDemo_Shared/UserControl/Controls/TagDemoCtl.xaml +++ b/src/Shared/HandyControlDemo_Shared/UserControl/Controls/TagDemoCtl.xaml @@ -16,18 +16,30 @@ - + - - + + + + + + + + + + + +