Page간 데이터를 전달하는 방법에 대해 알아보겠습니다.
예제는
첫 페이지에서 색상을 골라 다음 페이지로 값을 전달하는 3가지 방법과
현재 페이지의 값을 이전 페이지로 반환시키는 방법에 대한 내용입니다.
① 객체 매개변수를 받아들이는 Navigate
Navigate메소드는 Page의 인스턴스와 Uri뿐 아니라 어떤 것이든 전달 대상 페이지에 전송할 수 있습니다.
다음 소스와 같이 이동할 페이지의 인스턴스와 전달하려는 값을 넘길 수가 있습니다.
// 전송할 객체를 매개변수로 넘겨줍니다.
private void ObjectNavigate(object sender, RoutedEventArgs e) { ColorPage colorPage = new ColorPage(); // NavigationService의 LoadCompleted 이벤트 연결 colorPage.SetLoadCompleted(NavigationService);
this.NavigationService.Navigate(colorPage, color); } |
SetLoadCompleted의 함수 내용은 단순히 넘어온 NavigationService의 LoadCompleted 이벤트를
연결시켜줍니다.
public void SetLoadCompleted(NavigationService navigation)
{ navigation.LoadCompleted += new LoadCompletedEventHandler(NavigationService_LoadCompleted); } |
이와 같은 이유는 아래 그림과 같이 페이지 이동 시 일어나는 이벤트의 발생 순서에 따라
Page의 Loaded 이벤트가 발생하기 전에 LoadCompleted이벤트가 발생하기 때문입니다.
LoadCompleted 이벤트에서는 ExtraData값으로 넘겨받은 매개변수를 사용할 수 있습니다.
// 매개변수로 넘어온 값을 사용합니다.
void NavigationService_LoadCompleted(object sender, NavigationEventArgs e) { if (e.ExtraData != null) { this.color.Fill = (Brush)converter.ConvertFromString((string)e.ExtraData); }
this.NavigationService.LoadCompleted -= new LoadCompletedEventHandler(NavigationService_LoadCompleted); } |
② Instance만 사용하는 Navigate
오버로드 생성자를 사용하는 단순한 방법입니다.
매개변수의 데이터 타입을 정확히 할 수 있고, 프레임웍 차원에서 타입을 보증하기 때문에
데이터를 체크할 필요가 없는 장점이 있습니다.
// 오버로드된 생성자의 인자로 넘겨 받습니다.
public ColorPage(string color) { InitializeComponent();
this.color.Fill = (Brush)converter.ConvertFromString(color); } |
// 생성자의 매개변수로 넘겨줍니다.
private void InstanceNavigate(object sender, RoutedEventArgs e) { this.NavigationService.Navigate(new ColorPage(color)); } |
③ Application.Properties를 이용한 전역 데이터
여러 페이지에서 공유하기 위한 방법으로 사용할 수 있지만 안정성이 부족한 단점이 있습니다.
// 전역 데이터로 공유합니다.
private void ApplicationProperties(object sender, RoutedEventArgs e) { Application.Current.Properties["color"] = color; } |
// 전역데이터를 사용합니다.
private void Page_Loaded(object sender, RoutedEventArgs e) { if (Application.Current.Properties["color"] != null) { this.color.Fill = (Brush)converter.ConvertFromString((string)Application.Current.Properties["color"]); Application.Current.Properties.Remove("color"); } } |
④ PageFunction
다음 그림과 같이 현재 페이지에서 작업을 처리하고
이전페이지로 돌아갈 때 처리 결과를 반환할 경우가 생깁니다.
위의 방법들을 사용할 수도 있겠지만 항상 새로운 Instance를 생성하기 때문에 문제가 발생할 수 있습니다.
WPF는 PageFunction 클래스를 사용하여 안정적이고 뒤로가기 버튼을 누른 것처럼 자동으로 이동할 수 있습니다.
<PageFunction </Grid> |
x:TypeArguments="sys:String"의 구문이 사용되었습니다.
PageFunction은 PageFunction<T> 타입의 제너릭 클래스이기 때문에 반환되는 값의 타입을 명시해야 합니다.
이는 타입 안전성을 확보한다는 점이 있습니다.
다음과 같이 Ruturn 이벤트를 통해 반환값을 받을 수 있습니다.
// PageFunction 테스트
private void Hyperlink_Click(object sender, RoutedEventArgs e) { PageFunction1 page = new PageFunction1(); page.Return += new ReturnEventHandler<string>(page_Return); this.NavigationService.Navigate(page); }
void page_Return(object sender, ReturnEventArgs<string> e) { ((PageFunction1)sender).Return -= page_Return;
result.Text = "Message : " + e.Result; } |
PageFunction 클래스는 OnReturn 메소드를 호출해서 반환되는 데이터를 다음과 같이 ReturnEventArgs타입으로
래핑하여 전달할 수 있습니다.
private void Button_Click(object sender, RoutedEventArgs e)
{ OnReturn(new ReturnEventArgs<string>(input.Text)); } |
'Window > WPF' 카테고리의 다른 글
[ WPF ] Using WPF in Winform (0) | 2010.03.12 |
---|---|
[ WPF ] 옆으로 흐르는 TextBlock (0) | 2010.03.11 |
[ WPF ] 간단한 Image Animation (2) | 2010.02.12 |
[ WPF ] Canvas Image Background (0) | 2010.02.11 |
[ WPF ] TextBox Select All Text (0) | 2010.02.11 |