프로그래밍 기술/WPF

[WPF] 4. 탐색 - 4.2 PageFunction을 이용한 구조적 탐색

언제나휴일 2016. 5. 24. 14:22
반응형

[WPF] 4. 탐색 - 4.2 PageFunction을 이용한 구조적 탐색



4.2 PageFunction을 이용한 구조적 탐색

 

 응용 프로그램을 작성하다보면 하나의 기능이 다른 기능과 연계되는 경우가 많이 발생합니다탐색을 이용할 때도 하나의 페이지에 있는 요소의 값이 다른 페이지에 전달되고 전달받은 페이지에서 사용자의 선택에 따라 결과를 원래 페이지에 전달해야 할 때가 있습니다. 이러한 탐색을 구조적 탐색이라고 부릅니다.

 

 WPF에서는 구조적 탐색을 위해 PageFunction을 제공하고 있습니다. PageFunction은 제네릭 클래스로 제네릭 형식 인수가 필요합니다. PageFunction 항목을 추가할 때는 형식 인수가 string인 형태의 클래스가 만들어집니다이는 호출하는 곳에 결과를 반환할 형식입니다. 디폴트로 string 형식을 반환 값으로 설정하고 있지만 필요에 의해 반환 형식을 바꿀 수 있습니다.

 

 PageFunction을 사용하는 곳에서는 PageFuntion 개체를 생성한 후에 해당 개체에서 반환하는 값을 처리하기 위해 Return 이벤트 핸들러를 추가합니다그리고, NavigationService Navigate 메서드를 호출하면서 해당 개체를 전달합니다.

 

InputAgePFun inputpfun = new InputAgePFun();

inputpfun.Return += new ReturnEventHandler<string>(inputpfun_Return);

NavigationService.Navigate(inputpfun);

 

 그리고 해당 PageFunction에서는 결과를 반환하기 위해 OnReturn 메서드를 호출합니다해당 메서드의 입력 인자는 PageFunction과 제네릭 형식 인자가 일치하는 ReturnEventArg 개체를 생성하여 전달하여야 합니다그리고 ReturnEventArg 개체 생성 시에 반환할 값을 입력 인자로 전달합니다.

 

OnReturn(new ReturnEventArgs<string>(tbox_age.Text));

 

 

 이를 확인하기 위해 WPF 응용 프로그램을 만들어 봅시다.

PageFuntion을 이용한 구조적 탐색 프로젝트 생성

[그림 4.12] PageFuntion을 이용한 구조적 탐색 프로젝트 생성

 

 기본적으로 제공하는 WIndow 외에 하나의 Page와 하나의 PageFunction을 추가합시다여기에서는 Page의 이름은 BasicPage라 정하고 PageFunction의 이름은 InputAgePFun이라 하겠습니다.

 

 작성할 프로그램은 BasicPage에서 나이 입력 버튼을 누르면 InputAgePFun 개체를 탐색하고 해당 개체에서 나이를 입력한 후에 확인을 누르면 BasicPage로 입력한 값을 전달하게 할게요.

 

 먼저 Window1.xaml에는 탐색할 페이지를 표시할 Frame을 하나 두도록 하고 BasicPage Source 속성 초기값으로 설정하세요.

 

Window1.xaml

<Window x:Class="PageFuntion_이용한_구조적_탐색.MainWindow"

        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"

        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"

        xmlns:local="clr-namespace:PageFuntion_이용한_구조적_탐색"

        mc:Ignorable="d"

        Title="MainWindow" Height="350" Width="525">

    <Grid>

        <Frame Source="BasicPage.xaml" />

    </Grid>

</Window>

 

  

 BasicPage.xaml에서는 이름을 입력하기 위한 TextBox와 나이 입력을 요청하기 위한 Button, 입력한 나이를 표시할 TextBloc으로 구성을 할게요그리고 Button Click 이벤트 핸들러를 추가하세요.

 

BasicPage.xaml

<Page x:Class="PageFuntion_이용한_구조적_탐색.BasicPage"

      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"

      xmlns:d="http://schemas.microsoft.com/expression/blend/2008"

      xmlns:local="clr-namespace:PageFuntion_이용한_구조적_탐색"

      mc:Ignorable="d"

      d:DesignHeight="300" d:DesignWidth="300"

      Title="BasicPage">

 

    <StackPanel>

        <TextBox Name="tbox_name" Background="Cyan" Text="이름을 입력하세요."/>

        <Button Name="btn_setage" Content="나이 설정" Click="btn_setage_Click" />

        <TextBlock Name="tbox_age" Background="Cyan"/>

    </StackPanel>

 

