2010-07-15 5 views
13

Tengo un HeaderedContentControl que contiene un TreeView.¿Cómo estiro el contenido de HeaderedContentControl?

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

Aunque el HeaderedContentControl se extiende para llenar el área dentro de su red de padres, mi control TreeView sólo ocupa una pequeña parte del espacio disponible.

¿Cómo hago que mi TreeView se expanda para llenar el área de contenido de HeaderedContentControl?

Respuesta

26

La plantilla de control por defecto para HeaderedContentControl es algo como esto:

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

El StackPanel permite a cada niño tiene su propio altura deseada, por lo que el TreeView no estirar. Se podría reemplazarlo con una plantilla que utiliza una 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> 

Si quieres que sea más reutilizable, establece la plantilla en un estilo y utilizar 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> 

De esta manera, toda su HeaderedContentControls tendrá su contenido relleno por defecto, y puede anularlo configurando VerticalContentAlignment en un control individual.

Alternativamente, puede utilizar un DockPanel directamente en lugar de un HeaderedContentControl.

+1

Gracias por su explicación detallada y por los fragmentos de XAML. Creo que puedo usar el DockPanel directamente, pero es bueno ver un ejemplo de cómo ControlTemplates puede lograr el mismo efecto. – dthrasher

Cuestiones relacionadas