[wpf] WPF 모호한 글꼴 문제-솔루션

다음 링크에서 문제점을 설명하고 설명합니다.

설명 : WPF의 텍스트 선명도 . 이 링크에는 글꼴 비교가 있습니다.

이 문제에 대한 가능한 모든 솔루션을 수집하고 싶습니다. Microsoft Expression Blend는 WPF를 사용하지만 글꼴을 읽을 수 있습니다.

  • Microsoft Expression Blend에서와 같이 어두운 배경
  • 글꼴 크기 늘리기 및 글꼴 변경 (Calibri …) [link]
  • 창 형태 포함 [link]
  • GDI + 및 / 또는 Windows Forms TextRenderer 클래스를 사용하여 텍스트를 비트 맵으로 렌더링 한 다음 해당 비트 맵을 WPF 컨트롤로 렌더링하십시오. [링크]

더 이상의 해결책이 있습니까?

이것은 VS2010 (및 WPF4) 베타 2에서 수정 될 예정입니다.

IT가 마지막으로 해결 된 것처럼 보입니다!

Scott Hanselman의 ComputerZen.com : 완벽한 선명도를 갖춘 WPF 및 텍스트 흐림



답변

기술적 배경

windowsclient.net의 WPF 텍스트 프로그램 관리자 중 하나에서 WPF 텍스트 렌더링에 대한 자세한 기사가 있습니다. WPF의 텍스트 선명도 .

문제는 부드러운 애니메이션을 위해 선형 스케일링 글꼴 렌더링이 필요한 WPF로 귀결됩니다. 반면에 Pure ClearType은 글꼴을 사용하여 세로 줄기를 다음 픽셀로 밀어 넣는 데 약간의 자유가 필요합니다.

고전적인 “캐스케이드”패턴을 비교하면 차이가 분명합니다. 왼쪽 하단의 WinForms, 오른쪽 상단의 WPF :

나는 WPF의 글꼴 렌더링 특유성에 대한 팬이 아니지만 애니메이션이 Winforms 캐스케이드에서와 같이 뛰어 오르면 그 소름을 상상할 수 있습니다.

레지스트리와 함께 연주

저에게 관심이있는 것은 MSDN 기사 ” ClearType Registry Settings ” 에 대한 링크입니다 .

  • 클리어 타입 레벨 : 서브 픽셀 힌트 량
  • 감마 레벨
  • 픽셀 구조 : 디스플레이 픽셀의 색상 줄무늬 배열 방법
  • 텍스트 대비 수준 : 글꼴을 더 무겁게 만들기 위해 글리프 줄기의 너비를 조정합니다

이러한 설정을 사용하면 근본적인 문제가 실제로 개선되지는 않지만 민감한 사용자의 색상 번짐 효과를 줄이는 데 도움이 될 수 있습니다.

다른 접근법

텍스트 선명도 기사에서 제공 한 최상의 조언은 글꼴 크기를 늘리고 글꼴을 변경하는 것이 었습니다. Calibri는 표준 Segoe UI보다 더 잘 작동합니다. 웹 글꼴로 인기가 있기 때문에 Verdana도 사용해 보았지만 글꼴 크기를 애니메이션으로 표시 할 때 14pt와 15pt 사이의 무게가 급격히 증가했습니다.

WPF 4.0

WPF 4는 글꼴 렌더링에 영향을주는 지원이 향상되었습니다. WPF 텍스트 블로그 에는 변경 사항을 설명 하는 기사 가 있습니다 . 가장 눈에 띄게, 적어도 세 가지 종류의 텍스트 렌더링이 있습니다.

텍스트 렌더링 비교

<grumble> 모든 디자이너에게 충분한 밧줄이어야합니다. </ grumble>


답변

.NET 4는 결국 WPF의 열악한 텍스트 렌더링 품질에 대한 솔루션을 가지고 있지만 숨겨져 있습니다. 모든 창에 대해 다음을 설정하십시오.

TextOptions.TextFormattingMode="Display"

기본값은 “이상적”이며 이름에서 의미하는 바가 아닙니다.