</Page>

 

 BasicPage.xaml.cs에서는 Button을 클릭했을 때에 InputAgePFun 개체를 생성하여 Return 이벤트 핸들러를 추가한 후에 탐색을 해야겠지요그리고 Return 이벤트 핸들러에서는 전달받은 값을 나이를 표시하기 위해 추가한 TextBlock Text 속성에 설정합니다.

 

 BasicPage.xaml.cs

using System.Windows;

using System.Windows.Controls;

using System.Windows.Navigation;

 

namespace PageFuntion_이용한_구조적_탐색

{

    /// <summary>

    /// BasicPage.xaml에 대한 상호 작용 논리

    /// </summary>

    public partial class BasicPage : Page

    {

        public BasicPage()

        {

            InitializeComponent();

        }

        private void btn_setage_Click(object sender, RoutedEventArgs e)

        {

            InputAgePFun inputpfun = new InputAgePFun(tbox_name.Text);

            inputpfun.Return += new ReturnEventHandler<string>(inputpfun_Return);

            NavigationService.Navigate(inputpfun);

        }

        void inputpfun_Return(object sender, ReturnEventArgs<string> e)

        {

            tbox_age.Text = e.Result;

        }

    }

}

 

 

 InputAgePFun에서는 생성 시에 전달받은 이름을 표시할 TextBlock과 나이를 입력하기 위한 TextBox, 사용자에 의해 입력이 끝났음을 전달하는 Button을 추가할게요참고로 PageFuntion의 제네릭 형식 인자는 결과를 리턴하는 형식과 관계된 것이지 입력 인자와는 상관없습니다.

 

InputAgePFun.xaml

<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="PageFuntion_이용한_구조적_탐색.InputAgePFun"

    x:TypeArguments="sys:String"

    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"

    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"

    xmlns:local="clr-namespace:PageFuntion_이용한_구조적_탐색"

    mc:Ignorable="d"

    d:DesignHeight="300" d:DesignWidth="300"

    Title="InputAgePFun">

    <StackPanel>

        <TextBlock Name="tb_name"/>

        <TextBox Name="tbox_age"/>

        <Button Name="btn_input" Content="입력" Click="btn_input_Click" />

    </StackPanel>

 

</PageFunction>

 

 그리고 입력 버튼의 Click 이벤트 핸들러에서는 사용자가 입력한 나이를 전달하는 코드를 작성해야겠지요이를 위해서는 PageFunction의 제네릭 형식 인자가 동일한 ReturnEventArgs 개체를 생성해야 한다고 했습니다그리고 이를 OnReturn 메서드에 입력 인자로 전달하면 호출한 페이지로 전달합니다.

 

InputAgePFun.xaml.cs

using System;

using System.Windows;

using System.Windows.Navigation;

 

namespace PageFuntion_이용한_구조적_탐색

{

    /// <summary>

    /// InputAgePFun.xaml에 대한 상호 작용 논리

    /// </summary>

    public partial class InputAgePFun : PageFunction<String>

    {

        public InputAgePFun(string mname)

        {

            InitializeComponent();

            tb_name.Text = mname + "의 나이를 입력하세요";

        }

        private void btn_input_Click(object sender, RoutedEventArgs e)

        {

            OnReturn(new ReturnEventArgs<string>(tbox_age.Text));

        }

 

    }

}

 

 실행 하신 후에 이름을 입력한 나이 설정 버튼을 누르고 나이를 입력한 후에 입력 버튼을 눌러보세요. 어떻게 동작하는지 확인할 있을 거예요.

PageFuntion을 이용한 구조적 탐색 실행 화면

[그림 4.13] PageFuntion을 이용한 구조적 탐색 실행 화면


관련 게시글

[WPF] 4. 탐색 - 4.1.1 Page

[WPF] 4. 탐색 - 4.1.2 Hyperlink 사용하여 페이지 이동

[WPF] 4. 탐색 - 4.1.3 Frame 이용하기

[WPF] 4. 탐색 - 4.1.4 NavigationService 이용하기

[WPF] 4. 탐색 - 4.3 탐색 종합 세트, 마법사


실습 파일

PageFuntion을 이용한 구조적 탐색.zip


반응형