Как растянуть содержимое элемента HeaderedContentControl?

У меня есть HeaderedContentControl, который содержит TreeView.

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

Хотя HeaderedContentControl растягивается, чтобы заполнить область внутри своей родительской сетки, мой элемент управления TreeView занимает лишь небольшую часть доступного пространства.

Как мне расширить свой TreeView для заполнения области содержимого моего HeaderedContentControl?

Ответы

Ответ 1

Шаблон управления по умолчанию для HeaderedContentControl выглядит примерно так:

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

StackPanel позволяет каждому ребенку иметь желаемую высоту, поэтому TreeView не будет растягиваться. Вы можете заменить его шаблоном, который использует 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>

Если вы хотите сделать его более многоразовым, установите шаблон в стиле и используйте 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>

Таким образом, все ваши HeaderedContentControls будут заполнять свой контент по умолчанию, и вы можете переопределить это, установив VerticalContentAlignment на отдельный элемент управления.

В качестве альтернативы вы можете использовать DockPanel напрямую вместо HeaderedContentControl.