2008-12-01 2 views
6

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

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

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

ответ

6

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

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

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

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

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

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

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

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

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

BINGO!

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

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

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

5

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

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

0

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

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

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

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

1

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

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

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

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

+0

FWIW, я смог открыть его с помощью FF3. У меня установлен .NET 3.5SP1, если это имеет значение. – Andy 2008-12-01 17:23:53

+0

Но это не отвечает на вопрос. OP конкретно заявила, что это приложение WPF, поэтому способность XAML, отображаемая в веб-браузере, совершенно не относится к делу. – GalacticCowboy 2008-12-01 18:54:31

+0

Я использовал «веб-браузер», чтобы объяснить больше характеристик концепции LooseXAML. – 2008-12-02 22:38:45

7

Спасибо вам немыслимоMayhem для справки.

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

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

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

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

Cheers,

Dan

2

Посмотрите на http://xtrememvvm.codeplex.com/

Это позволяет позволяет использовать свободные XAML-файлы, но все-таки зацепить в события, связывания данных и маршрутизации команд.

  • Клей

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

Смежные вопросы