ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • WPF 윤곽선 텍스트(Outlined Text)
    C#/WPF 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



    댓글

GiGong