スタイルを変更するだけでなく、実際にエキスパンダー ボタンを HeaderTemplate に移動したいことがわかりました。これは、FindAncestor を使用して簡単に実行できます。
最初に ToggleButton を追加し、FindAncestor を使用して IsChecked プロパティを次の行にバインドします。
<DataTemplate x:Key="MyHeaderTemplate">
<Border ...>
<DockPanel>
<!-- Expander button -->
<ToggleButton
IsChecked="{Binding IsExpanded, Mode=TwoWay, RelativeSource={RelativeSource FindAncestor,Header,1}}"
Content=... />
<!-- Other content here -->
...
</DockPanel>
</Border>
</DataTemplate>
これにより、ヘッダー テンプレート内に展開ボタンが追加されますが、Expander によって提供される元のボタンは非表示になりません。これを行うには、Expander の ControlTemplate を置き換えることをお勧めします。
ToggleButton を単純な ContentPresenter に置き換えた Expander の ControlTemplate の完全なコピーを次に示します。
<ControlTemplate x:Key="ExpanderWithoutButton" TargetType="{x:Type Expander}">
<Border BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}"
Background="{TemplateBinding Background}"
CornerRadius="3"
SnapsToDevicePixels="true">
<DockPanel>
<ContentPresenter
Content="{TemplateBinding Header}"
ContentTemplate="{TemplateBinding HeaderTemplate}"
ContentTemplateSelector="{TemplateBinding HeaderTemplateSelector}"
DockPanel.Dock="Top"
Margin="1"
Focusable="false" />
<ContentPresenter
x:Name="ExpandSite"
Visibility="Collapsed"
HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
Margin="{TemplateBinding Padding}"
Focusable="false" />
</DockPanel>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsExpanded" Value="true">
<Setter Property="Visibility" Value="Visible" TargetName="ExpandSite"/>
</Trigger>
<Trigger Property="IsEnabled" Value="false">
<Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
次のように使用できます。
<Expander Template="{StaticResource ExpanderWithoutButton}">
<Expander.HeaderTemplate>
<DataTemplate ...>
<Border ...>
<DockPanel>
<ToggleButton ...
IsChecked="{Binding IsExpanded, Mode=TwoWay, RelativeSource={RelativeSource FindAncestor,Header,1}}" />
... other header template content here ...
より簡単な代替手段は、yourHeaderTemplate に負のマージンを設定して、エキスパンダー ボタンを覆うことです。上記の ControlTemplate の代わりに、DataTemplat には次のようなものが含まれます。
<DataTemplate ...>
<Border Margin="-20 0 0 0" ... />
必要な外観になるように負のマージンを調整します。このソリューションはより単純ですが、別のシステム テーマに切り替えると、必要なマージンが変わり、エキスパンダーの見栄えが悪くなる可能性があるという点で劣っています。