Это зависит от того, подключаете ли вы обработчики событий или используете атрибут «Name» или «x: Name» для доступа к элементам пользовательского интерфейса из кода.
Отличное приложение MVVM
Сначала давайте предположим, что у вас есть замечательное чистое приложение MVVM, которое использует исключительно привязку и команды, поэтому вы не используете именованные элементы пользовательского интерфейса или обработчики событий с выделенным кодом. Хорошо для вас: у вас хорошая чистая архитектура приложений, и вы мне нравитесь.
В этом случае все, что вам нужно сделать, это создать временную копию вашего файла XAML с удаленным атрибутом x: Class и вызвать:
Application.LoadComponent(this, uriToTemporaryCopy);
Уродливое нечистое не-MVVM приложение
Теперь давайте предположим, что вы использовали элемент с именем x: Name или Name из своего кода (непослушный, непослушный, непослушный!), Или вы подключили обработчик событий, используя XAML (менее непослушный, но не чистый). У вас нет хорошей чистой архитектуры, но вы все равно мне нравитесь.
В этом случае Application.LoadComponent не справится сам с собой, потому что эти настройки требуют интеграции с выделенным кодом. Вам также нужно найти способ вызвать BAML-компилятор.
Поскольку интеграция с выделенным кодом уже скомпилирована в ваш подкласс Page или UserControl, существуют некоторые ограничения:
- Вы не можете добавлять, удалять или изменять последовательность назначений обработчиков событий
- Вы не можете изменить имена или последовательности именованных элементов или добавить больше именованных элементов
Если вы будете соблюдать эти правила, в общем случае сгенерированный код, включенный в ваш класс, не изменится, поэтому вы можете загрузить новый файл XAML в работающее приложение, не нарушая ничего.
Процедура:
- Скомпилируйте файл XAML в BAML: A) создайте содержащий проект, B) создайте временный проект и скомпилируйте его, или C) напрямую вызовите задачи компилятора разметки в PresentationBuildTasks.
- Используйте Application.LoadComponent для загрузки файла BAML так же, как вы делали для отредактированного файла XAML в чистом решении.
В скомпилированном проекте .csproj все скомпилированные файлы BAML будут находиться в каталоге obj / debug или obj / release с расширением .baml. Если вы вызываете задачу компилятора разметки напрямую, вы можете выбрать место вывода.
Что такое файл BAML?
Для тех, кто не знает, BAML - это в основном сжатая и оптимизированная двоичная форма XAML и способ хранения вашего XAML внутри ваших .exe или .dll. Он также имеет возможности для прямой связи с сгенерированным кодом, которого нет в XAML.