Предположим, я создал приложение 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 '.'
Я могу представить, что это происходит, потому что относительные пути не разрешаются должным образом, когда вдругая сборка, но она не дает большой подсказки о том, как решить проблему.