Подтвердить что ты не робот

Application.Current "null" в консольном приложении

В настоящее время я пытаюсь использовать компонент WPF, который использует Application.Current из приложения WPF, однако из-за нескольких причин я никогда не называю Application.Run(и это не опция). Результатом является исключение NullReferenceException.

В основном я пытаюсь отобразить несколько экземпляров одного и того же окна WPF из того, что будет консольным приложением. Любые советы (и примеры кода в С#/F #) будут приветствоваться!

Заранее спасибо

4b9b3361

Ответ 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();
   }
}

EDIT: Хорошо, это немного громоздко. Application.Run будет блокироваться, поэтому он должен запускаться в своем потоке. Когда он запускается в своем потоке, любое взаимодействие между вашим основным потоком и вашим потоком ui лучше всего делать с помощью Application.Current.Dispatcher.Invoke. Вот какой рабочий код, который предполагает, что у вас есть класс, который наследуется от приложения. Я использую модифицированный файл App.xaml/App.xaml.cs, который создает для вас шаблон проекта WPF, чтобы получить бесплатную обработку 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();
  }
}

Ответ 2

Ниже приведено предполагаемое поведение класса Application:

  • Первое открытое окно - MainWindow.
  • Единственное окно в списке становится MainWindow (если другие удаляться).
  • Класс приложения предназначен для выхода, если в нем нет окон список окон.

Проверьте ссылку .

Таким образом, вы не можете запускать приложение без открытого окна. Держите окно открытым, но скрытым.


Если я неправильно понял вашу проблему, возможно, следующие похожие случаи могут помочь: