2010-07-15 19 views
13

Ich habe ein HeaderedContentControl, das eine TreeView enthält.Wie strecke ich den Inhalt eines HeaderedContentControl?

<HeaderedContentControl Header="Steps" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"> 
     <TreeView Name="WizardSteps" ItemsSource="{Binding WizardSteps}" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"> 
      <!-- Hierarchical data templates here --> 
     </TreeView> 
    </HeaderedContentControl> 

Obwohl die HeaderedContentControl dehnt den Bereich innerhalb der übergeordneten Gitter, mein TreeView Steuerung nur zu füllen, nimmt einen kleinen Teil des verfügbaren Raumes.

Wie bekomme ich meine TreeView zu erweitern, um den Inhaltsbereich meiner HeaderedContentControl zu füllen?

Antwort

26

Die Standard-Steuerelementvorlage für HeaderedContentControl ist dies so etwas wie:

<ControlTemplate TargetType="{x:Type HeaderedContentControl}"> 
    <StackPanel> 
     <ContentPresenter ContentSource="Header" /> 
     <ContentPresenter /> 
    </StackPanel> 
</ControlTemplate> 

Der Stackpanel läßt jedes Kind seine eigene gewünschte Höhe hat, so dass der TreeView nicht strecken wird. Man könnte es mit einer Vorlage zu ersetzen, die eine DockPanel verwendet:

<HeaderedContentControl Header="Steps" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" VerticalContentAlignment="Stretch" > 
    <HeaderedContentControl.Template> 
     <ControlTemplate TargetType="HeaderedContentControl"> 
      <DockPanel> 
       <ContentPresenter DockPanel.Dock="Top" ContentSource="Header" /> 
       <ContentPresenter /> 
      </DockPanel> 
     </ControlTemplate> 
    </HeaderedContentControl.Template> 

Wenn Sie es mehr wiederverwendbar machen wollen, die Vorlage in einem Stil festgelegt und verwendet Vertical:

<Style TargetType="HeaderedContentControl"> 
    <Setter Property="VerticalContentAlignment" Value="Stretch"/> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="HeaderedContentControl"> 
       <DockPanel> 
        <ContentPresenter DockPanel.Dock="Top" ContentSource="Header" /> 
        <ContentPresenter VerticalAlignment="{TemplateBinding VerticalContentAlignment}" /> 
       </DockPanel> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

Auf diese Weise alle Ihre Bei HeaderedContentControls wird der Inhalt standardmäßig gefüllt, und Sie können dies überschreiben, indem Sie VerticalContentAlignment für ein einzelnes Steuerelement festlegen.

Alternativ können Sie auch ein DockPanel direkt anstelle eines HeaderedContentControl verwenden.

+1

Vielen Dank für Ihre ausführliche Erklärung und XAML-Schnipsel. Ich denke, ich kann das DockPanel direkt verwenden, aber es ist gut, ein Beispiel zu sehen, wie ControlTemplates den gleichen Effekt erzielen können. – dthrasher

Verwandte Themen