모드
The Control Class
개관
WPF 윈도우즈는 요소들로 이뤄지지만, 이들 중의 일부분만이 controls이다.
WPF의 세계에서 control이란 일반적으로 사용자-상호교환 요소로 표현되며,
그 요소는 focus를 받을 수 있고 키보드나 혹 마우스로부터 입력을 전달받을 수 있는 요소이다. 구체적인 예로 text boxes 나 buttons를 들 수 있다.
그러나, 어느 부분에서는 확연한 구분이 흐려진다.
tooltip 은 사용자가 마우스를 움직임에 따라 보이거나 사라지기 때문에 control로 간주된다.
label 은 단축키로 focus를 관련 controls로 이동하는 mnemonics의 기능을 갖고 있기 때문에 control로 간주된다.
모든 controls는 System.Windows.Control 클래스에서 유래되며, 이 클래스는 약간의 기초기반이 더해진다.
control 내부의 내용 정렬설정
tab 순서를 설정
background, foreground, border 등 이용지원
text content의 폰트와 크기 형식지원
Bacground and Foreground Brushes
일반
모든 controls는 background와 foreground의 속성을 담고 있다.
대개, background는 control의 표면고, foreground는 text다.
WPF에서, Background 와 Foreground 속성을 이용해 사용자는 이 두 영역의 색을 설정한다.
Background 와 Foreground properties가 color objects를 이용할 것이라 예상하는 것은 당연하다.
그러나, 이런 속성들은 실제 훨씬 더 변화무쌍한 것을 사용하는데, 그것이 바로 Brush object이다.
이는 사용자가 background 와 foreground content를 단색으로 채우거나 그라디언트, 타일등 좀더 독특한 것들로 채우는 등 유연한 선택을 제공한다.
Setting Color in Code
cmd라는 이름의 버튼에 파란면으로 설정한다고 가정하자.
다음은 이를 위한 간단한 코드이다.
cmd.Background = new SolidColorBrush(Colors.AliceBlue);
이 코드는 간단히 Colors 클래스의 static property를 통해 자체생성된 색을 사용하여 새 SolidColorBrush를 생성한다.
그런 후, 생성된 brush를 버튼의 background brush로 설정한다.
이것으로 background가 AliceBlue로 색칠된다.
또한, System.Windows.SystemColors로부터 시스템 색깔을 사용할 수 있다.
아래는 예제이다.
cmd.Background = new SolidColorBrush(SystemColors.ControlColor);
그리고 system brushes는 자주 사용되므로, SystemColors 클래스는 SolidColorBrush objects를 반환하는 자체생성된 속성을 제공한다.
다음은 그 예제이다.
cmd.Background = SystemColors.ControlBrush;
이 두 예제는 좀 사소한 문제가 생길 수 있다. 만일 시스템색이 이 코드를 실행한 후에 변한다면, 버튼은 변화된 새 색으로 업데이트되지않는다.
본질적으로, 이 코드는 현재 색이나 brush의 스냅샷을 찍는 것이다.
사용자 프로그램이 설정변화에 바로바로 반응하여 업데이트하려면, 사용자는 dynamic resouces 를 사용할 필요가 있다. 이는 Chapter 10 에서 다룬다.
Colors 와 SystemColors 클래스는 손쉬운 방법을 제공하지만, 색을 설정하는 방법이 하나만 있는 것은 아니다. 사용자는 R, G, B 값을 입력하여
Color object를 생성할 수 있다. R, G, B 각각의 값은 0에서 255 사이이다.
int red = 0; int green = 255; int blue = 0;
cmd.Foreground = new SolidColorBruhs(Color.FromRgb(red,green,blue));
또한 알파값을 입력하여 색을 부분적으로 투명하게 만들 수 있다.
FromArgb() 메서드를 사용하며, 255의 알파값은 완전 불투명이며,0값은 완전 투명이다.
Setting Colors in XAML
사용자가 XAML에서 배경이나 전경을 설정할 경우, 사용자는 좀 더 빠른 길을 이용할 수 있다.
Brush object를 정의하기 보다는, 사용자는 색의 이름이나 색의 값을 입력할 수 있다.
WPF parser는 사용자가 명시한 색을 판단해 자동으로 SolidColorBrush object를 생성한다. 그런 후, 생성된 brush object를 배경이나 전경을 채우는 데 사용한다.
다음은 색 이름을 사용하는 예제이다.
<Button Background="Red">A Button</Button>
이 코드는 약간 복잡한 하단의 코드와 동일한 결과를 가져온다.
<Button>A Button
<Button.Background>
<SolidColorBrush Color="Red" />
</Button.Background>
</Button>
사용자는 선형그라디언트브러시 같이 다른 형식의 브러시를 생성하려면 좀 더 긴 색입력형식을 사용할 필요가 있다.
색 코드를 사용하고자 한다면, R, G, B 값을 hexadecimal 형식으로 입력하는 다소 불편한 구문을 사용해야 한다.
둘 중 하나를 사용할 수 있는데,
첫째는 #rrggbb 둘째는 #aarrggbb 이다.
다음은 예제이다.
<Button Background="#FFFF0000">A Button</Button>
여기서, 알파값은 FF, R값은 FF, G 값과 B값은 0이다.
배경이나 전경 속성이 브러시로 설정할 수 있는 세부항목만은 아니다.
또한 control 의 경계를 BorderBrush 나 BorderThickness속성으로색칠할 수 있다.
참고
몇몇 controls는 BorderBrush 와 BorderThickness 속성을 반영하지 않는다.
Button object는 저 속성들을 완전히 무시하는데, 버튼은 배경이나 경계를 ButtonChrome decorator를 사용해 정의하기 때문이다.
그러나, 사용자는 템플릿을 이용하여, 버튼을 사용자가 선택하는 경계로 새로운 면으로 입힐 수 있다.
이는 Chatper 17에서 다룬다.
Fonts
개관
Control 클래스는 control요소 안의 글자외형을 결정하는 폰트관련 속성들을 일정부분 정의하고 있다. 이런 속성들은 표 6-1에 있다.
FontFamily
사용하고자 하는 폰트명
FontSize
각각 1/96인치의 기기독립 단위를 가지는 폰트의 규격.
이는 관례와는 약간 다른데, WPF의 해상도-독립적인 rendering model을 지원하기 위해 고안되었다.
평범한 윈도응용프로그램은 points로 폰트를 측정한다.
points는 일반 pc 모니터에서 1/72인치로 가정한다.
만일, 사용자가 WPF 폰트 규격을 좀 더 익숙한 point 규격으로
전환하려면, 사용자는 point에 3/4를 곱하는 일종의 트릭을 사용할 수 있다.
예를 들어, 관례적 38-point 폰트는 WPF에서 48 units와 같다.
FontStyle
FontStyle objet로 재현되는 글자의 각도.
사용자는 FontStyle 클래스의 static properties를 이용해서 FontStyle preset를 얻을 수 있다.
스타일에는 Normal, Italic, oblique lettering 등이 있다.
oblique는 italic 폰트가 없는 컴퓨터에서 italic 글자를 생성하기 위한 인위적인 방식이다. 문자들은 일반 폰트로부터 취한 후 transform을 사용해
기울어진다. 이런 방식은 일방적으로 저품질 결과를 만든다.
FontWeight
FontWeight object로 재현되는 글자의 두꺼움.
사용자는 FontWeight 클래스의 static properties를 이용해서 FontWeight preset를 얻을 수 있다.
Bold가 이들 중 가장 눈에 띄는 것이지만, 몇몇 종류의 typefaces는 Heavy, Light, ExtraBold, 기타 등등의 다변항목을 제공한다.
FontStretch
FontStretch Object로 재현되는 늘어나거나 줄어든 글자의 범위량.
사용자는 FontStretch 클래스의 static properties를 이용해서 FontStretch preset를 얻을 수 있다.
예를 들어, UltraCondenced는 폰트를 일반너비의 50%로 감하지만, UltraExpanded는 폰트를 200%로 확장한다.
Font stretching은 많은 글꼴이 미지원하는 OpenType 기능이다.
Font Family
font family는 관련 글꼴의 집합체다.
예를 들어, Arial Regular, Arial Bold, Arial Italic, Arial Bold Italic은 모두 Arial font family에 속한다.
비록 typographic 규칙과 자음과 모음각각의 변화성이 독립적으로 정의되지만,
운영체제는 이 모두를 연관하여 구현한다.
그 결과, 사용자는 Arial Regular를 사용하여 요소를 설정할 수 있고,
FontWeight 속성을 굵게하여, WPF는 만족스럽게 Arial Bold 글꼴로 전환할 것이다.
폰트를 선택할 때, 사용자는 full family name을 입력해야 한다. 이는 아래와 같다.
<Button Name="cmd" FontFamily="Times New Roman" FontSize="18">A Button</Button>
코드에서는 아래와 같다.
cmd.FontFamily = "Times New Roman";
cmd.FontSize = "18";
FontFamily를 식별하는 경우, 축약된 스트링은 불충분하다.
이는 사용자가 Times 나 Times New 를 full name 인 Times New Roman으로 대체할 수 없음을 말한다.
선택적으로, 사용자는 아래와 같이, italic이나 bold로 하기 위해 full name의 글꼴을
사용할 수 있다.
<Button FontFamily="Times New Roman Bold">A Button</Button>
그러나, 그냥 family name을 사용하고 FontStyle과 FontWeight와 같은 속성을 설정하는 것이 다양한 글꼴모양을 보이려할 때, 더 유용하고 명확한 방법이다.
예를 들어, 다음은 FontFamily를 Times New Roman으로 설정하고, FontWeight를 FontWeight.Bold로 설정한 xml markup이다.
<Button FontFamily="Times New Roman" FontWeight="Bold">A Button</Button>
Text Decorations and Typography
몇몇 요소들은 TextDecorations 와 Typography 속성을 통해 더 고급 텍스트 꾸미기를 지원한다. 이것으로 텍스트를 장식할 수 있다.
예를 들어, 사용자는 TextDecorations class 의 static 속성을 사용하여 TextDecorations 속성을 설정할 수 있다.
이것으로 텍스트에 밑줄, 윗줄, 가운뎃줄, Baseline 과 같은 선을 추가할 수 있다.
Typography 속성은 더 고급이다.
이것으로 특화된 글꼴을 선택할 수 있다.
다음의 예들은 다른 숫자, 정렬위치, ligatures( 인접 문자들 사이의 연결), 그리고 작은 caps 등을 포함한다.
보통, TextDecorations 와 Typography 의 기능들은 오직 flow document content 에서만 사용할 수 있다.
사용자는 flow document로 고급 문서를 생성할 수 있으며 Chapter 28에서 자세하게 다룬다.
그러나, the frills turn up on TextBox 클래스. TextBlock에 의해 지원되며, 그것은
접힐 수 있는(wrap) 글자로 된 단문 컨텐츠를 표현하기에 최적인 더 가벼운 Label 버전이다.
비록 TextBox에 글장식을 사용하는 것이나 서체를 변경하는 것에 익숙치 않아도,
당신은 TextBlock에서 밑줄긑기를 사용하기 원할 것이다, 아래에서 보이는 것처럼.
만일 당신이 많은 양의 문자 컨텐츠를 윈도창에 집어넣으려 한다면
format individual portions 를 사용하고자 할 것이다.
(예를 들어, 중요 단어에 밑줄긑기) 그러려면 28장을 참고 해야 한다.
거기서 당신은 더 많은 flow element에 대해 배우게 될 것이다.
비록 flow elements 가 documents와 함께 사용되도록 고안되었지만,
당신은 그것들을 TextBlock 안으로 직접 품을 수 있다.
Font Inheritance
폰트 속성을 설정할 때, 그 값은 nested objects를 통해 전해진다.
예를 들어, 최상위단계 윈도우의 폰트패밀리 속성을 설정하면, 그 윈도우 내에 있는 모든 control은
동일한 폰트패밀리 값이 된다. (각각의 control 에서 다른 폰트를 지정하지 않는 이상)
폰트 속성들이 dependency properties 이기 때문에 이같이 동작한다.
그리고 dependency properties가 제공하는 특징 중에 하나는 property value 상속이다.
설정한 폰트 세팅값은 nested된 controls로 동일하게 흐르게 된다.
속성값상속은 그런 속성을 지원하지 않는 요소들에 조차 흐를 수 있다는 것에 주목하자.
예를 들어, 윈도우 하나를 생성했다고 가정해보자. 그 윈도우는 3개의 Label controls를 품고 있는 StackPanel을 지니고 있다.
사용자는 윈도우의 FontSize 속성을 설정할 수 있다. Window 클래스는 Control 클래스에서 유래되기 때문이다.
사용자는 StackPanel 에 FontSize 속성을 설정할 수 없다. StackPanel은 control이 아니기 때문이다.
그러나, 사용자가 윈도우의 FontSize 속성을 설정하면, 그 속성 값은 여전히 StackPanel 을 통해 그 안에 있는
labels 에 전해져서 labels의 font size 값을 변경할 수 있다.
font 세팅을 따라, 몇몇 다른 기본 속성은 property 값 상속을 사용한다.
Control 클래스에서, Foreground 속성은 상속을 사용한다.
Background 속성은 그렇지 않다.
그러나 기본 background 는 대부분의 controls 에서 투명배경으로 적용되는 null 참조값이다.
UIElement 클래스에서, AllowDrop, IsEnabled, IsVisible은 속성 상속을 사용한다.
FrameworkElement에서 CultureInfo, FlowDirection 속성도 마찬가지다.
Note :
dependency property는 FrameworkPropertyMetadata.Inherits flag가 true 로 설정된 경우에만 상속을 지원한다.
true 값은 기본 설정값이 아니다. 4장에서 FrameworkProperyMetadata 클래스와 속성 등록에 관해서 자세히 다룬다.
Font Substitution
Font Embedding
Text Formatting Mode
댓글