====== 리소스 ====== 리소스 : 이미지,폰트,오디오,비디오,문자열테이블 이런 리소스를 패키지화(?)해서 쓸 수 있도록 지원해준다. 리소스는 바이너리, 로지컬 두 방식이 있다. ===== 바이너리 리소스 ===== 비트맵 같은 일반적인 것부터 컴파일된 xaml도 리소스로 저장 가능. * 어셈블리 내부에 저장 * 느슨한 파일 형태(?)로 사용한다. 컴파일할때나 런타임으로 이용 가능. 추가 : 프로젝트에 파일을 추가하고 '속성'에서 적합한 빌드작업(빌드액션)을 선택하면 된다. * Resource : 위성어셈블리(?)나 일반 어셈블리에 포함 * Content : 느슨한파일(?)로 남겨두고 AssemblyAssociatedContentFile 에 파일 경로와 이름을 저장 * 그니까.. 위치만 기록하고 파일 리소스는 바깥에 둔다는 이야기(?) 바이너리 리소스에 접근 * URI를 통해 xaml이나 코드에서 리소스 접근 가능 * 'Source' 프로퍼티 써서 파일명 적으면 알아서 찾는데.. * 해당 리소스가 없어도 일단 동작은 한다. (예: 이미지 같은거) 다른 어셈블리에 있는 리소스 접근 어셈블리참조;컴포넌트/리소스명(AssemblyReference;Component/ResourceName) 라는 규칙이 있다. * 어셈블리명 \\ ( MyDll;component/images/logo.jpg ) * 어셈블리명;v버젼번호 \\ ( MyDll;v1.35;component/images/logo.jpg ) * 어셈블리명;공용키토큰 \\ ( MyDll;dlc642a7f5bd61912;component;component/images/logo.jpg ) * 어셈블리명;v버젼번호;공용키토큰 \\ ( MyDll;v1.35;dlc642a7f5bd61912;component;component/images/logo.jpg ) 사이트 원점에서 리소스 접근하기 * 용어를 왜 이렇게 복잡하게 쓰는가? 설치된 기준 폴더나 url. * 설치한 폴더를 기준폴더 , 사이트 원점이라고 부른다. * 웹에서 실행하는 경우 기본 Url 표시방법 * siteOfOrigin : 사이트 원점 키워드 pack://siteOfOrigin:,,,/ 코드에서 리소스 접근 * xaml 방식의 URI 쓸 수 없고 사이트원점을 URL 등의 전체 경로를 명시 Image img = new Image(); img.Source = new BitmapImage(new Uri("pack://application:,,,/logo.jpg")) 지역화 지원 언어(컬쳐)만큼 위성 어셈블리로 분리. LocBaml 을 이용하면 지역화할 문자열 작업을 간편하게 가능. ===== 로지컬 리소스 ===== 프로그래밍 코드에서 만들고 사용할 수 있는 리소스. 동적으로 데이터가 추가/삭제되는 데이터 타입의 리소스를 가리키는 듯. * Resource 프로퍼티에 닷넷 객체를 저장하고, 여러 자식 엘리먼트 사이에 공유. * FrameworkElement, FrameworkContentElement 에서 파생되는 클래스( 대부분의 컨트롤 UI )가 Resource 프로퍼티를 갖고 있으니 대부분 클래스에서 로지컬 리소스 이용 가능. 하드코딩하는 예제 Window.Resouce 에 브러쉬 리소스를 세팅해 놓고 사용하는 방식 ====리소스로 정의한 것==== * SolidColorBrush * LinearGradientBrush * Image 잠시, 리소스로 사용할 수 있는 것들의 부모 클래스 * System.Windows.Freezable : [[https://msdn.microsoft.com/ko-kr/library/system.windows.freezable(v=vs.110).aspx|링크]] * System.Windows.Media.Animation.Animatable : [[https://msdn.microsoft.com/ko-kr/library/system.windows.media.animation.animatable(v=vs.110).aspx|링크]] * System.Windows.Media.Brush : [[https://msdn.microsoft.com/ko-kr/library/system.windows.media.brush(v=vs.110).aspx|링크]] ====리소스 룩업(찾기)==== StaticResource 마크업 확장식은 리소스 딕셔너리 (위에서는 Window.Resource 부분)에서 아이템을 가리키는 키(x:Key 로 설정한)를 파라미터로 받는다. 어느 리소스 딕셔너리에든 있기만 하다면 x:Key로 접근 가능하다. 리소스 딕셔너리느는 상위 부모 엘리먼트 또는 애플리케이션 수준의 것도 있을 수 있다. 검색 단계 - 현재의 엘리먼트 리소스 딕셔너리 Resources 컬렉션. (없으면 다음 단계) - 부모의 것에서 찾기, 반복, 루트 엘리먼트까지 검색 (없으면 다음 단계) - Application 의 Resources 에서 검색 (없으면 다음 단계) - 시스템에서 검색 (없으면 다음 단계) - 이래도 없으면 InvalidOperationException 발생 ====스태틱vs다이나믹 리소스==== 키워드 * StaticResource * DynamicResource 스태틱 리소스는 선언된 후에 사용할 수 있다. 다이나믹은 그런 제한은 없다. Yellow Red ... === 리소스 분리해서 별개 파일로 나누기 === ResourceDictionary 클래스의 MergedDictionaries 프로퍼티를 써서 다른 파일의 리소스를 자신의 컬렉션으로 (리소스로) 합칠 수 있다. 코드보면 이해하기 쉬움. 개별 파일은 ResourceDictionary를 루트 엘리먼트로 써야 한다. 예, file1.xaml * 머지된 것들 중, 중복되는게 있으면 마지막 것으로 설정 된다. === 공유 없는 리소스 === * x:Shared = 'True' or 'False' 'False' 설정이면 StaticResource 로 한 섹션에 여러번 적용해도 다른 개체로 인식되어 에러가 나지 않는다. ... ... === 프로그래밍 코드에서 리소스 정의하고 적용하기 === 정의는 간단 window.Resources.Add("backgroundBrush", new SolidColorBrush("Yellow")); 적용(사용) **Case Static**