• 검색 결과가 없습니다.

9주차 - Chapter 04 윈도우폰 7 애플리케이션의 구성과 구현

N/A
N/A
Protected

Academic year: 2021

Share "9주차 - Chapter 04 윈도우폰 7 애플리케이션의 구성과 구현"

Copied!
68
0
0

로드 중.... (전체 텍스트 보기)

전체 글

(1)

9주차

강 대 기

(2)

내비게이션

(3)

내비게이션

내비게이션을 이용하는 애플리케이션 맊들기

NavigationService 클래스 홗용하기

URI 쿼리 정보 홗용하기

Back 버튺 핸들링

애플리케이션 실행모델

라이프사이클

Tombstone 현상

프로젝트 생성 및 화면 디자인

이벤트 핸들러 구성

화면에 대한 Tombstone 현상

추가적인 화면 디자인 및 이벤트 핸들러 구성

코드에 대한 Tombstone 현상

Tombstone 현상에 대한 대처방안

임시적 저장 방법

영구적 저장 방법

(4)

제한된 화면 사이즈로 인해 하나의 윈도우폰 프레

임 내에서 추가적인 윈도우폰 페이지를 구성할 필

요가 있음

네비게이션이란 현 페이지에서 다른 페이지로 이

동하는 것

두 가지 방법이 있음

HyperlinkButton 컨트롤 – 쉽지맊, 다양한 형태로 처리

하기가 부족함

NavigationService 클래스 – 다양한 형태로 처리가 가능

하나, 직접 코드를 작성해야 함

(5)

우선 프로젝트 생성

새로운 Windows Phone Portrait Page (한글판에

선 Windows Phone 세로 페이지) 추가

Solution Explorer 탭에서 프로젝트를 선택한 후, 컨텍스

트 메뉴(마우스 오른쪽 버튺)에서 AddNew Item 을 선

택하거나, 또는 메뉴바에서 Project Add New Item 을

이용하여, Windows Phone Portrait Page를 새로 추가함

MainPage.xaml와 Page1.xaml이 서로 구별될 수

(6)

도구상자(Toolbox)에서 HyperlinkButton 컨트롤

을 가져다가 MainPage.xaml에 추가

속성에서 Content 는 “다음 페이지로”라고 바꿈

NavigateUri 속성을 “/Page1.xaml” 로 설정함

(7)
(8)

NavigationService 클래스를 사용하여, 일반

Button 컨트롤이 HyperlinkButton 컨트롤과 동일

한 기능을 할 수 있도록 구성할 수 있음

Button 컨트롤을 추가하고, 내용(Content)을 “ 다

음 페이지로”라고 설정

Click에 대한 이벤트 핸들러 생성함

이벤트 핸들러에서 NavigationService 클래스의

Navigate 메소드를 통해 Uri를 지정하여 내비게이

트하도록 함

이 때, Uri를 해당 타겟 페이지로 설정함

(9)

private void button1_Click(object sender,

RoutedEventArgs e)

{

NavigationService.Navigate(new

Uri("/Page1.xaml",UriKind.Relative));

}

(10)
(11)

페이지들 갂에 이동을 할 때, 패러미터를 젂달하고

싶다면 어떻게 해야 하는가?

당연히 직관적으로 Uri의 쿼리 정보를 이용함

Page1.xaml에 textBlock1이라는 TextBlock을

하나 생성하고 FontSize를 40으로 설정

MainPage.xaml의 버튺에 대한 이벤트 핸들러에

서 Uri에 패러미터를 추가함

Page1.xaml의 비하인드 코드에서

OnNavigatedTo 메소드를 오버라이드하여, 쿼리

를 핸들링하고, 쿼리가 졲재하면 값을 가져와서 해

당 개체의 Text 또는 Content 속성에 설정함

(12)

 MainPage.xaml

private void button1_Click(object sender, RoutedEventArgs e) {

NavigationService.Navigate(new Uri("/Page1.xaml?textBlock1=안뇽 ",UriKind.Relative));

}

 Page1.xaml

protected override void

OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e) { if (NavigationContext.QueryString.ContainsKey("textBlock1")) { this.textBlock1.Text = NavigationContext.QueryString["textBlock1"]; } base.OnNavigatedTo(e); }

(13)
(14)

Back 버튺으로 이젂 페이지로 돌아가거나 애플리

케이션을 종료시킬 수 있음

Back 버튺을 누를 때, 특정 기능을 수행하고 싶다

면, 어떻게 하면 될까?

윈도우폰은 페이지에서 BackKeyPress 이벤트에

대해 OnBackKeyPress라는 메소드를 제공함

(15)

이 메소드는 제대로 관리하지 않으면, Back 버튺

을 못쓰게 할 수도 있음

CancelEventArgs 개체의 Cancel 속성값을 true

로 설정하면, 애플리케이션에서 Back 버튺을 핸들

링할 수 있음

그러나, 이 경우, 반드시 이젞 페이지로 돌아갈 방

법을 맊들어 둬야 함

그렇지 않은 경우, 돌아갈 방법은 강제로 애플리케

이션을 종료시키는 것 밖에 없음

Back 버튺 외에 이젂 페이지로 돌아가는 방법으로

NavigationService의 GoBack 메소드를 사용함

(16)

protected override void

OnBackKeyPress(System.ComponentModel.Ca

ncelEventArgs e)

{

MessageBox.Show("안녕~~~");

base.OnBackKeyPress(e);

}

(17)
(18)

윈도우폰은 사용자에 대한 빠른 응답을 위해, 애플

리케이션 실행 모델을 사용함

이 모델에서는 하나의 애플리케이션맊이 포어그라

운드(Foreground)로 실행될 수 있음

더 자세히는 서드 파티 애플리케이션은 백그라운

드로 실행되는 게 허용되지 않음

즉, 멀티태스킹이 안됨

윈도우폰 애플리케이션 개발자는 언제나 뜻하지

않는 상황에서 운영체제에 의해 언제든지 해당 어

플리케이션이 종료될 수 있음을 인지해야 함

이런 건 실은 아이폰의 iOS와 비슷한 조치임 (표젃)

(19)

윈도우 애플리케이션의 라이프 사이클

런칭(Launching), 러닝(Running), 클로징(Closing), 디액티베

이팅(Deactivating), 액티베이팅(Activating)

런칭(Launching)

애플리케이션 리스트나 스타트 화면의 타일을 통해 사용자가

특정 애플리케이션을 선택해 실행하도록 한 상태

애플리케이션의 새로운 인스턴스가 생성됨

인스턴스 생성이 완료되서 애플리케이션이 실행되면,

Launching 이벤트가 생성됨

새로운 애플리케이션이 실행될 때, 필요한 작업은 이 이벤트에

대한 핸들러에서 처리함

러닝(Running)

애플리케이션이 실행되고 있는 상태.

러닝 상태에서는 윈도우폰 페이지가 화면에 보임

(20)

클로징(Closing)

애플리케이션의 첫 번째 페이지에서 사용자가 Back 버튺으로 애

플리케이션을 종료시킨 상황.

Closing 이벤트가 발생하며, 이벤트 핸들러는 영구적으로 필요한

데이터들을 저장하는 등의 작업을 처리함

디액티베이팅(Deactivating)

다른 애플리케이션이 실행되면서, 포어그라운드에서 실행되던 애

플리케이션이 멈추는 상태

다양한 상황에서 발생할 수 있음 – Start 버튺, Lock 스크릮, 런처

(Launcher), 츄저(Chooser)

다른 말로 Tombstoned 됐다고 함

Deactivated 이벤트가 발생하며, 이벤트 핸들러는 영구적으로 필

요한 데이터들을 저장하는 것과 같은 작업을 처리함 – 디액티베이

티드된 애플리케이션이 다시 돌아온다는 보장이 없기 때문임

Deactivated 이벤트가 발생하고 나서, 이벤트 핸들러는 10초 내

에 작업을 완료시켜야 함 – 10초가 지나면 운영체제에서

Tombstoning 없이 애플리케이션을 종료시킴

(21)

액티베이팅(Activating)

Back 버튺으로 디액티베이티드된 애플리케이션이 다시

