Могут ли расширения, связанные с XAML 2009, использоваться в WPF?

Я говорю о расширениях, таких как x:Reference а также x:FactoryMethodколлективно появляются здесь. Я читаю много противоречивой информации в Интернете, в том числе на MSDN, Stackru и из других источников.

Я поговорю о x:Reference в качестве примера, но я на самом деле имею в виду и другие расширения разметки. Основными причинами путаницы являются следующие выдержки из MSDN:

Поддержка языков XAML 2009 в WPF

В WPF вы можете использовать функции XAML 2009, но только для XAML, который не скомпилирован с разметкой WPF. Скомпилированный с разметкой XAML и форма XAML BAML в настоящее время не поддерживают ключевые слова и функции языка XAML 2009. Обратите внимание, что существующие методы загрузки свободного XAML в WPF также имеют возможные ограничения безопасности и доступа к типам CLR и системе типов, которые являются более строгими, чем для XAML, скомпилированного с разметкой. Для получения дополнительной информации см. Безопасность (WPF) или Стратегия безопасности WPF - Безопасность платформы. В XAML 2009 также представлены дополнительные функции, которые либо изменяют предыдущие конструкции XAML 2006, либо изменяют базовые формы разметки.

x: Расширение ссылочной разметки

x: Ссылка - это конструкция, определенная в XAML 2009. В WPF вы можете использовать функции XAML 2009, но только для XAML, который не скомпилирован с разметкой WPF. Скомпилированный с разметкой XAML и форма XAML BAML в настоящее время не поддерживают ключевые слова и функции языка XAML 2009.

Тем не менее, следующий абзац появляется непосредственно перед предыдущим абзацем (то есть x:Reference).

В WPF и XAML 2006 ссылки на элементы рассматриваются с помощью функции уровня структуры привязки ElementName. Для большинства приложений и сценариев WPF все еще следует использовать привязку ElementName. Исключения из этого общего руководства могут включать случаи, когда существуют контекст данных или другие соображения, связанные с областью применения, которые делают нецелесообразным привязку данных, и когда компиляция разметки не участвует.

Здесь нет прямого противоречия, но этот параграф говорит, что можно использовать x:Reference в приложениях. Кроме того, этот пункт о x:Reference кажется, автоматически генерируется и может быть устаревшим.

Затем у нас есть следующий отрывок из книги "WPF 4 Unleashed":

Расширение разметки x:Reference часто ошибочно ассоциируется с функциями XAML2009, которые могут использоваться только из свободного XAML на момент написания этой статьи. Хотя x:Reference является новой функцией в WPF 4, ее можно использовать с XAML2006 очень хорошо, если ваш проект нацелен на версию 4 или более позднюю.NET Framework.

У нас также есть следующие вопросы Stackru, некоторые с противоречивыми ответами, и ни один из них не является явно правильным:

  1. Что будет альтернативой x:Reference?
  2. XAML 2009 - x: Ссылка - есть ли недостатки в использовании этого?
  3. Когда разрешается x:Reference в WPF и почему порядок элементов XAML влияет на это?

Наконец, я лично использовал x:Reference расширение, и кажется, что оно работает в приложениях WPF, что бы ни говорилось в MSDN, хотя Visual Studio иногда жалуется на странные вещи (или это может быть ReSharper), такие как исключения нулевой ссылки в разметке.

Приступая к актуальным вопросам,

  1. Можно ли использовать XAML 2009 (полностью или частично) в приложениях WPF?
  2. Могут ли эти конкретные расширения использоваться при написании приложений WPF? Есть ли ограничения в их использовании?
  3. Почему так много путаницы во всем этом?

1 ответ

Решение

Начну с конца:


Why is there so much confusion regarding all of this?

Возможно, потому что до сих пор, включая версию WPF 4.5, практически полностью отсутствует поддержка XAML 2009. Цитата Freestyle от Matthew MacDonald WPF 4.5, Chapter 2 книга:

Минимальное улучшение XAML 2009 все еще не полностью реализован. Они поддерживают только не связанные файлы XAML, но не тип ресурса Page (скомпилированный ресурс), которые используются везде. Наверное, XAML 2009 никогда не будет полностью интегрированной частью WPF, поскольку при условии, что улучшения особенно не важны, и любое изменение в компиляторе XAML создает проблемы безопасности и производительности.

Что касается будущего XAML 2009, то мы не можем точно сказать, когда он будет полностью поддерживать, но мы знаем, что на данный момент его не существует.


Can these specific extensions be used in writing WPF applications? Are there any limitations in using them?

Да, некоторые расширения могут использоваться в WPF 4.0 и WPF 4.5, например: x:Array и другие типы, а также x:Reference, x:FactoryMethod, Я лично использую типы в XAML 2009 и не заметил никаких ошибок.

О x:Reference Можно сказать, что в Visual Studio 2010 он не работает как надо: при использовании x:Reference как цель некоторых Control дизайнер Visual Studio бросает InvalidOperationException исключение с сообщением:

У поставщика услуг отсутствует служба INameResolver.

Проект будет компилироваться и выполняться без каких-либо проблем, но Design холст, где x:Reference Появление будет отключено из-за исключения. Лично у меня это иногда появляется, иногда нет, но это следует игнорировать.

Но я почти точно знаю, что в версии WPF 4.5 и, возможно, для Visual Studio больше, чем в 2010 году, эта ошибка была исправлена. Для получения дополнительной информации см. Это link,

Около x:FactoryMethod и здесь не все прошло гладко, для меня в WPF 4.0 программа VisualStudio 2010 не компилируется с ним. Также был создан баг-отчет по connect.microsoft.com Но представители Microsoft сказали, что:

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


Can XAML 2009 be used (in whole or in part) in WPF applications?

Определенный ответ: частично можно использовать, но, возможно, не для каждой версии WPF и Visual Studio.

Если ваш проект планируется в будущем портировать на версию WPF < 4.0 или более позднюю или на другие платформы, такие как Silverlight, Windows Phone, я думаю, что лучше избегать XAML 2009, потому что нет никаких гарантий, что они будут им по крайней мере частично поддерживается. Например, в Silverlight в XAML 2009 нет поддержки, даже XAML 2006 поддерживается не полностью. Может случиться так, что большая часть проекта может зависеть от XAML 2009, соответственно придется потратить определенное количество времени и ресурсов, чтобы избавиться от этой зависимости. В этой ситуации лучше использовать более универсальные решения.

Если вы используете WPF 4.0 и выше, и нет плана, перенесенного на другие платформы, я думаю, что частично можно будет использовать XAML 2009 после его тестирования.

Для получения дополнительной информации я рекомендую ознакомиться с нотацией XAML 2009:

MSDN: Microsoft Domain-Specific Languages

Другие вопросы по тегам