[WPF추천교육]WPF 리소스(Resources)
WPF 리소스(Resource)란?
n 리소스(Resource)는 일반적으로 한 번 이상 자주 사용하기를 원하는 자원을 이야기 한다. 컨트롤 또는 현재 창(Window)에 대해 또는 전체 응용 프로그램에 대해 전역으로 어떤 데이터를 저장하는 기능이다.
n 객체를 리소스로 정의하면 다른 윈도우, 컨트롤, 다른 어셈블리에서 객체에 접근할 수 있다. 즉 객체가 재사용 될 수 있다.
n 리소스는 리소스 사전(ResourceDictionary)에 정의되며 모든 객체는 리소스로 정의 될 수 있다. 고유 키는 XAML 리소스에 지정되며 해당 키를 사용하여 StaticResource, DynamicResource 태그 확장을 사용하여 참조 할 수 있다.
n 리소스에는 StaticResource, DynamicResource 두 가지 유형이 있는데 StaticResource는 참조가 처음 한번 이루어지고 변하지 않는 것이지만 DynamicResource는 런타임시에 값을 알수 있는 경우, 사용자 지정 컨트롤에 대한 테마스타일을 만들거나 참조하는 경우, 응용프로그램 라이프 사이클 기간 동안 ResourceDictionary의 내용을 조정, 변경하려는 경우에 이용되며 값이 사용될 때마다 변경여부에 대한 확인이 이루어진다. 즉 실시간 계산이 보류 되었다가 한번에 계산이 되는 형태인데 데이터 바인딩과 같이 변경이 동시에 이루어지는 형태에는 DynamicResource를 사용하지만 그외엔 StaticResource를 사용하면 된다.
n 정적 리소스(Static Resource)는 Window 또는 응용 프로그램이 시작될 때 로드 되므로 응용 프로그램이 무거워 느릴 때는 좋지 못할 수도 있다. 이에 반해 동적 리소스는 최초 사용될 때 로드되기 때문에 이 경우 동적 리소스가 장점이 있다.
n StaticResource와 DynamicResource의 차이는 참조하는 요소가 리소스를 검색하는 방법에 있다. StaticResource는 참조하는 요소에 의해 한 번만 검색되며 리소스의 전체 수명기간 동안 사용되지만 DynamicResource는 참조 된 객체가 사용될 때마다 획득된다.
n 실습 : 프로젝트에서 오른쪽 마우스 클릭 -> 추가 -> 리소스 사전(Resource Dictionary) 선택 후 새창에서 “리소스 사전” 클릭 후 파일명을 “mystyle.xaml”로 설정
n 전체 응용 프로그램에서 사용 가능하도록 app.xaml 파일의 Application.Resource로 mystyle.xaml 리소스 사전을 등록
[app.xaml]
n 정의된 리소스를 사용하는 MainWindow.xaml
[MainWindow.xaml]
n 실행 화면
VS Designer는 최초 DynamicResource를 StaticResource로 취급하며 버튼이 “Blue”로 렌더링되지만 실제로는 “Red”로 끝난다.
루트 레벨 스타일 (Blue)이 제거되면 StaticResource에서 오류가 발생한다.
n StaticResource는 일회성 조회이지만, DynamicResource는 데이터 바인딩과 유사하고 속성이 특정 리소스 키와 연관되어 있는 경우이다. 해당 키와 연관된 개체가 변경되면 DynamicResource가 대상 속성을 업데이트 한다.
n WPF 리소스 딕셔너리(ResourceDictionary)는 뷰의 코딩을 단순화하는 간단한 방법으로 다음 경우에 사용가능 하다.
ü 뷰 내의 ResourceDictionary에 상수 정의.
ü 뷰 내에서 ResourceDictionary내의 스타일 정의.
ü 동일한 어셈블리의 개별 파일에서 ResourceDictionary의 항목 사용
ü 별도의 어셈블리에서 ResourceDictionary에 있는 항목 사용
n 스타일을 재사용 할 수 있게 되면 개발이 빨라지며, 비슷한 컨트롤이 동일한 스타일을 사용하고 응용 프로그램 스타일이 쉽게 수정되므로 응용 프로그램의 모양과 느낌이 보다 일관적으로 유지된다는 이점이 있다.
n Resource로 상수를 정의
n Resource내에 Style을 정의
n ResourceDictionary에 사용자 정의 스타일, DataTemplates, ControlTemplates, 심지어 Brush, Color, Background 및 기타 많은 것들을 위한 사용자 정의 사항을 두고 관리할 수 있는데 중요한 것은 사전이므로 각 키를 할당하거나 스타일에 이름을 붙일 수 있다.
n 사용자 정의 컨트롤이나 Window 또는 페이지에 대한 리소스 파일을 XAML 파일에 만들어 Window 또는 Application 리소스로 이용할 수 있다.
n Window 리소스로 사용된 예문 : 각 컨트롤에 대한 리소스 사전을 가질 수 있으므로 다른 리소스 파일을 기존 리소스 사전에 병합할 수 있다.
n C# 코드에서 XAML로 정의한 ResourceDictionary에 접근해야 하는 경우가 있는데 XAML에서 이미 ResourceDictionary를 병합 한 경우 control.FindResource ("KeyWillGoHere")를 사용하여 내부 리소스에 쉽게 액세스 할 수 있다.
n 그러나 XAML의 리소스를 병합하지 않고 리소스 사전을 사용해야 하는 경우 C# 코드에서 직접 리소스를 사용할 수 있는 옵션도 있다.
URI를 사용하여 ResourceDictionary를 얻었는데 URI를 정의할 때 프로젝트 이름이 먼저오고 상대 경로가를 기술한다. UriKind 옵션은 매우 중요한데 UriKind를 기술하지 않으면 URI를 파싱하고 리소스를 찾을 수 없다. 리소스 사전이기 때문에 일반 사전과 마찬가지로 키를 사용하여 스타일에 액세스 해야한다.
n 응용 프로그램 코드가 XAML 로더에 의해 로드될 때 ResourceDictionary의 항목은 즉시 처리되지 않고 ResourceDictionary는 개체로 유지되며 개별 값은 특별히 요청 된 경우에만 처리된다.
n ResourceDictionary 클래스는 DictionaryBase에서 파생되지 않고 대신 IDictionary를 구현하지만 내부적으로는 Hashtable에 의존한다.
n 다른 가능한 XAML 사용법은 리소스 사전을 별도의 XAML 파일로 선언하고 런타임에 로드 하거나 리소스 또는 느슨한 파일로 프로젝트에 포함시키는 것이다. 이 경우 ResourceDictionary를 XAML의 루트 요소 역할을 하는 개체 요소로 선언 할 수 있다.
n 루트 요소로 사용할 계획 인 경우 리소스 사전 요소에 적절한 XML 네임 스페이스 값 (WPF 네임 스페이스의 기본값, 일반적으로 XAML 네임 스페이스의 경우 x:)을 매핑 해야 한다. 그런 다음 리소스를 정의하는 자식 요소를 x:Key 값과 함께 추가 할 수 있다.