Проблема с делегатом и обработкой события - PullRequest
0 голосов
/ 12 сентября 2011

После того, как я много гуглю и все еще не могу понять, как работает делегат и событие.

Чего я хочу добиться, так это: класс 1 будет воспроизводить анимацию, когда анимация завершится, она пройдетделегировать / событие классу 2, чтобы класс 2 что-то делал с анимацией END.

Интересно, как мне кодировать описанное выше поведение?

Ответы [ 4 ]

1 голос
/ 12 сентября 2011

Очень простая реализация событий ...

public delegate void Class1AnimationCompletedHandler(object sender, EventArgs e);

public class Class1
{
    public event Class1AnimationCompletedHandler AnimationCompleted;

    private void OnAnimationCompleted(EventArgs e)
    {
        if (this.AnimationCompleted != null)
        {
            // raises the AnimationCompleted event
            this.AnimationCompleted(this, e);
        }
    }

    public void Animate()
    {
        // do your animation steps here

        this.OnAnimationCompleted(new EventArgs());
    }
}

public class Class2
{
    private Class1 c1;

    public Class2()
    {
        // initialize the class
        c1 = new Class1();

        // attach this.Class1_AnimationCompleted to the AnimationCompleted event;
        c1.AnimationCompleted += new Class1AnimationCompletedHandler(this.Class1_AnimationCompleted);
    }

    private void Class1_AnimationCompleted(object sender, EventArgs e)
    {
        // do your post-animation stuff here
    }

}

Эта ссылка предоставляет хороший быстрый пример того, как создавать события.Он предназначен для VS 2003, но все еще применим.

0 голосов
/ 12 сентября 2011

Таким образом, Class1 представит событие, к которому Class2 прикрепит делегата. Когда анимация заканчивается, Class1 вызовет событие. Это то, что вам нужно?

    class Class1
    {
        public delegate void AnimationEndHandler();
        public event AnimationEndHandler AnimationEnded;

        public void Animation()
        {
            //do the animation
            Console.WriteLine("Animation ended. This is class 1");
            AnimationEnded();
        }
    }

    class Class2
    {
        public Class2(Class1 c1)
        {
            c1.AnimationEnded += new Class1.AnimationEndHandler(DoSomethingOnAnimationEnd);
        }

        public void DoSomethingOnAnimationEnd()
        {
            Console.WriteLine("Animation ended. This is class 2");
        }
    }

    static void Main(string[] args)
    {
        Class1 c1 = new Class1();
        Class2 c2 = new Class2(c1);

        c1.Animation();
    }
0 голосов
/ 12 сентября 2011

Вот два класса. Я полагаю, вы говорите о случаях выше.

public class ClassA
{
    public event EventHandler Finished;

    public ClassA() {}

    public void Animate()
    {
        Console.WriteLine("ClassA instance animating.");
        if (Finished != null)
            Finished(this, null);
    }
}

public class ClassB
{
    public ClassB() {}

    public void DoWork()
    {
        Console.WriteLine("ClassB instance doing work.");
    }
}

Тогда, если бы у вас была выигрышная форма, вы бы получили:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();

        ClassA a = new ClassA();
        a.Finished += delegate(object sender, EventArgs e)
        {
            ClassB b = new ClassB();
            b.DoWork();
        };
        a.Animate();
    }
}

И результат будет:

ClassA instance animating.
ClassB instance doing work.
0 голосов
/ 12 сентября 2011

Думайте об этом как об издателе (класс, представляющий событие) и подписчике (класс, регистрирующий обработчик события).

Хотя в упомянутом сценарии вы не можете вызвать DoSomething класса 2прямо из Class1?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...