'WPF Page 데이터전달'에 해당되는 글 1건

  1. 2010.03.06 [ WPF ] Page간 데이터 전달
Window/WPF2010. 3. 6. 02:34

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));

}

 

'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
Posted by 열ㅇl