SlideShare a Scribd company logo
송기수/ OpenSG
틱틱대도 써야 하는 Windows 10 앱 개발
C# Tips & Tricks.
오픈에스지
• OpenSG
• 기술이사
• 본 사 : 충남 아산
• 연구소 : 서울 강남
• Solution, Consulting, SI and Education Service based on Microsoft .NET
Technology
• 제조 자동화 설비, 실시간 모니터링, UX
14:30:38
Its all about UWP
(UWP : Universal Windows Platform)
1. XAML
2. Tool
3. Databinding
Agenda
14:30:38
XAML
• 새로운 컨트롤
• RelativePanel
• SplitView
• Adaptive UI
• 예)계산기, 설정창
• View States
• Adaptive triggers
• XAML 성능
• phase rendering
• deferred loading
14:30:38
상대적인 설정 값에 의해 자식 컨트롤을 배치
Relative Panel
레이아웃 컨트롤(Panel)
Grid
Stack
Panel
Canvas
Scroll
Viewer
Border View Box Wrap Grid Relative
Panel
14:30:38
<RelativePanel>
<Rectangle x:Name="BlueRect"
Height="100" Width="200" Fill="Blue" />
<Rectangle x:Name="RedRect"
Height="100" Width="100" Fill="Red"
RelativePanel.Below="BlueRect"
RelativePanel.AlignHorizontalCenterWith="BlueRect" />
</RelativePanel>
Relative Panel
• 타 Element를 기준으로 상대적 위치, 정렬 설정
• AttachedProperty로 설정됨
14:30:38
RelativePanel
• 적응형 UI 구현 최적
• 보통 Visual State와 동시 사용됨
<RelativePanel>
<Rectangle x:Name="BlueRect" Fill="Blue" />
<Rectangle x:Name="RedRect" RelativePanel.Below="BlueRect" />
</RelativePanel>
정렬
AlignBottomWith
AlignHorizontalCenterWith
AlignLeftWith
AlignRightWith
AlignTopWith
AlignVerticalCenterWith
(패널로부터의)정렬
AlignBottomWithPanel
AlignHorizontalCenterWithPanel
AlignLeftWithPanel
AlignRightWithPanel
AlignTopWithPanel
AlignVerticalCenterWithPanel
위치
Above
Below
LeftOf
RightOf
14:30:38
예)
14:30:38
Demo
• RelativePanel
4:45
14:30:38
SplitView
14:30:38
SplitView
• IsPaneOpen : True/False
• DisplayMode : Inline/Overlay/CompactInline/CompactOverlay
IsPaneOpen="True" IsPaneOpen="False"
DisplayMode=
"Inline"
DisplayMode=
"Overlay"
DisplayMode=
"CompactInline"
DisplayMode=
"CompactOverlay"
14:30:39
Demo
• SplitView
4:50
14:30:39
Adaptive UI
14:30:39
Adaptive UI
• Visual States
• XAML 정의
• 블랜드를 통해서 정의 가능
• 복잡하게 정의된 효과를 단순하게 선언하여 사용
• 에니메이션, 객체상태…
14:30:39
VisualState 상태 전환 방법
• VisualStateManager.Goto(element, state, transition)
private void Page_SizeChanged(object sender, SizeChangedEventArgs
e)
{
var state = string.Empty;
if (e.NewSize.Width > 361)
state = "MinWidth360";
else
state = "MinWidth000";
VisualStateManager.GoToState(this, state, true);
}
14:30:39
Demo
• VisuaState
14:30:39
Adaptive triggers
• 코드없이 XAML에서 설정만으로 상태전환 가능
• 제공되는 기본 트리거
• MinWindowHeight (Taller than this)
• MinWindowWidth (Wider than this)
<VisualState x:Name="VisualState500min">
<VisualState.StateTriggers>
<AdaptiveTrigger MinWindowWidth="501" />
</VisualState.StateTriggers>
</VisualState>
14:30:39
Demo
• Adaptive triggers
5:00
14:30:39
XAML 성능
• phase rendering
• deferred loading
14:30:39
X:Phase rendering
• 기본값 0
• 작은 값->큰값 순서로 랜더링 수행
• 값이 연속적일 필요는 없음
<DataTemplate x:DataType="model:Monster">
<Grid Width="200" Height="80">
<TextBlock Text="{x:Bind Name}" />
<TextBlock Text="{x:Bind StarSign}" x:Phase="1"/>
</Grid>
</DataTemplate>
14:30:39
deferred loading
• 초기 로드되는 요소 최소화
• 요소가 요구되기 전까지는 loading 되지 않는다
• 요소가 요구되는 상황
1. FindName()
2. GetTemplatedChild() (ControlTemplate 일경우)
3. Storyboard & VisualStates (내부적으로 FindName호출함)
<StackPanel x:Name="AdditionalProductPage" x:DeferLoadStrategy="Lazy">
<!– your lovely XAML goes here-->
</StackPanel>
14:30:39
Demo
• phase rendering
• deferred loading
5:05
14:30:39
2 Tool
• 비주얼 스튜디오 2015 의 새로운 기능
• 진단도구
• 중단점
• 직접실행창 : LINQ
• peek view
• 라이브 시각적 트리
• 라이브 속성 탐색기
14:30:39
Demo
• 진단도구
• 중단점
• 직접실행창 : LINQ
• peek view
• 라이브 시각적 트리
• 라이브 속성 탐색기
5:20
14:30:39
3 Databinding
• XAML Databinding
• 기존 바인딩
• Classic Binding
• {binding}
• 컴파일된 바인딩
• Compiled Binding
• {x:bind}
5:20
14:30:39
예) 정적 데이터 바인딩
바인딩 표현식 {StaticResource ….}
<Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}">
<TextBlock Text="나이 : " />
<TextBlock Text="성 : " />
<TextBlock Text="이름 : " />
<TextBlock Text="여성 : " />
…
14:30:39
예) 동적 데이터 바인딩
• 바인딩 표현식 {Binding ….}
• DataContext 설정 필요
<Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}">
<TextBox Text="{Binding PersonInfo.Age}" />
<TextBox Text="{Binding PersonInfo.LastName}" />
<TextBox Text="{Binding PersonInfo.FirstName}" />
<CheckBox IsChecked="{Binding PersonInfo.IsFemale}" />
…
14:30:39
<Page>
<Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}">
<TextBox Text="{Binding PersonInfo.FirstName}" />
…
Classic Binding
• DataContext : 바인딩 대상
• DataContext의 PersonInfo의 FirstName 속성을 찾음
• DataContext 검색
• 자신의 DataContext 우선 적용
• 자신의 DataContext가 null이면
• Tree 구조상 자신 -> 최상위까지 차례대로 탐색
14:30:39
Classic Binding
• 장점
• DataContext의 형식이 특정되지 않아도 됨
• 사용이 용이
• 다양하고 유연하게 코드적용가능
• 단점
• 런타임시 타입검사필요->성능이슈
• 디버깅의 어려움
ID
FirstName
LastName
Age
Btype Class
Address
Phone Number
Company
FirstName
Atype Class
Address
Phone Number
Company
Ctype Class
<Page>
<Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}">
<TextBox Text="{Binding FirstName}" />
…
(object)
DataContext
14:30:39
바인딩 표현식 #1
<TextBox Text="{Binding
Converter
ConverterLanguage
ConverterParameter
ElementName
FallbackValue
Mode
Path
RelativeSource
Source
TargetNullValue
UpdateSourceTrigger"}
Converter : 컨버터
ElementName : 요소 바인딩
FallbackValue : 기본값(바인딩이 유효하지 않을 때)
TargetNullValue : 기본값(대상 값이 null일 때)
UpdateSourceTrigger : 소스 반영시점
<TextBox Text="{Binding FirstName}" />
=>
<TextBox Text="{Binding Path=FirstName}" />
14:30:39
Demo
• Classic binding
• FallbackValue
• TargetNullValue
• UpdateSourceTrigger
5:35
14:30:39
컴파일 바인딩
• Compiled binding, {x:Bind}, {Binding ….}
• 기존 바인딩 단점
• 런타임시 부하 발생
• 바인딩식 디버깅 어려움
• 바인딩식 컴파일시에 검증 불가능
• 바인딩 대상의 형(Type) 명시 할 수 있다면
• 기존 바인딩 단점 보완 가능
• 런타임시 부하는 적음
• 변환된 코드는 디버깅 가능
• 바인딩식은 컴파일타임에 즉시 검증됨
• 바인딩 선언은 코드로 자동 변환된 후 컴파일 됨
• 기존의 기능과 편리함을 유지 & 성능 향상
14:30:39
컴파일 바인딩
• 바인딩 대상
• DataContext,
• 해당 페이지의 멤버만 바인딩 가능
14:30:39
컴파일 바인딩
<Page x:Class="Demo_Databinding.View.ClassicBindingPage1">
<Grid Background="{StaticResource>
<TextBox Text="{x:Bind sViewModel.PersonInfo.Age}" />
<TextBox Text="{x:Bind sViewModel.PersonInfo.LastName}" />
<TextBox Text="{x:Bind sViewModel.PersonInfo.FirstName}" />
<CheckBox IsChecked="{x:Bind sViewModel.PersonInfo.IsFemale}" />
…
public sealed partial class CompiledBindingPage : Page
{
public SampleViewModel sViewModel { get; set; }
public CompiledBindingPage()
{
this.InitializeComponent();
sViewModel = new SampleViewModel();
}
}
14:30:39
바인딩 표현식 #2
<TextBox Text="{Binding
Converter
ConverterLanguage
ConverterParameter
ElementName
FallbackValue
Mode
Path
RelativeSource
Source
TargetNullValue
UpdateSourceTrigger"}
<TextBox Text="{x:Bind
Converter
ConverterLanguage
ConverterParameter
ElementName
FallbackValue
Mode
Path
RelativeSource
Source
TargetNullValue
UpdateSourceTrigger"}
14:30:39
Demo
• Compiled binding
5:45
14:30:39
컴파일 바인딩
• Data Templates
<ListView ItemsSource="{x:Bind ViewModel.Employees}">
<ListView.ItemTemplate>
<DataTemplate x:DataType="model:Employee">
<TextBlock Text="{x:Bind Name}"/>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
14:30:40
컴파일 바인딩
• 이벤트 바인딩
<Button Click="btnSelectEmployee_Click">사원 정보 선택</Button>
<Button Click="{x:Bind Select}">사원 정보 선택</Button>
14:30:40
컴파일 바인딩
• 이벤트 바인딩
• 적용 가능한 함수 시그니처
• void Select()
• void Select(object sender, RoutedEventArgs e)
• void Select(object sender, object e)
• 오버로딩은 지원되지 않는다->하나의 메서드만 존재해야 함
• 모든 이벤트에 적용 가능함
• ICommand & EventToCommand 대신 사용 가능함
• 인자 전달, CanExecute와 같은 기능은 포함하지 않음
<Button Click="{x:Bind Select}">사원 정보 선택</Button>
<Button Click="{x:Bind EmplyeeUtil.Select}">사원 정보 선택</Button>
14:30:40
컴파일 바인딩
• 바인딩은 컴파일시에 검증된다
• Strongly-typed 바인딩
• 리플렉션을 사용하지 않는다
• 페이지 자신의 멤버를 바인딩
• DataContext와는 무관함
• 기본 모드는 OneTime
• Classic Binding에서는 OneWay가 기본 모드임
• 기존의 OneWay, TwoWay 모드도 가능함
• 기타 표준 바인딩 원리 준수
• INotifyPropertyChanged
• INotifyCollectionChanged
• IObservableVector
14:30:40
컴파일 바인딩 : 고려할 점
• MVVM에서 적용?
• View와 ViewModel과의 coupling 문제
• View 수준에서 ViewModel을 멤버로 가지고 있어야 함
• JSON객체 혹은 untyped object일 경우 사용불가
• Classic Binding을 사용
• 스타일에서의 사용
• {x:Bind}은 style에서 setters 로는 사용 불가
• {x:Bind}은 style에 정의된 DataTemplate 에서는 사용가능
14:30:40
{Binding} {x:Bind} 동시사용
• {Binding} {x:Bind} 를 동시에 C# 코드 구성사용 하게 구성
• DataContext와 특정멤버(ViewModel)를 같이 설정함
• XAML에서 {Binding}, {x:Bind}중 어느것을 사용하더라고 동작
public sealed partial class CompiledBindingPage : Page
{
public SampleViewModel sViewModel { get; set; }
public CompiledBindingPage()
{
this.InitializeComponent();
this.DataContextChanged += (s, e) =>
{
sViewModel = DataContext as SampleViewModel;
};
}
}
14:30:40
Session Summary
• XAML
• RelativePanel
• SplitView
• Tool
• 진단도구 : CPU, 메모리
• 직접실행창 : LINQ
• 라이브 시각적 트리, 속성 탐색기
• Databinding
• Classic Binding
• Compiled Binding
5:50
14:30:40
감사합니다.
• MSDN Forum http://aka.ms/msdnforum
• TechNet Forum http://aka.ms/technetforum
http://aka.ms/td2015_again
TechDays Korea 2015에서 놓치신 세션은
Microsoft 기술 동영상 커뮤니티 Channel 9에서
추후에 다시 보실 수 있습니다.

