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