В чем разница между следующими спецификациями TargetType?

1 .

<Style TargetType="{x:Type Button}" ...

2 .

<Style TargetType="Button" ...

Кажется, оба работают нормально.

3
vkrzv 30 Авг 2011 в 14:46

2 ответа

Лучший ответ

В первом примере расширение разметки Type создает экземпляр Type, указанный в данной строке, то есть Button.

Во втором примере преобразователь типов, связанный со свойством TargetType, преобразует строку "Button" в требуемую Type.

Оба дают одинаковый результат . Примечательно, что в Silverlight не существует расширения разметки Type, поэтому возможно только (2).

3
ColinE 30 Авг 2011 в 10:59

Извините за такую ​​старую ветку, но я чувствую, что оно того стоит. Недавно я столкнулся с ситуацией, которая показывает, что x:Type отличается от TypeName-as-String . По моему опыту -

x: Type учитывает строгое имя или версию сборки, но не TypeName-as-String .

Я объяснил свой сценарий и другие детали в моем блоге здесь -

http://weblogs.asp.net/akjoshi/archive/2012/02/03/importance-of-specifying-ancestortype-with-x-type-in-relativesourcebinding.aspx

Кроме того, существует разница в том, как WPF определяет тип. Для x: Type используется TypeExtension, тогда как для TypeName-as-String используется FrameworkElementFactory.

Согласно MSDN -

Свойства типа, поддерживающие Typename-as-String

WPF поддерживает методы, которые позволяют указывать значение некоторых свойств типа Type без необходимости использования расширения разметки x: Type. Вместо этого вы можете указать значение в виде строки, которая называет тип. Примерами этого являются ControlTemplate.TargetType и Style.TargetType. Поддержка такого поведения не обеспечивается ни преобразователями типов, ни расширениями разметки. Вместо этого это отложенное поведение, реализованное через FrameworkElementFactory.

http://msdn.microsoft.com/en-us/library/ms753322.aspx

1
akjoshi 17 Янв 2016 в 07:54