More Related Content

PPTX
Mongo db 최범균
PDF
Naver속도의, 속도에 의한, 속도를 위한 몽고DB (네이버 컨텐츠검색과 몽고DB) [Naver]
PPTX
mongodb와 mysql의 CRUD 연산의 성능 비교
PDF
Mongo db 활용 가이드 ch7
PDF
성공적인 게임 런칭을 위한 비밀의 레시피 #3
PPTX
엔지니어 관점에서 바라본 데이터시각화
PDF
Big data analysis with R and Apache Tajo (in Korean)
PDF
Event source 학습 내용 공유
Mongo db 최범균
Naver속도의, 속도에 의한, 속도를 위한 몽고DB (네이버 컨텐츠검색과 몽고DB) [Naver]
mongodb와 mysql의 CRUD 연산의 성능 비교
Mongo db 활용 가이드 ch7
성공적인 게임 런칭을 위한 비밀의 레시피 #3
엔지니어 관점에서 바라본 데이터시각화
Big data analysis with R and Apache Tajo (in Korean)
Event source 학습 내용 공유

What's hot (20)

PDF
[Pgday.Seoul 2019] Advanced FDW
PDF
[110730/아꿈사발표자료] mongo db 완벽 가이드 : 7장 '고급기능'
PPTX
Mongo DB 성능최적화 전략
PPTX
Vectorized processing in_a_nutshell_DeView2014
PPTX
Logstash, ElasticSearch, Kibana
PDF
Elastic stack
PDF
Data analysis with Tajo
PPTX
대용량 분산 아키텍쳐 설계 #5. rest
PDF
실시간 빅 데이터 기술 현황 및 Daum 활용 사례 소개 (2013)
PDF
Memcached의 확장성 개선
PDF
Elastic Stack & Data pipeline (1장)
PDF
[246] foursquare데이터라이프사이클 설현준
PDF
Mongodb 특징 분석
PPTX
Bigquery와 airflow를 이용한 데이터 분석 시스템 구축 v1 나무기술(주) 최유석 20170912
PDF
Elastic Search (엘라스틱서치) 입문
PPTX
Mongo DB 완벽가이드 - 4장 쿼리하기
PDF
Expanding Your Data Warehouse with Tajo
PDF
대용량 로그분석 Bigquery로 간단히 사용하기 (20170215 T아카데미)
PDF
[스마트스터디]MongoDB 의 역습
PDF
[235]루빅스개발이야기 황지수
[Pgday.Seoul 2019] Advanced FDW
[110730/아꿈사발표자료] mongo db 완벽 가이드 : 7장 '고급기능'
Mongo DB 성능최적화 전략
Vectorized processing in_a_nutshell_DeView2014
Logstash, ElasticSearch, Kibana
Elastic stack
Data analysis with Tajo
대용량 분산 아키텍쳐 설계 #5. rest
실시간 빅 데이터 기술 현황 및 Daum 활용 사례 소개 (2013)
Memcached의 확장성 개선
Elastic Stack & Data pipeline (1장)
[246] foursquare데이터라이프사이클 설현준
Mongodb 특징 분석
Bigquery와 airflow를 이용한 데이터 분석 시스템 구축 v1 나무기술(주) 최유석 20170912
Elastic Search (엘라스틱서치) 입문
Mongo DB 완벽가이드 - 4장 쿼리하기
Expanding Your Data Warehouse with Tajo
대용량 로그분석 Bigquery로 간단히 사용하기 (20170215 T아카데미)
[스마트스터디]MongoDB 의 역습
[235]루빅스개발이야기 황지수
Ad

