App.xaml
- это декларативная часть вашего кода (обычно генерируемая Visual Studio), расширяющая System.Windows.Application
. Например, Expression Blend может использовать App.xaml
для совместного использования словаря ресурсов или набора данных времени разработки со всем вашим приложением. И поскольку мы используем продукты Microsoft, то, что Expression Blend может делать автоматически, мы можем делать вручную в Visual Studio.
Теперь касательная: Для меня спросить о цели App.xaml
означает спросить о цели для System.Windows.Application
. Не стесняйтесь обвинять меня в том, что я изменил исходный вопрос (пусть цифровой жестоко наступит).
Вы не можете просто открыть System.Windows.Controls.Window
в любой сборке, которая вам нравится ... Крис Селлс, вероятно, говорит мне это в своей книге . Я начал понимать назначение System.Windows.Application
при использовании MEF и MVVM Light для отображения окон WPF в DLLs
(не EXEs
). Я получил такие ошибки:
The type 'System.Windows.Markup.IComponentConnector' is defined in an assembly that is not referenced.
или
The type 'System.Windows.Markup.IQueryAmbient' is defined in an assembly that is not referenced.
Вышеупомянутая ошибка просто говорит о том, что я пытаюсь открыть окно WPF внутри DLL, а не и EXE
. Затем появляется эта ошибка:
The component 'Songhay.Wpf.WordWalkingStick.Views.ClientView' does not have a resource identified by the URI '/Songhay.Wpf.WordWalkingStick;component/views/clientview.xaml'.
Это сводится к отсутствию средства, которое связывает XAML Windows WPF с «кодом» WPF (экземпляр). Это средство связано с WPF EXEs
, а не с WPF DLLs
. Visual Studio автоматически генерирует класс WPF EXE с именем App.g.cs
(в папке \obj\Debug
) с таким вызовом: System.Windows.Application.LoadComponent(this, resourceLocater)
, где resourceLocater
- это переменная с плохим именем, содержащая System.Uri
, указывающая на XAML, подобный ClientView.xaml
упоминалось выше.
Я уверен, что у Криса Селлса есть целая глава о том, как WPF зависит от System.Windows.Application
в самой его жизни. Это моя потеря (в буквальном смысле времени) за то, что я не читал об этом.
Я немного показал себя с этим модульным тестом:
[STAThread]
[TestMethod]
public void ShouldOpenWindow()
{
Application app = new Application();
app.Run(new Window());
}
Если не обернуть новое окно в методе System.Windows.Application.Run()
, из страны СОМ возникнет ошибка: «Почему вы вытащили коврик из-под меня?»