2017-01-25 11 views
-1

с приведенным ниже кодом Я хочу обновить progressbar от foo1. , но я не смог реализовать EventHandler в FooКак настроить обработчик событий

class Foo : Form  // implements progressbar 
{ 
    IFoo foo = new Foo1() 

    // this will not do: 
    ProgressBarEventHandler = new EventUpdateProgressBar(this.UpdateProgressBar); 

    UpdateProgressBar() { } 
} 

public delegate void EventUpdateProgressBar(); 
class FooBase 
{ 
    public EventUpdateProgressBar ProgressBarEventHandler; 

    protected virtual void UpdateProgressBar() 
    { 
     if (ProgressBarEventHandler != null) 
      ProgressBarEventHandler(); 
    } 

} 

class Foo1 : IFoo,FooBase { base.UpdateProgressBar() } 
class Foo2 : IFoo,FooBase {} 

interface IFoo {} 

есть способ, чтобы получить эту работу или есть лучший подход?

+1

Что именно проблема? Имеет ли этот код какие-либо исключения? –

+0

он не будет компилироваться, поскольку Foo ProgressBarEventHandler не существует. – aw48

+0

Он не будет компилироваться в первую очередь из-за странного объявления Foo. Foo объявляется как класс, но его тело содержит код, как и метод. Исправьте эту проблему, прежде чем мы сможем прийти в EventUpdateProgressBar. –

ответ

0

Я не совсем уверен в ваших намерениях, но если вы пытаетесь реализовать два класса, один из которых вызывает события, а другой - их, тогда минимальный образец будет выглядеть следующим образом.

delegate void MyEvent(); 

class MyEventSource 
{ 
    public event MyEvent Event; 

    public void RaiseEvent() 
    { 
     MyEvent evt = Event; 
     if (evt != null) 
      evt(); 
    } 
} 

class MyEventListener 
{ 
    public void SubscribeForEventFromMyEventSource(MyEventSource eventSource) 
    { 
     eventSource.Event += this.EventHandler; 
    } 

    public void EventHandler() 
    { 
     // Event handling logic here 
    } 
} 

Больше чтения на события можно посмотреть здесь: https://msdn.microsoft.com/en-us/library/9aackb16(v=vs.110).aspx и здесь https://codeblog.jonskeet.uk/2015/01/30/clean-event-handlers-invocation-with-c-6/

+0

Благодарим вас за ответ. a) класс Foo содержит только два объявления и метод. Я нашел решение вчера вечером: public EventUpdateProgressBar ProgressBarEventHandler {get; задавать; } и добавление его в список объявлений IFoo, и он работает! – aw48