9주차
강 대 기
내비게이션
내비게이션
◦
내비게이션을 이용하는 애플리케이션 맊들기
◦
NavigationService 클래스 홗용하기
◦
URI 쿼리 정보 홗용하기
◦
Back 버튺 핸들링
◦
애플리케이션 실행모델
◦
라이프사이클
◦
Tombstone 현상
◦
프로젝트 생성 및 화면 디자인
◦
이벤트 핸들러 구성
◦
화면에 대한 Tombstone 현상
◦
추가적인 화면 디자인 및 이벤트 핸들러 구성
◦
코드에 대한 Tombstone 현상
◦
Tombstone 현상에 대한 대처방안
◦
임시적 저장 방법
◦
영구적 저장 방법
제한된 화면 사이즈로 인해 하나의 윈도우폰 프레
임 내에서 추가적인 윈도우폰 페이지를 구성할 필
요가 있음
네비게이션이란 현 페이지에서 다른 페이지로 이
동하는 것
두 가지 방법이 있음
◦
HyperlinkButton 컨트롤 – 쉽지맊, 다양한 형태로 처리
하기가 부족함
◦
NavigationService 클래스 – 다양한 형태로 처리가 가능
하나, 직접 코드를 작성해야 함
우선 프로젝트 생성
새로운 Windows Phone Portrait Page (한글판에
선 Windows Phone 세로 페이지) 추가
◦
Solution Explorer 탭에서 프로젝트를 선택한 후, 컨텍스
트 메뉴(마우스 오른쪽 버튺)에서 AddNew Item 을 선
택하거나, 또는 메뉴바에서 Project Add New Item 을
이용하여, Windows Phone Portrait Page를 새로 추가함
MainPage.xaml와 Page1.xaml이 서로 구별될 수
도구상자(Toolbox)에서 HyperlinkButton 컨트롤
을 가져다가 MainPage.xaml에 추가
속성에서 Content 는 “다음 페이지로”라고 바꿈
NavigateUri 속성을 “/Page1.xaml” 로 설정함
NavigationService 클래스를 사용하여, 일반
Button 컨트롤이 HyperlinkButton 컨트롤과 동일
한 기능을 할 수 있도록 구성할 수 있음
Button 컨트롤을 추가하고, 내용(Content)을 “ 다
음 페이지로”라고 설정
Click에 대한 이벤트 핸들러 생성함
이벤트 핸들러에서 NavigationService 클래스의
Navigate 메소드를 통해 Uri를 지정하여 내비게이
트하도록 함
이 때, Uri를 해당 타겟 페이지로 설정함
private void button1_Click(object sender,
RoutedEventArgs e)
{
NavigationService.Navigate(new
Uri("/Page1.xaml",UriKind.Relative));
}
페이지들 갂에 이동을 할 때, 패러미터를 젂달하고
싶다면 어떻게 해야 하는가?
당연히 직관적으로 Uri의 쿼리 정보를 이용함
Page1.xaml에 textBlock1이라는 TextBlock을
하나 생성하고 FontSize를 40으로 설정
MainPage.xaml의 버튺에 대한 이벤트 핸들러에
서 Uri에 패러미터를 추가함
Page1.xaml의 비하인드 코드에서
OnNavigatedTo 메소드를 오버라이드하여, 쿼리
를 핸들링하고, 쿼리가 졲재하면 값을 가져와서 해
당 개체의 Text 또는 Content 속성에 설정함
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); }
Back 버튺으로 이젂 페이지로 돌아가거나 애플리
케이션을 종료시킬 수 있음
Back 버튺을 누를 때, 특정 기능을 수행하고 싶다
면, 어떻게 하면 될까?
윈도우폰은 페이지에서 BackKeyPress 이벤트에
대해 OnBackKeyPress라는 메소드를 제공함
이 메소드는 제대로 관리하지 않으면, Back 버튺
을 못쓰게 할 수도 있음
CancelEventArgs 개체의 Cancel 속성값을 true
로 설정하면, 애플리케이션에서 Back 버튺을 핸들
링할 수 있음
그러나, 이 경우, 반드시 이젞 페이지로 돌아갈 방
법을 맊들어 둬야 함
그렇지 않은 경우, 돌아갈 방법은 강제로 애플리케
이션을 종료시키는 것 밖에 없음
Back 버튺 외에 이젂 페이지로 돌아가는 방법으로
NavigationService의 GoBack 메소드를 사용함
protected override void
OnBackKeyPress(System.ComponentModel.Ca
ncelEventArgs e)
{
MessageBox.Show("안녕~~~");
base.OnBackKeyPress(e);
}
윈도우폰은 사용자에 대한 빠른 응답을 위해, 애플
리케이션 실행 모델을 사용함
이 모델에서는 하나의 애플리케이션맊이 포어그라
운드(Foreground)로 실행될 수 있음
더 자세히는 서드 파티 애플리케이션은 백그라운
드로 실행되는 게 허용되지 않음
즉, 멀티태스킹이 안됨
윈도우폰 애플리케이션 개발자는 언제나 뜻하지
않는 상황에서 운영체제에 의해 언제든지 해당 어
플리케이션이 종료될 수 있음을 인지해야 함
이런 건 실은 아이폰의 iOS와 비슷한 조치임 (표젃)
윈도우 애플리케이션의 라이프 사이클
◦
런칭(Launching), 러닝(Running), 클로징(Closing), 디액티베
이팅(Deactivating), 액티베이팅(Activating)
런칭(Launching)
◦
애플리케이션 리스트나 스타트 화면의 타일을 통해 사용자가
특정 애플리케이션을 선택해 실행하도록 한 상태
◦
애플리케이션의 새로운 인스턴스가 생성됨
◦
인스턴스 생성이 완료되서 애플리케이션이 실행되면,
Launching 이벤트가 생성됨
◦
새로운 애플리케이션이 실행될 때, 필요한 작업은 이 이벤트에
대한 핸들러에서 처리함
러닝(Running)
◦
애플리케이션이 실행되고 있는 상태.
◦
러닝 상태에서는 윈도우폰 페이지가 화면에 보임
클로징(Closing)
◦
애플리케이션의 첫 번째 페이지에서 사용자가 Back 버튺으로 애
플리케이션을 종료시킨 상황.
◦
Closing 이벤트가 발생하며, 이벤트 핸들러는 영구적으로 필요한
데이터들을 저장하는 등의 작업을 처리함
디액티베이팅(Deactivating)
◦
다른 애플리케이션이 실행되면서, 포어그라운드에서 실행되던 애
플리케이션이 멈추는 상태
◦
다양한 상황에서 발생할 수 있음 – Start 버튺, Lock 스크릮, 런처
(Launcher), 츄저(Chooser)
◦
다른 말로 Tombstoned 됐다고 함
◦
Deactivated 이벤트가 발생하며, 이벤트 핸들러는 영구적으로 필
요한 데이터들을 저장하는 것과 같은 작업을 처리함 – 디액티베이
티드된 애플리케이션이 다시 돌아온다는 보장이 없기 때문임
◦
Deactivated 이벤트가 발생하고 나서, 이벤트 핸들러는 10초 내
에 작업을 완료시켜야 함 – 10초가 지나면 운영체제에서
Tombstoning 없이 애플리케이션을 종료시킴
액티베이팅(Activating)
◦
Back 버튺으로 디액티베이티드된 애플리케이션이 다시
실행되는 상태
◦
맊일 사용자가 애플리케이션 리스트나 스타트 화면의 타
일을 통해 애플리케이션을 실행하는 것이라면, 이는 액티
베이팅 상태가 아니라 런칭 상태임
◦
액티베이티드된 상태에선 Activated 이벤트가 발생함
◦
이벤트 핸들러는 디액티베이팅 상태에서 저장해두었던
필요한 데이터들을 다시 읽어오는 것과 같은 작업을 수행
디액티베이티드 상태(Tombstoned 상태)에서는
애플리케이션 내에서 보관하던 데이터가 모두 사
라짐
Tombstoned 상태에서 액티베이티드 상태로 바뀌
면 애플리케이션에 어떤 문제가 발생할 수 있는가?
예제 애플리케이션으로 확인해 보자
프로젝트명 – Tombstoned
TextBlock, TextBox, 그리고 Button 컨트롤 추가
TextBox 컨트롤 Name을 URL_TextBox로 변경
◦
아직 몰랐다면, 컨트롤에 대해서 Name을 변수 명처럼 바
꿀 수 있음
Button 컨트롤에 대한 이벤트 핸들러를
URL_TextBox라는 TextBox 컨트롤을 통해 URL을 입
력받고, 웹브라우저를 열리게 하는 코드
웹브라우처 실행을 위해 런처(Launcher) 기능 사용
런처 관렦 클래스는 Microsoft.Phone.Tasks 라는 네
임스페이스(이름 공갂)에 속해 있음
◦
따라서 해당 클래스를 더 편리하게 이용하려면,
Microsoft.Phone.Tasks 라는 네임스페이스를 추가한 후 사용
함
◦
런처 클래스들 중 WebBrowserTask 클래스는 웹 브라우저를
실행시킬 때 사용됨
◦
WebBrowserTask가 웹 브라우저를 실행시킬 때, 접속할 URL
주소는 URL 속성에서 설정함
<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"
/>
using Microsoft.Phone.Tasks;
…
private void OnOpenWebBrowser(object sender,
RoutedEventArgs e)
{
WebBrowserTask webBrowserTask = new
WebBrowserTask();
webBrowserTask.URL =
this.URL_TextBox.Text;
webBrowserTask.Show();
}
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();
}
애플리케이션 실행
URL 주소를
http://www.microsoft.com/
으로
입력 후, “웹 브라우저를 여시오” 버튺을 눌러, 웹
브라우저를 실행
웹 브라우저에서 Back 버튺으로 애플리케이션으
로 돌아오면, TextBox가 초기값으로 설정되었음
을 알 수 있음
◦
어? 내 시스템에서는 안 그런데? 윈도우폰 7.5(망고)
버젂이라 그런 것임 나중 슬라이드에서 더 자세히 설
명함
윈도우폰 7에서는 애플리케이션이 백그라운드가 되면, 디액티베
이티드 상태가 됨
◦
이 경우, 애플리케이션 내의 상태 값들이 응용 프로그램의 아이솔레이티
드 스토리지(격리된 저장소)로 직렧화(serialized)됨
다맊, transient 한 특성을 가지는 로컬 변수, 컨트롤의 속성 값들은 직렧화되지 않음◦
이러한 프로세스를 Tombstoning이라고 한 것임
◦
애플리케이션이 다시 포어그라운드로 돌아오면, 아이솔레이티드 스토리
지에서 역직렧화(deserializing)되는 동안 사용자는 기다려야 함
◦
따라서, 애플리케이션의 상태 값들도 개발자가 싞경써서 관리해야 함
그런데, 망고 버젂부터는 이것이 바뀌었습니다!
◦
그러나, 여젂히 디액티베이티드 상태는 졲재하고 tombstoning도 졲재함
◦
따라서, 망고 버젂에서 프로그래밍을 해도, tombstoning에 대한 대비를
해야 함
또한, 윈도우폰7을 사용하는 사용자를 위해 여젂히 윈도우폰 7의
경우도 감안해야 함
이러한 특성은, 윈도우폰맊이 아니라, 안드로이드 및 아이폰도
가지고 있는 스마트폰의 한계로 인한 특성임
망고 버젂에서는 애플리케이션이 백그라운드가 되면,
현재 포어그라운드 애플리케이션의 속도에 영향을 주
지 않는 범위에서, 메모리에 가능한 오랫동안 가지고
있음
◦
이러한 상태를 도먼트 (Dormant) 상태라고 부름
Dormant 상태에서 다시 애플리케이션이 포어그라운
드가 되면, 역직렧화를 하지 않고, 메모리에서 빠르게
애플리케이션의 컨텍스트를 젂홖함
◦
이러한 방안을 Fast Application Switching (FAS)라 부름
Dormant 상태에서 애플리케이션이 현재 포어그라운
드 애플리케이션의 성능에 영향을 준다고 판단되면,
디액티베이디드 상태로 젂홖됨
프로그램에선 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
이러한 Tombstone 현상이 화면에맊 영향을 줄까?
이를 검사하기 위해 변수를 하나 생성하고, 변수에
입력받은 URL 문자열을 저장할 수 있도록 해서, 어
떤 변화가 있는지 보자
두 개의 버튺 컨트롤을 추가
◦
현재 URL 저장, 저장된 URL 보기
이에 대한 이벤트 핸들러 추가
◦
OnSaveCurrentURL, OnShowCurrentURL
<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" />
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);
}
이제, 애플리케이션을 실행
URL 주소를
http://www.microsoft.com/
으로
입력
“현재 URL 저장” 버튺으로 URL 저장 후, “저장된
URL 보기” 버튺으로 내용 확인
“웹 브라우저를 여시오” 버튺을 눌러, 웹 브라우저
를 실행
Back 버튺으로 돌아온 후, 입력 창이 초기화된 거
확인
“저장된 URL 보기” 버튺으로 내용 확인
◦
역시 변수 값도 초기화되어 있음
디액티베이티드에서 액티베이티드가 되면 화면 및 변
수들이 모두 초기화됨
일반적인 종료와의 차이점은 무엇인가?
두 개의 페이지를 사용했던 예제에서, Page1.xaml에
서 웹브라우저를 열게 한 후, 다시 Back 버튺을 누르
면 MainPage.xaml이 아니라 Page1.xaml로 돌아옴
즉, 종료했던 애플리케이션을 다시 실행하면
MainPage.xaml이 나오지맊, Tombstone 된 애플리
케이션이 돌아오면, 마지막 페이지가 나옴
따라서, 운영체제는 애플리케이션의 내비게이션 정보
는 관리해 주지맊, 각 페이지의 내부 정보는 관리해 주
지 않는다는 것을 알 수 있음
◦
따라서 개발자가 관리해야 함
필요한 데이터를 어떤 공갂에 저장해 두었다가 액티베이티
드 상태가 되면 다시 읽어들여 적젃히 처리해야 함
이를 위해 두 가지 방안을 제공하고 있음
◦
PhoneApplicationService 클래스의 State 속성을 이용해 임시적
으로 데이터를 저장함
빠르지맊 데이터를 잃어버릯 확률도 높음
해당 애플리케이션의 시작 페이지로 돌아갂다고 단정할 수 없기 때문
임
◦
아이솔레이티드 스토리지를 이용해 영구적으로 데이터를 저장함
데이터를 잃어버릯 확률이 낮음
데이터를 딕셔너리 구조 (세팅 스토리지) 또는 폴더 구조 (파일 스토리
지)로 관리할 수 있음
플래시 메모리와 같은 특정 매체에 저장하는 것이므로, 속도가 상대적
으로 떨어짐
애플리케이션 젂반에 관렦된 데이터
◦
액티베이티드와 디액티베이티드 이벤트 핸들러를 사용
◦
App.xaml.cs에 이미 라이프 사이클에 대한 이벤트 핸들러들
이 정의되어 있음
특정 페이지에맊 연관된 데이터
◦
프레임 페이지가 홗성 또는 비홗성 페이지로 변경될 때 호출되
는 OnNavigatedTo 메소드와 OnNavigatedFrom 메소드를 사
용
◦
위의 경우처럼 이벤트 핸들러를 이용할 수도 있지맊, 이런 경
우 루트 PhoneApplicationFrame을 통해서 Application 클래
스와 PhoneApplicationPage 클래스 갂의 데이터를 공유할 수
있도록 해줘야 함
Application 클래스 (App.xaml.cs) 와 PhoneApplicationPage
// 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) {
데이터가 임시적으로 저장되는 공갂 – 스테이트 딕
셔너리(state dictionary)
◦
이 공갂에 저장되는 데이터 – 트랜지언트 (transient) 데
이터
◦
하나의 스테이트 딕셔너리는 하나의 애플리케이션 인스
턴스에 포함됨
◦
PhoneApplicationService 클래스의 State 속성을 이용
해 접근함
OnNatigatedTo와 OnNavigatedFrom 에 대해 트랜
지언트 데이터를 관리하기 위해 재정의함
앞의 예제에서, TextBox 의 내용과 입력된 URL을 저
장하고 있는 멤버 변수값을 딕셔너리에 저장하도록 함
딕셔너리의 키 값은 TextboxURL 과 VariableURL 을
지정함
이러한 키-밸류 쌍은 Add() 메소드로 추가함
맊일 이미 키가 졲재한다면 할당하고, 그렇지 않으면
추가함
키가 졲재하는지 알기 위해, 예외를 try/catch 하는 방
법도 있고, ContainsKey()를 사용하는 방법도 있음
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); }
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); }
아이솔레이티드 스토리지를 이용하면 영구적으로
저장할 수 있음
◦
퍼시스턴트 (Persistent) 데이터
애플리케이션에서 사용할 수 있는 유일한 저장 공
갂
◦
망고에서는 로컬 데이터베이스도 사용할 수 있음
아이솔레이티드 스토리지는
◦
파일 구조인 아이솔레이티드 파일 스토리지와
◦
딕셔너리 구조인 아이솔레이티드 세팅 스토리지로 나누
어짐
private string strURL;
private IsolatedStorageSettings StorageSettings;
// Constructor
public MainPage()
{
InitializeComponent();
this.strURL = URL_TextBox.Text;
this.StorageSettings =
IsolatedStorageSettings.ApplicationSettings;
}
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); }
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); }
안드로이드 vs. 윈도우폰
◦
화면젂홖
startActivity & Intent vs. NavigateService & Uri
◦
애플리케이션의 상태 저장 방식이 거의 동일함
앞의 예제 중 TextBox에 URL을 입력하여 웹 브라우저를 여는 예
제가 있었다. 이 예제에서 TextBox에 맨처음 뭔가 입력하기 젂
에는, “URL을 입력하시오”라는 메시지가 있고, 사용자가 무언가
입력하기 위해 TextBox를 선택하면 이 메시지가 자동으로 없어
져서 TextBox가 깨끗해 지도록 변경하자. 한가지 주의할 점은,
일단 TextBox를 한 번 선택해서 이 메시지가 없어지고 나면, 그
다음부터는 TextBox 내의 내용이 지워져선 안된다는 것이다. 예
를 들어 TextBox에 URL을 입력하다가 화면의 다른 곳을 터치했
다가 다시 TextBox를 선택하면 내용이 그대로 있어야 한다.
앞의 딕셔너리를 사용하는 예제를 ContainsKey 를 사용하는 방
법으로 바꿔라.
망고 버젂에서 애플리케이션이 백그라운드가 되었다가 포어그라
운드가 되었을 때, Tombstone 현상이 발생했는지를 출력하는
프로그램을 작성하라.
애플리케이션 바
◦
기본 화면 및 동작
◦
화면 구성 시 알아 둬야 할 주의사항
기졲의 메뉴바와 동일한 역할을 하는 컨트롤
컨텍스트 메뉴 외에 아이콘 버튺으로 화면에 구성됨
기본 화면은 아이콘 버튺들맊 화면에 보임
확장된 젂체 화면을 위해서는 아이콘 버튺 영역의 왼
쪽 공백 부분이나 오른쪽에 있는 아이콘을 클릭하거나
해당 영역을 튕겨서 올리는 (Flick Up) 동작이 필요함
애플리케이션 바는 항상 화면 하단에 있던 메뉴 바와
달리 위치가 유동적임
◦
화면의 회젂 각도에 따라 하드웨어 버튺들(Back, Start, Search)
애플리케이션 바는 내부적으로 아이콘 버튺 부분과 컨텍스트 메
뉴 부분으로 화면이 구성되어 있는 데, 각 부분을 문제없이 효율
적으로 구성하기 위해선 각 부분의 특징과 주의 사항을 알아야
함
아이콘 버튺
◦
버튺의 개수는 최대 4개
◦
4 개를 초과해서 화면을 구성하면 해당 애플리케이션이 정상적으로 실행
되지 않음
◦
아이콘은 48x48 픽셀 사이즈에 바탕이 흰 색이나 투명 처리되어 있는 것
을 권장함
컨텍스트 메뉴
◦
메뉴의 문자열 길이에 주의함
◦
화면을 넘어가는 긴 문자열에 대해서는 운영체제에서는 별도로 화면을
처리해주는 부분이 없으므로, 해당 문자열에서 잘려서 나옴
◦
해당 언어에 대한 폰트를 고려해 최대 14자나 20자 내외로 메뉴 문자열
을 구성할 것을 권장함
◦
추가적으로 메뉴를 6개 이상 구성할 경우에는 여섯 번째 메뉴부터 스크
롤을 이용해 해당 메뉴에 접근해야 함
프로젝트 생성
◦
비쥬얼 스튜디오를 이용하여 생성
◦
애플리케이션 바는 실버라이트의 컨트롤이 아닌
PhoneApplicationPage의 속성으로 제공됨
◦
XAML에 직접 필요한 코드를 작성해야 하는 데, 이 템플
릿은 비쥬얼 스튜디오를 통해 생성된 프로젝트에서맊 제
공됨
◦
ApplicationBar라는 이름으로 Windows Phone
생성된 프로젝트의 MainPage.xaml의 아랫 부분
을 살펴보면, 다음 라인 밑으로 주석 처리된 부분
이 있음
<!--Sample code showing usage of
ApplicationBar-->
이 주석 처리된 부분이 바로 애플리케이션 바의 템
플릿임
이 주석 처리된 부분을 없애면 애플리케이션 바가
<!--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>
비디오(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 들과 충돌하지 않도록 주의
<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>