Themes/MaterialDesignTheme.Expander.xaml

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                    xmlns:converters="clr-namespace:MaterialDesignThemes.Wpf.Converters"
                    xmlns:convertersInternal="clr-namespace:MaterialDesignThemes.Wpf.Converters.Internal"
                    xmlns:wpf="clr-namespace:MaterialDesignThemes.Wpf">
 
  <Duration x:Key="ExpandDuration">0:0:0.250</Duration>
  <Duration x:Key="CollapseDuration">0:0:0.200</Duration>
 
  <KeyTime x:Key="ExpandKeyTime">0:0:0.250</KeyTime>
  <KeyTime x:Key="CollapseKeyTime">0:0:0.200</KeyTime>
 
  <Style x:Key="MaterialDesignExpanderToggleButton" TargetType="{x:Type ToggleButton}">
    <Setter Property="Template">
      <Setter.Value>
        <ControlTemplate>
          <ContentControl Content="{Binding RelativeSource={RelativeSource AncestorType=Expander, Mode=FindAncestor}, Path=(wpf:ExpanderAssist.ExpanderButtonContent)}" />
        </ControlTemplate>
      </Setter.Value>
    </Setter>
    <Style.Triggers>
      <DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType=Expander, Mode=FindAncestor}, Path=(wpf:ExpanderAssist.ExpanderButtonContent)}" Value="{x:Null}">
        <Setter Property="Template">
          <Setter.Value>
            <ControlTemplate TargetType="{x:Type ToggleButton}">
              <Border Background="Transparent">
                <VisualStateManager.VisualStateGroups>
                  <VisualStateGroup x:Name="CheckStates">
                    <VisualState x:Name="Checked">
                      <Storyboard>
                        <DoubleAnimationUsingKeyFrames Storyboard.TargetName="ExpandPathRotateTransform" Storyboard.TargetProperty="Angle">
                          <EasingDoubleKeyFrame KeyTime="{StaticResource ExpandKeyTime}" Value="180" />
                        </DoubleAnimationUsingKeyFrames>
                      </Storyboard>
                    </VisualState>
                    <VisualState x:Name="Unchecked">
                      <Storyboard>
                        <DoubleAnimationUsingKeyFrames Storyboard.TargetName="ExpandPathRotateTransform" Storyboard.TargetProperty="Angle">
                          <EasingDoubleKeyFrame KeyTime="{StaticResource CollapseKeyTime}" Value="0" />
                        </DoubleAnimationUsingKeyFrames>
                      </Storyboard>
                    </VisualState>
                  </VisualStateGroup>
                </VisualStateManager.VisualStateGroups>
                <wpf:PackIcon x:Name="ExpandPath"
                              Width="24"
                              Height="24"
                              Foreground="{TemplateBinding Foreground}"
                              Kind="ChevronDown"
                              Opacity="0.38"
                              RenderTransformOrigin="0.5 0.5">
                  <wpf:PackIcon.RenderTransform>
                    <RotateTransform x:Name="ExpandPathRotateTransform" />
                  </wpf:PackIcon.RenderTransform>
                </wpf:PackIcon>
              </Border>
            </ControlTemplate>
          </Setter.Value>
        </Setter>
      </DataTrigger>
    </Style.Triggers>
  </Style>
 
  <Style x:Key="MaterialDesignHorizontalHeaderStyle" TargetType="{x:Type ToggleButton}">
    <Setter Property="Background" Value="Transparent" />
 
    <Setter Property="Template">
      <Setter.Value>
        <ControlTemplate TargetType="{x:Type ToggleButton}">
          <Border Padding="{Binding Path=(wpf:ExpanderAssist.HorizontalHeaderPadding), RelativeSource={RelativeSource AncestorType=Expander, AncestorLevel=1}}" Background="{TemplateBinding Background}">
            <Grid>
              <Grid.ColumnDefinitions>
                <ColumnDefinition Width="Auto" />
                <ColumnDefinition Width="*" />
                <ColumnDefinition Width="Auto" />
              </Grid.ColumnDefinitions>
 
              <ContentPresenter x:Name="ExpanderHeader"
                                Grid.Column="1"
                                VerticalAlignment="Center"
                                Content="{TemplateBinding Content}"
                                ContentStringFormat="{TemplateBinding ContentStringFormat}"
                                ContentTemplate="{TemplateBinding ContentTemplate}"
                                ContentTemplateSelector="{TemplateBinding ContentTemplateSelector}" />
 
              <ToggleButton x:Name="ExpanderButton"
                            VerticalAlignment="Center"
                            Foreground="{TemplateBinding Foreground}"
                            IsChecked="{Binding Path=IsChecked, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}}"
                            RenderTransformOrigin="0.5 0.5">
                <ToggleButton.Style>
                  <Style TargetType="{x:Type ToggleButton}" BasedOn="{StaticResource MaterialDesignExpanderToggleButton}">
                    <Style.Triggers>
                      <DataTrigger Binding="{Binding ExpandDirection, RelativeSource={RelativeSource AncestorType=Expander, AncestorLevel=1}}" Value="Up">
                        <Setter Property="RenderTransform">
                          <Setter.Value>
                            <RotateTransform Angle="180" />
                          </Setter.Value>
                        </Setter>
                      </DataTrigger>
                    </Style.Triggers>
                  </Style>
                </ToggleButton.Style>
              </ToggleButton>
            </Grid>
          </Border>
          <ControlTemplate.Triggers>
            <DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType=Expander, Mode=FindAncestor}, Path=(wpf:ExpanderAssist.ExpanderButtonPosition)}" Value="Start">
              <Setter TargetName="ExpanderButton" Property="Grid.Column" Value="0" />
            </DataTrigger>
            <DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType=Expander, Mode=FindAncestor}, Path=(wpf:ExpanderAssist.ExpanderButtonPosition)}" Value="End">
              <Setter TargetName="ExpanderButton" Property="Grid.Column" Value="2" />
            </DataTrigger>
            <DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType=Expander, Mode=FindAncestor}, Path=(wpf:ExpanderAssist.ExpanderButtonPosition)}" Value="Default">
              <Setter TargetName="ExpanderButton" Property="Grid.Column" Value="2" />
            </DataTrigger>
          </ControlTemplate.Triggers>
        </ControlTemplate>
      </Setter.Value>
    </Setter>
  </Style>
 
  <Style x:Key="MaterialDesignVerticalHeaderStyle" TargetType="{x:Type ToggleButton}">
    <Setter Property="Background" Value="Transparent" />
    <Setter Property="Template">
      <Setter.Value>
        <ControlTemplate TargetType="{x:Type ToggleButton}">
          <Border Padding="{Binding Path=(wpf:ExpanderAssist.VerticalHeaderPadding), RelativeSource={RelativeSource AncestorType=Expander, AncestorLevel=1}}" Background="{TemplateBinding Background}">
            <Grid>
              <Grid.RowDefinitions>
                <RowDefinition Height="Auto" />
                <RowDefinition Height="*" />
                <RowDefinition Height="Auto" />
              </Grid.RowDefinitions>
 
              <ToggleButton x:Name="ExpanderButton"
                            VerticalAlignment="Center"
                            Foreground="{TemplateBinding Foreground}"
                            IsChecked="{Binding Path=IsChecked, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}}"
                            RenderTransformOrigin="0.5 0.5">
                <ToggleButton.Style>
                  <Style TargetType="{x:Type ToggleButton}" BasedOn="{StaticResource MaterialDesignExpanderToggleButton}">
                    <Style.Triggers>
 
                      <DataTrigger Binding="{Binding ExpandDirection, RelativeSource={RelativeSource AncestorType=Expander, AncestorLevel=1}}" Value="Left">
                        <Setter Property="RenderTransform">
                          <Setter.Value>
                            <RotateTransform Angle="90" />
                          </Setter.Value>
                        </Setter>
                      </DataTrigger>
 
                      <DataTrigger Binding="{Binding ExpandDirection, RelativeSource={RelativeSource AncestorType=Expander, AncestorLevel=1}}" Value="Right">
                        <Setter Property="RenderTransform">
                          <Setter.Value>
                            <RotateTransform Angle="-90" />
                          </Setter.Value>
                        </Setter>
                      </DataTrigger>
 
                    </Style.Triggers>
                  </Style>
                </ToggleButton.Style>
              </ToggleButton>
 
              <ContentPresenter Grid.Row="1"
                                VerticalAlignment="Center"
                                Content="{TemplateBinding Content}"
                                ContentStringFormat="{TemplateBinding ContentStringFormat}"
                                ContentTemplate="{TemplateBinding ContentTemplate}"
                                ContentTemplateSelector="{TemplateBinding ContentTemplateSelector}" />
 
            </Grid>
          </Border>
          <ControlTemplate.Triggers>
            <DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType=Expander, Mode=FindAncestor}, Path=(wpf:ExpanderAssist.ExpanderButtonPosition)}" Value="Start">
              <Setter TargetName="ExpanderButton" Property="Grid.Row" Value="0" />
            </DataTrigger>
            <DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType=Expander, Mode=FindAncestor}, Path=(wpf:ExpanderAssist.ExpanderButtonPosition)}" Value="End">
              <Setter TargetName="ExpanderButton" Property="Grid.Row" Value="2" />
            </DataTrigger>
            <DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType=Expander, Mode=FindAncestor}, Path=(wpf:ExpanderAssist.ExpanderButtonPosition)}" Value="Default">
              <Setter TargetName="ExpanderButton" Property="Grid.Row" Value="0" />
            </DataTrigger>
          </ControlTemplate.Triggers>
        </ControlTemplate>
      </Setter.Value>
    </Setter>
  </Style>
 
  <Style x:Key="MaterialDesignExpander" TargetType="{x:Type Expander}">
    <Setter Property="Background" Value="{DynamicResource MaterialDesign.Brush.Background}" />
    <Setter Property="BorderThickness" Value="0" />
    <Setter Property="Foreground" Value="{Binding RelativeSource={RelativeSource AncestorType={x:Type FrameworkElement}}, Path=(TextElement.Foreground)}" />
    <Setter Property="HorizontalContentAlignment" Value="Stretch" />
 
    <Setter Property="Template">
      <Setter.Value>
        <ControlTemplate TargetType="{x:Type Expander}">
          <Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}">
            <VisualStateManager.VisualStateGroups>
              <VisualStateGroup x:Name="ExpansionStates">
 
                <VisualStateGroup.Transitions>
                  <VisualTransition To="Expanded">
                    <Storyboard>
                      <DoubleAnimation Storyboard.TargetName="ContentPanel"
                                       Storyboard.TargetProperty="Opacity"
                                       From="0"
                                       To="1"
                                       Duration="{DynamicResource ExpandDuration}" />
                      <DoubleAnimation Storyboard.TargetName="ContentSiteScaleTransform"
                                       Storyboard.TargetProperty="(ScaleTransform.ScaleY)"
                                       From="0"
                                       To="1"
                                       Duration="{DynamicResource ExpandDuration}">
                        <DoubleAnimation.EasingFunction>
                          <CubicEase EasingMode="EaseInOut" />
                        </DoubleAnimation.EasingFunction>
                      </DoubleAnimation>
                      <ObjectAnimationUsingKeyFrames Storyboard.TargetName="PART_Content"
                                                     Storyboard.TargetProperty="Visibility"
                                                     Duration="0:0:0">
                        <DiscreteObjectKeyFrame KeyTime="0%" Value="{x:Static Visibility.Visible}" />
                      </ObjectAnimationUsingKeyFrames>
                    </Storyboard>
                  </VisualTransition>
 
                  <VisualTransition To="Collapsed">
                    <Storyboard>
                      <DoubleAnimation Storyboard.TargetName="ContentPanel"
                                       Storyboard.TargetProperty="Opacity"
                                       From="1"
                                       To="0"
                                       Duration="{DynamicResource CollapseDuration}" />
                      <DoubleAnimation Storyboard.TargetName="ContentSiteScaleTransform"
                                       Storyboard.TargetProperty="(ScaleTransform.ScaleY)"
                                       From="1"
                                       To="0"
                                       Duration="{DynamicResource CollapseDuration}">
                        <DoubleAnimation.EasingFunction>
                          <CubicEase EasingMode="EaseInOut" />
                        </DoubleAnimation.EasingFunction>
                      </DoubleAnimation>
                      <ObjectAnimationUsingKeyFrames Storyboard.TargetName="PART_Content"
                                                     Storyboard.TargetProperty="Visibility"
                                                     Duration="{DynamicResource CollapseDuration}">
                        <DiscreteObjectKeyFrame KeyTime="100%" Value="{x:Static Visibility.Collapsed}" />
                      </ObjectAnimationUsingKeyFrames>
                    </Storyboard>
                  </VisualTransition>
                </VisualStateGroup.Transitions>
 
                <VisualState x:Name="Expanded">
                  <Storyboard>
                    <DoubleAnimation Storyboard.TargetName="ContentPanel"
                                     Storyboard.TargetProperty="Opacity"
                                     To="1"
                                     Duration="0" />
                    <DoubleAnimation Storyboard.TargetName="ContentSiteScaleTransform"
                                     Storyboard.TargetProperty="(ScaleTransform.ScaleY)"
                                     To="1"
                                     Duration="0" />
                    <ObjectAnimationUsingKeyFrames Storyboard.TargetName="PART_Content"
                                                   Storyboard.TargetProperty="Visibility"
                                                   Duration="0">
                      <DiscreteObjectKeyFrame KeyTime="0%" Value="{x:Static Visibility.Visible}" />
                    </ObjectAnimationUsingKeyFrames>
                  </Storyboard>
                </VisualState>
 
                <VisualState x:Name="Collapsed">
                  <Storyboard>
                    <DoubleAnimation Storyboard.TargetName="ContentPanel"
                                     Storyboard.TargetProperty="Opacity"
                                     To="0"
                                     Duration="0" />
                    <DoubleAnimation Storyboard.TargetName="ContentSiteScaleTransform"
                                     Storyboard.TargetProperty="(ScaleTransform.ScaleY)"
                                     To="0"
                                     Duration="0" />
                    <ObjectAnimationUsingKeyFrames Storyboard.TargetName="PART_Content"
                                                   Storyboard.TargetProperty="Visibility"
                                                   Duration="0">
                      <DiscreteObjectKeyFrame KeyTime="100%" Value="{x:Static Visibility.Collapsed}" />
                    </ObjectAnimationUsingKeyFrames>
                  </Storyboard>
                </VisualState>
 
              </VisualStateGroup>
            </VisualStateManager.VisualStateGroups>
            <DockPanel Background="{TemplateBinding Background}">
              <ToggleButton Name="HeaderSite"
                            Background="{TemplateBinding wpf:ExpanderAssist.HeaderBackground}"
                            BorderThickness="0"
                            Content="{TemplateBinding Header}"
                            ContentStringFormat="{TemplateBinding HeaderStringFormat}"
                            ContentTemplate="{TemplateBinding HeaderTemplate}"
                            ContentTemplateSelector="{TemplateBinding HeaderTemplateSelector}"
                            Cursor="Hand"
                            DockPanel.Dock="Top"
                            Focusable="False"
                            Foreground="{TemplateBinding Foreground}"
                            IsChecked="{Binding Path=IsExpanded, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}}"
                            IsTabStop="False"
                            Opacity="0.87"
                            TextElement.FontSize="{TemplateBinding wpf:ExpanderAssist.HeaderFontSize}" />
 
              <Border Name="ContentSite">
                <Border.LayoutTransform>
                  <TransformGroup>
                    <ScaleTransform x:Name="ContentSiteScaleTransform" />
                    <RotateTransform Angle="{Binding Path=ExpandDirection, RelativeSource={RelativeSource AncestorType=Expander}, Converter={x:Static convertersInternal:ExpanderRotateAngleConverter.Instance}}" />
                  </TransformGroup>
                </Border.LayoutTransform>
 
                <Grid Name="ContentPanel"
                      Margin="{TemplateBinding Padding}"
                      HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
                      VerticalAlignment="{TemplateBinding VerticalContentAlignment}">
                  <Grid.LayoutTransform>
                    <RotateTransform Angle="{Binding Path=ExpandDirection, RelativeSource={RelativeSource AncestorType=Expander}, Converter={x:Static convertersInternal:ExpanderRotateAngleConverter.Instance}, ConverterParameter=-1}" />
                  </Grid.LayoutTransform>
 
                  <ContentPresenter Name="PART_Content"
                                    ContentStringFormat="{TemplateBinding ContentStringFormat}"
                                    ContentTemplate="{TemplateBinding ContentTemplate}"
                                    ContentTemplateSelector="{TemplateBinding ContentTemplateSelector}"
                                    Focusable="False"
                                    Visibility="Collapsed" />
 
                </Grid>
              </Border>
            </DockPanel>
          </Border>
          <ControlTemplate.Triggers>
 
            <Trigger Property="ExpandDirection" Value="Right">
              <Setter TargetName="HeaderSite" Property="DockPanel.Dock" Value="Left" />
              <Setter TargetName="HeaderSite" Property="Style" Value="{StaticResource MaterialDesignVerticalHeaderStyle}" />
            </Trigger>
 
            <Trigger Property="ExpandDirection" Value="Left">
              <Setter TargetName="HeaderSite" Property="DockPanel.Dock" Value="Right" />
              <Setter TargetName="HeaderSite" Property="Style" Value="{StaticResource MaterialDesignVerticalHeaderStyle}" />
            </Trigger>
 
            <Trigger Property="ExpandDirection" Value="Up">
              <Setter TargetName="HeaderSite" Property="DockPanel.Dock" Value="Bottom" />
              <Setter TargetName="HeaderSite" Property="Style" Value="{StaticResource MaterialDesignHorizontalHeaderStyle}" />
            </Trigger>
 
            <Trigger Property="ExpandDirection" Value="Down">
              <Setter TargetName="HeaderSite" Property="DockPanel.Dock" Value="Top" />
              <Setter TargetName="HeaderSite" Property="Style" Value="{StaticResource MaterialDesignHorizontalHeaderStyle}" />
            </Trigger>
          </ControlTemplate.Triggers>
        </ControlTemplate>
      </Setter.Value>
    </Setter>
    <Setter Property="VerticalContentAlignment" Value="Stretch" />
    <Setter Property="wpf:ExpanderAssist.HeaderBackground" Value="Transparent" />
  </Style>
</ResourceDictionary>