WPF: заменить XAML страницы или USERCONTROL (оба в порядке) во время выполнения?

StackOverflow https://stackoverflow.com/questions/3107223

  •  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, есть некоторые ограничения:

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

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

Процедура:

  1. Скомпилируйте XAML-файл в BAML либо на A) Создание содержащего проект, b) Создание временного проекта и составления того, что, или c) непосредственно вызова задач компилятора разметки в представленияхБильдтаз.
  2. Используйте Application.LoadComponent для загрузки файла BAML так же, как вы сделали для отредактированного файла XAML в чистом решении.

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

Что такое файл бамля?

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top