C#/WPF
WPF 윤곽선 텍스트(Outlined Text)
기공이
2017. 1. 23. 11:00
WPF에 Text를 관리할 때 Effect에는 Shadow Effect는 있지만 Outline Effect는 없습니다.
그래서 찾아보니 어떤 분이 만드신 사용자 지정 컨트롤이 있었고, (링크)
msdn에서 알려주는 Geometry와 Path를 사용하는 방식이 있었습니다.
사용자 지정 컨트롤은 아래 파일을 받으신 후 프로젝트에 추가하신 뒤 xaml에서 추가해주시고, 사용하시면 됩니다.
TextBlock와 거의 유사하게 사용하실 수 있습니다.(FontSize, TextAlignment, TextWrapping 등)
(namespace를 해당 프로젝트의 namespace로 바꾸신 뒤 아래와 같이 사용하실 수 있습니다.)
1 2 | <local:OutlinedTextBlock x:Name="textOutline" Text="Text" FontSize="50pt" StrokeThickness="2" Stroke="Orange" Fill="Yellow"/> | cs |
(혹은 해당 xaml의 Window 태그에 xmlns:OutlinedText="clr-namespace:OutlinedTextBlock" 를 추가해 주신 뒤 아래와 같이 사용하시면 됩니다.)
1 2 | <OutlinedTextBlock:OutlinedTextBlock x:Name="textOutline" Text="Text" FontSize="50pt" StrokeThickness="2" Stroke="Orange" Fill="Yellow"/> | cs |
madn에서 알려주는 방식은 Geometry를 사용한 방식인데 제가 Label에 적용가능하게 함수를 만들었습니다.
윤곽선을 적용한 뒤 다시 윤곽선을 해제하시려면 해당 Label의 Content를 따로 저장하신 뒤,
해당 Content로 다시 적용해 주시면 됩니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | void OutlinedTextLabel(Label lbl) { FormattedText formattedText = new FormattedText(lbl.Content.ToString(), System.Globalization.CultureInfo.GetCultureInfo("ko-kr"), FlowDirection.LeftToRight, new Typeface(lbl.FontFamily, lbl.FontStyle, lbl.FontWeight, lbl.FontStretch), lbl.FontSize, Brushes.Black); formattedText.TextAlignment = TextAlignment.Center; Geometry geometry = formattedText.BuildGeometry(new Point(0, 0)); PathGeometry pathGeometry = geometry.GetFlattenedPathGeometry(); Canvas cvs = new Canvas(); lbl.Content = cvs; Path pt = new Path(); pt.Stroke = Brushes.Red; pt.StrokeThickness = 2; pt.Fill = lbl.Foreground; pt.Stretch = Stretch.Fill; cvs.Children.Add(pt); Canvas.SetTop(pt, (cvs.ActualHeight - formattedText.Extent) / 2); Canvas.SetLeft(pt, (cvs.ActualWidth - formattedText.Width) / 2); pt.Data = pathGeometry; } | cs |