문제

언제 사용해야 할지 모르겠어요 ContentPresenter 대신에 ContentControl (그 반대).현재 제가 사용하고 있는 것은 ContentControl 내 안에는 거의 항상 DataTemplate에스.언제 ContentPresenter 더 나은 선택이 될까요?그리고 왜?

도움이 되었습니까?

해결책

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

ContentPresenter 제어 템플릿 내부에서 컨텐츠를 표시하기 위해 사용됩니다.

ContentControl, 직접 사용하면 (기본 클래스로 사용되어야 함) ContentPresEnter를 사용하여 컨텐츠를 표시하는 컨트롤 템플릿이 있습니다.

내 경험 규칙 (모든 경우에 적용되는 것은 아니며 판단을 사용합니다) :

  1. 내부에 ControlTemplate 사용 ContentPresenter
  2. 밖의 ControlTemplate (포함 DataTemplate 그리고 외부 템플릿) 템플릿을 사용하지 마십시오. 필요한 경우 선호해야합니다. ContentPresenter
  3. 아강 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은 발표자 컨텐츠로 수행해야 할 사항을 결정합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top