WPF 팁

Page간 데이터 교환 열이 평점: 10.0/10 (1명 참여) 조회: 7464
첨부파일

 답변을 달다 이미 아시는 분도 계시겠지만
자료 정도로 아시면 좋을 것 같아서 블로그에 포스팅한 내용을 올리겠습니다.^^
 
 
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
   xmlns="
http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="
http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:sys="clr-namespace:System;assembly=mscorlib"
    x:Class="WpfApplication1.PageFunction1"
    x:TypeArguments="sys:String"
    Title="PageFunction1">
  <Grid>

  </Grid>
</PageFunction>
 
 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));

}


태그 : page wpf
작성자 정보
열이
Level 37
 [EXP.76/80]

메일:  비공개

글등록 +12 200 덧글등록 +3 187
자기소개
- 선문비트 16기                                   - 바이널 인터렉티브 사업부 개발팀                          - Blog : http://shine10ee.blog.me                           - 디자이너의 감성을 지닌 개발자.
글 공유하기 |
  tweet facebook
2010-03-06 오전 2:56:12
나도한마디
사용자
LiveDK            [2010-03-07]
Level 56
 [EXP.178/250]
좋은 자료 감사합니다.
사용자
열이            [2010-03-07]
Level 37
 [EXP.76/80]
별 말씀을요 ㅎㅎ
사용자
하야웨이            [2010-03-25]
Level 2
 [EXP.2/16]
님들 친구자나요 -ㅅ-
사용자
ㅁㅅㅇㄷㅎㅅ            [2010-03-26]
Level 3
 [EXP.4/16]
감사합니다~!! 한번 해봐야겠네요..
사용자
Sucal            [2017-08-10]
Level 1
 [EXP.3/16]
완전 필요한 정보~ 감사합니다 ^^
태그로 엮인글
[WPF Q&A] C# wpf 다중 시리얼 데이터 처리에 대한 문의입니다.  블링c
[C#.NET Q&A] 익스플로러나 다른브라우저의 즐겨찿기 리스트를 가져오고싶습니다[2]  엿장수
[C#.NET Q&A] WPF( C Sharp ) 멀티윈도우 동시 컨트롤이 안되나요? ㅠㅠ[1]+3 파일첨부 insurang
[WPF Q&A] png 이미지 품질 문의 드립니다.[2]  d20121201
[C#.NET Q&A] wpf 웹브라우저콘트롤에서는 GoHome 메소드가 안보이내여...[1]+1  엿장수
[C#.NET Q&A] wpf 로 웹브라우저를 만들려는데  엿장수
[WPF Q&A] WPF 화면크기 메모리와 메모리해제 관련[2]  darkmaste
[WPF Q&A] 타이머 문의 드립니다.[2]+2  d20121201
[WPF Q&A] wpf 에서 find control 문의 드립니다.[1]+1  d20121201
[WPF Q&A] 레이블 글자 바꾸기 문의 드립니다.[2]+1  d20121201
글리스트
[tip]3D객체 파일을 쉽게 블렌드로 불러오기!  양대광
xaml에 네임스페이스 추가 오류시 추가방법  양대광
[TIP] WPF 3D 간단한 회전[4]  양대광
WPF 기본강좌 Panel (StackPanel)   양대광
WPF 기본강좌 Panel (DockPanel)  양대광
WPF 기본강좌 CONTENT  양대광
WPF 기본강좌 BRUSH ( Visual Brush )   양대광
WPF 기본강좌 BRUSH ( RadialGradientBrush)  양대광
WPF 기본강좌 BRUSH ( LinearGradientBrush ) [1]  양대광
WPF 기본강좌 BRUSH ( Color )[1]  양대광
 ★현재글->   Page간 데이터 교환[3]+2 파일첨부 열이
Xaml + CS 코드로 짜보는 간단한 3D프로그램[3]  양대광
[TIP] Wpf 애니메이션 사용시 주의할점[3]+3 파일첨부 양대광
3D 강좌 3D의 개념( 3 )[1]  양대광
3D 강좌 3D의 개념( 2 )[5]+2  양대광
3D 강좌 3D의 개념( 1 )[3]  양대광
아래 DLL을 이용한 이미지 mp3 player[5]+5  양대광
MP3 Tag에서 이미지 불러오기... 파일첨부 양대광
Visual Studio 2008 죽이기[4]+3  주찬진
[DTFE 2009 훈스닷넷 세미나] 경품추첨 프로그램[6] 파일첨부 한진수