Можно ли развернуть приложение wpf без компиляции xaml?

Можно ли развернуть приложение Windows WPF таким образом, чтобы файлы xaml можно было манипулировать во время выполнения? Если возможно, я бы предположил, что это будет работать аналогично приложению asp.net, которое может развертывать страницы .aspx в качестве контента, которые затем компилируются во время выполнения.

Я хотел бы разрешить редактирование простого макета экрана во время выполнения путем редактирования XAML. Кто-нибудь знает возможно ли это?

Изменить: когда я говорю о файлах xaml, я имею в виду соответствующий xaml для моих классов UIElement. Другими словами, я определил классы UserControl с использованием Xaml и кода программной части, наследования, обработчиков событий, ссылок на сборки и т. д. Когда придет время развертывания, я хотел бы иметь возможность сохранить функциональность кода программной части, но при этом позволить для редактирования.


person YeahStu    schedule 01.12.2008    source источник


Ответы (7)


У меня есть еще одно предложение для вас - реальный вопрос был:

«Я хотел бы разрешить редактирование простого макета экрана во время выполнения путем редактирования 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
comment
это полезное понимание. Мне нужно провести небольшое исследование, чтобы определить, нужно ли мне это делать. - person YeahStu; 04.12.2008
comment
Я буду рад помочь в дальнейшем, если подход звучит так, как вы хотите сделать, но не могу заставить WPF демонстрировать хорошие манеры. daniel.paull на thinkbottomup.com.au, если вам нужно связаться со мной. Привет, Дэн. - person Daniel Paull; 05.12.2008

Спасибо unthinkableMayhem за ссылку.

Проблема с свободным XAML заключается в том, что XamlReader при вызове во время выполнения не может подключать события к функциям в ваших сборках, а также отсутствует механизм для динамической загрузки сборок. То, как обработчики маршрутизируемых событий указываются в XAML, является одним из самых больших недостатков разработки WPF/XAML и делает свободный XAML практически бесполезным.

Работа, которую я проделал по внедрению сценариев Dynamic Language Runtime (DLR) в XAML, полезна как для свободного, так и для скомпилированного XAML. Мое намерение состояло в том, чтобы сделать свободный XAML первоклассным гражданином в WPF, разрешив маршрутизируемые события, команды, преобразователи значений и другие концепции XAML/WPF, доступные в свободном XAML. Я чувствую, что это было достигнуто (хотя в моих блогах не упоминается динамическая загрузка сборок, но это прямолинейно).

Если вы упорствуете, можно развернуть приложение Windows WPF таким образом, чтобы файлы xaml можно было манипулировать во время выполнения. Черт возьми, вы можете динамически генерировать XAML со встроенными скриптами — сборка не требуется. Чувак, это одна из самых забавных вещей, которые я говорил за долгое время.

Однако будьте осторожны: «X» в XAML — это только маркетинговый термин. Он не является расширяемым с инженерной точки зрения, так что ждите мир боли, когда вы сойдете с пути, намеченного Microsoft. Я буду рад помочь, если вы пойдете этим путем - контактные данные на моем веб-сайте (www.thinkbottomup.com.au).

Ваше здоровье,

Дэн

person Daniel Paull    schedule 04.12.2008

Не легко. XAML-приложение WPF транслируется компилятором в .g.cs и .baml, а затем компилируется в двоичный файл.

Конечно, можно создать компилятор XAML во время выполнения. Это было бы непростой задачей, и действительно потребовало бы некоторого размышления о том, почему бы просто не сделать это как веб-сайт!

person TheSoftwareJedi    schedule 01.12.2008

Этот пост в блоге: http://www.thinkbottomup.com.au/site/blog/Embedding_DLR_Scripts_in_XAML_Part_6 содержит некоторую информацию о загрузке XAML во время выполнения, а также другие интересные вещи.

person Andrew Kennan    schedule 01.12.2008

Взгляните на http://xtrememvvm.codeplex.com/.

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

  • Глина

Изменить от 7 октября 2012 г.: По просьбе Роберта Харви я являюсь автором упомянутой выше структуры. Не пытался ничего скрыть, просто не думал, что это актуально, учитывая, что это открытый исходный код. В любом случае, я обязательно раскрою свою принадлежность (если таковая имеется) в любых будущих сообщениях.

person Clay Ver Valen    schedule 26.07.2011
comment
При публикации ответов, которые ссылаются на продукты (коммерческие или иные), принято раскрывать вашу принадлежность в ваш ответ. Дополнительная информация здесь: stackoverflow.com/faq#promotion. - person Robert Harvey; 27.07.2011

XAMLPad и XAML Cruncher делают это, поэтому это должно быть возможно.

Исходный код XAML Cruncher доступен только в книге Чарльза Петцольда по WPF:

http://www.charlespetzold.com/wpf/

Похоже, он использует XamlReader для разбора XAML .

person Lou Franco    schedule 01.12.2008

Вы можете загрузить XAML в приложение во время выполнения, как показано ниже.

UIElement documentRoot = (UIElement)System.Windows.Markup.XamlReader.Load(xmlReader);

Существует понятие «свободный XAML». Свободный XAML — это в основном возможность, которая позволяет вам открывать любой файл XAML на вашем жестком диске (или гиперссылку на веб-странице) и «запускать» его в браузере без компиляции.

Взгляните на этот образец свободной страницы XAML с набором кнопок и настраиваемых шаблонов элементов управления, которые я реализовал, http://www.ria-labs.com/Resources/download.php?file=JellyButton_Theme.xaml в этом блог Он просто открывается в IE. Вы можете загрузить XAML в приложение WPF и использовать его.

person Jobi Joy    schedule 01.12.2008
comment
FWIW, я смог нормально открыть его с помощью FF3. У меня установлен .NET 3.5SP1, если это имеет значение. - person Andy; 01.12.2008
comment
Но на самом деле это не отвечает на вопрос. В ОП конкретно указано, что это приложение WPF, поэтому возможность отображения XAML в веб-браузере совершенно не имеет значения. - person GalacticCowboy; 01.12.2008
comment
Я использовал «Веб-браузер» только для того, чтобы объяснить больше характеристик концепции LooseXAML. - person Jobi Joy; 03.12.2008