Update:
Ok I could get your screenshot translated to something like
Xaml:
<ControlTemplate TargetType="{x:Type Expander}">
<Grid SnapsToDevicePixels="true">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="6" />
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="6" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Rectangle Grid.Row="0"
Grid.Column="0"
Height="1"
Margin="0 4 0 0"
VerticalAlignment="Center"
Fill="{TemplateBinding BorderBrush}" />
<Rectangle Grid.Row="0"
Grid.Column="2"
Grid.ColumnSpan="2"
Height="1"
Margin="0 4 0 0"
VerticalAlignment="Center"
Fill="{TemplateBinding BorderBrush}" />
<Border x:Name="Header"
Grid.Row="0"
Grid.Column="1"
Padding="3,0,3,0">
<Grid Background="Transparent"
SnapsToDevicePixels="False">
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<ToggleButton Name="HeaderToggle"
Grid.Column="0"
MinWidth="0"
MinHeight="0"
IsChecked="{Binding Path=IsExpanded,
Mode=TwoWay,
RelativeSource={RelativeSource TemplatedParent}}">
<ToggleButton.Template>
<ControlTemplate TargetType="{x:Type ToggleButton}">
<Grid Background="Transparent"
SnapsToDevicePixels="False">
<Ellipse x:Name="circle"
Width="15"
Height="15"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Fill="{DynamicResource ButtonNormalBackgroundFill}"
Stroke="DarkGray" />
<Ellipse x:Name="shadow"
Width="13"
Height="13"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Fill="{DynamicResource ExpanderShadowFill}"
Visibility="Hidden" />
<Path x:Name="arrow"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Data="M1,1 L4,4 7,1"
SnapsToDevicePixels="false"
Stroke="#666"
StrokeThickness="2" />
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="IsChecked"
Value="true">
<Setter TargetName="arrow"
Property="Data"
Value="M 1,4 L 4,1 L 7,4" />
</Trigger>
<Trigger Property="IsMouseOver"
Value="true">
<Setter TargetName="circle"
Property="Stroke"
Value="#666" />
<Setter TargetName="arrow"
Property="Stroke"
Value="#222" />
<Setter TargetName="shadow"
Property="Visibility"
Value="Visible" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</ToggleButton.Template>
</ToggleButton>
<ContentPresenter Grid.Column="1"
Margin="3,0,0,0"
HorizontalAlignment="Left"
VerticalAlignment="Center"
ContentSource="Header"
RecognizesAccessKey="true"
SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"
TextElement.Foreground="Black" />
</Grid>
</Border>
<ContentPresenter x:Name="ExpandSite"
Grid.Row="1"
Grid.Column="1"
Grid.ColumnSpan="2"
Margin="{TemplateBinding Padding}"
SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"
Visibility="Collapsed" />
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="IsExpanded"
Value="true">
<Setter TargetName="ExpandSite"
Property="Visibility"
Value="Visible" />
</Trigger>
<Trigger Property="IsEnabled"
Value="false">
<Setter Property="Foreground"
Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
I also did remove a few Grid
Rows
that were not being used and removed some Grid
Attached properties that were being set of items that were not even children of Grid
.
The main change is pretty much remove the Border
and OpacityMask
and just render Rectangle
's with a Height of 1 in the appropriate Grid
Column. This way you are actually not rendering anything behind the header at all.
You can extend this concept ofc when you add the Button
to the right. Just put it in it's own Grid Column and don't render a Rectangle
in that Column