WPF: заменить XAML страницы или USERCONTROL (оба в порядке) во время выполнения?
-
29-09-2019 - |
Вопрос
Я знаю, что можно разбирать XAML-файл во время выполнения и создать Uilement, который я могу вставить в мои страницы сетки, нет проблем там.
Но то, что я действительно хочу, это заменить весь Xaml моей страницы или usercontrol, это возможно тоже?
Рассуждения:
Я хочу дать пользователям моего приложения возможность иметь возможность прогона приложений (запуск занимает века - и это не может быть сокращено из-за некоторых устаревших проблем) и просто обновить вид на «Ctrl + S» в смеси.
Решение
Это зависит от того, прикрепите ли вы обработчики событий или используете атрибут «Имя» или «X: Name» для доступа к элементам пользовательских пользователей из кода.
Хорошее чистое приложение MVVM
Сначала давайте предположим, что у вас есть хорошее чистое приложение MVVM, которое использует привязку и команды исключительно, поэтому вы не используете именованные элементы пользовательского интерфейса или кодовые обработчики событий. Хорошо для вас: у вас есть хорошая чистая архитектура приложений, и ты мне нравишься.
В этом случае все, что вам нужно сделать, это создать временную копию вашего файла XAML с удаленным атрибутом X: Class, удаленным и вызовите:
Application.LoadComponent(this, uriToTemporaryCopy);
Уродливое нечистое приложение не MVVM
Теперь давайте предположим, что вы использовали элемент, названный X: Name или имя из вашего кода (непослушный, непослушный, непослушный!), Или вы прикрепили обработчик событий с помощью XAML (менее непослушной, но не чисто). У вас нет хорошей чистой архитектуры, но я все еще люблю тебя.
В этом случае Application.LoadComponent не будет делать хитрость сама по себе, потому что эти настройки требуют интеграции с кодом сзади. Вам также нужно найти способ вызвать компилятор BAML.
Поскольку кодовая интеграция уже скомпилирована на вашу страницу или подкласс USERCONTROL, есть некоторые ограничения:
- Вы не можете добавить, удалить или изменить последовательность заданий обработчиков событий
- Вы не можете изменить имена или последовательности именованных элементов или добавить больше именованных элементов
Если вы соблюдаете эти правила, в целом сгенерированный код, который включен в ваш класс, не изменится, поэтому вы можете загрузить новый файл XAML в запущенное приложение, не нарушая ничего.
Процедура:
- Скомпилируйте XAML-файл в BAML либо на A) Создание содержащего проект, b) Создание временного проекта и составления того, что, или c) непосредственно вызова задач компилятора разметки в представленияхБильдтаз.
- Используйте Application.LoadComponent для загрузки файла BAML так же, как вы сделали для отредактированного файла XAML в чистом решении.
В составленном проекте .csproj любые скомпилированные файлы BAML будут найден в каталоге Obj / Debug или OBJ / выпуска с расширением .baml. Если вы вызываете задачу компилятора разметки напрямую, вы можете выбрать местоположение вывода.
Что такое файл бамля?
Для тех, кто не знает, BAML в основном является сжатой и оптимизированной двоичной формой XAML, и является тем, как ваш XAML хранится внутри вашего .exe или .dll. Он также имеет возможности для связи непосредственно для сгенерированного кода, который XAML не имеет.