У меня есть еще одно предложение для вас - реальный вопрос был:
«Я хотел бы разрешить редактирование простого макета экрана во время выполнения путем редактирования XAML. Кто-нибудь знает, возможно ли это?»
Ответ определенно "ДА"! И есть много способов сделать это, конечно, сделав несколько предположений.
Если вам не нужно обрабатывать события или писать собственные преобразователи значений (или что-либо еще, что обычно идет в коде) в «динамической» части вашего XAML, то вы можете просто использовать класс XamlReader для анализа XAML-файл или строка, содержащая XAML. Поскольку вы просто редактируете макет, я ожидаю, что это предположение верно.
Итак, вот что я бы сделал:
1) Напишите все свои собственные элементы управления, модели данных, преобразователи значений и т. Д. И вставьте их в сборку.
2) Загрузите эту сборку, указав ссылку на нее в приложении или загрузив ее динамически - оба будут работать.
3) Создайте строку / файл / ресурс (на ваш выбор) с вашим XAML, который выполняет компоновку, вместе с отображением вашего пространства имен .NET в пространство имен XML. Убедитесь, что у вас нет атрибута «x: Class» в корневом элементе, поскольку у вас нет кода за файлом! Строка будет использовать стандартные элементы управления WPF (например, StackPanel) для размещения пользовательских элементов управления. (Конечно, вы также можете написать собственные элементы управления макетом).
4) Разрешить пользователю редактировать эту строку. Когда они отредактируют его, используйте XamlReader для анализа файла и затем отобразите полученный UIElement в вашем окне.
BINGO!
Одна проблема - каждый раз, когда XAML изменяется, графический интерфейс отбрасывается и создается новый. Если ваш графический интерфейс насыщен (даже если текущая позиция каретки важна), пользователь будет довольно быстро раздражаться. Это зависит от того, что вы собираетесь использовать - это может не быть проблемой.
Я ожидаю, что после некоторой дополнительной работы вы могли бы написать MarkupExtension, которое используется для ссылки на части, которые вы пытаетесь создать. Таким образом, они могут быть использованы повторно при изменении макета.
Надеюсь, это понятно. Если нет, дайте мне знать, и я смогу расширить концепцию - это сделало бы хорошую запись в блоге.