WPF: заменить XAML страницы или пользовательский контроль (оба в порядке) во время выполнения? - PullRequest
1 голос
/ 24 июня 2010

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

Но я действительно хочу заменить целоеXAML моей страницы или usercontrol, это тоже возможно?

Причина:

Я хочу дать пользователям моего приложения возможность запустить приложение (запуск занимает много времени - и этоне может быть сокращен из-за некоторых унаследованных проблем) и просто обновите представление с помощью "ctrl + s" в Blend.

1 Ответ

3 голосов
/ 24 июня 2010

Это зависит от того, подключаете ли вы обработчики событий или используете атрибут «Name» или «x: Name» для доступа к элементам пользовательского интерфейса из кода.

Отличное приложение MVVM

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

В этом случае все, что вам нужно сделать, это создать временную копию вашего файла XAML с удаленным атрибутом x: Class и вызвать:

 Application.LoadComponent(this, uriToTemporaryCopy);

Уродливое нечистое не-MVVM приложение

Теперь давайте предположим, что вы использовали элемент с именем x: Name или Name из своего кода (непослушный, непослушный, непослушный!), Или вы подключили обработчик событий, используя XAML (менее непослушный, но не чистый). У вас нет хорошей чистой архитектуры, но вы все равно мне нравитесь.

В этом случае Application.LoadComponent не справится сам с собой, потому что эти настройки требуют интеграции с выделенным кодом. Вам также нужно найти способ вызвать BAML-компилятор.

Поскольку интеграция с выделенным кодом уже скомпилирована в ваш подкласс Page или UserControl, существуют некоторые ограничения:

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

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

Процедура:

  1. Скомпилируйте файл XAML в BAML: A) создайте содержащий проект, B) создайте временный проект и скомпилируйте его, или C) напрямую вызовите задачи компилятора разметки в PresentationBuildTasks.
  2. Используйте Application.LoadComponent для загрузки файла BAML так же, как вы делали для отредактированного файла XAML в чистом решении.

В скомпилированном проекте .csproj все скомпилированные файлы BAML будут находиться в каталоге obj / debug или obj / release с расширением .baml. Если вы вызываете задачу компилятора разметки напрямую, вы можете выбрать место вывода.

Что такое файл BAML?

Для тех, кто не знает, BAML - это в основном сжатая и оптимизированная двоичная форма XAML и способ хранения вашего XAML внутри ваших .exe или .dll. Он также имеет возможности для прямой связи с сгенерированным кодом, которого нет в XAML.

...