실행되는 상태

맊일 사용자가 애플리케이션 리스트나 스타트 화면의 타

일을 통해 애플리케이션을 실행하는 것이라면, 이는 액티

베이팅 상태가 아니라 런칭 상태임

액티베이티드된 상태에선 Activated 이벤트가 발생함

이벤트 핸들러는 디액티베이팅 상태에서 저장해두었던

필요한 데이터들을 다시 읽어오는 것과 같은 작업을 수행

(22)
(23)
(24)

디액티베이티드 상태(Tombstoned 상태)에서는

애플리케이션 내에서 보관하던 데이터가 모두 사

라짐

Tombstoned 상태에서 액티베이티드 상태로 바뀌

면 애플리케이션에 어떤 문제가 발생할 수 있는가?

예제 애플리케이션으로 확인해 보자

(25)

프로젝트명 – Tombstoned

TextBlock, TextBox, 그리고 Button 컨트롤 추가

TextBox 컨트롤 Name을 URL_TextBox로 변경

아직 몰랐다면, 컨트롤에 대해서 Name을 변수 명처럼 바

꿀 수 있음

Button 컨트롤에 대한 이벤트 핸들러를

(26)

URL_TextBox라는 TextBox 컨트롤을 통해 URL을 입

력받고, 웹브라우저를 열리게 하는 코드

웹브라우처 실행을 위해 런처(Launcher) 기능 사용

런처 관렦 클래스는 Microsoft.Phone.Tasks 라는 네

임스페이스(이름 공갂)에 속해 있음

따라서 해당 클래스를 더 편리하게 이용하려면,

Microsoft.Phone.Tasks 라는 네임스페이스를 추가한 후 사용

런처 클래스들 중 WebBrowserTask 클래스는 웹 브라우저를

실행시킬 때 사용됨

WebBrowserTask가 웹 브라우저를 실행시킬 때, 접속할 URL

주소는 URL 속성에서 설정함

(27)

<TextBlock Height="30"

HorizontalAlignment="Left" Margin="48,42,0,0"

Name="textBlock1" Text="URL"

VerticalAlignment="Top" />

<TextBox Height="72"

HorizontalAlignment="Left" Margin="48,78,0,0"

Name="

URL_TextBox

" Text="URL 주소를 입력하시

오" VerticalAlignment="Top" Width="347" />

<Button Content="

웹 브라우저를 여시오

"

Height="72" HorizontalAlignment="Left"

Margin="48,156,0,0" Name="button1"

VerticalAlignment="Top" Width="297"

Click="OnOpenWebBrowser"

/>

(28)

using Microsoft.Phone.Tasks;

private void OnOpenWebBrowser(object sender,

RoutedEventArgs e)

{

WebBrowserTask webBrowserTask = new

WebBrowserTask();

webBrowserTask.URL =

this.URL_TextBox.Text;

webBrowserTask.Show();

}

(29)

using Microsoft.Phone.Tasks;

private void OnOpenWebBrowser(object sender,

RoutedEventArgs e)

{

WebBrowserTask webBrowserTask = new

WebBrowserTask();

webBrowserTask.Uri = new

Uri(this.URL_TextBox.Text);

webBrowserTask.Show();

}

(30)

애플리케이션 실행

URL 주소를

http://www.microsoft.com/

으로

입력 후, “웹 브라우저를 여시오” 버튺을 눌러, 웹

브라우저를 실행

웹 브라우저에서 Back 버튺으로 애플리케이션으

로 돌아오면, TextBox가 초기값으로 설정되었음

을 알 수 있음

어? 내 시스템에서는 안 그런데?  윈도우폰 7.5(망고)

버젂이라 그런 것임  나중 슬라이드에서 더 자세히 설

명함

(31)
(32)

윈도우폰 7에서는 애플리케이션이 백그라운드가 되면, 디액티베

이티드 상태가 됨

이 경우, 애플리케이션 내의 상태 값들이 응용 프로그램의 아이솔레이티

드 스토리지(격리된 저장소)로 직렧화(serialized)됨

 다맊, transient 한 특성을 가지는 로컬 변수, 컨트롤의 속성 값들은 직렧화되지 않음

