2011-09-29 61 views
0

我完全不熟悉C#中的事件和代表。 我想處理一個類(例如程序)中的數據讀取事件,並在另一個類(例如傳輸)中完成端口讀取。 我知道如何與代表獨自做,但不知道如何在事件中做到這一點。如何在c#中添加事件處理程序?

你能給我一個簡單的例子。謝謝。

+5

我敢肯定,微軟樣本此。 – BoltClock

+2

嗨 - 正常情況下,你只是「處理程序」添加到像'Button.Click + = OnButtonClickedHandler;'這樣的事件 - 但是你用什麼方式(例如程序)?你想處理進程/程序中的事件嗎? – Carsten

回答

3

看看這個例子

public class TimerManager : INotifyPropertyChanged 
    { 
    private readonly DispatcherTimer dispatcherTimer; 
    private TimeSpan durationTimeSpan; 
    private string durationTime = "00:00:00"; 
    private DateTime startTime; 
    private bool isStopped = true; 
    readonly TimeSpan timeInterval = new TimeSpan(0, 0, 1); 
    public event EventHandler Stopped; 

    public TimerManager() 
    { 
     durationTimeSpan = new TimeSpan(0, 0, 0); 
     durationTime = durationTimeSpan.ToString(); 
     dispatcherTimer = new DispatcherTimer(); 
     dispatcherTimer.Tick += DispatcherTimerTick; 
     dispatcherTimer.Interval = timeInterval; 
     dispatcherTimer.IsEnabled = false; 
     DefaultStopTime = new TimeSpan(17, 30, 0); 

    } 

    public TimerManager(TimeSpan defaultStopTime) 
     : this() 
    { 
     DefaultStopTime = defaultStopTime; 
    } 
    #region Properties 

    public TimeSpan ElapsedTime 
    { 
     get { return durationTimeSpan; } 
    } 
    public string DurationTime 
    { 
     get { return durationTime; } 
     set 
     { 
      durationTime = value; 
      OnPropertyChanged("DurationTime"); 
     } 
    } 

    public DateTime StartTime 
    { 
     get { return startTime; } 

    } 
    public bool IsTimerStopped 
    { 
     get 
     { 
      return isStopped; 
     } 
     set 
     { 
      isStopped = value; 
      OnPropertyChanged("IsTimerStopped"); 
     } 
    } 

    public TimeSpan DefaultStopTime { get; set; } 

    #endregion 

    #region Start Stop Timer 

    public void StartTimer() 
    { 
     dispatcherTimer.Start(); 
     durationTimeSpan = new TimeSpan(0,0,0); 
     startTime = DateTime.Now; 
     IsTimerStopped = false; 
    } 

    public void StopTimer() 
    { 
     dispatcherTimer.Stop(); 
     IsTimerStopped = true; 
     if (Stopped != null) 
     { 
      Stopped(this, new EventArgs()); 
     } 
    } 

    #endregion 


    public void DispatcherTimerTick(object sender, EventArgs e) 
    { 
     // durationTimeSpan = DateTime.Now - startTime; 
     durationTimeSpan = durationTimeSpan.Add(timeInterval); 
     DurationTime = string.Format("{0:d2}:{1:d2}:{2:d2}", durationTimeSpan.Hours, durationTimeSpan.Minutes, 
            durationTimeSpan.Seconds); 
     if (DateTime.Now.TimeOfDay >= DefaultStopTime) 
     { 
      StopTimer(); 
     } 

    } 


} 

這節課,我們已在停止計時器事件

 public event EventHandler Stopped; 

在我們調用事件處理程序的方法中,如果它不爲null

public void StopTimer() 
{ 
    dispatcherTimer.Stop(); 
    IsTimerStopped = true; 
    if (Stopped != null) 
    { 
     //call event handler 
     Stopped(this, new EventArgs()); 
    } 
} 

使用這個類和計時器停止事件看代碼

 var timer = new TimerManager(); 
    timer.Stopped += TimerStopped; 
    void TimerStopped(object sender, EventArgs e) 
    { 
     // do you code 
    } 
-1

如果我nright明白你問什麼,你可以做這樣的事情:

public class MyClass 
{ 
    ... 
    public void delegate MuCustomeEventDelegate(...params...); 
    public event MuCustomeEventDelegate MuCustomeEvent; 

    ... 
} 
相關問題