Viewers also liked (9)

PDF
[Td 2015]windows, linux, mac 신경 안 쓴다. .net 2015와 더더 좋아지는 c# 살짝 훔쳐보기(김명신)
PDF
[C++ Korea] Effective Modern C++ Study item14 16 +신촌
PDF
덤프 파일을 통한 사후 디버깅 실용 테크닉 NDC2012
PDF
[Td 2015]녹슨 c++ 코드에 모던 c++로 기름칠하기(옥찬호)
PDF
Boost 라이브리와 C++11
PDF
코드 생성을 사용해 개발 속도 높이기 NDC2011
PDF
자동화된 소스 분석, 처리, 검증을 통한 소스의 불필요한 #if - #endif 제거하기 NDC2012
PDF
[Td 2015]디버깅, 어디까지 해봤니 당신이 아마도 몰랐을 디버깅 꿀팁 공개(김희준)
PDF
Modern C++ 프로그래머를 위한 CPP11/14 핵심
[Td 2015]windows, linux, mac 신경 안 쓴다. .net 2015와 더더 좋아지는 c# 살짝 훔쳐보기(김명신)
[C++ Korea] Effective Modern C++ Study item14 16 +신촌
덤프 파일을 통한 사후 디버깅 실용 테크닉 NDC2012
[Td 2015]녹슨 c++ 코드에 모던 c++로 기름칠하기(옥찬호)
Boost 라이브리와 C++11
코드 생성을 사용해 개발 속도 높이기 NDC2011
자동화된 소스 분석, 처리, 검증을 통한 소스의 불필요한 #if - #endif 제거하기 NDC2012
[Td 2015]디버깅, 어디까지 해봤니 당신이 아마도 몰랐을 디버깅 꿀팁 공개(김희준)
Modern C++ 프로그래머를 위한 CPP11/14 핵심
Ad