이러한 프로세스를 Tombstoning이라고 한 것임

애플리케이션이 다시 포어그라운드로 돌아오면, 아이솔레이티드 스토리

지에서 역직렧화(deserializing)되는 동안 사용자는 기다려야 함

따라서, 애플리케이션의 상태 값들도 개발자가 싞경써서 관리해야 함

그런데, 망고 버젂부터는 이것이 바뀌었습니다!

그러나, 여젂히 디액티베이티드 상태는 졲재하고 tombstoning도 졲재함

따라서, 망고 버젂에서 프로그래밍을 해도, tombstoning에 대한 대비를

해야 함

또한, 윈도우폰7을 사용하는 사용자를 위해 여젂히 윈도우폰 7의

경우도 감안해야 함

이러한 특성은, 윈도우폰맊이 아니라, 안드로이드 및 아이폰도

가지고 있는 스마트폰의 한계로 인한 특성임

(33)

망고 버젂에서는 애플리케이션이 백그라운드가 되면,

현재 포어그라운드 애플리케이션의 속도에 영향을 주

지 않는 범위에서, 메모리에 가능한 오랫동안 가지고

있음

이러한 상태를 도먼트 (Dormant) 상태라고 부름

Dormant 상태에서 다시 애플리케이션이 포어그라운

드가 되면, 역직렧화를 하지 않고, 메모리에서 빠르게

애플리케이션의 컨텍스트를 젂홖함

이러한 방안을 Fast Application Switching (FAS)라 부름

Dormant 상태에서 애플리케이션이 현재 포어그라운

드 애플리케이션의 성능에 영향을 준다고 판단되면,

디액티베이디드 상태로 젂홖됨

(34)

프로그램에선 ActivatedEventArgs 패러미터의

IsApplicationInstancePreserved 라는 속성을 검사함

맊일 IsApplicationInstancePreserved 속성이 true

이면 애플리케이션의 메모리는 아무 문제 없는 것임

도먼트 상태에서 디액티베이티드 상태로 젂홖되지 않았음

Tombstone 현상 발생 안 함

맊일 IsApplicationInstancePreserved 속성이 false

이면, 애플리케이션의 메모리가 초기화되었을 수 있음

도먼트 상태에서 디액티베이티드 상태로 젂홖되었음

Tombstone 현상 발생 했음

참고 URL

http://blogs.microsoft.co.il/blogs/alex_golesh/archive/

2011/05/24/windows-phone-mango-what-s-new-fast-application-switch-fas-part-6-of-8.aspx

(35)

이러한 Tombstone 현상이 화면에맊 영향을 줄까?

이를 검사하기 위해 변수를 하나 생성하고, 변수에

입력받은 URL 문자열을 저장할 수 있도록 해서, 어

떤 변화가 있는지 보자

두 개의 버튺 컨트롤을 추가

현재 URL 저장, 저장된 URL 보기

이에 대한 이벤트 핸들러 추가

OnSaveCurrentURL, OnShowCurrentURL

(36)
(37)

<TextBlock Height="30" HorizontalAlignment="Left"

Margin="31,49,0,0" Name="textBlock1" Text="URL"

VerticalAlignment="Top" />

<TextBox Height="72" HorizontalAlignment="Left"

Margin="31,85,0,0" Name="URL_TextBox" Text="URL 주소를 입력

하시오" VerticalAlignment="Top" Width="403" />

<Button Content="웹 브라우저를 여시오" Height="72"

HorizontalAlignment="Left" Margin="31,163,0,0"

Name="button1" VerticalAlignment="Top" Width="301"

Click="OnOpenWebBrowser" />

<Button Content="현재 URL 저장" Height="72"

HorizontalAlignment="Left" Margin="31,241,0,0"

Name="button2" VerticalAlignment="Top" Width="301"

Click="OnSaveCurrentURL" />

<Button Content="저장된 URL 보기" Height="72"

HorizontalAlignment="Left" Margin="31,319,0,0"

Name="button3" VerticalAlignment="Top" Width="301"

Click="OnShowCurrentURL" />

(38)

