대리자 또는 대리인으로 해석되는데 이 개념은 이전에 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;
}
}
'개발언어 > .NET' 카테고리의 다른 글
WPF TextBox 기본 IME 모드를 한글로 입력 받기 (0) | 2019.01.10 |
---|---|
C# Process 검색 (0) | 2019.01.08 |
C# 클래스 라이브러리 생성 및 활용 (0) | 2018.12.27 |
C# byte 초기화 및 copy (0) | 2018.12.27 |
yyyyMMdd 타입의 string date를 DateTime format으로 변환 (0) | 2018.12.26 |