【问题标题】:Application.Current "null" in console application控制台应用程序中的 Application.Current “null”
【发布时间】:2011-09-12 18:12:01
【问题描述】:

我目前正在尝试使用 WPF 组件,该组件利用 WPF 应用程序中的 Application.Current,但是由于多种原因,我从不调用 Application.Run(也不是一个选项)。结果是 NullReferenceException。

我基本上是在尝试从控制台应用程序中显示同一 WPF 窗口的多个实例。 欢迎任何建议(以及 C#/F# 中的代码示例)!

提前致谢

【问题讨论】:

  • 如果您没有Run() 应用程序,那么您就没有Application。你在做什么?
  • 啊,在 WPF 应用程序之外使用 WPF 控件的乐趣。
  • 我正在尝试从多线程控制台应用程序中显示 WPF 窗口。同一个窗口被多次显示的情况也可能而且将会发生,所以情况不太容易! ://
  • 但是你为什么不打电话给Run()?你怎么得到一个消息循环>
  • @emaster70 你需要Run。创建一个隐藏窗口作为您的主窗口,然后您可以关闭一个窗口并在不终止应用程序的情况下生成另一个窗口。现在我可以看到下面的答案正是如此。这就是解决方案。

标签: c# .net wpf multithreading f#


【解决方案1】:

只是为了提供替代解决方案。 可以在不打开任何窗口的情况下保持应用程序运行。对我来说,这感觉不那么“骇人听闻”。 :) http://msdn.microsoft.com/en-us/library/system.windows.application.shutdownmode.aspx

public class AppCode : Application
{
   // Entry point method
   [STAThread]
   public static void Main()
   {
      AppCode app = new AppCode();
      app.ShutdownMode = ShutdownMode.OnExplicitShutdown;
      app.Run();
      ...
      app.Shutdown();
   }
}

编辑: 好的,这有点麻烦。 Application.Run 会阻塞,所以它需要在自己的线程中运行。 当它在自己的线程中运行时,主线程和 ui 线程之间的任何交互最好由 Application.Current.Dispatcher.Invoke 完成。这是一些工作代码,假设您有一个继承自 Application 的类。我正在使用 WPF 项目模板为您创建的经过修改的 App.xaml/App.xaml.cs,以免费获得对 ResourceDictionaries 的良好处理。

public class Program
{
  // Entry point method
  [STAThread]
  public static void Main()
  {
     var thread = new System.Threading.Thread(CreateApp);
     thread.SetApartmentState(System.Threading.ApartmentState.STA);
     thread.Start();

     // This is kinda shoddy, but the thread needs some time 
     // before we can invoke anything on the dispatcher
     System.Threading.Thread.Sleep(100);

     // In order to get input from the user, display a
     // dialog and return the result on the dispatcher
     var result = (int)Application.Current.Dispatcher.Invoke(new Func<int>(() =>
        {
           var win = new MainWindow();
           win.ShowDialog();
           return 10;
        }), null);

     // Show something to the user without waiting for a result
     Application.Current.Dispatcher.Invoke(new Action(() =>
     {
        var win = new MainWindow();
        win.ShowDialog();
     }), null);

     System.Console.WriteLine("result" + result);
     System.Console.ReadLine();

     // This doesn't really seem necessary 
     Application.Current.Dispatcher.InvokeShutdown();
  }

  private static void CreateApp()
  {
     App app = new App();
     app.ShutdownMode = ShutdownMode.OnExplicitShutdown;
     app.Run();
  }
}

【讨论】:

  • 谢谢,这听起来不错,但我实际上是在使用隐藏窗口的调度程序线程来创建和显示其他窗口。在你的例子中我会怎么做?
  • 从来不知道ShutdownMode.OnExplicitShutdown。感谢您发布该消息——许多在 WPF 中构建托盘应用程序的人都在寻找类似的东西。
【解决方案2】:

Application 类的预期行为如下:

  • 第一个打开的窗口是 MainWindow。
  • 列表中唯一的窗口成为主窗口(如果其他窗口 被删除)。
  • 应用程序类被设计为在没有窗口存在时退出 窗口列表。

检查这个link

所以基本上你不能在没有打开任何窗口的情况下运行应用程序。保持窗口打开但隐藏。


如果我误解了您的问题,那么以下类似案例可能会有所帮助:

【讨论】:

  • 我最终按照您建议的隐藏窗口运行。在该窗口的上下文中,通过 Dispatcher.Invoke 调用我实例化和 .Show() 其他窗口。这听起来很讨厌,但目前它有效:)
  • 好吧,从编译器的角度来看,你没有窗口的程序很糟糕:p
猜你喜欢
  • 2016-06-24
  • 1970-01-01
  • 2010-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-22
  • 2012-06-20
  • 2015-08-23
相关资源
最近更新 更多