silverlight에서 font 파일 사용에 대한 것을 공부하다가  다음 사이트를 발견 하고,


http://web-snippets.blogspot.com/2008/03/embedding-fonts-in-silverlight.html


공부 한 것을 한번 풀어 볼까 합니다.


먼저, silverlight에서 font를 사용하는 방법에는 3가지 정도가 있는 것 같습니다.

1. font 파일의 빌드 작업 속성을 "내용(content)" 으로 컴파일 하는 방법
2. font 파일의 빌드 작업 속성을 "포함 리소스(embedded resource)" 으로 컴파일 하는 방법
3. font 파일을 다운로드 하여 사용 하는 방법


 
위의 3 가지 방법은 예제 소스를 보시면 금방 이해가 될 것입니다.

그럼 일단 실행 결과 화면을 보겠습니다.



실행 결과는 위와 같습니다. 설명을 해보면 각각의 CROSSYS는 각기 다른 font 가 설정 되어있습니다.
그리고 각각의 font파일은 다른 빌드 작업 옵션으로 설정 되어 있습니다.



그럼 이제 부터 하나씩 알아보겠습니다.

1. font 파일의 빌드 작업 속성을 "내용(content)" 으로 컴파일 하는 방법


   실행 결과의 첫번째 줄의 CROSSYS 가 content 속성으로 컴파일된 font 파일 입니다. 방법은 간단 합니다.
 먼저, 사용할 font 파일을 프로젝트 안에 추가 합니다. (저는 JOKERMAN.TTF)라는 font 파일을 추가 했습니다. 
 추가한 font 파일의  빌드 작업 속성을 다음과 같이 content(내용)으로 변경 하여 컴파일 합니다.



   그런 다음 다음과 같이 font 파일을 사용 하면 되겠습니다. 
          
            TextBlock text2 = new TextBlock();
            text2.FontSize = 50;
            text2.FontFamily = new FontFamily("use_custom_font.xap#Jokerman");
            text2.Text = "CROSSYS";
            LayoutRoot.Children.Add(text2);

 
   font 파일의 빌드 작업의 속성 값을 content(내용)으로 하고 컴파일을 하면 사용한 font 파일이 xap 파일 안으로 
 내장 되게 됩니다. 때문에 xap 파일의 압축을 해제 하면 font 파일이 보이고 누구나 사용할 수 있게 되는 것입니다.
 그렇기 때문에 자신만의 font를 생성하여 사용하는 경우 (다른 사용자가 font 파일을 입수 하면 안되는 경우)에는 
 적합하지 않은 듯 합니다. (만약 다른 사용자가 xap 파일을 얻을 수 있다면)
  xap 파일의 압축을 해제 해보니 다음과 같은 결과가 나오고 font 파일이 안에 내장 된 것을 볼 수 있습니다. 





  위의 결과와 같이 JOKERMAN.TTF 라는 font 파일을 추출 할 수 있다는 것을 다시 한번 확인 할 수 있습니다.
  (역시 다른 사용자가 xap 파일을 얻을 수 있으면 위와 같은 사항이 문제가 됩니다.)



2. font 파일의 빌드 작업 속성을 "포함 리소스(embedded resource)" 으로 컴파일 하는 방법

   포함 리소스(embedded resource) 방법이라고 해서 특별한 방법이 아닙니다. 첫번째 방법과 마찬가지로 머저
 추가할(사용할) font 파일을 프로젝트 내에 추가 하시고 단순히 컴파일을 수행 하면 됩니다.
   하지만, 이번에는 추가한 font 파일(저는 FREESCPT.TTF 파일을 추가함)의 빌드 작업 속성을 포함 리소스로 
 선택하고 컴파일 하면 되는 것입니다.
   작업이 끝나면 다음과 같이 font 파일을 사용하면 됩니다.

            Stream stream = this.GetType().Assembly.
                GetManifestResourceStream("use_custom_font.FREESCPT.TTF");

            text.FontSource = new FontSource(stream);
            text.FontSize = 50;
            text.FontFamily = new FontFamily("Freestyle Script");
            text.Text = "CROSSYS";
            LayoutRoot.Children.Add(text);



  소스에서 GetManufestResourceStream() 함수는 프로젝트내의 어셈블리에서 특별한 리소스를 불러들이는,
 즉, 프로젝트내의 dll에서 font 파일을 불러온다고 생각하시면 될 것 같습니다.

   빌드 작업 속성에서 나오듣이 이 방법은 사용자가 추가한 font 파일을 DLL로 컴파일 합니다. 따라서 font 파일을
  찾기가 힘들지만(xap 파일에서 처럼 압축을 해제 하면 찾는 경우) decompiler에 의해서 가능 하긴 한다고 합니다.

  한마디로 이 방법은 그냥, DLL 안에서 font resource를 불러온다고 생각 하면 좋을 듯 합니다.


3. font 파일을 다운로드 하여 사용 하는 방법

   마지막으로 그냥 다운로드 해서 사용하는 방법 입니다. 이 방법은 font 파일의 빌드 작업 속성을 제어 하는 것이 아니라,
 처음부터 font 파일을 ClientBin 폴더에 추가 해놓고 사용하는 방법입니다. 사용자는 이 ClientBin 폴더안에 있는 font 파일을
 다운받아 사용하게 되는 것입니다. 사용방법은 다음과 같습니다.

         WebClient  fontDownloader = new WebClient();
         fontDownloader.OpenReadCompleted +=
                new OpenReadCompletedEventHandler(fontDownloader_OpenReadCompleted);
         fontDownloader.OpenReadAsync(new Uri("starfac.TTF", UriKind.Relative));

         void fontDownloader_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e)
        {
            TextBlock text3 = new TextBlock();
            text3.FontSource = new FontSource(e.Result);

            text3.FontFamily = new FontFamily("4 Star Face Font");
            text3.FontSize = 50;
            text3.Text = "CROSSYS";
            LayoutRoot.Children.Add(text3);
        }

  WebClient 클래스를 이용하여 지정된 리소스(font 파일)을 읽을 수 있는 스트림을 열고, 스트림을 여는 작업이 완료되면
 발생하는 이벤트 OpenReadComplated 를 이용하여 적절 하게 TextBlock을 추가 하였습니다.

  즉, OpenReadAsync() 를 사용하여 font 파일을 읽을 수 있게 스트림을 열고,
 font 파일의 스트림이 모두 열리면 발생하는 이벤트 OpenReadComplated를 이용하여 TextBlock을 추가 하였습니다.



역시, 제 생각을 글로 쓴다는게 쉬운 일은 아닌것 같습니다. 그래서 전체 소스를 올립니다.



Posted by JMSOFT

댓글을 달아 주세요

  1. 실버라이트3에서 폰트지정을 하려고 자료를 찾다가 여기까지 왔습니다.
    위에 방법으로 하니깐 잘 됐습니다. 하지만 한글 폰트를 적용하니깐 되지를 않습니다.
    혹시 한글 폰트도 해보셨는지여?? 혹시 아신다면 자료 부탁드리겠습니다.

    yoshikisuny1@naver.com

  2. 대화창의 추가 버튼을 클릭합니다.cdsfdsfghff

티스토리 툴바