ContentControl과 ContentPresenter의 차이점은 무엇입니까?
-
18-09-2019 - |
문제
언제 사용해야 할지 모르겠어요 ContentPresenter
대신에 ContentControl
(그 반대).현재 제가 사용하고 있는 것은 ContentControl
내 안에는 거의 항상 DataTemplate
에스.언제 ContentPresenter
더 나은 선택이 될까요?그리고 왜?
해결책
ContentControl
다른 요소를 포함하고있는 컨트롤의 기본 클래스입니다. Content
-Property (예 : Button
).
ContentPresenter
제어 템플릿 내부에서 컨텐츠를 표시하기 위해 사용됩니다.
ContentControl
, 직접 사용하면 (기본 클래스로 사용되어야 함) ContentPresEnter를 사용하여 컨텐츠를 표시하는 컨트롤 템플릿이 있습니다.
내 경험 규칙 (모든 경우에 적용되는 것은 아니며 판단을 사용합니다) :
- 내부에
ControlTemplate
사용ContentPresenter
- 밖의
ControlTemplate
(포함DataTemplate
그리고 외부 템플릿) 템플릿을 사용하지 마십시오. 필요한 경우 선호해야합니다.ContentPresenter
- 아강
ContentControl
호스트 컨텐츠를 호스트하는 "Lookless"컨트롤을 작성하고 기존 컨트롤 템플릿을 변경하여 동일한 결과를 얻을 수없는 경우 (매우 드물게) 동일한 결과를 얻을 수 없습니다.
다른 팁
ContentPresenter는 일반적으로 "실제 콘텐츠를 여기에 넣는"자리 표시 자로 ControlTemplate에서 사용됩니다.
템플릿에서는 콘텐츠 구성이 어디에서나 사용할 수 있습니다. 지정된 컨텐츠 유형에 대해 정의 된 DataTemplate을 선택합니다.
최근 에이 두 가지 컨트롤에 관한 블로그에 게시물을 썼습니다.
ContentPresenter vs ContentControl (편집 : 깨진 링크가 아카이브 버전으로 대체되었습니다.)
그만큼 ContentPresenter.ContentSource 실제로 두 클래스의 가장 큰 차이를 만드는 것입니다. ContentSource 속성은 ControlTemplate 내에서만 의미가 있습니다. 컨텐츠를 맵핑 해야하는 템플릿 배치 속성을 결정합니다. 예를 들어, 컨트롤에 종속성 속성이 포함 된 경우 MyProperty1
, 그러면 우리는 그 내에서 다음을 찾을 수 있습니다 ControlTemplate
:
<ControlTemplate TargetType="MyControl" >
[...]
<ContentPresenter ContentSource="MyProperty1" />
[...]
</ControlTemplate>
ContentPresenter의 내용은 다음의 가치를 받게됩니다. MyProperty1
.
부동산의 이름이 Content
, 지정할 필요가 없습니다 ContentSource
기본값이므로.
Angularjs를 아는 사람들에게 : 이것은 메카 니즘을 횡단하는 것과 유사합니다.
때로는 이론적인 전문 용어보다 예가 더 쉽습니다.MS 웹사이트(아래로 스크롤: http://msdn.microsoft.com/en-us/library/system.windows.controls.contentpresenter(v=vs.110).aspx), 버튼을 예로 사용합니다.Button에는 하나의 컨트롤이나 Image, Text, CheckBox, StackPanel, Grid 등의 사용자 정의 컨트롤을 배치할 수 있는 ContentControl이 있습니다.
Button을 사용자 정의한 후 이제 Xaml에서 다음을 작성할 수 있습니다.
<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을 사용하면 텍스트만 입력할 수 있습니다.
그것의 오래된 질문이지만 나는 단지 Universal 앱을위한 템플릿 인 애니메이션 타일 컨트롤 개발을 마치고 있었는데, 오래된 전화 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
컨텐츠 블록을 표시하기 위해 최소한 Microsoft의 사람들이 WP7/8 SDK를 개발했을 때 한 일입니다. ContentControl은 컨텐츠를 표시하는 데 사용될 수도 있지만 컨테이너 및 발표자 역할을합니다. 따라서 위의 샘플 코드에서 목적은 컨테이너와 발표자로 나뉩니다. 동적 샘플에서는 컨테이너를 표시 할 수 있습니다 (아직 빈 배경이나 아직없는 것이있을 수 있음)가 발표자 컨텐츠로 동적으로 채울 수 있습니다. 컨테이너에는 치수 (너비, 높이 등)가 있으므로 해당 속성을 컨테이너 컨트롤에 넣고 컨텐츠를 제시합니다. 샘플에서 ContentControl은 발표자 컨텐츠로 수행해야 할 사항을 결정합니다.