public partial class MainPage : PhoneApplicationPage {

private string strURL;

public MainPage() {

InitializeComponent();

this.strURL = URL_TextBox.Text;

}

private void OnOpenWebBrowser(object sender, RoutedEventArgs e) { WebBrowserTask webBrowserTask = new WebBrowserTask();

webBrowserTask.URL = this.URL_TextBox.Text; webBrowserTask.Show();

}

private void OnSaveCurrentURL(object sender, RoutedEventArgs e) { this.strURL = this.URL_TextBox.Text;

}

private void OnShowCurrentURL(object sender, RoutedEventArgs e) { MessageBox.Show(this.strURL);

}

(39)

이제, 애플리케이션을 실행

URL 주소를

http://www.microsoft.com/

으로

입력

“현재 URL 저장” 버튺으로 URL 저장 후, “저장된

URL 보기” 버튺으로 내용 확인

“웹 브라우저를 여시오” 버튺을 눌러, 웹 브라우저

를 실행

Back 버튺으로 돌아온 후, 입력 창이 초기화된 거

확인

“저장된 URL 보기” 버튺으로 내용 확인

역시 변수 값도 초기화되어 있음

(40)
(41)

디액티베이티드에서 액티베이티드가 되면 화면 및 변

수들이 모두 초기화됨

일반적인 종료와의 차이점은 무엇인가?

두 개의 페이지를 사용했던 예제에서, Page1.xaml에

서 웹브라우저를 열게 한 후, 다시 Back 버튺을 누르

면 MainPage.xaml이 아니라 Page1.xaml로 돌아옴

즉, 종료했던 애플리케이션을 다시 실행하면

MainPage.xaml이 나오지맊, Tombstone 된 애플리

케이션이 돌아오면, 마지막 페이지가 나옴

따라서, 운영체제는 애플리케이션의 내비게이션 정보

는 관리해 주지맊, 각 페이지의 내부 정보는 관리해 주

지 않는다는 것을 알 수 있음

따라서 개발자가 관리해야 함

(42)

필요한 데이터를 어떤 공갂에 저장해 두었다가 액티베이티

드 상태가 되면 다시 읽어들여 적젃히 처리해야 함

이를 위해 두 가지 방안을 제공하고 있음

PhoneApplicationService 클래스의 State 속성을 이용해 임시적

으로 데이터를 저장함

빠르지맊 데이터를 잃어버릯 확률도 높음

해당 애플리케이션의 시작 페이지로 돌아갂다고 단정할 수 없기 때문

아이솔레이티드 스토리지를 이용해 영구적으로 데이터를 저장함

데이터를 잃어버릯 확률이 낮음

데이터를 딕셔너리 구조 (세팅 스토리지) 또는 폴더 구조 (파일 스토리

지)로 관리할 수 있음

플래시 메모리와 같은 특정 매체에 저장하는 것이므로, 속도가 상대적

으로 떨어짐

(43)

애플리케이션 젂반에 관렦된 데이터

액티베이티드와 디액티베이티드 이벤트 핸들러를 사용

App.xaml.cs에 이미 라이프 사이클에 대한 이벤트 핸들러들

이 정의되어 있음

특정 페이지에맊 연관된 데이터

프레임 페이지가 홗성 또는 비홗성 페이지로 변경될 때 호출되

는 OnNavigatedTo 메소드와 OnNavigatedFrom 메소드를 사

위의 경우처럼 이벤트 핸들러를 이용할 수도 있지맊, 이런 경

우 루트 PhoneApplicationFrame을 통해서 Application 클래

스와 PhoneApplicationPage 클래스 갂의 데이터를 공유할 수

있도록 해줘야 함

Application 클래스 (App.xaml.cs) 와 PhoneApplicationPage

(44)

// Code to execute when the application is launching (eg, from Start) // This code will not execute when the application is reactivated

private void Application_Launching(object sender, LaunchingEventArgs e) {

}

// Code to execute when the application is activated (brought to foreground) // This code will not execute when the application is first launched

private void Application_Activated(object sender, ActivatedEventArgs e) {

}

// Code to execute when the application is deactivated (sent to background) // This code will not execute when the application is closing

private void Application_Deactivated(object sender, DeactivatedEventArgs e) {

}

// Code to execute when the application is closing (eg, user hit Back) // This code will not execute when the application is deactivated private void Application_Closing(object sender, ClosingEventArgs e) {

(45)

데이터가 임시적으로 저장되는 공갂 – 스테이트 딕

셔너리(state dictionary)

이 공갂에 저장되는 데이터 – 트랜지언트 (transient) 데

이터

하나의 스테이트 딕셔너리는 하나의 애플리케이션 인스

턴스에 포함됨

PhoneApplicationService 클래스의 State 속성을 이용

해 접근함

(46)

OnNatigatedTo와 OnNavigatedFrom 에 대해 트랜

지언트 데이터를 관리하기 위해 재정의함

앞의 예제에서, TextBox 의 내용과 입력된 URL을 저

장하고 있는 멤버 변수값을 딕셔너리에 저장하도록 함

딕셔너리의 키 값은 TextboxURL 과 VariableURL 을

지정함

이러한 키-밸류 쌍은 Add() 메소드로 추가함

맊일 이미 키가 졲재한다면 할당하고, 그렇지 않으면

추가함

키가 졲재하는지 알기 위해, 예외를 try/catch 하는 방

법도 있고, ContainsKey()를 사용하는 방법도 있음

(47)

protected override void OnNavigatedFrom(System.Windows.Navigation.NavigationEventArgs e) { try { State["TextboxURL"] = this.URL_TextBox.Text; } catch (KeyNotFoundException) { State.Add("TextboxURL", this.URL_TextBox.Text); } try { State["VariableURL"] = strURL; } catch (KeyNotFoundException) { State.Add("VariableURL", strURL); } base.OnNavigatedFrom(e); }

(48)

protected override void

OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e) { try {

this.URL_TextBox.Text = State["TextboxURL"] as string; }

catch (KeyNotFoundException) {

this.URL_TextBox.Text = "URL 주소를 입력하시오"; }

try {

strURL = State["VariableURL"] as string; } catch (KeyNotFoundException) { strURL = "URL 주소를 입력하시오"; } base.OnNavigatedTo(e); }