Similar to [Td 2015]틱틱대도 써야 하는 windows 10 앱 개발, c# tips &amp; tricks(송기수) (20)

PDF
20150912 windows 10 앱 tips tricks
PPTX
2013 JCO tipJS.com JavaScript MVC framework
PDF
웹개발자가 알아야할 기술
PDF
다음 통합검색 로딩 속도 개선 삽질기
PDF
GoF_(Gang of Four)_디자인_패턴_20241115서만원.pdf
PPTX
Webframeworks angular js 세미나
PDF
제 19회 보아즈(BOAZ) 빅데이터 컨퍼런스 - [백발백준] : 백준봇 : 컨테이너 오케스트레이션 기반 백준 문제 추천 봇
PDF
02.실행환경 실습교재(데이터처리)
PPTX
Nexacro
PDF
Ji 개발 리뷰 (신림프로그래머)
PDF
Javascript 조금 더 잘 알기
PPTX
Hacosa js study 4주차
PPTX
5-4. html5 offline and storage
PDF
Ksug2015 jpa5 스프링과jpa
PDF
Mongo db 시작하기
PDF
C++에서 Objective-C까지
PDF
[D2 오픈세미나]3.web view hybridapp
PPTX
딥러닝(Deep Learing) using DeepDetect
PDF
How to evaluate accessibility with automatic
PDF
자바스크립트 프레임워크 살펴보기
20150912 windows 10 앱 tips tricks
2013 JCO tipJS.com JavaScript MVC framework
웹개발자가 알아야할 기술
다음 통합검색 로딩 속도 개선 삽질기
GoF_(Gang of Four)_디자인_패턴_20241115서만원.pdf
Webframeworks angular js 세미나
제 19회 보아즈(BOAZ) 빅데이터 컨퍼런스 - [백발백준] : 백준봇 : 컨테이너 오케스트레이션 기반 백준 문제 추천 봇
02.실행환경 실습교재(데이터처리)
Nexacro
Ji 개발 리뷰 (신림프로그래머)
Javascript 조금 더 잘 알기
Hacosa js study 4주차
5-4. html5 offline and storage
Ksug2015 jpa5 스프링과jpa
Mongo db 시작하기
C++에서 Objective-C까지
[D2 오픈세미나]3.web view hybridapp
딥러닝(Deep Learing) using DeepDetect
How to evaluate accessibility with automatic
자바스크립트 프레임워크 살펴보기

