diff --git a/README.md b/README.md
index 4fe14930..f6426bca 100644
--- a/README.md
+++ b/README.md
@@ -63,6 +63,10 @@ Step 4:enjoy coding
## Latest examples
+### FloatingBlock
+
+
+
### HoneycombPanel

@@ -81,12 +85,12 @@ Step 4:enjoy coding

+## History publication
+
### Card

-## History publication
-
### ButtonGroup

diff --git a/src/Shared/HandyControlDemo_Shared/Resources/Themes/Basic/Geometries.xaml b/src/Shared/HandyControlDemo_Shared/Resources/Themes/Basic/Geometries.xaml
index 4158b09e..0860ffdd 100644
--- a/src/Shared/HandyControlDemo_Shared/Resources/Themes/Basic/Geometries.xaml
+++ b/src/Shared/HandyControlDemo_Shared/Resources/Themes/Basic/Geometries.xaml
@@ -9,6 +9,7 @@
M449.722947 199.412211H706.021053c130.967579 0 237.136842 106.169263 237.136842 237.136842v256.298105c0 130.967579-106.169263 237.136842-237.136842 237.136842H449.722947c-130.965895 0-237.136842-106.169263-237.136842-237.136842V436.549053c0-130.967579 106.170947-237.136842 237.136842-237.136842z m-201.205894-21.557895c0-64.299789-70.085053-104.704-125.850948-72.55579s-55.764211 112.96 0 145.111579 125.850947-8.257684 125.850948-72.555789z m239.528421 234.74021c0-68.003368-74.088421-110.736842-133.037474-76.734315s-58.950737 119.467789 0 153.470315 133.039158-8.730947 133.039158-76.736zM835.368421 692.847158c0-117.596632-128.154947-191.494737-230.123789-132.695579s-101.970526 206.593684 0 265.391158S835.368421 810.443789 835.368421 692.847158z
M430.079734 481.464543c45.196365 45.596478 118.486578 45.596478 163.68499 0l360.684736-324.939627c0.547469 3.751441 1.13894 7.490601 1.13894 11.401678l0 404.753417 0 116.754121c0 42.995233-34.547841 77.838809-77.145008 77.838809L145.397996 767.272941c-42.597167 0-77.145008-34.844599-77.145008-77.838809L68.252988 494.839155 68.252988 167.926594c0-3.911076 0.593518-7.65126 1.139963-11.401678L430.079734 481.464543zM910.960992 74.226538 562.044278 387.28558c-38.470173 38.811957-62.276369 38.811957-100.770078 0L112.538611 74.408687c10.011005-4.789073 21.069875-7.673773 32.859385-7.673773l733.044372 0C890.095779 66.735937 901.065622 69.539796 910.960992 74.226538z
M260.8 645H160V0h100.8v645zM461.8 152.2h-100.8V1024h100.8V152.2z m201.2 0h-100.8V1024h100.8V152.2zM864 152h-100.8v494H864V152z
+ M68.191078 915.462005l161.384597 0L229.575676 431.30719 68.191078 431.30719 68.191078 915.462005zM955.808922 471.653083c0-44.582381-36.109406-80.69281-80.69281-80.69281L620.329241 390.960273 658.859789 206.578915c0.807389-4.034896 1.412163-8.271384 1.412163-12.709463 0-16.743336-6.859221-31.873941-17.752316-42.767036l-42.968627-42.565445L333.871043 374.216937c-14.524808 14.7264-23.602557 34.899858-23.602557 57.090253l0 403.462005c0 44.582381 36.109406 80.69281 80.69281 80.69281l363.116111 0c33.487695 0 62.133106-20.37505 74.236771-49.222051l121.643478-284.441261c3.63069-9.279341 5.850242-19.164478 5.850242-29.452799L955.807898 475.083206l-0.403183-0.403183L955.808922 471.653083z
M736 224H288a64 64 0 0 0-64 64v448a64 64 0 0 0 64 64h448a64 64 0 0 0 64-64V288a64 64 0 0 0-64-64z m-416 160a64 64 0 1 1 128.032 0.032A64 64 0 0 1 320 384z m416 320a32 32 0 0 1-32 32H384a32 32 0 0 1-32-32l96-160c26.432-2.048 68.128 6.016 128 64l128-224a32 32 0 0 1 32 32v288z
M19.692308 512A25 25 0 1 1 19.692308 531.692308ZM512 303.027832C512 286.548884 524.86564 273.174666 540.717948 273.174666L598.153846 273.174666C614.006154 273.174666 626.871794 286.548884 626.871794 303.027832L626.871794 362.734167C626.871794 379.213115 614.006154 392.587333 598.153846 392.587333L540.717948 392.587333C524.86564 392.587333 512 379.213115 512 362.734167L512 303.027832 512 303.027832ZM512 482.146834 512 541.853166C512 558.332115 499.13436 571.706335 483.282052 571.706335L425.846154 571.706335C409.993846 571.706335 397.128206 558.332115 397.128206 541.853166L397.128206 482.146834C397.128206 465.667885 409.993846 452.293665 425.846154 452.293665L483.282052 452.293665C499.13436 452.293665 512 465.667885 512 482.146834L512 482.146834ZM339.692308 303.027832C339.692308 286.548884 352.557948 273.174666 368.410256 273.174666L425.846154 273.174666C441.698462 273.174666 454.564102 286.548884 454.564102 303.027832L454.564102 362.734167C454.564102 379.213115 441.698462 392.587333 425.846154 392.587333L368.410256 392.587333C352.557948 392.587333 339.692308 379.213115 339.692308 362.734167L339.692308 303.027832 339.692308 303.027832ZM167.384615 303.027832C167.384615 286.548884 180.250256 273.174666 196.102564 273.174666L253.538462 273.174666C269.390769 273.174666 282.25641 286.548884 282.25641 303.027832L282.25641 362.734167C282.25641 379.213115 269.390769 392.587333 253.538462 392.587333L196.102564 392.587333C180.250256 392.587333 167.384615 379.213115 167.384615 362.734167L167.384615 303.027832 167.384615 303.027832ZM282.25641 720.972168C282.25641 737.451116 269.390769 750.825334 253.538462 750.825334L196.102564 750.825334C180.250256 750.825334 167.384615 737.451116 167.384615 720.972168L167.384615 661.265833C167.384615 644.786885 180.250256 631.412667 196.102564 631.412667L253.538462 631.412667C269.390769 631.412667 282.25641 644.786885 282.25641 661.265833L282.25641 720.972168 282.25641 720.972168ZM310.97436 571.706335 253.538462 571.706335C237.686154 571.706335 224.820513 558.332115 224.820513 541.853166L224.820513 482.146834C224.820513 465.667885 237.686154 452.293665 253.538462 452.293665L310.97436 452.293665C326.826667 452.293665 339.692308 465.667885 339.692308 482.146834L339.692308 541.853166C339.692308 558.332115 326.826667 571.706335 310.97436 571.706335L310.97436 571.706335ZM569.435898 720.972168C569.435898 737.451116 556.570256 750.825334 540.717948 750.825334L368.410256 750.825334C352.557948 750.825334 339.692308 737.451116 339.692308 720.972168L339.692308 661.265833C339.692308 644.786885 352.557948 631.412667 368.410256 631.412667L540.717948 631.412667C556.570256 631.412667 569.435898 644.786885 569.435898 661.265833L569.435898 720.972168 569.435898 720.972168ZM569.435898 541.853166 569.435898 482.146834C569.435898 465.667885 582.301538 452.293665 598.153846 452.293665L655.589744 452.293665C671.442052 452.293665 684.307692 465.667885 684.307692 482.146834L684.307692 541.853166C684.307692 558.332115 671.442052 571.706335 655.589744 571.706335L598.153846 571.706335C582.301538 571.706335 569.435898 558.332115 569.435898 541.853166L569.435898 541.853166ZM856.615385 720.972168C856.615385 737.451116 843.749744 750.825334 827.897437 750.825334L655.589744 750.825334C639.737437 750.825334 626.871794 737.451116 626.871794 720.972168L626.871794 661.265833C626.871794 644.786885 639.737437 631.412667 655.589744 631.412667L713.02564 631.412667C728.877948 631.412667 741.74359 618.038449 741.74359 601.559501L741.74359 482.146834C741.74359 465.667885 754.609231 452.293665 770.461538 452.293665L827.897437 452.293665C843.749744 452.293665 856.615385 465.667885 856.615385 482.146834L856.615385 720.972168 856.615385 720.972168ZM856.615385 362.734167C856.615385 379.213115 843.749744 392.587333 827.897437 392.587333L713.02564 392.587333C697.173333 392.587333 684.307692 379.213115 684.307692 362.734167L684.307692 303.027832C684.307692 286.548884 697.173333 273.174666 713.02564 273.174666L827.897437 273.174666C843.749744 273.174666 856.615385 286.548884 856.615385 303.027832L856.615385 362.734167 856.615385 362.734167Z
M890.2 208.2c-91.8-91.9-242.1-91.9-334 0L544.4 220c-18.2 18.2-47.6 18.2-65.8 0l-11.8-11.8c-91.9-91.9-242.1-91.9-334 0C41 300 24.7 533.9 203.6 722.1 304 827.8 412.4 882.3 470 905.9c26.6 10.9 56.5 10.9 83 0 57.6-23.6 166-78.1 266.4-183.8 178.9-188.2 162.6-422 70.8-513.9z
diff --git a/src/Shared/HandyControlDemo_Shared/UserControl/Controls/FloatingBlockDemoCtl.xaml b/src/Shared/HandyControlDemo_Shared/UserControl/Controls/FloatingBlockDemoCtl.xaml
index 0b28aeb2..338b7430 100644
--- a/src/Shared/HandyControlDemo_Shared/UserControl/Controls/FloatingBlockDemoCtl.xaml
+++ b/src/Shared/HandyControlDemo_Shared/UserControl/Controls/FloatingBlockDemoCtl.xaml
@@ -1,7 +1,25 @@
-
-
-
+ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+ xmlns:hc="https://handyorg.github.io/handycontrol"
+ Background="{DynamicResource RegionBrush}">
+
+
+
+
+
+
+
diff --git a/src/Shared/HandyControl_Shared/Controls/Block/FloatingBlock.cs b/src/Shared/HandyControl_Shared/Controls/Block/FloatingBlock.cs
index 68b7907b..5901c7ed 100644
--- a/src/Shared/HandyControl_Shared/Controls/Block/FloatingBlock.cs
+++ b/src/Shared/HandyControl_Shared/Controls/Block/FloatingBlock.cs
@@ -1,7 +1,188 @@
-namespace HandyControl.Controls
-{
- public class FloatingBlock
- {
+using System;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Media;
+using System.Windows.Media.Animation;
+using HandyControl.Data;
+using HandyControl.Interactivity;
+using HandyControl.Tools;
+namespace HandyControl.Controls
+{
+ public class FloatingBlock : Control
+ {
+ public static readonly DependencyProperty ToXProperty = DependencyProperty.RegisterAttached(
+ "ToX", typeof(double), typeof(FloatingBlock), new PropertyMetadata(ValueBoxes.Double0Box));
+
+ public static void SetToX(DependencyObject element, double value)
+ => element.SetValue(ToXProperty, value);
+
+ public static double GetToX(DependencyObject element)
+ => (double) element.GetValue(ToXProperty);
+
+ public static readonly DependencyProperty ToYProperty = DependencyProperty.RegisterAttached(
+ "ToY", typeof(double), typeof(FloatingBlock), new PropertyMetadata(-100.0));
+
+ public static void SetToY(DependencyObject element, double value)
+ => element.SetValue(ToYProperty, value);
+
+ public static double GetToY(DependencyObject element)
+ => (double)element.GetValue(ToYProperty);
+
+ public static readonly DependencyProperty DurationProperty = DependencyProperty.RegisterAttached(
+ "Duration", typeof(Duration), typeof(FloatingBlock), new PropertyMetadata(new Duration(TimeSpan.FromSeconds(2))));
+
+ public static void SetDuration(DependencyObject element, Duration value)
+ => element.SetValue(DurationProperty, value);
+
+ public static Duration GetDuration(DependencyObject element)
+ => (Duration) element.GetValue(DurationProperty);
+
+ public static readonly DependencyProperty HorizontalOffsetProperty = DependencyProperty.RegisterAttached(
+ "HorizontalOffset", typeof(double), typeof(FloatingBlock), new PropertyMetadata(ValueBoxes.Double0Box));
+
+ public static void SetHorizontalOffset(DependencyObject element, double value)
+ => element.SetValue(HorizontalOffsetProperty, value);
+
+ public static double GetHorizontalOffset(DependencyObject element)
+ => (double) element.GetValue(HorizontalOffsetProperty);
+
+ public static readonly DependencyProperty VerticalOffsetProperty = DependencyProperty.RegisterAttached(
+ "VerticalOffset", typeof(double), typeof(FloatingBlock), new PropertyMetadata(ValueBoxes.Double0Box));
+
+ public static void SetVerticalOffset(DependencyObject element, double value)
+ => element.SetValue(VerticalOffsetProperty, value);
+
+ public static double GetVerticalOffset(DependencyObject element)
+ => (double) element.GetValue(VerticalOffsetProperty);
+
+ public static readonly DependencyProperty ContentTemplateProperty = DependencyProperty.RegisterAttached(
+ "ContentTemplate", typeof(DataTemplate), typeof(FloatingBlock), new PropertyMetadata(default(DataTemplate), OnDataChanged));
+
+ public static void SetContentTemplate(DependencyObject element, DataTemplate value)
+ => element.SetValue(ContentTemplateProperty, value);
+
+ public static DataTemplate GetContentTemplate(DependencyObject element)
+ => (DataTemplate) element.GetValue(ContentTemplateProperty);
+
+ public DataTemplate ContentTemplate
+ {
+ get => (DataTemplate)GetValue(ContentTemplateProperty);
+ set => SetValue(ContentTemplateProperty, value);
+ }
+
+ private static readonly DependencyProperty ReadyToFloatProperty = DependencyProperty.RegisterAttached(
+ "ReadyToFloat", typeof(bool), typeof(FloatingBlock), new PropertyMetadata(ValueBoxes.FalseBox));
+
+ private static void SetReadyToFloat(DependencyObject element, bool value)
+ => element.SetValue(ReadyToFloatProperty, value);
+
+ private static bool GetReadyToFloat(DependencyObject element)
+ => (bool)element.GetValue(ReadyToFloatProperty);
+
+ public static readonly DependencyProperty ContentProperty = DependencyProperty.RegisterAttached(
+ "Content", typeof(object), typeof(FloatingBlock), new PropertyMetadata(default, OnDataChanged));
+
+ public static void SetContent(DependencyObject element, object value)
+ => element.SetValue(ContentProperty, value);
+
+ public static object GetContent(DependencyObject element)
+ => element.GetValue(ContentProperty);
+
+ public object Content
+ {
+ get => GetValue(ContentProperty);
+ set => SetValue(ContentProperty, value);
+ }
+
+ private static void OnDataChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
+ {
+ if (!(d is UIElement target)) return;
+
+ target.RemoveHandler(PreviewMouseLeftButtonDownEvent, new MouseButtonEventHandler(Target_PreviewMouseLeftButtonDown));
+ target.RemoveHandler(PreviewMouseLeftButtonUpEvent, new MouseButtonEventHandler(Target_PreviewMouseLeftButtonUp));
+
+ if (e.NewValue != null)
+ {
+ target.AddHandler(PreviewMouseLeftButtonDownEvent, new MouseButtonEventHandler(Target_PreviewMouseLeftButtonDown));
+ target.AddHandler(PreviewMouseLeftButtonUpEvent, new MouseButtonEventHandler(Target_PreviewMouseLeftButtonUp));
+ }
+ }
+
+ private static void Target_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e) => SetReadyToFloat(sender as DependencyObject, true);
+
+ private static void Target_PreviewMouseLeftButtonUp(object sender, MouseButtonEventArgs e)
+ {
+ if (sender is UIElement element && GetReadyToFloat(element))
+ {
+ var layer = AdornerLayer.GetAdornerLayer(element);
+ if (layer != null)
+ {
+ var adorner = new AdornerContainer(layer)
+ {
+ IsHitTestVisible = false
+ };
+ var child = CreateBlock(element, adorner);
+ adorner.Child = child;
+
+ layer.Add(adorner);
+ }
+ SetReadyToFloat(element, false);
+ }
+ }
+
+ private static FloatingBlock CreateBlock(Visual element, AdornerContainer adorner)
+ {
+ var p = Mouse.GetPosition(adorner.AdornedElement);
+ var transform = new TranslateTransform
+ {
+ X = p.X + GetHorizontalOffset(element),
+ Y = p.Y + GetVerticalOffset(element)
+ };
+
+ var block = new FloatingBlock
+ {
+ Content = GetContent(element),
+ ContentTemplate = GetContentTemplate(element),
+ RenderTransform = new TransformGroup
+ {
+ Children =
+ {
+ transform
+ }
+ }
+ };
+
+ var milliseconds = GetDuration(element).TimeSpan.TotalMilliseconds;
+
+ var animationX = AnimationHelper.CreateAnimation(GetToX(element) + transform.X, milliseconds);
+ Storyboard.SetTargetProperty(animationX, new PropertyPath("(UIElement.RenderTransform).(TransformGroup.Children)[0].(TranslateTransform.X)"));
+ Storyboard.SetTarget(animationX, block);
+
+ var animationY = AnimationHelper.CreateAnimation(GetToY(element) + transform.Y, milliseconds);
+ Storyboard.SetTargetProperty(animationY, new PropertyPath("(UIElement.RenderTransform).(TransformGroup.Children)[0].(TranslateTransform.Y)"));
+ Storyboard.SetTarget(animationY, block);
+
+ var animationOpacity = AnimationHelper.CreateAnimation(0, milliseconds);
+ Storyboard.SetTargetProperty(animationOpacity, new PropertyPath("Opacity"));
+ Storyboard.SetTarget(animationOpacity, block);
+
+ var storyboard = new Storyboard();
+ storyboard.Completed += (s, e) =>
+ {
+ var layer = AdornerLayer.GetAdornerLayer(element);
+ if (layer == null) return;
+ adorner.Child = null;
+ layer.Remove(adorner);
+ };
+ storyboard.Children.Add(animationX);
+ storyboard.Children.Add(animationY);
+ storyboard.Children.Add(animationOpacity);
+ storyboard.Begin();
+
+ return block;
+ }
}
}
diff --git a/src/Shared/HandyControl_Shared/HandyControl_Shared.projitems b/src/Shared/HandyControl_Shared/HandyControl_Shared.projitems
index 107835c7..6aa8a170 100644
--- a/src/Shared/HandyControl_Shared/HandyControl_Shared.projitems
+++ b/src/Shared/HandyControl_Shared/HandyControl_Shared.projitems
@@ -402,6 +402,10 @@
Designer
MSBuild:Compile
+
+ Designer
+ MSBuild:Compile
+
Designer
XamlIntelliSenseFileGenerator
diff --git a/src/Shared/HandyControl_Shared/Themes/Styles/FloatingBlock.xaml b/src/Shared/HandyControl_Shared/Themes/Styles/FloatingBlock.xaml
new file mode 100644
index 00000000..51778b88
--- /dev/null
+++ b/src/Shared/HandyControl_Shared/Themes/Styles/FloatingBlock.xaml
@@ -0,0 +1,16 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/src/Shared/HandyControl_Shared/Themes/Styles/Style.xaml b/src/Shared/HandyControl_Shared/Themes/Styles/Style.xaml
index 93b2485a..aaa1a79c 100644
--- a/src/Shared/HandyControl_Shared/Themes/Styles/Style.xaml
+++ b/src/Shared/HandyControl_Shared/Themes/Styles/Style.xaml
@@ -73,6 +73,7 @@
+
\ No newline at end of file