Search code examples
wpfxaml

DockPanel inside TreeViewItem.Header don't fill all the space


I want to have 2 Textblocks in my TreeViewItem.Header. So I though it works like this:

<TreeViewItem>
    <TreeViewItem.Header>
       <DockPanel LastChildFill="False" HorizontalAlignment="Stretch">
            <TextBlock Text="Pizza" DockPanel.Dock="Left"/>
            <TextBlock Text="5,00 €" DockPanel.Dock="Right"/>
       </DockPanel>
    </TreeViewItem.Header>
</TreeViewItem>

But the DockPanel don't fill all the Space which is available in TreeViewItem.Header. I tried to Use HorizontalAlignment="Stretch", but this hasn't any effect.

Is there an Attribute to make this Work?

I have a picture where can u see the problem better: Image


Solution

  • If you want the header of a TreeView to stretch horizontally, you should override the ControlTemplate:

    <TreeViewItem HorizontalContentAlignment="Stretch">
        <TreeViewItem.Template>
            <ControlTemplate TargetType="{x:Type TreeViewItem}">
                <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition MinWidth="19" Width="Auto"/>
                        <ColumnDefinition Width="Auto"/>
                        <ColumnDefinition Width="*"/>
                    </Grid.ColumnDefinitions>
                    <Grid.RowDefinitions>
                        <RowDefinition Height="Auto"/>
                        <RowDefinition/>
                    </Grid.RowDefinitions>
                    <ToggleButton x:Name="Expander" ClickMode="Press" IsChecked="{Binding IsExpanded, RelativeSource={RelativeSource TemplatedParent}}" />
                    <Border x:Name="Bd" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" Grid.Column="2" Padding="{TemplateBinding Padding}" SnapsToDevicePixels="true">
                        <ContentPresenter x:Name="PART_Header" ContentSource="Header" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
                    </Border>
                    <ItemsPresenter x:Name="ItemsHost" Grid.ColumnSpan="2" Grid.Column="1" Grid.Row="1"/>
                </Grid>
                <ControlTemplate.Triggers>
                    <Trigger Property="IsExpanded" Value="false">
                        <Setter Property="Visibility" TargetName="ItemsHost" Value="Collapsed"/>
                    </Trigger>
                    <Trigger Property="HasItems" Value="false">
                        <Setter Property="Visibility" TargetName="Expander" Value="Hidden"/>
                    </Trigger>
                    <Trigger Property="IsSelected" Value="true">
                        <Setter Property="Background" TargetName="Bd" Value="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}"/>
                        <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.HighlightTextBrushKey}}"/>
                    </Trigger>
                    <MultiTrigger>
                        <MultiTrigger.Conditions>
                            <Condition Property="IsSelected" Value="true"/>
                            <Condition Property="IsSelectionActive" Value="false"/>
                        </MultiTrigger.Conditions>
                        <Setter Property="Background" TargetName="Bd" Value="{DynamicResource {x:Static SystemColors.InactiveSelectionHighlightBrushKey}}"/>
                        <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.InactiveSelectionHighlightTextBrushKey}}"/>
                    </MultiTrigger>
                    <Trigger Property="IsEnabled" Value="false">
                        <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/>
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </TreeViewItem.Template>
        <TreeViewItem.Header>
            <DockPanel LastChildFill="False">
                <TextBlock Text="Pizza" DockPanel.Dock="Left"/>
                <TextBlock Text="5,00 €" DockPanel.Dock="Right"/>
            </DockPanel>
        </TreeViewItem.Header>
    </TreeViewItem>