C#이벤트 스터디 위임 및 작은 DEMO

5376 단어
먼저 왜 이벤트에 의뢰라는 개념을 도입해야 하는지를 소개한다. 이벤트는 대상이 보낸 메시지로 신호를 보내 조작의 발생을 알리는 것이다.조작은 사용자의 상호작용 (예를 들어 마우스 클릭) 으로 일어날 수도 있고, 일부 다른 프로그램 논리로 촉발될 수도 있다.사건을 일으키는 대상을 사건 발송자라고 한다.이벤트를 캡처하고 이에 응답하는 대상을 이벤트 수신자라고 한다.이벤트 통신에서 이벤트 발송자 클래스는 그 이벤트가 일으킨 이벤트를 수신하거나 처리하는 대상이나 방법을 모른다.필요한 것은 원본과 수신자 사이에 하나의 매개체(또는 지침과 유사한 메커니즘)가 존재하는 것이다.NET Framework는 함수 포인터 기능을 제공하는 특수 유형(Delegate)을 정의합니다.원리 소개: C#에서 하나의 클래스는 필드(Fields), 속성(Properties), 방법(Methods), 인덱스(Indexs), 이벤트(Events), 의뢰(delegate) 등 구성원이 있는데 그 중에서 이벤트(Events) 구성원은 하나의 클래스를 설명하는 데 쓰인다.클래스에서 하나의 이벤트 구성원을 성명하는 데는 일반적으로 다음과 같은 문법 형식을 사용한다. Public 이벤트 에이전트 이름 이벤트 이름은 특정한 클래스에서 MyClick 이벤트 구성원을 설명하는 것과 같다. 그 문법은 다음과 같다. Public 이벤트 DelegateName(사용자 정의 의뢰) MyClick.C#에 이벤트 처리 문제를 해결하기 위한 새로운 데이터 유형 delegate(대표)가 추가되었습니다.대표 데이터 유형은 C 언어의 바늘과 매우 유사하다. 바늘과 달리 코드는 안전하고 관리할 수 있다.여기는DelegateName이 시스템에서 제공한 에이전트인 EventHandler일 수도 있고, 자신이 미리 정의한 의뢰일 수도 있습니다. 의뢰의 정의는 다음과 같습니다. Public delegate[반환값] delegatename(의뢰의 이름)(파라미터 목록......)(이것은 클래스 바깥쪽에 놓을 수도 있고 클래스에 넣을 수도 있다. 코드에 접근할 수만 있다면 된다) 여기에 주의한다. 만약에 이 의뢰가 이벤트로 설명된 것이라면 이곳의 반환값의 유형은void 형식일 뿐이다. 그렇지 않으면 문제가 발생할 수 있다.C#에서delegate를 사용하면'+='(가등) 조작부호를 쉽게 사용할 수 있습니다.Net 객체 중 하나에 하나 이상의 응답 방법을 추가합니다.또한 매우 간단한 "- ="조작부호를 통해 이 응답 방법을 취소할 수 있다.다음에서temp 단추에 클릭 이벤트를 추가하는 문구와 같습니다. 위에서 이벤트를 설명하는 문구에서 Eventhandler는delegate (대표) 유형입니다.Net 클래스 라이브러리에서 다음과 같이 설명합니다. public delegate void EventHandler(object sender, EventArgse).이렇게 하면 모든 형태는 다음과 같다. void 오류 이름(object 매개 변수 이름, EventArgs 매개 변수 이름).의 함수를 Control 클래스의 Click 이벤트 응답 방법으로 사용할 수 있습니다.다음 이벤트 응답 방법 정의: private void button 1Click(object sender, System.EventArgse)은delegate(대표 유형)를 통해 이벤트를 처리하기 때문에 하나의 이벤트에 여러 개의 응답 방법을 누적할 수 있습니다.이와 동시에 하나의 방법을 여러 이벤트의 응답 방법으로 사용할 수 있다.(참고: C# 언어 클래스의 이벤트 구성원 뒤에는'+='와'-='두 개의 이벤트 응답 함수를 추가하고 취소하는 것을 나타내는 조작부호만 나타날 수 있습니다.)ASP든Net은 일반적인 Windows Forms 프로그래밍이고 C#에서 기본적으로 우리가 만나는 이벤트 응답 방법은 다음과 같은 형식으로 설명되어 있습니다:private void button1Click(object sender, System.EventArgse)(기타 자료 참조) 이벤트 응답 방법의 접근 권한, 반환 값 유형, 매개 변수와 유형, 심지어 방법 이름 등은 고정불변해야 합니까?정답은:아니야!일반적인 상황에서 이벤트의 응답 방법에는 두 개의 매개 변수가 있는데 그 중 하나는 이벤트를 일으키는 대상인sender를 대표한다. 이벤트를 일으키는 대상은 예측할 수 없기 때문에 우리는 이를 Object 유형으로 성명하고 모든 대상이 적용된다.두 번째 파라미터는 사건을 일으키는 구체적인 정보를 대표하고 각종 유형의 사건에서 다를 수 있으며 이것은 클래스 중의 사건 구성원의 설명에 따라 결정해야 한다.우리는 이벤트가delegate(대표)를 통해 처리되는 것을 안다.가령 이벤트를 나타낼 대표를 다음과 같은 형식으로 설명한다면: delegate int My Event Handler(object sender, Tool Bar Button Click Event Argse).위의 이벤트 응답 함수에 대한 설명을 할 때 다음과 같은 형식으로 설명해야 합니다:private int MyTest (object sender, Tool Bar Button Click EventArgse) {} 대상에 이벤트 응답 방법을 추가할 때 다음과 같은 코드로 실행할 수 있습니다:Control.Event+=new MyEventHandler(MyTest
마지막으로 나는 WPF로 작은 DEMO를 만들었다.
클래스cs:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace WpfDelegateTest
{
    class setEvent
    {
        public int i = 0;
        public delegate string GetMessage(string str);
        public event GetMessage gm;
        public string str1;
        public string getMess(string str)
        {
            str1=" "+(++i)+"   !";
            return str1;
        }
        public void CheckItOut()
        {
            if (gm != null) gm(str1);
        }
    }
}

xaml.cs 백엔드 코드
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace WpfDelegateTest
{
    /// <summary>
    /// MainWindow.xaml  
    /// </summary>
    public partial class MainWindow : Window
    {
        setEvent se = new setEvent();
        public MainWindow()
        {
            InitializeComponent();

            // 
           
            se.gm += new setEvent.GetMessage(se.getMess);
         
        }

        private void btnOk_Click(object sender, RoutedEventArgs e)
        {
            se.CheckItOut();
            label1.Content = se.str1;
        }

    }
}

 
프론트 데스크 코드:
<Window x:Class="WpfDelegateTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <Label Content=" " Height="28" HorizontalAlignment="Left" Margin="160,109,0,0" Name="label1" VerticalAlignment="Top" />
        <Button Content=" " Height="23" HorizontalAlignment="Left" Margin="160,180,0,0" Name="btnOk" VerticalAlignment="Top" Width="75" Click="btnOk_Click" />
    </Grid>
</Window>

 

좋은 웹페이지 즐겨찾기