안녕하세요. 이번 시간에는 WPF에서 사용하는 Default System Color를 Overriding 하여 사용하는 방법에 대해 소개해 드리겠습니다. 먼저 Default System Color란 Windows에서 어떤 상황에 어떤 부분엔 어떤 Brush를 사용한다 라고 미리 정의해놓은 일종의 Color Table이라 할 수 있습니다. 이해를 돕기 위해 System Color가 사용되는 예를 보여드리자면, 아래 그림과 같이 TextBox나 ListBox, ComboBox에서 선택된 아이템은 배경을 파랑 색으로 보이는 것이 HiglighBrush가 파란색으로 설정 되어 있기 때문입니다.
이제 대충 뭔지 감이 오시나요? WPF에서는 SystemColor 를 System.Windows.SystemColors Class에 약 60여 개 정도 미리 정의 해놓고 각 상황에 맞게 사용하고 있습니다. 조금 옛날 이야기를 하자면, 기존 Win32이나 MFC를 사용하여 선택되었을 때의 색을 변경하기 위해서는 DrawItem부분에서 직접 Rectangle을 그려주는 방식을 사용했습니다. ComboBox, ListBox등 제각각 DrawItem에 그리는 코드를 추가해야 하기 때문에 코드 효율 면에서 매우 떨어지게 됩니다. 그렇다면, WPF는 어떨 가요?
WPF에서는 위와 같은 상황에서 System.Windows.SystemColosr의 ResourceKey를 사용하여 Brush를 참조하게 됩니다. 모든 종류의 기본적인 UI객체들이 SystemColor의 ResourceKey를 참조 하기 때문에 ResourceKey의 내용을 수정한다면 굳이 다시 그려줄 필요 없이, 변경된 내용이 적용됩니다.
그렇다면 어떻게 SystemColor ResourceKey를 수정할 수 있을가요? 간단합니다. 사용하고자 하는 객체의 리소스에 참조해야할 이름의 ResourceKey를 새로 생성하여 리소스를 Overriding하면 되는데요, 예를 들어서 아래 그림과 같이 아이템이 선택되었을 때 Highlight색상을 빨강색 으로 변경하고자 한다면 다음과 같이 할 수 있습니다.
|
<ListBox> <ListBox.Resources> <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="Red"/> </ListBox.Resources> <TextBlock>아이템1</TextBlock> <TextBlock>아이템1</TextBlock> <TextBlock>아이템1</TextBlock> </ListBox> |
간단하죠? 그럼 리스트 박스가 하나가 아니라, 여러 개라면 어떻게 해야 할까요? 매번 저렇게 리소스를 추가해서 사용해야 할까요? 아닙니다. XAML은 Resource에도 Scope가 존재하기 때문에 부모 리소스에 한번만 적용을 하면 자식 객체들에서도 부모의 리소스를 사용이 가능합니다. 따라서 객체가 여러 개 존재한다 하더라도, 부모 객체에 리소스가 등록되어 있다면 부모 객체의 리소스를 사용하게 됩니다.
|
<StackPanel Orientation="Horizontal"> <StackPanel.Resources> <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="Red"/> </StackPanel.Resources> <ListBox HorizontalAlignment="Center" BorderBrush="Black"> <TextBlock>아이템1</TextBlock> <TextBlock>아이템1</TextBlock> <TextBlock>아이템1</TextBlock> </ListBox> <ListBox HorizontalAlignment="Center" BorderBrush="Black"> <TextBlock>아이템1</TextBlock> <TextBlock>아이템1</TextBlock> <TextBlock>아이템1</TextBlock> </ListBox> <ListBox HorizontalAlignment="Center" BorderBrush="Black"> <TextBlock>아이템1</TextBlock> <TextBlock>아이템1</TextBlock> <TextBlock>아이템1</TextBlock> </ListBox> </StackPanel> |
Resource Scope를 잘 활용하면 몇몇 객체는 빨간색이 몇몇 객체는 다른 색을 적용하는 것 또한 가능합니다. 그럼 오늘 포스팅은 여기까지로 하고 SystemColors Class의 멤버를 정리해 놓은 표를 첨부합니다. 참고하시기 바랍니다.
|
멤버 (Windows.SystemColor) |
설명 |
|
활성 창의 테두리를 칠하는 데 사용되는 SolidColorBrush의 ResourceKey를 가져옵니다. | |
|
활성 창 테두리의 Color에 대한 ResourceKey를 가져옵니다. | |
|
활성 창 제목 표시줄의 배경을 칠하는 데 사용되는 SolidColorBrush에 대한 ResourceKey를 가져옵니다. | |
|
활성 창 제목 표시줄의 배경 Color에 대한 ResourceKey를 가져옵니다. | |
|
활성 창 제목 표시줄의 텍스트를 칠하는 SolidColorBrush에 대한 ResourceKey를 가져옵니다. | |
|
활성 창 제목 표시줄에 있는 텍스트의 Color에 대한 ResourceKey를 가져옵니다. | |
|
응용 프로그램 작업 영역을 칠하는 SolidColorBrush에 대한 ResourceKey를 가져옵니다. | |
|
응용 프로그램 작업 영역의 Color에 대한 ResourceKey를 가져옵니다. | |
|
3차원 표시 요소의 표면을 칠하는 SolidColorBrush에 대한 ResourceKey를 가져옵니다. | |
|
3차원 표시 요소의 표면 Color에 대한 ResourceKey를 가져옵니다. | |
|
3차원 표시 요소의 그림자를 칠하는 SolidColorBrush에 대한 ResourceKey를 가져옵니다. | |
|
3차원 표시 요소의 그림자 Color에 대한 ResourceKey를 가져옵니다. | |
|
3차원 표시 요소의 짙은 그림자를 칠하는 SolidColorBrush에 대한 ResourceKey를 가져옵니다. | |
|
3차원 표시 요소의 강조 색의 짙은 그림자 Color에 대한 ResourceKey를 가져옵니다. | |
|
3차원 표시 요소의 옅은 색 영역을 칠하는 SolidColorBrush에 대한 ResourceKey를 가져옵니다. | |
|
3차원 표시 요소의 강조 Color에 대한 ResourceKey를 가져옵니다. | |
|
3차원 표시 요소의 강조 영역을 칠하는 SolidColorBrush에 대한 ResourceKey를 가져옵니다. | |
|
3차원 표시 요소의 강조 Color에 대한 ResourceKey를 가져옵니다. | |
|
3차원 표시 요소의 텍스트를 칠하는 SolidColorBrush에 대한 ResourceKey를 가져옵니다. | |
|
3차원 표시 요소의 텍스트 Color에 대한 ResourceKey를 가져옵니다. | |
|
바탕 화면을 칠하는 SolidColorBrush에 대한 ResourceKey를 가져옵니다. | |
|
바탕 화면의 Color에 대한 ResourceKey를 가져옵니다. | |
|
활성 창 제목 표시줄에 있는 그라데이션의 오른쪽 색인 SolidColorBrush에 대한 ResourceKey를 가져옵니다. | |
|
활성 창 제목 표시줄에 있는 그라데이션의 오른쪽 Color에 대한 ResourceKey를 가져옵니다. | |
|
비활성 창 제목 표시줄에 있는 그라데이션의 오른쪽 색인 SolidColorBrush에 대한 ResourceKey를 가져옵니다. | |
|
비활성 창 제목 표시줄에 있는 그라데이션의 오른쪽 Color에 대한 ResourceKey를 가져옵니다. | |
|
비활성 텍스트를 칠하는 SolidColorBrush에 대한 ResourceKey를 가져옵니다. | |
|
비활성 텍스트의 Color에 대한 ResourceKey를 가져옵니다. | |
|
선택된 항목의 배경을 칠하는 SolidColorBrush에 대한 ResourceKey를 가져옵니다. | |
|
선택된 항목의 배경 Color에 대한 ResourceKey를 가져옵니다. | |
|
선택된 항목의 텍스트를 칠하는 SolidColorBrush에 대한 ResourceKey를 가져옵니다. | |
|
선택된 항목의 텍스트 Color에 대한 ResourceKey를 가져옵니다. | |
|
핫 트랙 항목을 칠하는 SolidColorBrush에 대한 ResourceKey를 가져옵니다. | |
|
핫 트랙 항목을 나타내는 Color에 대한 ResourceKey를 가져옵니다. | |
|
비활성 창의 테두리를 칠하는 SolidColorBrush에 대한 ResourceKey를 가져옵니다. | |
|
비활성 창 테두리의 Color에 대한 ResourceKey를 가져옵니다. | |
|
비활성 창 제목 표시줄의 배경을 칠하는 SolidColorBrush에 대한 ResourceKey를 가져옵니다. | |
|
비활성 창 제목 표시줄의 배경 Color에 대한 ResourceKey를 가져옵니다. | |
|
비활성 창 제목 표시줄의 텍스트를 칠하는 SolidColorBrush에 대한 ResourceKey를 가져옵니다. | |
|
비활성 창 제목 표시줄의 텍스트 Color에 대한 ResourceKey를 가져옵니다. | |
|
ToolTip 컨트롤의 배경색인 SolidColorBrush를 가져옵니다. | |
|
ToolTip 컨트롤의 배경을 칠하는 SolidColorBrush에 대한 ResourceKey를 가져옵니다. | |
|
ToolTip 컨트롤의 배경색인 Color 구조체를 가져옵니다. | |
|
ToolTip 컨트롤의 배경 Color에 대한 ResourceKey를 가져옵니다. | |
|
ToolTip 컨트롤의 텍스트 색인 SolidColorBrush를 가져옵니다. | |
|
ToolTip 컨트롤의 텍스트를 칠하는 SolidColorBrush에 대한 ResourceKey를 가져옵니다. | |
|
ToolTip 컨트롤의 텍스트 색인 Color 구조체를 가져옵니다. | |
|
ToolTip 컨트롤의 텍스트 Color에 대한 ResourceKey를 가져옵니다. | |
|
메뉴 모음의 배경을 칠하는 SolidColorBrush에 대한 ResourceKey를 가져옵니다. | |
|
메뉴 모음의 배경 Color에 대한 ResourceKey를 가져옵니다. | |
|
메뉴의 배경을 칠하는 SolidColorBrush에 대한 ResourceKey를 가져옵니다. | |
|
메뉴의 배경 Color에 대한 ResourceKey를 가져옵니다. | |
|
강조 표시된 메뉴 항목을 칠하는 SolidColorBrush에 대한 ResourceKey를 가져옵니다. | |
|
강조 표시된 메뉴 항목의 배경 Color에 대한 ResourceKey를 가져옵니다. | |
|
메뉴의 텍스트를 칠하는 SolidColorBrush에 대한 ResourceKey를 가져옵니다. | |
|
메뉴의 텍스트 Color에 대한 ResourceKey를 가져옵니다. | |
|
스크롤 막대의 배경을 칠하는 SolidColorBrush에 대한 ResourceKey를 가져옵니다. | |
|
스크롤 막대의 배경 Color에 대한 ResourceKey를 가져옵니다. | |
|
창 클라이언트 영역의 배경을 칠하는 SolidColorBrush에 대한 ResourceKey를 가져옵니다. | |
|
창 클라이언트 영역의 배경 Color에 대한 ResourceKey를 가져옵니다. | |
|
창 프레임을 칠하는 SolidColorBrush에 대한 ResourceKey를 가져옵니다. | |
|
창 프레임의 Color에 대한 ResourceKey를 가져옵니다. | |
|
창 클라이언트 영역의 텍스트를 칠하는 SolidColorBrush에 대한 ResourceKey를 가져옵니다. | |
|
창 클라이언트 영역의 텍스트 Color에 대한 ResourceKey를 가져옵니다.양식의 맨 아래 |
김대욱 (kdw234@naver.com) / http://whatisthat.co.kr

