From 508dfc0cf8e50f276b67da943ed4c6895cfb4a8c Mon Sep 17 00:00:00 2001
From: NaBian <836904362@qq.com>
Date: Thu, 10 Mar 2022 13:53:57 +0800
Subject: [PATCH] enhance: optimized Poptip
---
.../HandyControl_Net_40/Themes/Theme.xaml | 1 -
.../Controls/Other/Poptip.cs | 112 ++++++++++--------
.../Themes/Styles/Base/PoptipBaseStyle.xaml | 1 -
.../HandyControl_Shared/Themes/Theme.xaml | 1 -
4 files changed, 61 insertions(+), 54 deletions(-)
diff --git a/src/Net_40/HandyControl_Net_40/Themes/Theme.xaml b/src/Net_40/HandyControl_Net_40/Themes/Theme.xaml
index 28949e9a..6402103d 100644
--- a/src/Net_40/HandyControl_Net_40/Themes/Theme.xaml
+++ b/src/Net_40/HandyControl_Net_40/Themes/Theme.xaml
@@ -9985,7 +9985,6 @@
-
diff --git a/src/Shared/HandyControl_Shared/Controls/Other/Poptip.cs b/src/Shared/HandyControl_Shared/Controls/Other/Poptip.cs
index d5f3e033..425b536f 100644
--- a/src/Shared/HandyControl_Shared/Controls/Other/Poptip.cs
+++ b/src/Shared/HandyControl_Shared/Controls/Other/Poptip.cs
@@ -18,7 +18,8 @@ namespace HandyControl.Controls
_popup = new Popup
{
AllowsTransparency = true,
- Child = this
+ Child = this,
+ Placement = PlacementMode.Relative
};
_popup.SetBinding(DataContextProperty, new Binding(DataContextProperty.Name) { Source = this });
@@ -91,19 +92,42 @@ namespace HandyControl.Controls
set => SetValue(ContentTemplateSelectorProperty, value);
}
- public static readonly DependencyProperty OffsetProperty = DependencyProperty.RegisterAttached(
- "Offset", typeof(double), typeof(Poptip), new PropertyMetadata(6.0));
+ public static readonly DependencyProperty VerticalOffsetProperty = DependencyProperty.RegisterAttached(
+ "VerticalOffset", typeof(double), typeof(Poptip), new PropertyMetadata(ValueBoxes.Double0Box));
- public static void SetOffset(DependencyObject element, double value)
- => element.SetValue(OffsetProperty, value);
-
- public static double GetOffset(DependencyObject element)
- => (double) element.GetValue(OffsetProperty);
-
- public double Offset
+ public static void SetVerticalOffset(DependencyObject element, double value)
{
- get => (double) GetValue(OffsetProperty);
- set => SetValue(OffsetProperty, value);
+ element.SetValue(VerticalOffsetProperty, value);
+ }
+
+ public static double GetVerticalOffset(DependencyObject element)
+ {
+ return (double) element.GetValue(VerticalOffsetProperty);
+ }
+
+ public double VerticalOffset
+ {
+ get => (double) GetValue(VerticalOffsetProperty);
+ set => SetValue(VerticalOffsetProperty, value);
+ }
+
+ public static readonly DependencyProperty HorizontalOffsetProperty = DependencyProperty.RegisterAttached(
+ "HorizontalOffset", typeof(double), typeof(Poptip), new PropertyMetadata(ValueBoxes.Double0Box));
+
+ public static void SetHorizontalOffset(DependencyObject element, double value)
+ {
+ element.SetValue(HorizontalOffsetProperty, value);
+ }
+
+ public static double GetHorizontalOffset(DependencyObject element)
+ {
+ return (double) element.GetValue(HorizontalOffsetProperty);
+ }
+
+ public double HorizontalOffset
+ {
+ get => (double) GetValue(HorizontalOffsetProperty);
+ set => SetValue(HorizontalOffsetProperty, value);
}
public static readonly DependencyProperty PlacementTypeProperty = DependencyProperty.RegisterAttached(
@@ -193,75 +217,60 @@ namespace HandyControl.Controls
var poptip = (Poptip) GetInstance(Target);
var popupPlacement = poptip.PlacementType;
- var popupOffset = poptip.Offset;
-
- PlacementMode placementMode;
+ var popupOffsetX = poptip.HorizontalOffset;
+ var popupOffsetY = poptip.VerticalOffset;
switch (popupPlacement)
{
case PlacementType.LeftTop:
- offsetX = -popupOffset;
- placementMode = PlacementMode.Left;
break;
case PlacementType.Left:
- offsetX = -popupOffset;
- offsetY = (targetHeight - height) / 2;
- placementMode = PlacementMode.Left;
+ offsetY = -(height - targetHeight) * 0.5;
break;
case PlacementType.LeftBottom:
- offsetX = -popupOffset;
- offsetY = targetHeight - height;
- placementMode = PlacementMode.Left;
+ offsetY = -(height - targetHeight);
break;
case PlacementType.TopLeft:
- offsetY = -popupOffset;
- placementMode = PlacementMode.Top;
+ offsetX = width;
+ offsetY = -height;
break;
case PlacementType.Top:
- offsetX = (targetWidth - width) / 2;
- offsetY = -popupOffset;
- placementMode = PlacementMode.Top;
+ offsetX = (width + targetWidth) * 0.5;
+ offsetY = -height;
break;
case PlacementType.TopRight:
- offsetX = targetWidth - width;
- offsetY = -popupOffset;
- placementMode = PlacementMode.Top;
+ offsetX = targetWidth;
+ offsetY = -height;
break;
case PlacementType.RightTop:
- offsetX = popupOffset;
- placementMode = PlacementMode.Right;
+ offsetX = width + targetWidth;
break;
case PlacementType.Right:
- offsetX = popupOffset;
- offsetY = (targetHeight - height) / 2;
- placementMode = PlacementMode.Right;
+ offsetX = width + targetWidth;
+ offsetY = -(height - targetHeight) * 0.5;
break;
case PlacementType.RightBottom:
- offsetX = popupOffset;
- offsetY = targetHeight - height;
- placementMode = PlacementMode.Right;
+ offsetX = width + targetWidth;
+ offsetY = -(height - targetHeight);
break;
case PlacementType.BottomLeft:
- offsetY = popupOffset;
- placementMode = PlacementMode.Bottom;
+ offsetX = width;
+ offsetY = targetHeight;
break;
case PlacementType.Bottom:
- offsetX = (targetWidth - width) / 2;
- offsetY = popupOffset;
- placementMode = PlacementMode.Bottom;
+ offsetX = (width + targetWidth) * 0.5;
+ offsetY = targetHeight;
break;
case PlacementType.BottomRight:
- offsetX = targetWidth - width;
- offsetY = popupOffset;
- placementMode = PlacementMode.Bottom;
+ offsetX = targetWidth;
+ offsetY = targetHeight;
break;
default:
throw new ArgumentOutOfRangeException();
}
- _popup.HorizontalOffset = offsetX;
- _popup.VerticalOffset = offsetY;
- _popup.Placement = placementMode;
+ _popup.HorizontalOffset = offsetX + popupOffsetX;
+ _popup.VerticalOffset = offsetY + popupOffsetY;
}
private void SwitchPoptip(bool isShow)
@@ -273,7 +282,8 @@ namespace HandyControl.Controls
SetCurrentValue(ContentProperty, GetContent(Target));
SetCurrentValue(PlacementTypeProperty, GetPlacement(Target));
SetCurrentValue(HitModeProperty, GetHitMode(Target));
- SetCurrentValue(OffsetProperty, GetOffset(Target));
+ SetCurrentValue(HorizontalOffsetProperty, GetHorizontalOffset(Target));
+ SetCurrentValue(VerticalOffsetProperty, GetVerticalOffset(Target));
SetCurrentValue(IsOpenProperty, GetIsOpen(Target));
}
diff --git a/src/Shared/HandyControl_Shared/Themes/Styles/Base/PoptipBaseStyle.xaml b/src/Shared/HandyControl_Shared/Themes/Styles/Base/PoptipBaseStyle.xaml
index 2280a99c..27b26086 100644
--- a/src/Shared/HandyControl_Shared/Themes/Styles/Base/PoptipBaseStyle.xaml
+++ b/src/Shared/HandyControl_Shared/Themes/Styles/Base/PoptipBaseStyle.xaml
@@ -7,7 +7,6 @@
-
diff --git a/src/Shared/HandyControl_Shared/Themes/Theme.xaml b/src/Shared/HandyControl_Shared/Themes/Theme.xaml
index 37874226..fe27287d 100644
--- a/src/Shared/HandyControl_Shared/Themes/Theme.xaml
+++ b/src/Shared/HandyControl_Shared/Themes/Theme.xaml
@@ -10103,7 +10103,6 @@
-