update tag demo
This commit is contained in:
1 parent
4f9b77d567
commit
ae36827885
12 files changed
+112
-140
No files matched your search
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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<Style>(ResourceToken.AddTagButtonStyle),
|
||||
Margin = TagMargin
|
||||
};
|
||||
_addTagButton.Click += AddTagButton_Click;
|
||||
Children.Add(_addTagButton);
|
||||
}
|
||||
else
|
||||
{
|
||||
Children.Remove(_addTagButton);
|
||||
Children.Add(_addTagButton);
|
||||
}
|
||||
_isInternalAction = false;
|
||||
}
|
||||
}
|
||||
|
||||
private void AddTagButton_Click(object sender, RoutedEventArgs e) => RaiseEvent(new RoutedEventArgs(AddTagButtonClickEvent, this));
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user