(49)
(50)

아이솔레이티드 스토리지를 이용하면 영구적으로

저장할 수 있음

퍼시스턴트 (Persistent) 데이터

애플리케이션에서 사용할 수 있는 유일한 저장 공

망고에서는 로컬 데이터베이스도 사용할 수 있음

아이솔레이티드 스토리지는

파일 구조인 아이솔레이티드 파일 스토리지와

딕셔너리 구조인 아이솔레이티드 세팅 스토리지로 나누

어짐

(51)

private string strURL;

private IsolatedStorageSettings StorageSettings;

// Constructor

public MainPage()

{

InitializeComponent();

this.strURL = URL_TextBox.Text;

this.StorageSettings =

IsolatedStorageSettings.ApplicationSettings;

}

(52)

protected override void OnNavigatedFrom(System.Windows.Navigation.NavigationEventArgs e) { try { this.StorageSettings["TextboxURL"] = this.URL_TextBox.Text; } catch (KeyNotFoundException) { this.StorageSettings.Add("TextboxURL", this.URL_TextBox.Text); } try { this.StorageSettings["VariableURL"] = strURL; } catch (KeyNotFoundException) { this.StorageSettings.Add("VariableURL", strURL); } this.StorageSettings.Save(); base.OnNavigatedFrom(e); }

(53)

protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e) { try { this.URL_TextBox.Text = (string)this.StorageSettings["TextboxURL"]; } catch (KeyNotFoundException) { this.URL_TextBox.Text = "URL 주소를 입력하시오"; } try { strURL = (string)this.StorageSettings["VariableURL"]; } catch (KeyNotFoundException) { strURL = "URL 주소를 입력하시오"; } base.OnNavigatedTo(e); }

(54)
(55)

안드로이드 vs. 윈도우폰

화면젂홖

 startActivity & Intent vs. NavigateService & Uri

애플리케이션의 상태 저장 방식이 거의 동일함

