【问题标题】:Why does Application.Current == null in a WinForms application?为什么在 WinForms 应用程序中 Application.Current == null?
【发布时间】:2016-06-24 11:46:04
【问题描述】:

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

我在做:

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

【问题讨论】:

标签: c# winforms


【解决方案1】:

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

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

【讨论】:

  • 我已经有一段时间没有在 C# 中看到 Yoda 条件了。
  • 这看起来不应该工作,但确实有效!查看参考源link 有一个静态字段 _appInstance,它是在第一次调用构造函数时设置的。
【解决方案2】:

恕我直言,其他 SO 答案并不是真正适用于 Windows 窗体的方法,尽管 也许 不正确。

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

您需要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 线程上引发。

【讨论】:

    【解决方案3】:

    基于这个其他 SO 问题,Application.Current 是 WPF 功能而不是 WinForm 功能:Application.Current in ElementHost is null

    有一个MSDN post 展示了如何通过向您的代码添加一些引用来利用 Winform 中的功能:

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

    1.在解决方案资源管理器中,右键单击项目节点,然后单击添加引用。

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

    3.选择PresentationFramework,然后点击OK。

    4.添加“使用System.Windows.Shell;”和“使用 System.Windows;”到你的代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-01
      • 2016-04-04
      • 2011-11-28
      • 1970-01-01
      • 2011-11-10
      • 2012-09-19
      相关资源
      最近更新 更多