Основное различие между этими двумя вещами заключается в том, что ControlTemplate определяет внешний вид элемента управления. Это на самом деле не размещение контента внутри него. В каком-то месте внутри элемента управления контентом должна быть какая-то форма ContentPresenter . Встроенные элементы управления способны на это, потому что они являются так называемыми «элементами без внешнего вида» , и любые созданные пользовательские элементы управления также должны быть без внешнего вида. Когда элемент управления не шаблонизирован без внешнего вида, а вместо этого имеет статическую компоновку, может возникнуть путаница, с которой вы столкнулись.
Что касается правильного способа делать вещи, это зависит от того, чего вы пытаетесь достичь. Если вы пытаетесь изменить элемент управления, такой как внешний вид или поведение, то с использованием ControlTemplate (или DataTemplate, в зависимости от того, что вы используете в качестве шаблона), безусловно, является подходящим вариантом. Хорошим примером этого является CheckBox, верите или нет, CheckBox на самом деле является ToggleButton ( более или менее ), который через через шаблон отображает возможность переключения в пуле. Вот еще один очень хороший пример того, как вы можете использовать шаблоны, чтобы делать очень изящные вещи.
ControlTemplates также следует применять через стили , вместо того, чтобы непосредственно устанавливать элемент.
Если вы на самом деле не стремитесь изменить поведение или внешний вид элемента управления, тогда использование модели содержимого является правильным подходом.
WPF делает это лучше, чем Silverlight , хотя я не знаю, есть ли улучшения в SL3.