sdk:wpf:xaml_basic
차이
문서의 선택한 두 판 사이의 차이를 보여줍니다.
양쪽 이전 판이전 판다음 판 | 이전 판 | ||
sdk:wpf:xaml_basic [2017/06/19 17:12] – kieuns | sdk:wpf:xaml_basic [2024/04/23 22:44] (현재) – 바깥 편집 127.0.0.1 | ||
---|---|---|---|
줄 1: | 줄 1: | ||
+ | ====== xaml 편집기 ====== | ||
+ | |||
+ | * VisualStudio를 설치하면 같이 설치되는 것 같은데, 어느 버젼인지는 모름. | ||
+ | * C:\Program Files\Microsoft SDKs\Windows\v6.0A\Bin\Xamlpad.exe | ||
+ | |||
+ | ====== 엘리먼트, | ||
+ | |||
+ | xml 기반으로 닷넷의 네임스페이스, | ||
+ | |||
+ | ^ XamlPad에서 실행 가능한 코드. 프로그램 내의 화면 전체에 큰 버튼을 만든다. ^ | ||
+ | | <code xml> | ||
+ | < | ||
+ | xmlns=" | ||
+ | xmlns: | ||
+ | < | ||
+ | <Button Content=" | ||
+ | </ | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | <wrap info> | ||
+ | |||
+ | ===== Xaml 요소는 ===== | ||
+ | |||
+ | = 오브젝트 엘리먼트< | ||
+ | = 프로퍼티 어트리뷰트< | ||
+ | = 이벤트 어트리뷰트< | ||
+ | |||
+ | ^ button_Click 이벤트 처리기가 필요해지면서 단독 실행은 안되게 되었지만.. ^^ | ||
+ | | <code xml>< | ||
+ | | ::: | **Content** : 프로퍼티어트리뷰트 | ||
+ | | ::: | **button_Click** : 이벤트처리기 | | ||
+ | |||
+ | * xaml 키워드들은 대소문자를 구분 : \\ %%< | ||
+ | |||
+ | ====== 네임스페이스 ====== | ||
+ | |||
+ | <code xml> | ||
+ | < | ||
+ | xmlns=" | ||
+ | xmlns: | ||
+ | ... | ||
+ | </ | ||
+ | |||
+ | * %%http:// | ||
+ | * xmlns:x=... x 라는 새로운 네임스페이스를 불러 들이는 것. | ||
+ | * WPF의 하드코딩된 XmlnsDefinitionAttribute 인스턴스를 이용해서 xaml 요소와 닷넷 요소를 맵핑 | ||
+ | |||
+ | < | ||
+ | xmlns=" | ||
+ | xmlns: | ||
+ | </ | ||
+ | |||
+ | **꼭 넣어야 한다고 하니**, 그냥 갖다 씁니다. **안넣으면 에러, 에러, 에러, 에러** | ||
+ | |||
+ | ====== 프로퍼티엘리먼트 ====== | ||
+ | |||
+ | |||
+ | 특정 요소에 추가 속성을 지정하려고 하는데, | ||
+ | * 추가 요소가 오브젝트엘리먼트 요소이고< | ||
+ | * 일반 어트리뷰트로는 입력할 수 없는 경우< | ||
+ | |||
+ | <color silver> | ||
+ | |||
+ | <code xml> | ||
+ | <Button xmlns=" | ||
+ | < | ||
+ | < | ||
+ | </ | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | 컨텐트 프로퍼티 구문 안에, 오브젝트엘리먼트를 추가하는 것으로 다른 객체를 갖다 붙일 수 있다.< | ||
+ | |||
+ | 이걸 프로퍼티엘리먼트< | ||
+ | |||
+ | ====== 타입컨버터 ====== | ||
+ | |||
+ | |||
+ | * Brush, Color, FontWeight, Point 처럼 많이 쓰이는 데이터 타입을 처리해주는 타입 컨버터가 있다. | ||
+ | * TypeConverter 에서 파생된 클래스로, | ||
+ | * 타입컨버터는 대소문자를 구분하지 않는다. \\ White == white == wHite 모두 같은 값으로 인식. | ||
+ | |||
+ | ^ 타입컨버터가 Background 어트리뷰트에서 White를 흰색 브러쉬로 인식하게 한다. ^ | ||
+ | | < | ||
+ | <Button xmlns=" | ||
+ | </ | ||
+ | ^ 타입컨버터가 White를 브러쉬로 인식하지 못한다면, | ||
+ | | < | ||
+ | <Button xmlns=" | ||
+ | < | ||
+ | < | ||
+ | </ | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | ====== 마크업 확장식 ====== | ||
+ | |||
+ | 타입컨버터가 인식하지 못하는 새로운 키워드를 사용해야 할때, 마크업 확장을 통해 한계 돌파. | ||
+ | |||
+ | 컨트롤 배경 색상을 "fancy gradient brush" 와 같은 사용자 정의 문자열을 이용하고 싶을때 사용자 지정 마크업 확장식을 만들어서 사용한다. | ||
+ | |||
+ | * 중괄호 ({})로 감싸진 어트리뷰트를 만나면 xaml에서는 문자열이 아니라 마크업 확장식으로 인식 | ||
+ | |||
+ | {{: | ||
+ | |||
+ | * 접두사(x: | ||
+ | * 이름 끝에 Extensison 접미사가 붙은 것이 클래스지만 xaml에서는 Extension은 제외한다. | ||
+ | * x:Null --> NullExtension, | ||
+ | * 두번째 네임스페이스에 있는 요소와 매핑 되므로 ' | ||
+ | * Binding은 기본 네임스페이스를 사용하므로 Extension 접두사를 붙이지 않는다. | ||
+ | |||
+ | 아 뭐지.. 이해 안되네. | ||
+ | |||
+ | ====== 오브젝트 엘리먼트의 자식 요소들 ====== | ||
+ | |||
+ | 오브젝트 엘리먼트의 자식 엘리먼트 타입 : | ||
+ | - 컨텐트 프로퍼티의 값 | ||
+ | - 컬렉션 아이템 | ||
+ | - 부모엘리먼트의 타입으로 캐스팅할 수 있는 값 | ||
+ | |||
+ | ===== 컨텐트 프로퍼티 ===== | ||
+ | |||
+ | 사용자 지정 프로퍼티를 설정하는 기능 | ||
+ | |||
+ | | 컨텐트 프로퍼티 사용하는 간단한 예 | <code xml>< | ||
+ | | 컨텐트 프로퍼티 없는 경우 | <code xml> | ||
+ | < | ||
+ | OK2 | ||
+ | </ | ||
+ | |||
+ | 다른 객체를 포함시킬 수도 있다. | ||
+ | |||
+ | ^ Rectangle 를 컨텐트프로퍼티로 추가 ^ | ||
+ | | <code xml> | ||
+ | < | ||
+ | < | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | * 컨텐트프로퍼티는 **Content** 키워드만 사용한다. | ||
+ | * 예외는 | ||
+ | * ComboBox, ListBox, TabControl 등 몇 컨트롤은 컨텐트프로퍼티 대신 Items 프로퍼티를 사용 | ||
+ | |||
+ | ===== 컬렉션 아이템 ===== | ||
+ | |||
+ | 리스트< | ||
+ | |||
+ | ==== 리스트(list) ==== | ||
+ | |||
+ | System.Collections.IList를 구현한 컬렉션. | ||
+ | |||
+ | ^ Items 프로퍼티로 리스트박스에 아이템 추가 ^ | ||
+ | | <code xml> | ||
+ | < | ||
+ | < | ||
+ | < | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | ==== 딕셔너리 ==== | ||
+ | |||
+ | |||
+ | * System.Collections.IDictionary 인터페이스를 구현한 컬렉션. | ||
+ | * 키와 값을 쌍으로 가진 데이터를 추가/ | ||
+ | * 두번째 네임스페이스에 정의된 x:Key를 사용해서 데이터를 컬렉션에 추가 | ||
+ | |||
+ | ^ 두개의 Color를 ResourceDictionary에 추가 ^ | ||
+ | | <code xml> | ||
+ | < | ||
+ | <Color x: | ||
+ | <Color x: | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | ====== 음 ====== | ||
+ | |||
+ | ===== 런타임 로드 & 파싱 ===== | ||
+ | |||
+ | * 로드 : XamlReader 의 Load 함수 사용 | ||
+ | * 저장 : XamlWriter 의 Save 함수 사용 | ||
+ | |||
+ | 로드 | ||
+ | |||
+ | <code csharp> | ||
+ | Window _wnd = null; | ||
+ | using( FileStream _fs = new FileStream(" | ||
+ | _wnd = (Window)XamlReader.Load( _fs ); | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | 로드 후에는 인스턴스로 저장 되기 때문에, 파일을 더 사용하지 않는다. | ||
+ | |||
+ | 또한, **루트 엘리먼트의 요소(인스턴스)가 있기 때문에 자식 엘리먼트를 검색할 수 있다.** | ||
+ | |||
+ | ^ 5개의 OK 버튼을 갖고 있는 StackPanel이 있는 엘리먼트가 있다는 가정 ^ | ||
+ | | <code csharp> | ||
+ | Window _wnd = null; | ||
+ | using( FileStream _fs = new FileStream(" | ||
+ | _wnd = (Window)XamlReader.Load( _fs ); | ||
+ | } | ||
+ | // | ||
+ | StackPanel _panel = (StackPanel)Window.Content; | ||
+ | Button _okBtn = (Button)_panel.Children[4]; | ||
+ | </ | ||
+ | |||
+ | 위의 방식으로 찾는 것은 프로그램이 깨지기 쉬우므로 엘리먼트에 이름을 부여해서 찾는 방법도 있다. | ||
+ | |||
+ | ^ **Name**키워드를 사용해서 이름을 부여한다. ^ | ||
+ | | <code xml>< | ||
+ | |||
+ | ====== Grid ====== | ||
+ | |||
+ | <code xml> | ||
+ | < | ||
+ | < | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | _COMPONENT_는 컬럼 1번 (왼쪽으로부터 두번째)에 배치하고 컬럼 두개를 (컬럼1부터 + 컬럼2까지) 사용해서 배치한다. |