2011-09-12 9 views
0

私はずっとGoogleの後、デリゲートとイベントがどのように機能するのかまだ分かりません。デリゲートとイベントの処理に関する問題

私が達成したいのは、 クラス1がアニメーションを再生しているときに、クラス2がデリゲート/イベントをクラス2に渡し、クラス2がアニメーションENDで何かを行うようにします。

上記の動作をどのようにコードすることができますか?

答えて

1

非常に基本的なイベントの実装...

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 
    } 

} 

このlinkは、イベントを作成する方法について良い簡単な例を提供します。これはVS 2003を対象としていますが、まだ適用されています。

+0

ありがとうございます!最後に私はそれを働かせました! –

0

パブリッシャー(イベントを公開するクラス)とサブスクライバー(イベントにハンドラーを登録するクラス)と考えることができます。

上記のシナリオでは、Class1のDoSomethingをClass2から直接呼び出すことはできませんか?

0

ここには2つのクラスがあります。上記の事例についてお話していると思います。

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(); 
    } 
} 
をし、出力は次のようになります:

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."); 
    } 
} 

次にあなたが勝利のフォームを持っていた場合、あなたが持っていると思います

ClassA instance animating. 
ClassB instance doing work. 
0

ので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(); 
    }