답변:
ContentControl
다른 요소를 포함하고 Content
속성 이있는 컨트롤의 기본 클래스입니다 (예 :) Button
.
ContentPresenter
컨트롤 템플릿 내에서 콘텐츠를 표시하는 데 사용됩니다.
ContentControl
직접 사용되는 경우 (기본 클래스로 사용되어야 함) ContentPresenter를 사용하여 해당 컨텐츠를 표시하는 제어 템플릿이 있습니다.
내 경험 법칙 (모든 경우에 해당되는 것은 아니며 판단을 사용하십시오) :
ControlTemplate
사용ContentPresenter
ControlTemplate
( DataTemplate
템플릿 포함 및 외부)를 사용하지 마십시오. 필요한 경우 선호해야합니다.ContentPresenter
ContentControl
콘텐츠를 호스팅하는 사용자 지정 "lookless"컨트롤을 만들고 기존 컨트롤의 템플릿을 변경하여 동일한 결과를 얻을 수없는 경우 서브 클래스 (매우 드 should니다).ContentPresenter는 일반적으로 ControlTemplate에서 "실제 내용을 여기에 넣습니다"라는 자리 표시 자로 사용됩니다.
ContentControl은 템플릿이 아닌 어디에서나 사용할 수 있습니다. 할당 된 컨텐츠 유형에 대해 정의 된 모든 DataTemplate을 선택합니다.
나는 최근에 두 가지 컨트롤에 관한 내 블로그에 게시물을 썼습니다.
ContentPresenter와 ContentControl (편집 : 끊어진 링크는 보관 된 버전으로 대체 됨)
ContentPresenter.ContentSource는 실제로 두 클래스 사이의 가장 큰 차이를 만드는 것입니다. ContentSource 속성은 ControlTemplate 내에서만 의미가 있습니다. 콘텐츠를 매핑 할 TemplatedParent 속성을 결정합니다. 예를 들어, 컨트롤에 종속성 속성이 포함 된 경우 컨트롤 MyProperty1
내에 다음이있을 수 있습니다 ControlTemplate
.
<ControlTemplate TargetType="MyControl" >
[...]
<ContentPresenter ContentSource="MyProperty1" />
[...]
</ControlTemplate>
ContentPresenter의 컨텐츠는의 값을받습니다 MyProperty1
.
속성 이름 이 인 경우 기본값이므로 Content
지정할 필요가 없습니다 ContentSource
.
앵귤러 J를 아는 사람들에게 : 이것은 메카니즘을 막는 것과 유사합니다.
오래된 질문이지만 방금 유니버설 앱을 기반으로 한 템플릿 인 애니메이션 타일 컨트롤 개발을 마치고 싶었습니다. 이전 코드 WP7 / 8 SDK 에서이 코드를보십시오.
<ContentControl x:Name="contentControl" HorizontalAlignment="Stretch" HorizontalContentAlignment="Stretch" VerticalAlignment="Stretch" VerticalContentAlignment="Stretch">
<ContentPresenter x:Name="contentPresenter" CacheMode="BitmapCache"/>
</ContentControl>
여기서 ContentControl이 컨테이너를 표시하고 컨텐츠를 표시하는 발표자를 볼 수 있습니다. 대부분의 경우 ControlTemplate은 컨테이너가되지만 ControlTemplate
다른 컨테이너에 원하는 경우 추가 컨테이너를 넣을 수 있습니다. 컨테이너 ContentControl
에 별도의 내용을 표시하십시오 ContentPresenter
. 별도의 용기를 필요가없는 경우 만 사용 ControlTemplate
하고ControlPresenters
최소한 WP7 / 8 SDK를 개발할 때 콘텐츠 블록을 표시하는 것입니다. ContentControl을 사용하여 내용을 표시 할 수도 있지만 컨테이너와 발표자 역할을합니다. 따라서 위의 샘플 코드에서 그 목적은 Container and Presenter로 나뉩니다. 동적 샘플에서는 컨테이너를 표시하고 (빈 배경 또는 아직없는 것) 프리젠 테이션 컨텐츠로 동적으로 채울 수 있습니다. 컨테이너에는 크기 (너비, 높이 등)가 있으며 컨테이너 속성에 해당 속성을 넣고 내용을 표시합니다. 샘플에서 ContentControl은 발표자 컨텐츠로 수행 할 작업을 결정합니다.
때로는 이론적 인 전문 용어보다 예제가 더 쉽습니다. MS 웹 사이트 (맨 아래로 스크롤 : http://msdn.microsoft.com/en-us/library/system.windows.controls.contentpresenter(v=vs.110).aspx )에서 다음과 같이 단추를 사용합니다. 예. 버튼에는 ContentControl이있어 Image, Text, CheckBox, StackPanel, Grid 등 어떤 컨트롤이나 사용자 정의 컨트롤을 배치 할 수 있습니다.
Xaml에서 Button을 사용자 정의한 후 다음을 작성할 수 있습니다.
<my:Button>
<my:Button.Content>
<my:AnotherControl>
</my:Button.Content>
</my:Button>
위의 예제 코드에서 "my : Button.Content"는 ContentControl입니다. AnotherControl은 ContentPresenter가있는 위치에 지정한 위치에 배치됩니다.
마찬가지로 TextBox와 TextBlock을 비교할 때 TextBox에는 위의 Button 예제와 마찬가지로 내용을 넣을 수있는 ContentPresenter가 있지만 TextBlock은 그렇지 않습니다. TextBlock은 텍스트 만 입력 할 수 있습니다.
Button
않는다 가 A [ ContentControl
(msdn.microsoft.com/en-us/library/system.windows.controls.contentcontrol (V = vs.110)를 .ASPX)는 A는 (상속) ContentControl
. 는 Button
이 을 ContentPresenter
. 표준 Button
으로 사용자 정의 할 필요가 없으므로이를 수행 할 수 있습니다.
ContentPresenter
a 대신 a를 ContentControl
사용할 수 있는지 여부와 이유를 설명하지 않습니다 . 따라서 질문에 대답하지 않습니다. ControlTemplate
Button