2016-03-09 11 views
6

Perché lo Application.Current viene annullato in un'applicazione WinForms? Come e quando dovrebbe essere ambientato?Perché Application.Current == null in un'applicazione WinForms?

che sto facendo:

static class Program { 
     /// <summary> 
     /// The main entry point for the application. 
     /// </summary> 
     [STAThread] 
     static void Main() { 
      Application.Run(new MainForm()); 
     } 
    } 
+2

Non esiste una proprietà 'System.Windows.Forms.Application.Current'. Ti stai mescolando con WPF? –

+0

Questo è lo sfondo di questa domanda e sto cercando di implementare la soluzione qui: http://stackoverflow.com/questions/35901454/how-to-raise-onpropertychanged-on-a-gui-thread-when-an- object-property-is-modifi – Denis

+2

L'unica risposta nella domanda collegata che vedo inizia con * per ** WPF ***. –

risposta

12

Application.Current è specifico per l'applicazione WPF. Pertanto, quando si utilizzano i controlli WPF nell'applicazione WinForms, è necessario inizializzare l'istanza dell'applicazione WPF. Fai questo nella tua applicazione WinForms.

if (null == System.Windows.Application.Current) 
{ 
    new System.Windows.Application(); 
} 
+17

Da un po 'di tempo da quando ho visto una condizione Yoda in C#. –

+0

grazie mille per l'ottima risposta – smoothumut

+0

Non aiuta ?? – Moumit

1

Sulla base di questa domanda altri SO, Application.Current è una caratteristica WPF e non una caratteristica WinForm.

Application.Current Question

Ci

è un MSDN post che mostra come sfruttare la funzione di Winform con l'aggiunta di alcuni riferimenti al codice:

è possibile aggiungere un riferimento a PresentationFramework prima:

1.In Esplora soluzioni, fare clic con il tasto destro del mouse sul nodo del progetto e fare clic su Aggiungi riferimento.

2. Nella finestra di dialogo Aggiungi riferimento, selezionare la scheda .NET.

3.Selezionare PresentationFramework, quindi fare clic su OK.

4.Aggiungi "using System.Windows.Shell;" e "using System.Windows;" al tuo codice.

1

Bene IMHO parere l'altro SO risposta non è davvero la strada da percorrere per Windows Forms, anche se forse non corretto.

Normalmente si utilizza ISynchronizeInvoke per tale funzionalità in WinForms. Ogni controllo contenitore implementa questa interfaccia.

È necessario il metodo BeginInvoke() per eseguire il marshalling della chiamata al thread corretto.

Basato sulla domanda precedente il codice sarebbe diventato:

public class SomeObject : INotifyPropertyChanged 
{ 
    private readonly ISynchronizeInvoke invoker; 
    public SomeObject(ISynchronizeInvoke invoker) 
    { 
     this.invoker = invoker; 
    } 

    public decimal AlertLevel 
    { 
     get { return alertLevel; } 
     set 
     { 
      if (alertLevel == value) return; 
      alertLevel = value; 
      OnPropertyChanged("AlertLevel"); 
     } 
    } 

    private void OnPropertyChanged(string propertyName) 
    { 
     if (PropertyChanged != null) 
     { 
      this.invoker.BeginInvoke((Action)(() => 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName))), null); 

     } 
    } 
} 

Dove si passa il possedere Form di classe al costruttore di SomeObject. Il PropertyChanged verrà ora generato nel thread dell'interfaccia utente della classe del modulo proprietario.