При запуске приложения WPF из консольного приложения App.xaml игнорируется - PullRequest
2 голосов
/ 13 мая 2019

Предположим, я создал приложение WPF, назовем его TestApplication, используя шаблон по умолчанию в Visual Studio 2019, т. Е. У меня настроены App.xaml, App.xaml.cs, MainWindow.xaml и MainWindow.xaml.cs.

Затем я пытаюсь запустить это приложение WPF программно из консольного приложения в другой сборке через

[STAThread]
static void Main(string[] args)
{
    var app = new TestApplication.App();
    app.Run();
}

Теперь это не будет работать само по себе. первая часть этого ответа предоставляет один альтернативный подход: если я изменю app.Run() на app.Run(new TestApplication.MainWindow()), тогда MainWindow фактически откроется.

Однако, похоже, что так и должно бытьобязательно: по умолчанию App.xaml включает в свое определение <Application /> a StartupUri="MainWindow.xaml", что предполагает, что он каким-то образом сможет найти MainWindow самостоятельно.

В общем, App.xaml кажется, полностью игнорируется с помощью этого подхода;в мою настройку я включил коллекцию ResourceDictionary в App.xaml, и они просто не будут загружаться.

Итак, есть ли какой-то способ запустить приложение WPF программно, который учитываетсодержимое XAML?

Редактировать: немного поиграв, я понял, что InitializeComponent отвечает за обработку этого для окон и пользовательских элементов управления.Как подсказывает также этот ответ , изменение приведенного выше кода на

[STAThread]
static void Main(string[] args)
{
    var app = new TestApplication.App();
    app.InitializeComponent();
    app.Run();
}

действительно продвигает меня на один шаг вперед, но тогда у меня остается

System.IO.IOException : 'Не удается найти ресурс' mainwindow.xaml '.'

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

1 Ответ

1 голос
/ 13 мая 2019

Похоже, достаточно также вручную перезаписать Application.StartupUri следующим образом:

[STAThread]
static void Main(string[] args)
{
    var app = new TestApplication.App();
    app.InitializeComponent();
    app.StartupUri = new Uri($"pack://application:,,,/TestApplication;component/{app.StartupUri}");
    app.Run();
}

Хотя это не самое удовлетворительное решение в мире, оно, похоже, выполняет свою работу в том смысле, что все другие относительные пути в App.xaml переводятся, как и ожидалось; в частности, если я включу в App.xaml a ResourceDictionary с Source, скажем, Style.xaml, то это также будет правильно воспринято консольным приложением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...