2013-06-20 2 views
4

나는 Telerik 타일에 대한 ControlTemplate이 있고 내가 좋아 아래 오버라이드 (override) 오전 :의 UserControl은

<DockPanel> 
     <!-- some content --> 

     <ContentPresenter/> 

    </DockPanel> 

가 된 ControlTemplate은의 내용을 표시하지 않습니다

<ControlTemplate TargetType="{x:Type ctrl:Tile}"> 
    <Border> 

     <local:UserControl> 
      <ContentPresenter Content="{TemplateBinding Content}" ContentTemplate="{TemplateBinding ContentTemplate}"/> 
     </local:UserControl> 
    </Border> 
</ControlTemplate> 

내 사용자 컨트롤처럼 보인다 UserControl.

내가 내 컨트롤 템플릿 변경하는 경우 :

<ControlTemplate TargetType="{x:Type ctrl:Tile}"> 
    <Border> 
     <StackPanel> 
      <local:UserControl/> 

      <ContentPresenter Content="{TemplateBinding Content}" ContentTemplate="{TemplateBinding ContentTemplate}"/> 
     </StackPanel> 
    </Border> 
</ControlTemplate> 

을이 컨텐츠를 찾아 적절하게 배치합니다. ControlTemplate 내 UserControl 안에 중첩 된 일단 콘텐츠를 찾을 수없는 것 같습니다. 내가 잘못하고있는 일이 있을까?

이러한 ControlTemplate 항목은 ItemsPresenter에 표시됩니다.

답변

5

UserControl은 실제로는 실제와 조금 다를 수있는 ContentControl (예 : Button) 인 것처럼 취급하고 있습니다. Button을 예로 들자면 Button 요소에 어린이 (즉, TextBlock)를 추가하면 실제로 TextBlockButton's Content 속성으로 설정됩니다. 렌더링 방법은 ButtonControlTemplate이며, ContentPresenter에는 Content을 삽입합니다. 시각적 트리는 다음과 같이 끝납니다 :

<Button> 
    -start Template 
    <Border> 
    <ContentPresenter> 
     -start Content 
     <TextBlock> 

지금까지는 기본적으로 코드가 따르는 모델입니다. 문제는 UserControlContent을 정의하는 XAML + 코드 숨김 모델에서 가장 자주 정의되는 ControlTemplate을 사용하는 대신 UserControl (여전히 ContentControl에서 파생 됨)을 사용하는 것입니다. 수 아직도 당신이 정상적으로 XAML에 UserControl의 모양을 정의하는 두하려면

와 (이 모델을 전환하고 UserControl을 템플릿 또는 XAML + 코드 숨김하지만 일반적인와 Button 파생 클래스를 만드는 것이 가능하다) 다른 내용을 삽입 할 수있는 경우 DependencyProperty을 추가하면 Content 속성의 설정을 그대로 반영하고 내용을 설정할 수 있습니다. 이 접근법은 본질적으로 2 개의 콘텐츠 속성, ContentHeader을 기본적으로 갖는 HeaderedContentControl 파생어 (즉, Expander)와 함께 사용됩니다. 새로운 속성을 사용하여 다음과 같이 보일 것이다 :

<DockPanel> 
    <!-- some content --> 

    <ContentPresenter Content="{Binding Path=OtherContent, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=UserControl}}"/> 
</DockPanel> 
: 명시 적으로 ContentPresenter 바인딩을 설정해야 UserControl의 XAML 내부

<Border> 
    <local:UserControl> 
     <local:UserControl.OtherContent> 
      <ContentPresenter Content="{TemplateBinding Content}" ContentTemplate="{TemplateBinding ContentTemplate}"/> 
     </local:UserControl.OtherContent> 
    </local:UserControl> 
</Border> 

그리고 다음을 (당신은 단지 ContentControls 무료 내부 템플릿을 얻을)

ContentTemplate, ContentTemplateSelector 또는 ContentStringFormat을 원할 경우 해당 속성과 바인딩을 추가해야합니다.