ContentControl과 ContentPresenter의 차이점은 무엇입니까?


208

언제 ContentPresenter대신 사용해야합니까 ContentControl(반대의 경우) 확실하지 않습니다 . 현재, 나는 ContentControl거의 항상 내 DataTemplates를 사용하고 있습니다. 때 것 ContentPresenter보다 나은 선택이? 그리고 왜?

답변:


164

ContentControl다른 요소를 포함하고 Content속성 이있는 컨트롤의 기본 클래스입니다 (예 :) Button.

ContentPresenter 컨트롤 템플릿 내에서 콘텐츠를 표시하는 데 사용됩니다.

ContentControl직접 사용되는 경우 (기본 클래스로 사용되어야 함) ContentPresenter를 사용하여 해당 컨텐츠를 표시하는 제어 템플릿이 있습니다.

내 경험 법칙 (모든 경우에 해당되는 것은 아니며 판단을 사용하십시오) :

  1. 내부 ControlTemplate사용ContentPresenter
  2. 외부 ControlTemplate( DataTemplate템플릿 포함 및 외부)를 사용하지 마십시오. 필요한 경우 선호해야합니다.ContentPresenter
  3. ContentControl콘텐츠를 호스팅하는 사용자 지정 "lookless"컨트롤을 만들고 기존 컨트롤의 템플릿을 변경하여 동일한 결과를 얻을 수없는 경우 서브 클래스 (매우 드 should니다).

1
그것은 일반적으로 DataTemplates 내에서 ContentPresenter를 사용해야한다는 것을 의미합니까? 더 경량이기 때문입니다 (그러나 DataTemplate에서 이와 같이 사용하면 기능적으로 동일합니다). 그런 다음 새 컨트롤을 작성하는 경우 ContentControl을 기본 클래스로 사용합니까?
Wilka

ContentPresenter를 사용할 때와 ContentControl
Nir

1
Ok ContentPresenter를 ContentControl 대신 템플릿에 사용해야한다는 생각이 들었습니다. 왜 그렇습니까?
sll

32
@sll-ContentControl은 "content"(예 : Label)를 표시하는 모든 컨트롤의 기본 클래스입니다. ContentPresenter는 ContentControl에서 컨텐츠를 표시하기 위해 내부적으로 사용하는 코드입니다. 1. ContentPresenter는 더 가볍고 ContnetPresenter는 그대로 사용되도록 설계되었으며 ContentControl은 확장 (상 속됨)되도록 설계되었습니다
Nir

23
ContentPresenter는 Content 속성이 설정 될 때 ContentControl과 다르게 동작합니다. ContentPresenter의 Content 속성을 설정하면 DataContext가 Content 속성과 일치하도록 변경되지만 ContentControl의 DataContext는 영향을받지 않습니다. DataContext가 일단 변경되면 모든 바인딩이이를 소스로 사용하기 때문에 바인딩을 통해 ContentPresenter에 다른 속성을 설정 한 경우이 문제가 중요합니다.
user195275

25

ContentPresenter는 일반적으로 ControlTemplate에서 "실제 내용을 여기에 넣습니다"라는 자리 표시 자로 사용됩니다.

ContentControl은 템플릿이 아닌 어디에서나 사용할 수 있습니다. 할당 된 컨텐츠 유형에 대해 정의 된 모든 DataTemplate을 선택합니다.


6
ContentPresenter가 DataTemplate을 해당 컨텐츠에 적용하지 않습니까? 그것이 주된 목적이 아닌가?
Drew Noakes

1
음 ... 아마. 어쨌든, Bea Stollnitz의 설명은 나의 것보다 훨씬 낫습니다.)
Thomas Levesque

간결한 답변은 빨리 요약하는 것처럼 보였습니다. ContentPresenter의 전체 디자인은 단순히 DataTemplate 인플레이션을 "구현"하는 것입니다. 그런 다음 최대한 많이 "사라지게"하려고 시도합니다 (아직 확장 된 템플릿 내에서 TextElement 속성과 같은 주변 속성에 바인딩 한 다음 ContentPresenter에서 나올 수 있음). 다른 것에 대해 걱정할 필요가 없으며 템플릿을 비교적 슬림하게 팽창시킵니다. (나는 가장 얇은 찾고 있어요!)
Steven Coco

9

나는 최근에 두 가지 컨트롤에 관한 내 블로그에 게시물을 썼습니다.

ContentPresenter와 ContentControl (편집 : 끊어진 링크는 보관 된 버전으로 대체 됨)

ContentPresenter.ContentSource는 실제로 두 클래스 사이의 가장 큰 차이를 만드는 것입니다. ContentSource 속성은 ControlTemplate 내에서만 의미가 있습니다. 콘텐츠를 매핑 할 TemplatedParent 속성을 결정합니다. 예를 들어, 컨트롤에 종속성 속성이 포함 된 경우 컨트롤 MyProperty1내에 다음이있을 수 있습니다 ControlTemplate.

<ControlTemplate TargetType="MyControl" >
    [...]
       <ContentPresenter ContentSource="MyProperty1" />
    [...]
</ControlTemplate>

ContentPresenter의 컨텐츠는의 값을받습니다 MyProperty1.

속성 이름 이 인 경우 기본값이므로 Content지정할 필요가 없습니다 ContentSource.

앵귤러 J를 아는 사람들에게 : 이것은 메카니즘을 막는 것과 유사합니다.


2

오래된 질문이지만 방금 유니버설 앱을 기반으로 한 템플릿 인 애니메이션 타일 컨트롤 개발을 마치고 싶었습니다. 이전 코드 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은 발표자 컨텐츠로 수행 할 작업을 결정합니다.


1

때로는 이론적 인 전문 용어보다 예제가 더 쉽습니다. 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은 텍스트 만 입력 할 수 있습니다.


2
A는 Button않는다 A [ ContentControl(msdn.microsoft.com/en-us/library/system.windows.controls.contentcontrol (V = vs.110)를 .ASPX)는 A는 (상속) ContentControl. 는 Button ContentPresenter. 표준 Button으로 사용자 정의 할 필요가 없으므로이를 수행 할 수 있습니다.
또는 매퍼

그러나 그와 관련이없는이 답변은 의 내용을 표시하기 위해 ContentPresentera 대신 a를 ContentControl사용할 수 있는지 여부와 이유를 설명하지 않습니다 . 따라서 질문에 대답하지 않습니다. ControlTemplateButton
또는 매퍼
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.