From 40b09cc9c50626488e5eea4a293e678406b3c26e Mon Sep 17 00:00:00 2001
From: NaBian <836904362@qq.com>
Date: Mon, 6 Jan 2020 00:01:47 +0800
Subject: [PATCH] fixed #278
---
.../Controls/OutlineTextDemoCtl.xaml | 2 +
.../Controls/Text/OutlineText.cs | 50 ++++++++++++++++++-
.../Data/Enum/StrokePosition.cs | 9 ++++
.../HandyControl_Shared.projitems | 1 +
4 files changed, 61 insertions(+), 1 deletion(-)
create mode 100644 src/Shared/HandyControl_Shared/Data/Enum/StrokePosition.cs
diff --git a/src/Shared/HandyControlDemo_Shared/UserControl/Controls/OutlineTextDemoCtl.xaml b/src/Shared/HandyControlDemo_Shared/UserControl/Controls/OutlineTextDemoCtl.xaml
index a8ccd7e0..21762990 100644
--- a/src/Shared/HandyControlDemo_Shared/UserControl/Controls/OutlineTextDemoCtl.xaml
+++ b/src/Shared/HandyControlDemo_Shared/UserControl/Controls/OutlineTextDemoCtl.xaml
@@ -11,6 +11,8 @@
+
+
diff --git a/src/Shared/HandyControl_Shared/Controls/Text/OutlineText.cs b/src/Shared/HandyControl_Shared/Controls/Text/OutlineText.cs
index be9022c9..038480de 100644
--- a/src/Shared/HandyControl_Shared/Controls/Text/OutlineText.cs
+++ b/src/Shared/HandyControl_Shared/Controls/Text/OutlineText.cs
@@ -10,16 +10,29 @@ namespace HandyControl.Controls
{
public class OutlineText : FrameworkElement
{
+ private Pen _pen;
+
private FormattedText _formattedText;
private Geometry _textGeometry;
+ private PathGeometry _clipGeometry;
+
static OutlineText()
{
SnapsToDevicePixelsProperty.OverrideMetadata(typeof(OutlineText), new FrameworkPropertyMetadata(ValueBoxes.TrueBox));
UseLayoutRoundingProperty.OverrideMetadata(typeof(OutlineText), new FrameworkPropertyMetadata(ValueBoxes.TrueBox));
}
+ public static readonly DependencyProperty StrokePositionProperty = DependencyProperty.Register(
+ "StrokePosition", typeof(StrokePosition), typeof(OutlineText), new PropertyMetadata(default(StrokePosition)));
+
+ public StrokePosition StrokePosition
+ {
+ get => (StrokePosition) GetValue(StrokePositionProperty);
+ set => SetValue(StrokePositionProperty, value);
+ }
+
public static readonly DependencyProperty TextProperty = DependencyProperty.Register(
"Text", typeof(string), typeof(OutlineText), new FrameworkPropertyMetadata(
string.Empty,
@@ -143,7 +156,34 @@ namespace HandyControl.Controls
protected override void OnRender(DrawingContext drawingContext)
{
EnsureGeometry();
- drawingContext.DrawGeometry(Fill, new Pen(Stroke, StrokeThickness), _textGeometry);
+
+ drawingContext.DrawGeometry(Fill, null, _textGeometry);
+
+ if (StrokePosition == StrokePosition.Outside)
+ {
+ drawingContext.PushClip(_clipGeometry);
+ }
+ else if (StrokePosition == StrokePosition.Inside)
+ {
+ drawingContext.PushClip(_textGeometry);
+ }
+
+ drawingContext.DrawGeometry(null, _pen, _textGeometry);
+
+ if (StrokePosition == StrokePosition.Outside || StrokePosition == StrokePosition.Inside)
+ {
+ drawingContext.Pop();
+ }
+ }
+
+ private void UpdatePen()
+ {
+ _pen = new Pen(Stroke, StrokeThickness);
+
+ if (StrokePosition == StrokePosition.Outside || StrokePosition == StrokePosition.Inside)
+ {
+ _pen.Thickness = StrokeThickness * 2;
+ }
}
private void EnsureFormattedText()
@@ -187,6 +227,12 @@ namespace HandyControl.Controls
EnsureFormattedText();
_textGeometry = _formattedText.BuildGeometry(new Point(0, 0));
+
+ if (StrokePosition == StrokePosition.Outside)
+ {
+ var geometry = new RectangleGeometry(new Rect(0, 0, ActualWidth, ActualHeight));
+ _clipGeometry = Geometry.Combine(geometry, _textGeometry, GeometryCombineMode.Exclude, null);
+ }
}
private void UpdateFormattedText()
@@ -237,6 +283,8 @@ namespace HandyControl.Controls
_formattedText.MaxTextWidth = Math.Min(3579139, availableSize.Width);
_formattedText.MaxTextHeight = Math.Max(0.0001d, availableSize.Height);
+ UpdatePen();
+
// return the desired size
return new Size(_formattedText.Width, _formattedText.Height);
}
diff --git a/src/Shared/HandyControl_Shared/Data/Enum/StrokePosition.cs b/src/Shared/HandyControl_Shared/Data/Enum/StrokePosition.cs
new file mode 100644
index 00000000..96711a7d
--- /dev/null
+++ b/src/Shared/HandyControl_Shared/Data/Enum/StrokePosition.cs
@@ -0,0 +1,9 @@
+namespace HandyControl.Data
+{
+ public enum StrokePosition
+ {
+ Center,
+ Outside,
+ Inside
+ }
+}
\ 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 b6842277..4af77f44 100644
--- a/src/Shared/HandyControl_Shared/HandyControl_Shared.projitems
+++ b/src/Shared/HandyControl_Shared/HandyControl_Shared.projitems
@@ -45,6 +45,7 @@
+