Application.Current“空"在控制台应用程序中 [英] Application.Current "null" in console application

查看:17
本文介绍了Application.Current“空"在控制台应用程序中的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I'm currently trying to use a WPF component that makes use of Application.Current from a WPF application, however due to several reasons I never call Application.Run (nor is that an option). The result is a NullReferenceException.

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

I'm basically trying to display multiple instances of the same WPF window from what would be a console application. Any advice (and code samples in C#/F#) would be welcome!

提前致谢

推荐答案

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

Just to offer an alternative solution. It is possible to keep an application running without any windows open. To me this feels less 'hackish'. :) 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 的良好处理.

Ok this got a bit cumbersome. Application.Run will block, so it needs to run in its own thread. When it does run in its own thread, any interaction between your main thread and your ui thread had best be done by Application.Current.Dispatcher.Invoke. Here is some working code, that assumes you have a class that inherits from Application. I'm using a modified App.xaml/App.xaml.cs that a WPF project template creates for you, to get nice handling of ResourceDictionaries for free.

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

这篇关于Application.Current“空"在控制台应用程序中的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