2010-07-15 13 views
13

Ho un HeaderedContentControl che contiene un TreeView.Come allungo il contenuto di un HeaderedContentControl?

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

Sebbene il HeaderedContentControl tende a riempire l'area all'interno della sua griglia del genitore, il mio controllo TreeView occupa solo una piccola parte dello spazio disponibile.

Come si apre la TreeView per espandere l'area del contenuto del mio HeaderedContentControl?

risposta

26

Il modello di controllo di default per HeaderedContentControl è qualcosa di simile:

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

Lo StackPanel lascia ogni bambino ha la propria altezza desiderata, in modo che il controllo TreeView non sarà allungare. Si potrebbe sostituirlo con un modello che utilizza un DockPanel:

<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> 

Se si vuole rendere più riutilizzabile, impostare il modello in uno stile e utilizzare VerticalContentAlignment:

<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> 

In questo modo, tutta la vostra HeaderedContentControls riempirà il contenuto per impostazione predefinita, e puoi sovrascriverlo impostando VerticalContentAlignment su un singolo controllo.

In alternativa, è possibile utilizzare direttamente un DockPanel anziché un HeaderedContentControl.

+1

Grazie per la spiegazione dettagliata e gli snippet XAML. Penso che potrei semplicemente usare DockPanel direttamente, ma è bello vedere un esempio di come ControlTemplates può ottenere lo stesso effetto. – dthrasher

Problemi correlati