Можно ли развернуть приложение wpf без компиляции xaml? - PullRequest
7 голосов
/ 01 декабря 2008

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

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

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

Ответы [ 7 ]

7 голосов
/ 04 декабря 2008

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

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

Ответ определенно "ДА"! И есть много способов сделать это, конечно, сделав несколько предположений.

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

Итак, вот что я бы сделал:

1) Напишите все свои собственные элементы управления, модели данных, преобразователи значений и т. Д. И вставьте их в сборку.

2) Загрузите эту сборку, указав ссылку на нее в приложении или загрузив ее динамически - оба будут работать.

3) Создайте строку / файл / ресурс (на ваш выбор) с вашим XAML, который выполняет компоновку, вместе с отображением вашего пространства имен .NET в пространство имен XML. Убедитесь, что у вас нет атрибута «x: Class» в корневом элементе, поскольку у вас нет кода за файлом! Строка будет использовать стандартные элементы управления WPF (например, StackPanel) для размещения пользовательских элементов управления. (Конечно, вы также можете написать собственные элементы управления макетом).

4) Разрешить пользователю редактировать эту строку. Когда они отредактируют его, используйте XamlReader для анализа файла и затем отобразите полученный UIElement в вашем окне.

BINGO!

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

Я ожидаю, что после некоторой дополнительной работы вы могли бы написать MarkupExtension, которое используется для ссылки на части, которые вы пытаетесь создать. Таким образом, они могут быть использованы повторно при изменении макета.

Надеюсь, это понятно. Если нет, дайте мне знать, и я смогу расширить концепцию - это сделало бы хорошую запись в блоге.

7 голосов
/ 04 декабря 2008

Спасибо, немыслимый Майхем за ссылку.

Проблема со свободным 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).

Приветствия

Dan

5 голосов
/ 01 декабря 2008

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

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

2 голосов
/ 27 июля 2011

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

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

  • Клей

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

2 голосов
/ 02 декабря 2008

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

0 голосов
/ 01 декабря 2008

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

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

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

Посмотрите этот пример свободной страницы XAML, в которой есть набор кнопок и пользовательских шаблонов управления, которые я реализовал, http://wpf.ria -labs.com / ux.xaml в этом блоге Он просто открывается в IE. Вы можете загрузить XAML в приложение WPF и использовать его.

0 голосов
/ 01 декабря 2008

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...