EventSetters в теме ResourceDictionary
MSDN говорит о настройках событий:
Настройщики событий не могут использоваться в стиле, который содержится в словаре ресурсов темы. Это связано с тем, что словарь ресурса темы во время выполнения часто является свободным двоичным файлом XAML (BAML) и не имеет какой-либо области определения, где может существовать сопроводительный код, который определяет, что обработчики могут существовать.
Это подтверждается первым ответом на этот вопрос SO, который гласит:
ресурс xaml не может иметь код за файлом, его обычно называют "свободным xaml". Вы можете прочитать об этом в msdn о EventSetter.
Тем не менее, я пока не понимаю ограничений для разработчиков событий. Я попытался использовать файл с кодом для словаря ресурсов. Я назначил обработчик события для события элемента управления, содержащегося в шаблоне, определенном в стиле в указанном словаре ресурсов, - и он сработал.
Добавление объекта события в стиль в том же словаре ресурсов, с другой стороны, приводит к исключению.
Я попал в специальный случай, когда он работает?
Или настройка обработчика событий в шаблоне всегда работает, но если да, то почему я не могу использовать установщик событий в стиле в том же словаре ресурсов?
Мой вопрос сводится к:
Что именно подразумевается под выражением MSDN, что словарь ресурса темы часто является свободным двоичным XAML - как часто, при каких обстоятельствах точно?
Ответы
Ответ 1
Это означает, что он скомпилирован сам по себе не с кодом за или внутри пространства имен.
Или, говоря иначе, нет части кода для свободного файла xaml, его можно было бы считывать из базы данных в виде текста, например, или генерировать "на лету" как текст и загружать без какой-либо кодифицированной ассоциации.
Что касается погоды, это действительная причина или нет. Это касается каждого разработчика, но это то, что означает свободный xaml.
Edit:
В ответ на ваш комментарий, я бы предположил, что они конкретно ссылаются на ресурсы и стили, поскольку они являются наиболее распространенными "свободными файлами", и в большинстве случаев большинство людей не поддерживают их с помощью файла кода. Лично я рассматриваю его как решение. Они могли бы легко добавить атрибут Loose = True и решить эту проблему.
Реально проблема заключается не в объеме свободных файлов, а в частоте, с которой они используются, это связано с тем, что было принято правило для компенсации недостающей функции. Было бы намного проще, если бы они просто сказали, что вы не можете делать x, y, z, потому что у нас нет поддержки для него, вместо того, чтобы сказать, что это из-за некоторого количества свободных xaml файлов.