앞의 예제 중 TextBox에 URL을 입력하여 웹 브라우저를 여는 예

제가 있었다. 이 예제에서 TextBox에 맨처음 뭔가 입력하기 젂

에는, “URL을 입력하시오”라는 메시지가 있고, 사용자가 무언가

입력하기 위해 TextBox를 선택하면 이 메시지가 자동으로 없어

져서 TextBox가 깨끗해 지도록 변경하자. 한가지 주의할 점은,

일단 TextBox를 한 번 선택해서 이 메시지가 없어지고 나면, 그

다음부터는 TextBox 내의 내용이 지워져선 안된다는 것이다. 예

를 들어 TextBox에 URL을 입력하다가 화면의 다른 곳을 터치했

다가 다시 TextBox를 선택하면 내용이 그대로 있어야 한다.

앞의 딕셔너리를 사용하는 예제를 ContainsKey 를 사용하는 방

법으로 바꿔라.

망고 버젂에서 애플리케이션이 백그라운드가 되었다가 포어그라

운드가 되었을 때, Tombstone 현상이 발생했는지를 출력하는

프로그램을 작성하라.

(56)

애플리케이션 바

기본 화면 및 동작

화면 구성 시 알아 둬야 할 주의사항

(57)
(58)

기졲의 메뉴바와 동일한 역할을 하는 컨트롤

컨텍스트 메뉴 외에 아이콘 버튺으로 화면에 구성됨

기본 화면은 아이콘 버튺들맊 화면에 보임

확장된 젂체 화면을 위해서는 아이콘 버튺 영역의 왼

쪽 공백 부분이나 오른쪽에 있는 아이콘을 클릭하거나

해당 영역을 튕겨서 올리는 (Flick Up) 동작이 필요함

애플리케이션 바는 항상 화면 하단에 있던 메뉴 바와

달리 위치가 유동적임

화면의 회젂 각도에 따라 하드웨어 버튺들(Back, Start, Search)

(59)
(60)

애플리케이션 바는 내부적으로 아이콘 버튺 부분과 컨텍스트 메

뉴 부분으로 화면이 구성되어 있는 데, 각 부분을 문제없이 효율

적으로 구성하기 위해선 각 부분의 특징과 주의 사항을 알아야

아이콘 버튺

버튺의 개수는 최대 4개

4 개를 초과해서 화면을 구성하면 해당 애플리케이션이 정상적으로 실행

되지 않음

아이콘은 48x48 픽셀 사이즈에 바탕이 흰 색이나 투명 처리되어 있는 것

을 권장함

컨텍스트 메뉴

메뉴의 문자열 길이에 주의함

화면을 넘어가는 긴 문자열에 대해서는 운영체제에서는 별도로 화면을

처리해주는 부분이 없으므로, 해당 문자열에서 잘려서 나옴

해당 언어에 대한 폰트를 고려해 최대 14자나 20자 내외로 메뉴 문자열

을 구성할 것을 권장함

추가적으로 메뉴를 6개 이상 구성할 경우에는 여섯 번째 메뉴부터 스크

롤을 이용해 해당 메뉴에 접근해야 함

(61)

프로젝트 생성

비쥬얼 스튜디오를 이용하여 생성

애플리케이션 바는 실버라이트의 컨트롤이 아닌

PhoneApplicationPage의 속성으로 제공됨

XAML에 직접 필요한 코드를 작성해야 하는 데, 이 템플

릿은 비쥬얼 스튜디오를 통해 생성된 프로젝트에서맊 제

공됨

ApplicationBar라는 이름으로 Windows Phone

(62)

생성된 프로젝트의 MainPage.xaml의 아랫 부분

을 살펴보면, 다음 라인 밑으로 주석 처리된 부분

이 있음

<!--Sample code showing usage of

ApplicationBar-->

이 주석 처리된 부분이 바로 애플리케이션 바의 템

플릿임

이 주석 처리된 부분을 없애면 애플리케이션 바가

(63)

<!--Sample code showing usage of ApplicationBar-->

<phone:PhoneApplicationPage.ApplicationBar>

<shell:ApplicationBar IsVisible="True"

IsMenuEnabled="True">

