diff --git a/README.md b/README.md
index 8b23f787..cc9002de 100644
--- a/README.md
+++ b/README.md
@@ -65,6 +65,10 @@ Step 4:enjoy coding
## Latest examples
+### Poptip
+
+
+
### Divider

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

+## History publication
+
### HoneycombPanel

-## History publication
-
### RunningBlock

diff --git a/src/Core_30/HandyControlDemo_Core_30/HandyControlDemo_Core30.csproj b/src/Core_30/HandyControlDemo_Core_30/HandyControlDemo_Core30.csproj
index 9b2ac39f..055fd6d1 100644
--- a/src/Core_30/HandyControlDemo_Core_30/HandyControlDemo_Core30.csproj
+++ b/src/Core_30/HandyControlDemo_Core_30/HandyControlDemo_Core30.csproj
@@ -436,6 +436,9 @@
Resources\Img\LeftMainContent\DottedSplitter_16x.png
+
+ Resources\Img\LeftMainContent\PopupCursor_16x.png
+
diff --git a/src/Net_40/HandyControlDemo_Net_40/HandyControlDemo_Net_40.csproj b/src/Net_40/HandyControlDemo_Net_40/HandyControlDemo_Net_40.csproj
index 76b42023..91e7c38f 100644
--- a/src/Net_40/HandyControlDemo_Net_40/HandyControlDemo_Net_40.csproj
+++ b/src/Net_40/HandyControlDemo_Net_40/HandyControlDemo_Net_40.csproj
@@ -430,6 +430,9 @@
TextTemplatingFileGenerator
MessageToken.cs
+
+ Resources\Img\LeftMainContent\PopupCursor_16x.png
+
Resources\Img\Cover.png
diff --git a/src/Net_GE45/HandyControlDemo_Net_GE45/HandyControlDemo_Net_GE45.csproj b/src/Net_GE45/HandyControlDemo_Net_GE45/HandyControlDemo_Net_GE45.csproj
index 28ac4d6e..b3b7a445 100644
--- a/src/Net_GE45/HandyControlDemo_Net_GE45/HandyControlDemo_Net_GE45.csproj
+++ b/src/Net_GE45/HandyControlDemo_Net_GE45/HandyControlDemo_Net_GE45.csproj
@@ -496,6 +496,9 @@
TextTemplatingFileGenerator
MessageToken.cs
+
+ Resources\Img\LeftMainContent\PopupCursor_16x.png
+
Resources\Img\Cover.png
diff --git a/src/Shared/HandyControlDemo_Shared/App.xaml.cs b/src/Shared/HandyControlDemo_Shared/App.xaml.cs
index cd97b41f..6ba5a34f 100644
--- a/src/Shared/HandyControlDemo_Shared/App.xaml.cs
+++ b/src/Shared/HandyControlDemo_Shared/App.xaml.cs
@@ -19,10 +19,10 @@ namespace HandyControlDemo
[SuppressMessage("代码质量", "IDE0052:删除未读的私有成员", Justification = "<挂起>")]
private static Mutex AppMutex;
- public App()
+ protected override void OnStartup(StartupEventArgs e)
{
AppMutex = new Mutex(true, "HandyControlDemo", out var createdNew);
-
+
if (!createdNew)
{
var current = Process.GetCurrentProcess();
@@ -37,29 +37,28 @@ namespace HandyControlDemo
}
Shutdown();
}
- }
-
- protected override void OnStartup(StartupEventArgs e)
- {
- var splashScreen = new SplashScreen("Resources/Img/Cover.png");
- splashScreen.Show(true);
-
- base.OnStartup(e);
-
- UpdateRegistry();
-
- ShutdownMode = ShutdownMode.OnMainWindowClose;
- GlobalData.Init();
- ConfigHelper.Instance.SetLang(GlobalData.Config.Lang);
-
- if (GlobalData.Config.Skin != SkinType.Default)
+ else
{
- UpdateSkin(GlobalData.Config.Skin);
+ var splashScreen = new SplashScreen("Resources/Img/Cover.png");
+ splashScreen.Show(true);
+
+ base.OnStartup(e);
+
+ UpdateRegistry();
+
+ ShutdownMode = ShutdownMode.OnMainWindowClose;
+ GlobalData.Init();
+ ConfigHelper.Instance.SetLang(GlobalData.Config.Lang);
+
+ if (GlobalData.Config.Skin != SkinType.Default)
+ {
+ UpdateSkin(GlobalData.Config.Skin);
+ }
+
+ ConfigHelper.Instance.SetSystemVersionInfo(CommonHelper.GetSystemVersionInfo());
+
+ ServicePointManager.SecurityProtocol = (SecurityProtocolType)(SslProtocols)0x00000C00;
}
-
- ConfigHelper.Instance.SetSystemVersionInfo(CommonHelper.GetSystemVersionInfo());
-
- ServicePointManager.SecurityProtocol = (SecurityProtocolType)(SslProtocols)0x00000C00;
}
protected override void OnExit(ExitEventArgs e)
diff --git a/src/Shared/HandyControlDemo_Shared/Data/GlobalData.cs b/src/Shared/HandyControlDemo_Shared/Data/GlobalData.cs
index 92e46551..d49cb4c8 100644
--- a/src/Shared/HandyControlDemo_Shared/Data/GlobalData.cs
+++ b/src/Shared/HandyControlDemo_Shared/Data/GlobalData.cs
@@ -12,7 +12,7 @@ namespace HandyControlDemo.Data
try
{
var json = File.ReadAllText(AppConfig.SavePath);
- Config = JsonConvert.DeserializeObject(json);
+ Config = (string.IsNullOrEmpty(json) ? new AppConfig() : JsonConvert.DeserializeObject(json)) ?? new AppConfig();
}
catch
{
diff --git a/src/Shared/HandyControlDemo_Shared/Data/MessageToken.cs b/src/Shared/HandyControlDemo_Shared/Data/MessageToken.cs
index c59c99a0..8c984761 100644
--- a/src/Shared/HandyControlDemo_Shared/Data/MessageToken.cs
+++ b/src/Shared/HandyControlDemo_Shared/Data/MessageToken.cs
@@ -98,6 +98,8 @@
public static readonly string GridDemoCtl = nameof(GridDemoCtl);
+ public static readonly string PoptipDemoCtl = nameof(PoptipDemoCtl);
+
public static readonly string RangeSliderDemoCtl = nameof(RangeSliderDemoCtl);
public static readonly string ButtonGroupDemoCtl = nameof(ButtonGroupDemoCtl);
diff --git a/src/Shared/HandyControlDemo_Shared/Data/MessageToken.tt b/src/Shared/HandyControlDemo_Shared/Data/MessageToken.tt
index 201cc75c..6d152292 100644
--- a/src/Shared/HandyControlDemo_Shared/Data/MessageToken.tt
+++ b/src/Shared/HandyControlDemo_Shared/Data/MessageToken.tt
@@ -51,6 +51,7 @@ var controlList = new List
"DialogDemoCtl",
"SideMenuDemoCtl",
"GridDemoCtl",
+ "PoptipDemoCtl",
"RangeSliderDemoCtl",
"ButtonGroupDemoCtl",
"CardDemoCtl",
diff --git a/src/Shared/HandyControlDemo_Shared/HandyControlDemo_Shared.projitems b/src/Shared/HandyControlDemo_Shared/HandyControlDemo_Shared.projitems
index 6128b123..09b4abbc 100644
--- a/src/Shared/HandyControlDemo_Shared/HandyControlDemo_Shared.projitems
+++ b/src/Shared/HandyControlDemo_Shared/HandyControlDemo_Shared.projitems
@@ -161,6 +161,9 @@
PasswordBoxDemoCtl.xaml
+
+ PoptipDemoCtl.xaml
+
PreviewSliderDemoCtl.xaml
@@ -604,6 +607,10 @@
Designer
MSBuild:Compile
+
+ Designer
+ MSBuild:Compile
+
Designer
MSBuild:Compile
diff --git a/src/Shared/HandyControlDemo_Shared/Properties/Langs/Lang.Designer.cs b/src/Shared/HandyControlDemo_Shared/Properties/Langs/Lang.Designer.cs
index e2cf3fe6..397ce9ed 100644
--- a/src/Shared/HandyControlDemo_Shared/Properties/Langs/Lang.Designer.cs
+++ b/src/Shared/HandyControlDemo_Shared/Properties/Langs/Lang.Designer.cs
@@ -1122,6 +1122,24 @@ namespace HandyControlDemo.Properties.Langs {
}
}
+ ///
+ /// 查找类似 气泡提示 的本地化字符串。
+ ///
+ public static string Poptip {
+ get {
+ return ResourceManager.GetString("Poptip", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 上左;上边;上右;右上;右边;右下;下右;下边;下左;左下;左边;左上 的本地化字符串。
+ ///
+ public static string PoptipPositionStr {
+ get {
+ return ResourceManager.GetString("PoptipPositionStr", resourceCulture);
+ }
+ }
+
///
/// 查找类似 上一步 的本地化字符串。
///
diff --git a/src/Shared/HandyControlDemo_Shared/Properties/Langs/Lang.en.resx b/src/Shared/HandyControlDemo_Shared/Properties/Langs/Lang.en.resx
index f555d91f..fd7c626c 100644
--- a/src/Shared/HandyControlDemo_Shared/Properties/Langs/Lang.en.resx
+++ b/src/Shared/HandyControlDemo_Shared/Properties/Langs/Lang.en.resx
@@ -600,6 +600,9 @@
Border
+
+ Poptip
+
Recommendation
@@ -678,4 +681,7 @@
Divider
+
+ top-start;top;top-end;right-start;right;right-end;bottom-end;bottom;bottom-start;left-end;left;left-start
+
\ No newline at end of file
diff --git a/src/Shared/HandyControlDemo_Shared/Properties/Langs/Lang.fa.resx b/src/Shared/HandyControlDemo_Shared/Properties/Langs/Lang.fa.resx
index 170b2ced..f68af839 100644
--- a/src/Shared/HandyControlDemo_Shared/Properties/Langs/Lang.fa.resx
+++ b/src/Shared/HandyControlDemo_Shared/Properties/Langs/Lang.fa.resx
@@ -678,4 +678,10 @@
Divider
+
+ Poptip
+
+
+ top-start;top;top-end;right-start;right;right-end;bottom-end;bottom;bottom-start;left-end;left;left-start
+
\ No newline at end of file
diff --git a/src/Shared/HandyControlDemo_Shared/Properties/Langs/Lang.fr.resx b/src/Shared/HandyControlDemo_Shared/Properties/Langs/Lang.fr.resx
index f7c5365c..c01f2d99 100644
--- a/src/Shared/HandyControlDemo_Shared/Properties/Langs/Lang.fr.resx
+++ b/src/Shared/HandyControlDemo_Shared/Properties/Langs/Lang.fr.resx
@@ -678,4 +678,10 @@
Divider
+
+ Poptip
+
+
+ top-start;top;top-end;right-start;right;right-end;bottom-end;bottom;bottom-start;left-end;left;left-start
+
\ No newline at end of file
diff --git a/src/Shared/HandyControlDemo_Shared/Properties/Langs/Lang.resx b/src/Shared/HandyControlDemo_Shared/Properties/Langs/Lang.resx
index 2d26de95..0de5fbbe 100644
--- a/src/Shared/HandyControlDemo_Shared/Properties/Langs/Lang.resx
+++ b/src/Shared/HandyControlDemo_Shared/Properties/Langs/Lang.resx
@@ -600,6 +600,9 @@
响应式布局
+
+ 气泡提示
+
群友推荐
@@ -678,4 +681,7 @@
分割线
+
+ 上左;上边;上右;右上;右边;右下;下右;下边;下左;左下;左边;左上
+
\ No newline at end of file
diff --git a/src/Shared/HandyControlDemo_Shared/Resources/Img/LeftMainContent/PopupCursor_16x.png b/src/Shared/HandyControlDemo_Shared/Resources/Img/LeftMainContent/PopupCursor_16x.png
new file mode 100644
index 00000000..a1e4fd09
Binary files /dev/null and b/src/Shared/HandyControlDemo_Shared/Resources/Img/LeftMainContent/PopupCursor_16x.png differ
diff --git a/src/Shared/HandyControlDemo_Shared/UserControl/Controls/HoneycombPanelDemoCtl.xaml b/src/Shared/HandyControlDemo_Shared/UserControl/Controls/HoneycombPanelDemoCtl.xaml
index 9d1f7c91..fb6370d1 100644
--- a/src/Shared/HandyControlDemo_Shared/UserControl/Controls/HoneycombPanelDemoCtl.xaml
+++ b/src/Shared/HandyControlDemo_Shared/UserControl/Controls/HoneycombPanelDemoCtl.xaml
@@ -23,7 +23,7 @@
-
+
diff --git a/src/Shared/HandyControlDemo_Shared/UserControl/Controls/PoptipDemoCtl.xaml b/src/Shared/HandyControlDemo_Shared/UserControl/Controls/PoptipDemoCtl.xaml
new file mode 100644
index 00000000..7d15afc0
--- /dev/null
+++ b/src/Shared/HandyControlDemo_Shared/UserControl/Controls/PoptipDemoCtl.xaml
@@ -0,0 +1,78 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/Shared/HandyControlDemo_Shared/UserControl/Controls/PoptipDemoCtl.xaml.cs b/src/Shared/HandyControlDemo_Shared/UserControl/Controls/PoptipDemoCtl.xaml.cs
new file mode 100644
index 00000000..8daa08f5
--- /dev/null
+++ b/src/Shared/HandyControlDemo_Shared/UserControl/Controls/PoptipDemoCtl.xaml.cs
@@ -0,0 +1,10 @@
+namespace HandyControlDemo.UserControl
+{
+ public partial class PoptipDemoCtl
+ {
+ public PoptipDemoCtl()
+ {
+ InitializeComponent();
+ }
+ }
+}
diff --git a/src/Shared/HandyControlDemo_Shared/UserControl/Controls/ProgressButtonDemoCtl.xaml b/src/Shared/HandyControlDemo_Shared/UserControl/Controls/ProgressButtonDemoCtl.xaml
index b6dd935b..00aae1f9 100644
--- a/src/Shared/HandyControlDemo_Shared/UserControl/Controls/ProgressButtonDemoCtl.xaml
+++ b/src/Shared/HandyControlDemo_Shared/UserControl/Controls/ProgressButtonDemoCtl.xaml
@@ -7,20 +7,20 @@
-
-
-
-
-
-
+
+
+
+
+
+
-
-
-
-
-
-
+
+
+
+
+
+
diff --git a/src/Shared/HandyControlDemo_Shared/UserControl/Main/LeftMainContent.xaml b/src/Shared/HandyControlDemo_Shared/UserControl/Main/LeftMainContent.xaml
index 2081856c..a0d2b13a 100644
--- a/src/Shared/HandyControlDemo_Shared/UserControl/Main/LeftMainContent.xaml
+++ b/src/Shared/HandyControlDemo_Shared/UserControl/Main/LeftMainContent.xaml
@@ -245,6 +245,11 @@
+
+
+
+
+
@@ -465,7 +470,7 @@
-
+
diff --git a/src/Shared/HandyControl_Shared/Controls/Button/SplitButton.cs b/src/Shared/HandyControl_Shared/Controls/Button/SplitButton.cs
index 0bdd19e7..f5e3767c 100644
--- a/src/Shared/HandyControl_Shared/Controls/Button/SplitButton.cs
+++ b/src/Shared/HandyControl_Shared/Controls/Button/SplitButton.cs
@@ -10,11 +10,11 @@ namespace HandyControl.Controls
public class SplitButton : ButtonBase
{
public static readonly DependencyProperty HitModeProperty = DependencyProperty.Register(
- "HitMode", typeof(MouseHitMode), typeof(SplitButton), new PropertyMetadata(default(MouseHitMode)));
+ "HitMode", typeof(HitMode), typeof(SplitButton), new PropertyMetadata(default(HitMode)));
- public MouseHitMode HitMode
+ public HitMode HitMode
{
- get => (MouseHitMode) GetValue(HitModeProperty);
+ get => (HitMode) GetValue(HitModeProperty);
set => SetValue(HitModeProperty, value);
}
@@ -62,7 +62,7 @@ namespace HandyControl.Controls
{
base.OnPreviewMouseLeftButtonDown(e);
- if (HitMode == MouseHitMode.Hover)
+ if (HitMode == HitMode.Hover)
{
e.Handled = true;
}
@@ -72,7 +72,7 @@ namespace HandyControl.Controls
{
base.OnMouseEnter(e);
- if (HitMode == MouseHitMode.Hover)
+ if (HitMode == HitMode.Hover)
{
SetCurrentValue(IsDropDownOpenProperty, ValueBoxes.TrueBox);
}
diff --git a/src/Shared/HandyControl_Shared/Controls/Grid/Row.cs b/src/Shared/HandyControl_Shared/Controls/Grid/Row.cs
index a166b027..043c2887 100644
--- a/src/Shared/HandyControl_Shared/Controls/Grid/Row.cs
+++ b/src/Shared/HandyControl_Shared/Controls/Grid/Row.cs
@@ -59,7 +59,7 @@ namespace HandyControl.Controls
}
}
- return new Size(constraint.Width, _maxChildDesiredHeight * totalRowCount - Gutter);
+ return new Size(0, _maxChildDesiredHeight * totalRowCount - Gutter);
}
protected override Size ArrangeOverride(Size finalSize)
diff --git a/src/Shared/HandyControl_Shared/Controls/Other/Poptip.cs b/src/Shared/HandyControl_Shared/Controls/Other/Poptip.cs
new file mode 100644
index 00000000..65ec968c
--- /dev/null
+++ b/src/Shared/HandyControl_Shared/Controls/Other/Poptip.cs
@@ -0,0 +1,361 @@
+using System;
+using System.ComponentModel;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Controls.Primitives;
+using System.Windows.Data;
+using System.Windows.Input;
+using HandyControl.Data;
+using HandyControl.Data.Enum;
+
+namespace HandyControl.Controls
+{
+ public class Poptip : Control
+ {
+ private readonly Popup _popup;
+
+ private UIElement _elementTarget;
+
+ public Poptip()
+ {
+ _popup = new Popup
+ {
+ AllowsTransparency = true,
+ Child = this
+ };
+
+ _popup.SetBinding(DataContextProperty, new Binding(DataContextProperty.Name) {Source = this});
+ }
+
+ public static readonly DependencyProperty HitModeProperty = DependencyProperty.RegisterAttached(
+ "HitMode", typeof(HitMode), typeof(Poptip), new PropertyMetadata(HitMode.Hover));
+
+ public static void SetHitMode(DependencyObject element, HitMode value)
+ => element.SetValue(HitModeProperty, value);
+
+ public static HitMode GetHitMode(DependencyObject element)
+ => (HitMode) element.GetValue(HitModeProperty);
+
+ public HitMode HitMode
+ {
+ get => (HitMode)GetValue(HitModeProperty);
+ set => SetValue(HitModeProperty, value);
+ }
+
+ private static readonly DependencyProperty IsInstanceProperty = DependencyProperty.RegisterAttached(
+ "IsInstance", typeof(bool), typeof(Poptip), new PropertyMetadata(ValueBoxes.TrueBox));
+
+ private static void SetIsInstance(DependencyObject element, bool value)
+ => element.SetValue(IsInstanceProperty, value);
+
+ private static bool GetIsInstance(DependencyObject element)
+ => (bool) element.GetValue(IsInstanceProperty);
+
+ public static readonly DependencyProperty ContentProperty = DependencyProperty.RegisterAttached(
+ "Content", typeof(object), typeof(Poptip), new PropertyMetadata(default, OnContentChanged));
+
+ private static void OnContentChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
+ {
+ if (d is Poptip) return;
+ if (GetInstance(d) == null)
+ {
+ SetInstance(d, Default);
+ SetIsInstance(d, false);
+ }
+ }
+
+ 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);
+ }
+
+ public static readonly DependencyProperty ContentTemplateProperty = DependencyProperty.Register(
+ "ContentTemplate", typeof(DataTemplate), typeof(Poptip), new PropertyMetadata(default(DataTemplate)));
+
+ public DataTemplate ContentTemplate
+ {
+ get => (DataTemplate)GetValue(ContentTemplateProperty);
+ set => SetValue(ContentTemplateProperty, value);
+ }
+
+ public static readonly DependencyProperty ContentStringFormatProperty = DependencyProperty.Register(
+ "ContentStringFormat", typeof(string), typeof(Poptip), new PropertyMetadata(default(string)));
+
+ public string ContentStringFormat
+ {
+ get => (string)GetValue(ContentStringFormatProperty);
+ set => SetValue(ContentStringFormatProperty, value);
+ }
+
+ public static readonly DependencyProperty ContentTemplateSelectorProperty = DependencyProperty.Register(
+ "ContentTemplateSelector", typeof(DataTemplateSelector), typeof(Poptip), new PropertyMetadata(default(DataTemplateSelector)));
+
+ public DataTemplateSelector ContentTemplateSelector
+ {
+ get => (DataTemplateSelector)GetValue(ContentTemplateSelectorProperty);
+ set => SetValue(ContentTemplateSelectorProperty, value);
+ }
+
+ public static readonly DependencyProperty OffsetProperty = DependencyProperty.RegisterAttached(
+ "Offset", typeof(double), typeof(Poptip), new PropertyMetadata(6.0));
+
+ 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
+ {
+ get => (double)GetValue(OffsetProperty);
+ set => SetValue(OffsetProperty, value);
+ }
+
+ public static readonly DependencyProperty PlacementProperty = DependencyProperty.RegisterAttached(
+ "Placement", typeof(TipPlacement), typeof(Poptip), new PropertyMetadata(TipPlacement.Top));
+
+ public static void SetPlacement(DependencyObject element, TipPlacement value)
+ => element.SetValue(PlacementProperty, value);
+
+ public static TipPlacement GetPlacement(DependencyObject element)
+ => (TipPlacement) element.GetValue(PlacementProperty);
+
+ public TipPlacement Placement
+ {
+ get => (TipPlacement)GetValue(PlacementProperty);
+ set => SetValue(PlacementProperty, value);
+ }
+
+ public static readonly DependencyProperty IsOpenProperty = DependencyProperty.RegisterAttached(
+ "IsOpen", typeof(bool), typeof(Poptip), new PropertyMetadata(ValueBoxes.FalseBox, OnIsOpenChanged));
+
+ private static void OnIsOpenChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
+ {
+ if (d is Poptip poptip)
+ {
+ poptip.SwitchPoptip((bool) e.NewValue);
+ }
+ else
+ {
+ GetInstance(d)?.SwitchPoptip((bool)e.NewValue);
+ }
+ }
+
+ public static void SetIsOpen(DependencyObject element, bool value)
+ => element.SetValue(IsOpenProperty, value);
+
+ public static bool GetIsOpen(DependencyObject element)
+ => (bool) element.GetValue(IsOpenProperty);
+
+ public bool IsOpen
+ {
+ get => (bool) GetValue(IsOpenProperty);
+ set => SetValue(IsOpenProperty, value);
+ }
+
+ public static readonly DependencyProperty TargetProperty = DependencyProperty.Register(
+ "Target", typeof(UIElement), typeof(Poptip), new PropertyMetadata(default(UIElement), OnTargetChanged));
+
+ private static void OnTargetChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
+ {
+ var ctl = (Poptip)d;
+ ctl.UpdateTarget(ctl._elementTarget, false);
+ ctl.UpdateTarget((UIElement)e.NewValue, true);
+ }
+
+ [Bindable(true), Category("Layout")]
+ [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
+ public UIElement Target
+ {
+ get => (UIElement) GetValue(TargetProperty);
+ set => SetValue(TargetProperty, value);
+ }
+
+ public static readonly DependencyProperty InstanceProperty = DependencyProperty.RegisterAttached(
+ "Instance", typeof(Poptip), typeof(Poptip), new PropertyMetadata(default(Poptip), OnPoptipChanged));
+
+ private static void OnPoptipChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
+ {
+ if (!(d is UIElement target)) return;
+ var poptip = (Poptip)e.NewValue;
+ poptip.Target = target;
+ }
+
+ public static void SetInstance(DependencyObject element, Poptip value)
+ => element.SetValue(InstanceProperty, value);
+
+ public static Poptip GetInstance(DependencyObject element)
+ => (Poptip)element.GetValue(InstanceProperty);
+
+ public static Poptip Default => new Poptip();
+
+ private void UpdateTarget(UIElement element, bool isNew)
+ {
+ if (element == null) return;
+
+ if (!isNew)
+ {
+ element.MouseEnter -= Element_MouseEnter;
+ element.MouseLeave -= Element_MouseLeave;
+ element.GotFocus -= Element_GotFocus;
+ element.LostFocus -= Element_LostFocus;
+ _elementTarget = null;
+ }
+ else
+ {
+ element.MouseEnter += Element_MouseEnter;
+ element.MouseLeave += Element_MouseLeave;
+ element.GotFocus += Element_GotFocus;
+ element.LostFocus += Element_LostFocus;
+ _elementTarget = element;
+ _popup.PlacementTarget = _elementTarget;
+ }
+ }
+
+ private void UpdateLocation()
+ {
+ var targetWidth = Target.RenderSize.Width;
+ var targetHeight = Target.RenderSize.Height;
+
+ Measure(new Size(double.PositiveInfinity, double.PositiveInfinity));
+ var size = DesiredSize;
+
+ var width = size.Width;
+ var height = size.Height;
+
+ var offsetX = .0;
+ var offsetY = .0;
+
+ var poptip = GetInstance(Target);
+ var popupPlacement = poptip.Placement;
+ var popupOffset = poptip.Offset;
+
+ PlacementMode placementMode;
+
+ switch (popupPlacement)
+ {
+ case TipPlacement.LeftTop:
+ offsetX = -popupOffset;
+ placementMode = PlacementMode.Left;
+ break;
+ case TipPlacement.Left:
+ offsetX = -popupOffset;
+ offsetY = (targetHeight - height) / 2;
+ placementMode = PlacementMode.Left;
+ break;
+ case TipPlacement.LeftBottom:
+ offsetX = -popupOffset;
+ offsetY = targetHeight - height;
+ placementMode = PlacementMode.Left;
+ break;
+ case TipPlacement.TopLeft:
+ offsetY = -popupOffset;
+ placementMode = PlacementMode.Top;
+ break;
+ case TipPlacement.Top:
+ offsetX = (targetWidth - width) / 2;
+ offsetY = -popupOffset;
+ placementMode = PlacementMode.Top;
+ break;
+ case TipPlacement.TopRight:
+ offsetX = targetWidth - width;
+ offsetY = -popupOffset;
+ placementMode = PlacementMode.Top;
+ break;
+ case TipPlacement.RightTop:
+ offsetX = popupOffset;
+ placementMode = PlacementMode.Right;
+ break;
+ case TipPlacement.Right:
+ offsetX = popupOffset;
+ offsetY = (targetHeight - height) / 2;
+ placementMode = PlacementMode.Right;
+ break;
+ case TipPlacement.RightBottom:
+ offsetX = popupOffset;
+ offsetY = targetHeight - height;
+ placementMode = PlacementMode.Right;
+ break;
+ case TipPlacement.BottomLeft:
+ offsetY = popupOffset;
+ placementMode = PlacementMode.Bottom;
+ break;
+ case TipPlacement.Bottom:
+ offsetX = (targetWidth - width) / 2;
+ offsetY = popupOffset;
+ placementMode = PlacementMode.Bottom;
+ break;
+ case TipPlacement.BottomRight:
+ offsetX = targetWidth - width;
+ offsetY = popupOffset;
+ placementMode = PlacementMode.Bottom;
+ break;
+ default:
+ throw new ArgumentOutOfRangeException();
+ }
+
+ _popup.HorizontalOffset = offsetX;
+ _popup.VerticalOffset = offsetY;
+ _popup.Placement = placementMode;
+ }
+
+ private void SwitchPoptip(bool isShow)
+ {
+ if (isShow)
+ {
+ if (!GetIsInstance(Target))
+ {
+ SetCurrentValue(ContentProperty, GetContent(Target));
+ SetCurrentValue(PlacementProperty, GetPlacement(Target));
+ SetCurrentValue(HitModeProperty, GetHitMode(Target));
+ SetCurrentValue(OffsetProperty, GetOffset(Target));
+ SetCurrentValue(IsOpenProperty, GetIsOpen(Target));
+ }
+
+ _popup.PlacementTarget = Target;
+ UpdateLocation();
+ }
+ _popup.IsOpen = isShow;
+ Target.SetCurrentValue(IsOpenProperty, isShow);
+ }
+
+ private void Element_MouseEnter(object sender, MouseEventArgs e)
+ {
+ var hitMode = GetIsInstance(Target) ? HitMode : GetHitMode(Target);
+ if (hitMode != HitMode.Hover || hitMode == HitMode.None) return;
+
+ SwitchPoptip(true);
+ }
+
+ private void Element_MouseLeave(object sender, MouseEventArgs e)
+ {
+ var hitMode = GetIsInstance(Target) ? HitMode : GetHitMode(Target);
+ if (hitMode != HitMode.Hover || hitMode == HitMode.None) return;
+
+ SwitchPoptip(false);
+ }
+
+ private void Element_GotFocus(object sender, RoutedEventArgs e)
+ {
+ var hitMode = GetIsInstance(Target) ? HitMode : GetHitMode(Target);
+ if (hitMode != HitMode.Focus || hitMode == HitMode.None) return;
+
+ SwitchPoptip(true);
+ }
+
+ private void Element_LostFocus(object sender, RoutedEventArgs e)
+ {
+ var hitMode = GetIsInstance(Target) ? HitMode : GetHitMode(Target);
+ if (hitMode != HitMode.Focus || hitMode == HitMode.None) return;
+
+ SwitchPoptip(false);
+ }
+ }
+}
diff --git a/src/Shared/HandyControl_Shared/Controls/Slider/RangeSlider/RangeSlider.cs b/src/Shared/HandyControl_Shared/Controls/Slider/RangeSlider/RangeSlider.cs
index 4250b29a..70060224 100644
--- a/src/Shared/HandyControl_Shared/Controls/Slider/RangeSlider/RangeSlider.cs
+++ b/src/Shared/HandyControl_Shared/Controls/Slider/RangeSlider/RangeSlider.cs
@@ -22,9 +22,9 @@ namespace HandyControl.Controls
private RangeTrack _track;
- private readonly ToolTip _autoToolTipStart = null;
+ private readonly System.Windows.Controls.ToolTip _autoToolTipStart = null;
- private readonly ToolTip _autoToolTipEnd = null;
+ private readonly System.Windows.Controls.ToolTip _autoToolTipEnd = null;
private RangeThumb _thumbCurrent;
@@ -448,11 +448,11 @@ namespace HandyControl.Controls
OnThumbDragStarted(isStart ? _autoToolTipStart : _autoToolTipEnd, isStart);
}
- private void OnThumbDragStarted(ToolTip toolTip, bool isStart)
+ private void OnThumbDragStarted(System.Windows.Controls.ToolTip toolTip, bool isStart)
{
if (toolTip == null)
{
- toolTip = new ToolTip
+ toolTip = new System.Windows.Controls.ToolTip
{
Placement = PlacementMode.Custom,
PlacementTarget = isStart ? _track.ThumbStart : _track.ThumbEnd,
@@ -556,7 +556,7 @@ namespace HandyControl.Controls
// Show AutoToolTip if needed
if (AutoToolTipPlacement != AutoToolTipPlacement.None)
{
- var toolTip = (isStart ? _autoToolTipStart : _autoToolTipEnd) ?? new ToolTip();
+ var toolTip = (isStart ? _autoToolTipStart : _autoToolTipEnd) ?? new System.Windows.Controls.ToolTip();
toolTip.Content = GetAutoToolTipNumber(isStart);
diff --git a/src/Shared/HandyControl_Shared/Data/Enum/MouseHitMode.cs b/src/Shared/HandyControl_Shared/Data/Enum/HitMode.cs
similarity index 50%
rename from src/Shared/HandyControl_Shared/Data/Enum/MouseHitMode.cs
rename to src/Shared/HandyControl_Shared/Data/Enum/HitMode.cs
index 6232328a..400e2de3 100644
--- a/src/Shared/HandyControl_Shared/Data/Enum/MouseHitMode.cs
+++ b/src/Shared/HandyControl_Shared/Data/Enum/HitMode.cs
@@ -1,8 +1,10 @@
namespace HandyControl.Data.Enum
{
- public enum MouseHitMode
+ public enum HitMode
{
Click,
- Hover
+ Hover,
+ Focus,
+ None
}
}
diff --git a/src/Shared/HandyControl_Shared/Data/Enum/TipPlacement.cs b/src/Shared/HandyControl_Shared/Data/Enum/TipPlacement.cs
index c6c2fff3..bc492ea7 100644
--- a/src/Shared/HandyControl_Shared/Data/Enum/TipPlacement.cs
+++ b/src/Shared/HandyControl_Shared/Data/Enum/TipPlacement.cs
@@ -3,7 +3,64 @@ namespace HandyControl.Data
{
public enum TipPlacement
{
+ ///
+ /// 左上
+ ///
+ LeftTop,
+
+ ///
+ /// 左
+ ///
+ Left,
+
+ ///
+ /// 左下
+ ///
+ LeftBottom,
+
+ ///
+ /// 上左
+ ///
TopLeft,
+
+ ///
+ /// 上
+ ///
+ Top,
+
+ ///
+ /// 上右
+ ///
+ TopRight,
+
+ ///
+ /// 右上
+ ///
+ RightTop,
+
+ ///
+ /// 右
+ ///
+ Right,
+
+ ///
+ /// 右下
+ ///
+ RightBottom,
+
+ ///
+ /// 下左
+ ///
+ BottomLeft,
+
+ ///
+ /// 下
+ ///
+ Bottom,
+
+ ///
+ /// 下右
+ ///
BottomRight,
}
}
\ 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 68ed8f5c..077f6b78 100644
--- a/src/Shared/HandyControl_Shared/HandyControl_Shared.projitems
+++ b/src/Shared/HandyControl_Shared/HandyControl_Shared.projitems
@@ -29,6 +29,7 @@
+
@@ -37,7 +38,7 @@
-
+
@@ -383,6 +384,14 @@
Designer
MSBuild:Compile
+
+ Designer
+ MSBuild:Compile
+
+
+ Designer
+ MSBuild:Compile
+
Designer
MSBuild:Compile
diff --git a/src/Shared/HandyControl_Shared/Themes/Basic/Converters.xaml b/src/Shared/HandyControl_Shared/Themes/Basic/Converters.xaml
index bdf0240d..ef70bbea 100644
--- a/src/Shared/HandyControl_Shared/Themes/Basic/Converters.xaml
+++ b/src/Shared/HandyControl_Shared/Themes/Basic/Converters.xaml
@@ -10,10 +10,10 @@
-
+
-
-
+
+
diff --git a/src/Shared/HandyControl_Shared/Themes/Styles/Base/ColorPickerBaseStyle.xaml b/src/Shared/HandyControl_Shared/Themes/Styles/Base/ColorPickerBaseStyle.xaml
index 62f6a76b..b465d39a 100644
--- a/src/Shared/HandyControl_Shared/Themes/Styles/Base/ColorPickerBaseStyle.xaml
+++ b/src/Shared/HandyControl_Shared/Themes/Styles/Base/ColorPickerBaseStyle.xaml
@@ -200,7 +200,7 @@
-
+
diff --git a/src/Shared/HandyControl_Shared/Themes/Styles/Base/PoptipBaseStyle.xaml b/src/Shared/HandyControl_Shared/Themes/Styles/Base/PoptipBaseStyle.xaml
new file mode 100644
index 00000000..9c513359
--- /dev/null
+++ b/src/Shared/HandyControl_Shared/Themes/Styles/Base/PoptipBaseStyle.xaml
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/Shared/HandyControl_Shared/Themes/Styles/Poptip.xaml b/src/Shared/HandyControl_Shared/Themes/Styles/Poptip.xaml
new file mode 100644
index 00000000..c0162f78
--- /dev/null
+++ b/src/Shared/HandyControl_Shared/Themes/Styles/Poptip.xaml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
\ 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 ea4bb002..971fca8e 100644
--- a/src/Shared/HandyControl_Shared/Themes/Styles/Style.xaml
+++ b/src/Shared/HandyControl_Shared/Themes/Styles/Style.xaml
@@ -76,6 +76,7 @@
+
\ No newline at end of file
diff --git a/src/Shared/HandyControl_Shared/Themes/Styles/ToolTip.xaml b/src/Shared/HandyControl_Shared/Themes/Styles/ToolTip.xaml
index f324761e..99db4872 100644
--- a/src/Shared/HandyControl_Shared/Themes/Styles/ToolTip.xaml
+++ b/src/Shared/HandyControl_Shared/Themes/Styles/ToolTip.xaml
@@ -1,5 +1,4 @@