diff --git a/README.md b/README.md
index 9545f278..b29f80ff 100644
--- a/README.md
+++ b/README.md
@@ -63,6 +63,10 @@ Step 4:enjoy coding
## Latest examples
+### Magnifier
+
+
+
### Card

@@ -79,12 +83,12 @@ Step 4:enjoy coding

+## History publication
+
### NotifyIcon

-## History publication
-
### Dialog

diff --git a/Resources/Magnifier.png b/Resources/Magnifier.png
new file mode 100644
index 00000000..929ae0c9
Binary files /dev/null and b/Resources/Magnifier.png differ
diff --git a/src/Shared/HandyControlDemo_Shared/UserControl/Controls/MagnifierDemoCtl.xaml b/src/Shared/HandyControlDemo_Shared/UserControl/Controls/MagnifierDemoCtl.xaml
index ca5b7eed..81c2839c 100644
--- a/src/Shared/HandyControlDemo_Shared/UserControl/Controls/MagnifierDemoCtl.xaml
+++ b/src/Shared/HandyControlDemo_Shared/UserControl/Controls/MagnifierDemoCtl.xaml
@@ -4,12 +4,14 @@
Background="{DynamicResource RegionBrush}"
xmlns:hc="https://handyorg.github.io/handycontrol">
-
-
+
+
+
+
-
+
-
+
diff --git a/src/Shared/HandyControl_Shared/Controls/Other/Magnifier.cs b/src/Shared/HandyControl_Shared/Controls/Other/Magnifier.cs
index d553789d..407adeb1 100644
--- a/src/Shared/HandyControl_Shared/Controls/Other/Magnifier.cs
+++ b/src/Shared/HandyControl_Shared/Controls/Other/Magnifier.cs
@@ -1,10 +1,11 @@
-using System;
-using System.Windows;
+using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
+using HandyControl.Data;
using HandyControl.Interactivity;
+using HandyControl.Tools;
using HandyControl.Tools.Extension;
namespace HandyControl.Controls
@@ -14,7 +15,7 @@ namespace HandyControl.Controls
{
private Size _viewboxSize;
- private Adorner _adorner;
+ private AdornerContainer _adorner;
private UIElement _elementTarget;
@@ -22,6 +23,26 @@ namespace HandyControl.Controls
private VisualBrush _visualBrush = new VisualBrush();
+ private readonly TranslateTransform _translateTransform;
+
+ public static readonly DependencyProperty HorizontalOffsetProperty = DependencyProperty.Register(
+ "HorizontalOffset", typeof(double), typeof(Magnifier), new PropertyMetadata(ValueBoxes.Double0Box));
+
+ public double HorizontalOffset
+ {
+ get => (double) GetValue(HorizontalOffsetProperty);
+ set => SetValue(HorizontalOffsetProperty, value);
+ }
+
+ public static readonly DependencyProperty VerticalOffsetProperty = DependencyProperty.Register(
+ "VerticalOffset", typeof(double), typeof(Magnifier), new PropertyMetadata(ValueBoxes.Double0Box));
+
+ public double VerticalOffset
+ {
+ get => (double) GetValue(VerticalOffsetProperty);
+ set => SetValue(VerticalOffsetProperty, value);
+ }
+
public static readonly DependencyProperty InstanceProperty = DependencyProperty.RegisterAttached(
"Instance", typeof(Magnifier), typeof(Magnifier), new PropertyMetadata(default(Magnifier), OnMagnifierChanged));
@@ -38,6 +59,8 @@ namespace HandyControl.Controls
public static Magnifier GetInstance(DependencyObject element)
=> (Magnifier) element.GetValue(InstanceProperty);
+ public static Magnifier Default => new Magnifier();
+
internal static readonly DependencyProperty TargetProperty = DependencyProperty.Register(
"Target", typeof(UIElement), typeof(Magnifier), new PropertyMetadata(default(UIElement), OnTargetChanged));
@@ -55,7 +78,7 @@ namespace HandyControl.Controls
}
public static readonly DependencyProperty ScaleProperty = DependencyProperty.Register(
- "Scale", typeof(double), typeof(Magnifier), new PropertyMetadata(5.0, OnScaleChanged));
+ "Scale", typeof(double), typeof(Magnifier), new PropertyMetadata(5.0, OnScaleChanged), ValidateHelper.IsInRangeOfPosDouble);
private static void OnScaleChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) => ((Magnifier)d).UpdateViewboxSize();
@@ -65,6 +88,12 @@ namespace HandyControl.Controls
set => SetValue(ScaleProperty, value);
}
+ public Magnifier()
+ {
+ _translateTransform = new TranslateTransform();
+ RenderTransform = _translateTransform;
+ }
+
public override void OnApplyTemplate()
{
base.OnApplyTemplate();
@@ -102,25 +131,30 @@ namespace HandyControl.Controls
}
}
- private void UpdateLocation(Point adornerPoint)
+ private void UpdateLocation()
{
var targetPoint = Mouse.GetPosition(Target);
-
var subX = targetPoint.X - _visualBrush.Viewbox.Width / 2;
var subY = targetPoint.Y - _visualBrush.Viewbox.Height / 2;
- _visualBrush.Viewbox = new Rect(new Point(subX, subY), _viewboxSize);
+ var targetVector = VisualTreeHelper.GetOffset(Target);
+ _visualBrush.Viewbox = new Rect(new Point(subX + targetVector.X, subY + targetVector.Y), _viewboxSize);
- var x = adornerPoint.X - ActualWidth / 2;
- var y = adornerPoint.Y - ActualHeight / 2;
- Arrange(new Rect(x, y, ActualWidth, ActualHeight));
-
- Console.WriteLine(new Rect(x, y, ActualWidth, ActualHeight));
+ var adornerPoint = Mouse.GetPosition(_adorner);
+ _translateTransform.X = adornerPoint.X + HorizontalOffset;
+ _translateTransform.Y = adornerPoint.Y + VerticalOffset;
}
- private void Element_MouseMove(object sender, MouseEventArgs e) => UpdateLocation(Mouse.GetPosition(_adorner));
+ private void Element_MouseMove(object sender, MouseEventArgs e) => UpdateLocation();
- private void Element_MouseLeave(object sender, MouseEventArgs e) => _adorner?.Collapse();
+ private void Element_MouseLeave(object sender, MouseEventArgs e)
+ {
+ var layer = AdornerLayer.GetAdornerLayer(Target);
+ if (layer == null) return;
+ layer.Remove(_adorner);
+ _adorner.Child = null;
+ _adorner = null;
+ }
private void Element_MouseEnter(object sender, MouseEventArgs e)
{
@@ -134,9 +168,7 @@ namespace HandyControl.Controls
};
layer.Add(_adorner);
}
-
- _adorner.Show();
- UpdateLocation(Mouse.GetPosition(_adorner));
+ this.Show();
}
}
}
diff --git a/src/Shared/HandyControl_Shared/Interactivity/AdornerContainer.cs b/src/Shared/HandyControl_Shared/Interactivity/AdornerContainer.cs
index 4fea569d..27b0c0e5 100644
--- a/src/Shared/HandyControl_Shared/Interactivity/AdornerContainer.cs
+++ b/src/Shared/HandyControl_Shared/Interactivity/AdornerContainer.cs
@@ -17,6 +17,13 @@ namespace HandyControl.Interactivity
get => _child;
set
{
+ if (value == null)
+ {
+ RemoveVisualChild(_child);
+ // ReSharper disable once ExpressionIsAlwaysNull
+ _child = value;
+ return;
+ }
AddVisualChild(value);
_child = value;
}
diff --git a/src/Shared/HandyControl_Shared/Themes/Styles/Base/MagnifierBaseStyle.xaml b/src/Shared/HandyControl_Shared/Themes/Styles/Base/MagnifierBaseStyle.xaml
index ebc512c3..519841dd 100644
--- a/src/Shared/HandyControl_Shared/Themes/Styles/Base/MagnifierBaseStyle.xaml
+++ b/src/Shared/HandyControl_Shared/Themes/Styles/Base/MagnifierBaseStyle.xaml
@@ -8,6 +8,8 @@