WPF WindowLess MessageBox

Я пытаюсь преобразовать очень маленькое консольное приложение С# в приложение WPF. Он принимает некоторые параметры, выполняет некоторую работу и может вызывать MessageBox.

Я перемещаю его из консольного приложения в WPF, потому что оно должно работать невидимым, если только оно не имеет сообщения об ошибке.

До сих пор заминка заключалась в том, чтобы показать MessageBox. Ниже приведена очень короткая версия, которая компилируется, запускается... но не показывает MessageBox.

namespace MyApp{
  public class EntryPoint {
    [STAThread]
    public static void Main(string[] args) {
        App app = new App();
        app.Run();
        MessageBox.Show("test", "test", MessageBoxButton.YesNo, MessageBoxImage.Question);
    }
  }
}

Кто-нибудь знает, как заставить этот надоедливый MessageBox отображаться без главного окна программы?


person ltwally    schedule 11.04.2016    source источник
comment
app.Run не завершится до тех пор, пока программа не завершится, поэтому вызов MessageBox не будет выполняться, как вы ожидаете. Вам придется переместить MessageBox в другое место кода. Мы не можем дать более конкретную информацию, потому что вы не показали нам никакого другого кода.   -  person Bradley Uffner    schedule 11.04.2016
comment
Это буквально все, что нужно. Я совершенно новичок в WPF и не знаю, как создать приложение без окон.   -  person ltwally    schedule 12.04.2016
comment
Вы можете поместить весь свой код в событие запуска приложения в app.xaml и избавиться от всех форм.   -  person Bradley Uffner    schedule 12.04.2016
comment
Это буквально мое первое приложение WPF, и я понятия не имею, как делать то, о чем вы говорите. Единственный код в файле XAML - это код по умолчанию, созданный VS... и все это связано с главным окном программы, которое я с тех пор удалил из файла CS.   -  person ltwally    schedule 14.04.2016
comment
Я добавлю ответ с некоторым кодом.   -  person Bradley Uffner    schedule 14.04.2016


Ответы (2)


Лучше всего попробовать запустить код в событии Startup приложения. Имейте в виду, что WPF на самом деле не был предназначен для использования таким образом, поэтому могут быть некоторые странные особенности.

Начните с открытия «App.xaml» в обозревателе решений. Корень XAML должен выглядеть примерно так:

<Application x:Class="Configurator.Application.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:local="clr-namespace:FoodSafetyConfigurator"
             xmlns:s="clr-namespace:Configurator.Application.Properties"
             StartupUri="MainForm.xaml">

Удалите атрибут StartupUri="MainForm.xaml" и замените его на Startup="App_OnStartup". Это остановит WPF от отображения окна по умолчанию и привяжет событие запуска к методу в «App.xaml.cs» с именем App_Starup.

Теперь разверните «App.xaml» в обозревателе решений и откройте «App.xaml.cs»; это код файла для «App.xaml». Добавьте метод с именем App_OnStartup, который будет целью события, которое мы прикрепили ранее. Это должно выглядеть примерно так:

private void App_OnStartup(object sender, StartupEventArgs e)
{
    //Your code goes here.
}

Добавьте сюда любой код, который вы хотите запустить. Любые окна сообщений, отображаемые с помощью MessageBox.Show(), должны отображаться правильно, но я на самом деле не проверял это.

person Bradley Uffner    schedule 14.04.2016
comment
Прошу прощения... но это действительно мое первое приложение WPF. И я не уверен, куда поместить описанную вами функцию в файле App.xaml.cs. - person ltwally; 14.04.2016
comment
В любом месте класса - person Bradley Uffner; 14.04.2016
comment
Итак, вы имеете в виду, что это заменяет Main() ? - person ltwally; 14.04.2016
comment
Да, в этом сценарии App_OnStartp будет действовать как метод Main из вашего консольного приложения. - person Bradley Uffner; 14.04.2016
comment
Ошибка 1 «MyApp.App» не содержит определения для «App_OnStartup», и не удалось найти метод расширения «App_OnStartup», принимающий первый аргумент типа «MyApp.App» (вам не хватает директивы using или ссылки на сборку?) - person ltwally; 14.04.2016
comment
Вы добавили метод App_OnStartup в класс App в App.xaml.cs? - person Bradley Uffner; 14.04.2016

В итоге я остановился на стандартном приложении Windows Forms и просто удалил форму. Выяснение того, как заставить WPF сделать это, отнимало много времени, разочаровывало и, в конечном счете, потерпело неудачу. Формы могут быть не в моде, но это работает.

person ltwally    schedule 21.04.2016