2016-03-09 15 views
6

Application.CurrentがWinFormsアプリケーションでnullになるのはなぜですか?いつ、どのように設定されるのですか?私がやっているなぜWinFormsアプリケーションでApplication.Current == nullになるのですか?

:この他のSOの質問に基づいて

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

'System.Windows.Forms.Application.Current'プロパティはありません。あなたはWPFと混合していますか? –

+0

これはこの質問の背景です。私はここで解決策を実装しようとしています:http://stackoverflow.com/questions/35901454/how-to-raise-onpropertychanged-on-a-gui-thread-when-an- object-property-is-modifi – Denis

+2

私が見るリンクされた質問の唯一の答えは、** WPF ***の*で始まります。 –

答えて

12

Application.CurrentはWPFアプリケーションに固有です。 したがって、WinFormsアプリケーションでWPFコントロールを使用する場合は、WPFアプリケーションのインスタンスを初期化する必要があります。 WinFormsアプリケーションでこれを行います。

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

CodaのYoda Conditionを見てからしばらくしてきました。 –

+0

おかげさまで偉大なお返事をいただきました – smoothumut

+0

お困りですか? – Moumit

1

を、Application.Currentは、WPFの特徴ではなく、Winフォームの機能です。

Application.Current Question

MSDN postは、あなたのコードにいくつかの参照を追加することによって、Winフォームでの機能を活用する方法を示してあります:

あなたが最初PresentationFrameworkへの参照を追加することができます。

1.Inソリューションエクスプローラでプロジェクトノードを右クリックし、[参照の追加]をクリックします。

2. [参照の追加]ダイアログボックスで[.NET]タブを選択します。

3. PresentationFrameworkを選択し、[OK]をクリックします。

4.「using System.Windows.Shell;」を追加します。と "using System.Windows;"あなたのコードに。

1

まあ私見意見ものの多分ない間違った他のSOの答えは、実際にWindowsフォームのために行く方法ではありません。

通常、WinFormsのこのような機能にはISynchronizeInvokeを使用します。すべてのコンテナコントロールはこのインターフェイスを実装しています。

コールを適切なスレッドにマーシャリングするには、BeginInvoke()メソッドが必要です。

は、コードになるでしょう、あなたの前の質問に基づいて:あなたは SomeObjectのコンストラクタに所有 Formクラスを渡す

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); 

     } 
    } 
} 

。 PropertyChangedは、所有するフォームクラスのUIスレッドで生成されるようになりました。

関連する問題