ContentControl is a base class for controls that contain other elements and have a Content-property (for example, Button).
ContentPresenter is used inside control templates to display content.
ContentControl, when used directly (it’s supposed to be used as a base class), has a control template that uses ContentPresenter to display it’s content.
My rules of thumb (not applicable in every case, use your judgment):
- Inside
ControlTemplateuseContentPresenter - Outside of
ControlTemplate(includingDataTemplateand outside templates) try not to use any of them, if you need to, you must preferContentPresenter - Subclass
ContentControlif you are creating a custom “lookless” control that host content and you can’t get the same result by changing an existing control’s template (that should be extremely rare).