Можно ли использовать расширения разметки XAML 2009 в WPF?

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

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

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

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

x: Расширение расширений ссылок

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

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

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

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

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

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

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

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

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

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

Ответы

Ответ 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