C#/WPF

WPF 윤곽선 텍스트(Outlined Text)

기공이 2017. 1. 23. 11:00


WPF에 Text를 관리할 때 Effect에는 Shadow Effect는 있지만 Outline Effect는 없습니다.


그래서 찾아보니 어떤 분이 만드신 사용자 지정 컨트롤이 있었고, (링크

msdn에서 알려주는 Geometry와 Path를 사용하는 방식이 있었습니다.


사용자 지정 컨트롤은 아래 파일을 받으신 후 프로젝트에 추가하신 뒤 xaml에서 추가해주시고, 사용하시면 됩니다.


OutlinedTextBlock.cs

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






참고참고2 참고3