More from Sang Don Kim (20)

PDF
[Td 2015] 국내에서 처음으로 선보이는 microsoft 차세대 서버 운영 체제 windows server 2016
PDF
[TD 2015] windows server에서 만나보는 docker와 windows container(최한홍)
PDF
[TD 2015] Microsoft Azure IaaS v2(최정현)
PDF
[TD2015] 이 시대에 소규모 게임 개발팀이 마소와 함께 살아가는 방법(송용성)
PDF
[Td 2015]두근두근 asp.net 5(한상훈)
PDF
[Td 2015]windows 10 엔터프라이즈 시나리오 part II 보안 및 관리(권순만)
PDF
[Td 2015]windows 10 엔터프라이즈 시나리오 part I 배포 및 이미징(박성기)
PDF
[Td 2015]함께하면 더 좋은 windows 10과 인텔 스카이레이크, 아키텍쳐와 인텔 그래픽스 최적화 살펴보기(하태동)
PDF
[Td 2015]프로그래밍 언어의 f1머신 c++을 타고 windows 10 uwp 앱 개발의 세계로~(유영천)
PDF
[Td 2015]치즈케이크 팩토리는 알겠는데, 데이터 팩토리는 뭔가요(한기환)
PDF
[Td 2015]조막만한 화면에서 대박만한 화면까지. 고생 끝 적응(adaptive ui) 시작(권영철)
PDF
[Td 2015]알아두면 핵 이득! vc++로 안드로이드 개발하기(김성엽)
PDF
[Td 2015]박애주의 office 365, 멀티플랫폼과 사랑에 빠지다(최한홍)
PDF
[Td 2015]맨땅에 헤딩하고 터득한 스토어 공략법(돈벌기)(육주용)
PDF
[Td 2015]라즈베리파이에 windows 10 io t core 맛있게 발라 먹기(유정현)
PDF
[Td 2015]너에게만 나는 반응해 반응형 응용프로그램(이규원)
PDF
[Td 2015]구름 위로 올려 어느 곳에서든 연결되는 서비스 azure 앱 서비스(이종인)
PDF
[Td 2015]각이 다른 mvc6! 그 여섯 번째 이야기!(최지훈)
PDF
[Td 2015]개발하기 바쁜데 푸시서버와 메시지큐는 있는거 쓸래요(김영재)
PDF
[Td 2015]python을 azure에서 사용하는법(배권한)
[Td 2015] 국내에서 처음으로 선보이는 microsoft 차세대 서버 운영 체제 windows server 2016
[TD 2015] windows server에서 만나보는 docker와 windows container(최한홍)
[TD 2015] Microsoft Azure IaaS v2(최정현)
[TD2015] 이 시대에 소규모 게임 개발팀이 마소와 함께 살아가는 방법(송용성)
[Td 2015]두근두근 asp.net 5(한상훈)
[Td 2015]windows 10 엔터프라이즈 시나리오 part II 보안 및 관리(권순만)
[Td 2015]windows 10 엔터프라이즈 시나리오 part I 배포 및 이미징(박성기)
[Td 2015]함께하면 더 좋은 windows 10과 인텔 스카이레이크, 아키텍쳐와 인텔 그래픽스 최적화 살펴보기(하태동)
[Td 2015]프로그래밍 언어의 f1머신 c++을 타고 windows 10 uwp 앱 개발의 세계로~(유영천)
[Td 2015]치즈케이크 팩토리는 알겠는데, 데이터 팩토리는 뭔가요(한기환)
[Td 2015]조막만한 화면에서 대박만한 화면까지. 고생 끝 적응(adaptive ui) 시작(권영철)
[Td 2015]알아두면 핵 이득! vc++로 안드로이드 개발하기(김성엽)
[Td 2015]박애주의 office 365, 멀티플랫폼과 사랑에 빠지다(최한홍)
[Td 2015]맨땅에 헤딩하고 터득한 스토어 공략법(돈벌기)(육주용)
[Td 2015]라즈베리파이에 windows 10 io t core 맛있게 발라 먹기(유정현)
[Td 2015]너에게만 나는 반응해 반응형 응용프로그램(이규원)
[Td 2015]구름 위로 올려 어느 곳에서든 연결되는 서비스 azure 앱 서비스(이종인)
[Td 2015]각이 다른 mvc6! 그 여섯 번째 이야기!(최지훈)
[Td 2015]개발하기 바쁜데 푸시서버와 메시지큐는 있는거 쓸래요(김영재)
[Td 2015]python을 azure에서 사용하는법(배권한)

