2012-10-08 2 views
4

다음 코드가 예외를 throw하지 않는 이유는 무엇입니까?새로운 FontFamily ("Invalid font")가 예외를 throw하지 않는 이유는 무엇입니까?

FontFamily font = new FontFamily("bla bla bla"); 

은 내가 특정 font이 (FontFamily를,의 fontStyle, 글꼴 너비의 조합으로, ...) 나의 현재 OS에 있는지 알 필요가있다. 어떻게해야합니까?

+0

는 http://msdn.microsoft.com/ru-ru/library/2ext31w1.aspx –

+1

@Artur Udod에 따라 예외를 발생해야 : 그 일부가 아닌'System.Drawing.FontFamily',이다 WPF. – BoltClock

+0

@BoltClock, wpf 태그를 알지 못함 =) –

답변

7

이것은 의도적으로 설계된 것입니다. 프로그램은 종종 기계에 존재하지 않는 글꼴, 특히 프로그래머의 거주지에서 멀리 떨어져있는 글꼴을 요구합니다. 글꼴 매퍼는 대안을 제시합니다. 글꼴 대체는 일반적으로 매우 일반적입니다. Windows 컴퓨터를 사용 중이라면 지금 Arial을보고 있습니다. 하지만이 게시물에 你好 世界을 붙여 넣을 수 있습니다. Arial에는 한자에 대한 글리프가 없더라도 정확하게 렌더링되는 것을 볼 수 있습니다.

힌트 번호 하나는 실제로 어떤 글꼴을 사용할 수 있는지 걱정하지 않는 것입니다. Windows api는 EnumFontFamiliesEx()를 사용하여 사용 가능한 글꼴 패밀리를 열거합니다. 그러나 WPF에서는 공개되지 않습니다. OpenType과의 마찰로 인해 Windows와의 통합이 제대로 이루어지지 않는 글꼴 표준입니다. 어도비가 마이크로 소프트와 관련된 일을 할 때 또 다른 그림자가 생겼다.

Winforms의 FontFamily 클래스에 대한 의견에 약간의 혼란이 있습니다. 이 경우 실제로 사용할 수있는 GetFamilies() 메서드는 사용 가능한 패밀리 배열을 반환합니다. 단, OpenType 글꼴이 아닌 트루 타입 글꼴.

+0

어떤 응용 프로그램에서 실행될 때만 예외가 발생하지 않고 특정 유형의 글꼴 (예 : 기울임 꼴 Nina)을 설정 한 경우에만 충돌하는 응용 프로그램이 있습니다. 하지만 다른 컴퓨터에서 실행하거나 다른 글꼴 (보통 Nina)을 설정하면 정상적인 동작을 보입니다. 이 이상한 행동을 어떻게 설명 할 수 있습니까? – Nick

0

당신은 System.Drawing.Text.InstalledFontCollection

http://msdn.microsoft.com/en-us/library/system.drawing.text.installedfontcollection.aspx

WPF는 예외를 던지는되지 않는 이유의 질문에 대답하기 위해 프레임 워크 구체적인 방법을 Fonts.SystemFontFamilies

http://msdn.microsoft.com/en-us/library/system.windows.media.fonts.systemfontfamilies.aspx

+0

그러나 예를 들어 FontFamilies를 사용하여 Nina (기울임 꼴 및 굵게) 글꼴이 존재하는지 어떻게 알 수 있습니까? – Nick

0

가지고있는 클래스를 사용에 따라 수 FontFamily Constructor on MSDN으로 프레임 워크 버전 3.5까지 예외가 추가되지 않았습니다.

버전 3.0 이하를 타겟팅하고있는 것으로 의심됩니다.

건배!

+1

그건'System.Drawing.FontFamily'입니다. 'System.Windows.Media.FontFamily'의 생성자는 인수가 null이 아니면 예외를 throw하지 않습니다. – BoltClock

+0

아니요, 인수가 null 인 경우 생성자가 ArgumentNullException을 throw하지만 내 경우에는 그렇지 않습니다. – Nick

0

Fonts.SystemFontFamilies 컬렉션을 사용하여 시스템에서 사용 가능한 글꼴을 찾아 볼 수 있습니다. 필요한 모든 조건에 맞는 일부 Linq를 사용할 수 있습니다.

// true 
bool exists = (from f in Fonts.SystemFontFamilies where f.Source.Equals("Arial") select f).Any(); 

// false 
exists = (from f in Fonts.SystemFontFamilies where f.Source.Equals("blahblah") select f).Any(); 
+0

Hans Passant의 답변이 아마도 더 적절할 것입니다. –

관련 문제