2014-02-08 6 views
0

У меня есть метод myobj_EndInteractionEvt, который выполняется, когда происходит событиевызова отделка обратного вызова при завершении другого внутреннего зависимых финишного метода обратного вызова

В главном классе зарегистрироваться как:

//on main class register method passing args like 
lo.myobj.EndInteractionEvt += (s, args) => updateInteraction(lo.myobj_EndInteractionEvt(s, args)); 

//this is called when finish executin "lo.myobj_EndInteractionEvt" 
public void updateInteraction(AOItour tour) 
{ 
    Console.WriteLine(tour.StateOfAOItour); 
    ClearMsg(); 
    etc... 
} 

Внутри myobj класса I звоните myobj_EndInteractionEvt, который возвращает объект AOItour

internal AOItour myobj_EndInteractionEvt(vtkObject losender, vtkObjectEventArgs e) 
{ 
    //do stuff and return AOItour 
    return AOItour; 
} 

это работает, как это необходимо (в основном потому, что я работаю на ВТК и это нужно использовать много обратных вызовов), вопрос приходит как myobj имеет другой обратный вызов angleEndInteractionEvt, который обновляет AOItour внутренне

public void angleEndInteractionEvt(vtkObject sender, vtkObjectEventArgs e) { 
    //AOItour has been modified, so i would like to call own "myobj_EndInteractionEvt" 
    // so I can pass 
    // modified AOItour to it and then myobj_EndInteractionEvt would return AOI to 
    // updateInteraction 
} 

Как позвонить callback myobj_EndInteractionEvt в конце angleEndInteractionEvt?

Я попытался

public void angleEndInteractionEvt(vtkObject sender, vtkObjectEventArgs e) { 
    //some stuff 
    myobj_EndInteractionEvt(sender,e);  
} 

И это правильно идет к myobj_EndInteractionEvt но вопрос после этого исполнения, программа возвращается к angleEndInteractionEvt и не идет updateInteraction Как сделать это?

ответ

1

Вам нужно вызвать событие, что вы подключили к. Это немного трудно понимание вы структура, но, как правило, вы бы это в классе, где был определен Ты событие:

public class MyObj 
{ 
    public void angleEndInteractionEvt(vtkObject sender, vtkObjectEventArgs e) { 
     // Do stuff 
     if(EndInteractionEvt != null) { 
     EndInteractionEvt(sender, e); 
     } 
    } 
} 

Как правило, однако отправитель должен быть это - экземпляр, который вызвал событие.

На данный момент следующая строка будет пинать в игру:

lo.myobj.EndInteractionEvt += (s, args) => updateInteraction(lo.myobj_EndInteractionEvt(s, args)); 

Во-первых, ваш метод myobj_EndInteractionEvt собирается назвать, который должен вернуть AOITour.

internal AOItour myobj_EndInteractionEvt(vtkObject losender, vtkObjectEventArgs e) 
{ 
    //do stuff and return AOItour 
    return AOItour; 
} 

В результате этого должен затем получить перешел в updateInteraction, что я перечисленных ниже, так что вы должны теперь войти загнуться.

public void updateInteraction(AOItour tour) 
{ 
    Console.WriteLine(tour.StateOfAOItour); 
    ClearMsg(); 
    etc... 
} 

Что может быть лучше и немного более читаемым (если они определены на одном объекте), чтобы вместо того, чтобы просто сделать:

public void angleEndInteractionEvt(vtkObject sender, vtkObjectEventArgs e) { 
    // Do stuff 

    this.myobj_EndInteractionEvt(sender, e); 
    if(EndInteractionEvt != null) { 
     EndInteractionEvt(sender, e); 
    } 
} 
1

myobj_EndInteractionEvt - это метод, а не событие. Вместо прямого вызова myobj_EndInteractionEvt(sender,e); необходимо вызвать событие, которое вызывает его в вашем основном классе. Меняем angleEndInteractionEvt к:

public void angleEndInteractionEvt(vtkObject sender, vtkObjectEventArgs e) { 
    //some stuff 
    EndInteractionEvt(sender, e);  
} 
+0

это правильно, но как бы вы вернуть AOItour как в 'myobj_EndInteractionEvt'? – cMinor

+0

Выбрасывание события приведет к тому, что main запустит обработчик событий 'updateInteraction'. – klugerama

Смежные вопросы