Я нашел причину такого поведения - это по замыслу:
Если ContentControl уже является WPF-элементом, он создается перед его использованием в ContenPresenter . Логический родительский элемент элемента равен , поэтому ContentControl . Я могу проверить это, изменив разметку ContentControl следующим образом:
<ContentControl Template="{StaticResource Test}" TextBlock.FontSize="50">
<TextBlock>
This text now is shown with a size of 50
</TextBlock>
</ContentControl>
В этом примере размер текста равен 50 по желанию. Я могу доказать эту аргументацию также с помощью wpf-визуализатора visual studio. Родителем является ContentControl, и через dp-наследование FontSize берется из родительского (ContentControl), а текст отображается с размером 50!
Другое поведение можно наблюдать, если ContentControl содержит только текст в качестве содержимого:
<Window.Resources>
<ControlTemplate x:Key="Test" TargetType="{x:Type ContentControl}">
<ContentPresenter TextBlock.FontSize="50"/>
</ControlTemplate>
</Window.Resources>
<Grid>
<ContentControl Template="{StaticResource Test}">
This text is shown with a size of 50
</ContentControl>
</Grid>
В этом сценарии TextBox - это , созданный с помощью ContentPresenter , поскольку текст не может быть введен в визуальное дерево. У текстового поля нет родителя, но свойство TemplateParent приводит к ContentPresenter в качестве родителя TextBoxes, а DP-система принимает значение FontSize через наследование свойства присоединенной зависимости от ContentPresenter. Вот почему в этом сценарии размер шрифта изменяется на 50.
Различные сценарии описаны здесь .
Что я не понимаю, так это то, почему VS2010 показывает FontSize 50 перед компиляцией.