본문 바로가기
개발언어/.NET

C# delegate 사용법 - 사례1

by 공장장코난 2019. 1. 5.

대리자 또는 대리인으로 해석되는데 이 개념은 이전에 MFC, Win32 개발시에 많이 사용하던 function pointer(함수 포인터)와 비슷한 개념이다.

최근 DotNetFramework 환경에서 Application 개발로 WPF 기반 C# 언어로 네이티브 Windows Application을 개발중인데 여러가지 활용방법이 있겠으나 나의 경우엔 제일 많이 사용할때가 Parent Window와 UserControl와의 이벤트 전송에 사용했다.

즉 Parent Window는 Loading된 UserControl 또는 Page 접근이 자유롭지만 UserControl에서는 Parent Window의 쉽지 않아 처리된 결과값을 delegate를 이용하여 Navigate 용도로 사용한다.

예제는 Parent Window에서 첫번재 UserControl1을 표시 처리 후 delegate를 이용해서 두번째 UserControl2를 표시하는 방법이다.

delegate 선언

public delegate void NextPageEventHandler(object sender, ParamEventArgs e);


전달될 parameter 정의

public class ParamEventArgs : EventArgs

{

public string param1;

public string param2;


public ParamEventArgs(string inParam1, string inParam2)

{

param1 = inParam1;

param2 = inParam2;

}

}


UserControl1.cs

public event NextPageEventHandler OnNextPageEvent;    //delegate event 선언

...

private void GotoNextPage(object sender, EventArgs e)

{

OnNextPageEvent(this, new ParamEventArgs("1", "TEST")); //delegate event 호출

}


ParentWindow.xaml

xmlns:uc="clr-namespace:DelegateExamApp.Controls"

UserControl1.cs


<Window>

<DockPanel x:nam="mainFrame">

<Grid>

<uc:UserControl1 x:Name="ucUserControl1" Visibility="Visible"/>
<uc:UserControl1 x:Name="ucUserControl2" Visibility="Hidden"/>

</Gird>

</DockPanel>

</Window>


ParentWindow.cs

public ParentWindow()

{

InitializeComponent();

this.ucUserControl1.OnNextPageEvent += new NextPageEventHandler(OnNextPage_EventHandler); //UserControl1의 OnNextPageEvent event handler 등록

}

...

//delegate event handler

private void OnNextPage_EventHandler(object sender, ParamEventArgs e)

{

switch (e.param1)

{

case "1": //UserControl1을 Loading

{

this.ucUserControl1.Visibility = Visibility.Visible;

this.ucUserControl2.Visibility = Visibility.Hidden;

}

break;

case "2": //UserControl2를 Loading

{

this.ucUserControl1.Visibility = Visibility.Hidden;

this.ucUserControl2.Visibility = Visibility.Visible;

}

break;

}

}