为什么WinForms应用程序中的Application.Current == null?

时间:2016-03-09 21:18:43

标签: c# winforms

为什么Application.Current在WinForms应用程序中出现null?应该如何以及何时设置?

我在做:

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

3 个答案:

答案 0 :(得分:20)

Application.Current特定于WPF应用程序。 因此,当您在WinForms应用程序中使用WPF控件时,您需要初始化WPF应用程序的实例。在WinForms应用程序中执行此操作。

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

答案 1 :(得分:2)

基于其他SO问题,Application.Current是WPF功能而不是WinForm功能。

Application.Current Question

MSDN post通过添加对代码的一些引用来说明如何利用Winform中的功能:

您可以先添加对PresentationFramework的引用:

1.在Solution Explorer中,右键单击项目节点,然后单击Add Reference。

2.在“添加引用”对话框中,选择“.NET”选项卡。

3.选择PresentationFramework,然后单击“确定”。

4.添加&#34;使用System.Windows.Shell;&#34;和#34;使用System.Windows;&#34;你的代码。

答案 2 :(得分:1)

恕我直言,其他SO回答并不是真正的Windows窗体,尽管可能不正确。

通常,您会在WinForms中使用ISynchronizeInvoke这样的功能。每个容器控件都实现此接口。

您需要BeginInvoke()方法将呼叫编组回适当的线程。

根据您之前的问题,代码将变为:

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

        }
    }
}

将拥有的Form类传递给SomeObject的构造函数的位置。 PropertyChanged现在将在拥有的表单类的UI线程上引发。