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 @@ +