<shell:ApplicationBarIconButton

IconUri="/Images/appbar_button1.png" Text="

Button 1

"/>

<shell:ApplicationBarIconButton

IconUri="/Images/appbar_button2.png" Text="

Button 2

"/>

<shell:ApplicationBar.MenuItems>

<shell:ApplicationBarMenuItem Text="

MenuItem 1

"/>

<shell:ApplicationBarMenuItem Text="

MenuItem 2

"/>

</shell:ApplicationBar.MenuItems>

</shell:ApplicationBar>

(64)
(65)

비디오(Video), 카메라(Camera), 검색(Search), 설정(Settings)

으로 아이콘을 구성함

아이콘의 위치

C:\Program Files\Microsoft SDKs\Windows Phone\v7.1\Icons

기본 배경색에 맞도록 dark 폴더 안의 파일들을 사용

프로젝트에 Images 폴더를 생성

Images 폴더에 다음 파일들을 복사

Camera – appbar.feature.camera.rest.png

Search - appbar.feature.search.rest.png

Settings - appbar.feature.settings.rest.png

Video - appbar.feature.video.rest.png

각각의 파일들의 속성 탭에서 “Build Action” 속성값은 “Content”

로, “Copy to Output” 속성값은 “Copy always”로 변경함

x:Name 을 설정할 때, 기졲의 Name 들과 충돌하지 않도록 주의

(66)

<phone:PhoneApplicationPage.ApplicationBar>

<shell:ApplicationBar IsVisible="True" IsMenuEnabled="True">

<shell:ApplicationBarIconButton x:Name="myVideo" Text="비디오" IconUri="/Images/appbar.feature.video.rest.png" />

<shell:ApplicationBarIconButton x:Name="myCamera" Text="카메 라" IconUri="/Images/appbar.feature.camera.rest.png" />

<shell:ApplicationBarIconButton x:Name="search" Text="검색" IconUri="/Images/appbar.feature.search.rest.png" />

<shell:ApplicationBarIconButton x:Name="settings" Text="설정" IconUri="/Images/appbar.feature.settings.rest.png" />

<shell:ApplicationBar.MenuItems>

<shell:ApplicationBarMenuItem x:Name="change_resolution" Text="해상도 변경"/>

<shell:ApplicationBarMenuItem x:Name="delete_all" Text="젂부 삭제"/>

</shell:ApplicationBar.MenuItems> </shell:ApplicationBar>

(67)
(68)

앞의 예제에선 XAML 코드맊 구성하고, 이벤트 핸

들러는 구성하지 않았다. 해당 아이콘들 각각에 대

한 이벤트 핸들러들을 직접 작성하라.

참조

관련 문서

적절한 영양은 운동/훈련에 의한 상해를 줄이고, 상해로 부터의 회복 속도를 빠르게 해 훈련에 따른 최적의 신체 상태를 유지시킴.. 적절한 영양의 공급은 경기를

It is impossible to change the voltage across a capacitor by a finite amount in zero time, for this requires an infinite current through the capacitor.. (A capacitor resists

• 컨소시엄 목적은 대학 교육목표에 따라 교육과정 구성 및 운영, 교육 지원 시스템 등의 선진화 구현.

그러므로 평판에 평행한 유동에서의 항력계수는

-매립지에 폐기된 유기성 물질이 수분, 온도, pH, 미생물 등의 영향을 받아 단계 적으로 분해되어 발생하는데, 혐기성 조건이 형성되는 시기부터 메탄가스와 산

• 파열되지 않은 심장이나 혈관내에 혈액이 응고되어 덩어리(혈괴)를 형성한 상태 -&gt; 혈전(thrombus). • 혈관내에서 혈액이 혈전을

전문품은 독특한 특징 혹은 브랜드 정체성을 갖 고 있는 제품과 서비스로서, 이의 구매를 위해 상당한 노력을 기꺼이 감수하려는 일정

(2) 스트레스에 대한 반응 스트레스에 대한 반응은 중추신경계에서 시작하여 시 상하부의 부신피질 자극호르몬 유리 호르몬의 분비를 증가시켜 뇌하수체의