2012-05-05 6 views
7

Sto sviluppando un'applicazione in Windows 8 Visual Studio 11, e voglio definire un gestore di eventi per un'istanza DispatcherTimer come di seguito:definire gestore eventi per Tick caso di DispatcherTimer in Windows 8 App

public sealed partial class BlankPage : Page 
    { 

     int timecounter = 10; 
     DispatcherTimer timer = new DispatcherTimer(); 
     public BlankPage() 
     { 
      this.InitializeComponent(); 
      timer.Tick += new EventHandler(HandleTick); 
     } 

     private void HandleTick(object s,EventArgs e) 
     { 

      timecounter--; 
      if (timecounter ==0) 
      { 
       //disable all buttons here 
      } 
     } 
     ..... 
} 

Ma Ottengo il seguente errore:

Cannot implicitly convert type 'System.EventHandler' to 'System.EventHandler<object>' 

Sono uno sviluppatore alle prime armi delle vedove 8 app.

Per favore aiutatemi?

risposta

8

quasi ce l'aveva :) Non è necessario creare un'istanza di un nuovo oggetto eventhandler, è sufficiente indicare il metodo che gestisce l'evento. Quindi, un eventhandler.

 int timecounter = 10; 
    DispatcherTimer timer = new DispatcherTimer(); 
    public BlankPage() 
    { 
     this.InitializeComponent(); 

     timer.Tick += timer_Tick; 
    } 

    protected void timer_Tick(object sender, object e) 
    { 
     timecounter--; 
     if (timecounter == 0) 
     { 
      //disable all buttons here 
     } 
    } 

provare a leggere sui delegati a comprendere gli eventi Understanding events and event handlers in C#

+0

Ma noi non hanno questo problema in applicazioni Windows? Noi? –

+0

Un delegato e un eventhandler sono gli stessi su tutta la piattaforma. Non è un "problema", è come funziona :) – danielovich

+0

Per problema intendevo 'System.EventHandler ' e non intendo che sia un bug –

2

WinRT fa uso dei farmaci generici più che il runtime standard di .NET. DispatcherTimer.Tick come defined in WinRT is here:

public event EventHandler<object> Tick 

Mentre il WPF DispatcherTimer.Tick is here evento pubblico EventHandler Tick

Si noti inoltre che non è necessario utilizzare il metodo standard di nome per creare un gestore eventi. È possibile utilizzare un lambda per farlo sul posto:

int timecounter = 10; 
DispatcherTimer timer = new DispatcherTimer(); 
public BlankPage() 
{ 
    this.InitializeComponent(); 

    timer.Tick += (s,o)=> 
    { 
     timecounter--; 
     if (timecounter == 0) 
     { 
      //disable all buttons here 
     } 
    }; 
} 
3

Il codice si aspetta che HandleTick abbia due parametri di oggetto. Non un parametro oggetto e un parametro EventArg.

private void HandleTick(object s, object e) 

NON

private void HandleTick(object s,EventArgs e) 

Questo è un cambiamento che ha avuto luogo per Windows 8.

Problemi correlati