TextOptions에는 TextHintingMode와 TextRenderingMode의 두 가지 옵션이 있지만 둘 다 합리적인 기본값을 갖습니다.


답변

다른 날 DropShadowEffect가 적용된 테두리를 사용할 때 문제가 발생했습니다 . 결과적으로 해당 테두리 안의 모든 텍스트가 매우 흐릿했습니다. 텍스트가 다른 패널 안에 있거나 테두리 바로 아래에 있든 상관 없습니다. 효과 가있는 부모의 자식 인 텍스트 블록 적용된 영향을받는 것 같습니다.

이 특별한 경우에 대한 해결책은 효과가있는 테두리 안에 물건을 넣지 말고 그리드 (또는 서로 위에 내용을 넣는 것을 지원하는 다른 것)를 사용하고 텍스트와 동일한 셀에 사각형을 배치하는 것입니다 (예 : 시각적 트리에서 형제로) 영향을 미칩니다.

이렇게 :

<!-- don't do this --->
<Border>
     <Border.Effect>
          <DropShadowEffect BlurRadius="25" ShadowDepth="0" Opacity="1"/>
     </Border.Effect>
     <TextBlock Text="This Text Will Be Blurry" />
</Border>

<!-- Do this instead -->
<Grid>
  <Rectangle>
     <Rectangle.Effect>
          <DropShadowEffect BlurRadius="25" ShadowDepth="0" Opacity="1"/>
     </Rectangle.Effect>
  </Rectangle>
  <TextBlock Text="This Text Will Be Crisp and Clear" />
</Grid>


답변

이것은 VS2010 (및 WPF4) 베타 2에서 수정 될 예정입니다.



답변

SnapToDevicePixels는 텍스트 렌더러가 아닌 WPF 모양 (선 등)에만 적용됩니다.

이 문제에 대한 알려진 해결 방법이 없습니다. Microsoft에 따르면이 동작은 “설계”입니다.

또한 Microsoft 포럼 에서이 스레드를 통해 문제를 논의하십시오. 문제에 대한 입장을 분명히하는 MS 담당자로부터 몇 가지 대답을 받았습니다.


답변

개발자의 관점에서 현재까지 알려진 “해결 방법”은 GDI + 및 / 또는 Windows Forms TextRenderer 클래스를 사용하여 텍스트를 비트 맵으로 렌더링 한 다음 해당 비트 맵을 WPF 컨트롤로 렌더링하는 것입니다. 명백한 성능 영향을 제외하고 기존 응용 프로그램의 문제를 완화하지는 않습니다.

이 문제에 대한 Microsoft Connect 티켓을 만들었습니다. (모든 부정에도 불구하고 지정된 추적기에 실제 버그 보고서가 없었습니다).

그것이 요청과 질문을 Microsoft에 전달하는 공식 채널 중 하나이므로 더 빠른 답변을 위해이를 진행하는 것이 좋습니다. 최소한 문제를 다른 방식으로 해결하려면 해당 티켓에 투표하거나 문제를 확인하면 Microsoft PM 및 엔지니어의 관심을 끌고이 우선 순위를 높일 수 있습니다.


답변

나는 그것을 버그로 보지 않지만 기본 구성은 실제로 매우 성가시다. 여기에 모든 조합의 비교가 있습니다

TextOptions.TextRenderingMode
TextOptions.TextFormattingMode
RenderOptions.ClearTypeHint

SnapToDevicePixels 텍스트 렌더링에 차이가 없습니다.

http://i.stack.imgur.com/cS3S2.png

나는 선호한다:

TextOptions.TextRenderingMode="Auto"
TextOptions.TextFormattingMode="Ideal"
RenderOptions.ClearTypeHint="Auto"

수직선이 결코 흐릿하지 않습니다.

사용 된 글꼴은 Open Sans Light이며 최신 TeamViewer 에서처럼 잘 사용하면 정말 아름답습니다.

Mahapps.Metro를 사용하는 경우 문제는 TransitioningContentControl https://github.com/MahApps/MahApps.Metro/issues/889입니다.