[Td 2015]틱틱대도 써야 하는 windows 10 앱 개발, c# tips &amp; tricks(송기수)

  • 1. 송기수/ OpenSG 틱틱대도 써야 하는 Windows 10 앱 개발 C# Tips & Tricks.
  • 2. 오픈에스지 • OpenSG • 기술이사 • 본 사 : 충남 아산 • 연구소 : 서울 강남 • Solution, Consulting, SI and Education Service based on Microsoft .NET Technology • 제조 자동화 설비, 실시간 모니터링, UX 14:30:38
  • 3. Its all about UWP (UWP : Universal Windows Platform) 1. XAML 2. Tool 3. Databinding Agenda 14:30:38
  • 4. XAML • 새로운 컨트롤 • RelativePanel • SplitView • Adaptive UI • 예)계산기, 설정창 • View States • Adaptive triggers • XAML 성능 • phase rendering • deferred loading 14:30:38
  • 5. 상대적인 설정 값에 의해 자식 컨트롤을 배치 Relative Panel 레이아웃 컨트롤(Panel) Grid Stack Panel Canvas Scroll Viewer Border View Box Wrap Grid Relative Panel 14:30:38
  • 6. <RelativePanel> <Rectangle x:Name="BlueRect" Height="100" Width="200" Fill="Blue" /> <Rectangle x:Name="RedRect" Height="100" Width="100" Fill="Red" RelativePanel.Below="BlueRect" RelativePanel.AlignHorizontalCenterWith="BlueRect" /> </RelativePanel> Relative Panel • 타 Element를 기준으로 상대적 위치, 정렬 설정 • AttachedProperty로 설정됨 14:30:38
  • 7. RelativePanel • 적응형 UI 구현 최적 • 보통 Visual State와 동시 사용됨 <RelativePanel> <Rectangle x:Name="BlueRect" Fill="Blue" /> <Rectangle x:Name="RedRect" RelativePanel.Below="BlueRect" /> </RelativePanel> 정렬 AlignBottomWith AlignHorizontalCenterWith AlignLeftWith AlignRightWith AlignTopWith AlignVerticalCenterWith (패널로부터의)정렬 AlignBottomWithPanel AlignHorizontalCenterWithPanel AlignLeftWithPanel AlignRightWithPanel AlignTopWithPanel AlignVerticalCenterWithPanel 위치 Above Below LeftOf RightOf 14:30:38
  • 11. SplitView • IsPaneOpen : True/False • DisplayMode : Inline/Overlay/CompactInline/CompactOverlay IsPaneOpen="True" IsPaneOpen="False" DisplayMode= "Inline" DisplayMode= "Overlay" DisplayMode= "CompactInline" DisplayMode= "CompactOverlay" 14:30:39
  • 14. Adaptive UI • Visual States • XAML 정의 • 블랜드를 통해서 정의 가능 • 복잡하게 정의된 효과를 단순하게 선언하여 사용 • 에니메이션, 객체상태… 14:30:39
  • 15. VisualState 상태 전환 방법 • VisualStateManager.Goto(element, state, transition) private void Page_SizeChanged(object sender, SizeChangedEventArgs e) { var state = string.Empty; if (e.NewSize.Width > 361) state = "MinWidth360"; else state = "MinWidth000"; VisualStateManager.GoToState(this, state, true); } 14:30:39
  • 17. Adaptive triggers • 코드없이 XAML에서 설정만으로 상태전환 가능 • 제공되는 기본 트리거 • MinWindowHeight (Taller than this) • MinWindowWidth (Wider than this) <VisualState x:Name="VisualState500min"> <VisualState.StateTriggers> <AdaptiveTrigger MinWindowWidth="501" /> </VisualState.StateTriggers> </VisualState> 14:30:39
  • 19. XAML 성능 • phase rendering • deferred loading 14:30:39
  • 20. X:Phase rendering • 기본값 0 • 작은 값->큰값 순서로 랜더링 수행 • 값이 연속적일 필요는 없음 <DataTemplate x:DataType="model:Monster"> <Grid Width="200" Height="80"> <TextBlock Text="{x:Bind Name}" /> <TextBlock Text="{x:Bind StarSign}" x:Phase="1"/> </Grid> </DataTemplate> 14:30:39
  • 21. deferred loading • 초기 로드되는 요소 최소화 • 요소가 요구되기 전까지는 loading 되지 않는다 • 요소가 요구되는 상황 1. FindName() 2. GetTemplatedChild() (ControlTemplate 일경우) 3. Storyboard & VisualStates (내부적으로 FindName호출함) <StackPanel x:Name="AdditionalProductPage" x:DeferLoadStrategy="Lazy"> <!– your lovely XAML goes here--> </StackPanel> 14:30:39
  • 22. Demo • phase rendering • deferred loading 5:05 14:30:39
  • 23. 2 Tool • 비주얼 스튜디오 2015 의 새로운 기능 • 진단도구 • 중단점 • 직접실행창 : LINQ • peek view • 라이브 시각적 트리 • 라이브 속성 탐색기 14:30:39
  • 24. Demo • 진단도구 • 중단점 • 직접실행창 : LINQ • peek view • 라이브 시각적 트리 • 라이브 속성 탐색기 5:20 14:30:39
  • 25. 3 Databinding • XAML Databinding • 기존 바인딩 • Classic Binding • {binding} • 컴파일된 바인딩 • Compiled Binding • {x:bind} 5:20 14:30:39
  • 26. 예) 정적 데이터 바인딩 바인딩 표현식 {StaticResource ….} <Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}"> <TextBlock Text="나이 : " /> <TextBlock Text="성 : " /> <TextBlock Text="이름 : " /> <TextBlock Text="여성 : " /> … 14:30:39
  • 27. 예) 동적 데이터 바인딩 • 바인딩 표현식 {Binding ….} • DataContext 설정 필요 <Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}"> <TextBox Text="{Binding PersonInfo.Age}" /> <TextBox Text="{Binding PersonInfo.LastName}" /> <TextBox Text="{Binding PersonInfo.FirstName}" /> <CheckBox IsChecked="{Binding PersonInfo.IsFemale}" /> … 14:30:39
  • 28. <Page> <Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}"> <TextBox Text="{Binding PersonInfo.FirstName}" /> … Classic Binding • DataContext : 바인딩 대상 • DataContext의 PersonInfo의 FirstName 속성을 찾음 • DataContext 검색 • 자신의 DataContext 우선 적용 • 자신의 DataContext가 null이면 • Tree 구조상 자신 -> 최상위까지 차례대로 탐색 14:30:39
  • 29. Classic Binding • 장점 • DataContext의 형식이 특정되지 않아도 됨 • 사용이 용이 • 다양하고 유연하게 코드적용가능 • 단점 • 런타임시 타입검사필요->성능이슈 • 디버깅의 어려움 ID FirstName LastName Age Btype Class Address Phone Number Company FirstName Atype Class Address Phone Number Company Ctype Class <Page> <Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}"> <TextBox Text="{Binding FirstName}" /> … (object) DataContext 14:30:39
  • 30. 바인딩 표현식 #1 <TextBox Text="{Binding Converter ConverterLanguage ConverterParameter ElementName FallbackValue Mode Path RelativeSource Source TargetNullValue UpdateSourceTrigger"} Converter : 컨버터 ElementName : 요소 바인딩 FallbackValue : 기본값(바인딩이 유효하지 않을 때) TargetNullValue : 기본값(대상 값이 null일 때) UpdateSourceTrigger : 소스 반영시점 <TextBox Text="{Binding FirstName}" /> => <TextBox Text="{Binding Path=FirstName}" /> 14:30:39
  • 31. Demo • Classic binding • FallbackValue • TargetNullValue • UpdateSourceTrigger 5:35 14:30:39
  • 32. 컴파일 바인딩 • Compiled binding, {x:Bind}, {Binding ….} • 기존 바인딩 단점 • 런타임시 부하 발생 • 바인딩식 디버깅 어려움 • 바인딩식 컴파일시에 검증 불가능 • 바인딩 대상의 형(Type) 명시 할 수 있다면 • 기존 바인딩 단점 보완 가능 • 런타임시 부하는 적음 • 변환된 코드는 디버깅 가능 • 바인딩식은 컴파일타임에 즉시 검증됨 • 바인딩 선언은 코드로 자동 변환된 후 컴파일 됨 • 기존의 기능과 편리함을 유지 & 성능 향상 14:30:39
  • 33. 컴파일 바인딩 • 바인딩 대상 • DataContext, • 해당 페이지의 멤버만 바인딩 가능 14:30:39
  • 34. 컴파일 바인딩 <Page x:Class="Demo_Databinding.View.ClassicBindingPage1"> <Grid Background="{StaticResource> <TextBox Text="{x:Bind sViewModel.PersonInfo.Age}" /> <TextBox Text="{x:Bind sViewModel.PersonInfo.LastName}" /> <TextBox Text="{x:Bind sViewModel.PersonInfo.FirstName}" /> <CheckBox IsChecked="{x:Bind sViewModel.PersonInfo.IsFemale}" /> … public sealed partial class CompiledBindingPage : Page { public SampleViewModel sViewModel { get; set; } public CompiledBindingPage() { this.InitializeComponent(); sViewModel = new SampleViewModel(); } } 14:30:39
  • 35. 바인딩 표현식 #2 <TextBox Text="{Binding Converter ConverterLanguage ConverterParameter ElementName FallbackValue Mode Path RelativeSource Source TargetNullValue UpdateSourceTrigger"} <TextBox Text="{x:Bind Converter ConverterLanguage ConverterParameter ElementName FallbackValue Mode Path RelativeSource Source TargetNullValue UpdateSourceTrigger"} 14:30:39
  • 37. 컴파일 바인딩 • Data Templates <ListView ItemsSource="{x:Bind ViewModel.Employees}"> <ListView.ItemTemplate> <DataTemplate x:DataType="model:Employee"> <TextBlock Text="{x:Bind Name}"/> </DataTemplate> </ListView.ItemTemplate> </ListView> 14:30:40
  • 38. 컴파일 바인딩 • 이벤트 바인딩 <Button Click="btnSelectEmployee_Click">사원 정보 선택</Button> <Button Click="{x:Bind Select}">사원 정보 선택</Button> 14:30:40
  • 39. 컴파일 바인딩 • 이벤트 바인딩 • 적용 가능한 함수 시그니처 • void Select() • void Select(object sender, RoutedEventArgs e) • void Select(object sender, object e) • 오버로딩은 지원되지 않는다->하나의 메서드만 존재해야 함 • 모든 이벤트에 적용 가능함 • ICommand & EventToCommand 대신 사용 가능함 • 인자 전달, CanExecute와 같은 기능은 포함하지 않음 <Button Click="{x:Bind Select}">사원 정보 선택</Button> <Button Click="{x:Bind EmplyeeUtil.Select}">사원 정보 선택</Button> 14:30:40
  • 40. 컴파일 바인딩 • 바인딩은 컴파일시에 검증된다 • Strongly-typed 바인딩 • 리플렉션을 사용하지 않는다 • 페이지 자신의 멤버를 바인딩 • DataContext와는 무관함 • 기본 모드는 OneTime • Classic Binding에서는 OneWay가 기본 모드임 • 기존의 OneWay, TwoWay 모드도 가능함 • 기타 표준 바인딩 원리 준수 • INotifyPropertyChanged • INotifyCollectionChanged • IObservableVector 14:30:40
  • 41. 컴파일 바인딩 : 고려할 점 • MVVM에서 적용? • View와 ViewModel과의 coupling 문제 • View 수준에서 ViewModel을 멤버로 가지고 있어야 함 • JSON객체 혹은 untyped object일 경우 사용불가 • Classic Binding을 사용 • 스타일에서의 사용 • {x:Bind}은 style에서 setters 로는 사용 불가 • {x:Bind}은 style에 정의된 DataTemplate 에서는 사용가능 14:30:40
  • 42. {Binding} {x:Bind} 동시사용 • {Binding} {x:Bind} 를 동시에 C# 코드 구성사용 하게 구성 • DataContext와 특정멤버(ViewModel)를 같이 설정함 • XAML에서 {Binding}, {x:Bind}중 어느것을 사용하더라고 동작 public sealed partial class CompiledBindingPage : Page { public SampleViewModel sViewModel { get; set; } public CompiledBindingPage() { this.InitializeComponent(); this.DataContextChanged += (s, e) => { sViewModel = DataContext as SampleViewModel; }; } } 14:30:40
  • 43. Session Summary • XAML • RelativePanel • SplitView • Tool • 진단도구 : CPU, 메모리 • 직접실행창 : LINQ • 라이브 시각적 트리, 속성 탐색기 • Databinding • Classic Binding • Compiled Binding 5:50 14:30:40
  • 44. 감사합니다. • MSDN Forum http://aka.ms/msdnforum • TechNet Forum http://aka.ms/technetforum
  • 45. http://aka.ms/td2015_again TechDays Korea 2015에서 놓치신 세션은 Microsoft 기술 동영상 커뮤니티 Channel 9에서 추후에 다시 보실 수 있습니다.