Themes/MaterialDesignTheme.ScrollViewer.xaml

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                    xmlns:wpf="clr-namespace:MaterialDesignThemes.Wpf">
 
  <ControlTemplate x:Key="MaterialDesignScrollViewerTemplate" TargetType="{x:Type ScrollViewer}">
    <Grid x:Name="Grid" Background="{TemplateBinding Background}">
      <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*" />
        <ColumnDefinition Width="Auto" />
      </Grid.ColumnDefinitions>
      <Grid.RowDefinitions>
        <RowDefinition Height="*" />
        <RowDefinition Height="Auto" />
      </Grid.RowDefinitions>
 
      <Rectangle x:Name="PART_Corner"
                 Grid.Row="1"
                 Grid.Column="1"
                 Fill="{DynamicResource MaterialDesign.Brush.ScrollBar.Foreground}"
                 Visibility="{Binding Path=(wpf:ScrollViewerAssist.CornerRectangleVisibility), RelativeSource={RelativeSource TemplatedParent}}" />
 
      <ScrollContentPresenter x:Name="PART_ScrollContentPresenter"
                              Grid.Row="0"
                              Grid.Column="0"
                              CanContentScroll="{TemplateBinding CanContentScroll}"
                              CanHorizontallyScroll="False"
                              CanVerticallyScroll="False"
                              Content="{TemplateBinding Content}"
                              ContentTemplate="{TemplateBinding ContentTemplate}" />
 
      <Separator x:Name="PART_TopSeparator"
                 Grid.Row="0"
                 Grid.Column="0"
                 Margin="0"
                 VerticalAlignment="Top"
                 Background="{DynamicResource MaterialDesign.Brush.Separator.Background}"
                 Opacity="0.4"
                 Visibility="Visible" />
 
      <Separator x:Name="PART_BottomSeparator"
                 Grid.Row="0"
                 Grid.Column="0"
                 Margin="0"
                 VerticalAlignment="Bottom"
                 Background="{DynamicResource MaterialDesign.Brush.Separator.Background}"
                 Opacity="0.4"
                 Visibility="Hidden" />
 
      <ScrollBar x:Name="PART_VerticalScrollBar"
                 Grid.Row="0"
                 Grid.Column="1"
                 AutomationProperties.AutomationId="VerticalScrollBar"
                 Cursor="Arrow"
                 Maximum="{TemplateBinding ScrollableHeight}"
                 Minimum="0"
                 ViewportSize="{TemplateBinding ViewportHeight}"
                 Visibility="{TemplateBinding ComputedVerticalScrollBarVisibility}"
                 Value="{Binding VerticalOffset, Mode=OneWay, RelativeSource={RelativeSource TemplatedParent}}" />
 
      <ScrollBar x:Name="PART_HorizontalScrollBar"
                 Grid.Row="1"
                 Grid.Column="0"
                 AutomationProperties.AutomationId="HorizontalScrollBar"
                 Cursor="Arrow"
                 Maximum="{TemplateBinding ScrollableWidth}"
                 Minimum="0"
                 Orientation="Horizontal"
                 ViewportSize="{TemplateBinding ViewportWidth}"
                 Visibility="{TemplateBinding ComputedHorizontalScrollBarVisibility}"
                 Value="{Binding HorizontalOffset, Mode=OneWay, RelativeSource={RelativeSource TemplatedParent}}" />
    </Grid>
    <ControlTemplate.Triggers>
      <MultiTrigger>
        <MultiTrigger.Conditions>
          <Condition Property="wpf:ScrollViewerAssist.ShowSeparators" Value="True" />
          <Condition Property="ComputedVerticalScrollBarVisibility" Value="Visible" />
        </MultiTrigger.Conditions>
        <Setter TargetName="PART_BottomSeparator" Property="Visibility" Value="Visible" />
      </MultiTrigger>
 
      <Trigger Property="VerticalOffset" Value="0">
        <Setter TargetName="PART_TopSeparator" Property="Visibility" Value="Hidden" />
      </Trigger>
 
      <Trigger Property="wpf:ScrollViewerAssist.ShowSeparators" Value="False">
        <Setter TargetName="PART_TopSeparator" Property="Visibility" Value="Hidden" />
      </Trigger>
 
      <MultiTrigger>
        <MultiTrigger.Conditions>
          <Condition Property="wpf:ScrollViewerAssist.IgnorePadding" Value="False" />
          <Condition Property="wpf:ScrollViewerAssist.PaddingMode" Value="Default" />
        </MultiTrigger.Conditions>
        <MultiTrigger.Setters>
          <Setter TargetName="PART_ScrollContentPresenter" Property="Margin" Value="{Binding Padding, RelativeSource={RelativeSource TemplatedParent}}" />
        </MultiTrigger.Setters>
      </MultiTrigger>
 
      <MultiTrigger>
        <MultiTrigger.Conditions>
          <Condition Property="wpf:ScrollViewerAssist.IsAutoHideEnabled" Value="True" />
          <Condition Property="ComputedVerticalScrollBarVisibility" Value="Visible" />
          <Condition Property="IsMouseOver" Value="False" />
        </MultiTrigger.Conditions>
        <MultiTrigger.EnterActions>
          <BeginStoryboard>
            <Storyboard>
              <DoubleAnimation Storyboard.TargetName="PART_VerticalScrollBar"
                               Storyboard.TargetProperty="Opacity"
                               To="0"
                               Duration="0:0:0.2" />
            </Storyboard>
          </BeginStoryboard>
        </MultiTrigger.EnterActions>
        <MultiTrigger.ExitActions>
          <BeginStoryboard>
            <Storyboard>
              <DoubleAnimation Storyboard.TargetName="PART_VerticalScrollBar"
                               Storyboard.TargetProperty="Opacity"
                               To="1"
                               Duration="0:0:0.2" />
            </Storyboard>
          </BeginStoryboard>
        </MultiTrigger.ExitActions>
      </MultiTrigger>
 
      <MultiTrigger>
        <MultiTrigger.Conditions>
          <Condition Property="wpf:ScrollViewerAssist.IsAutoHideEnabled" Value="True" />
          <Condition Property="ComputedHorizontalScrollBarVisibility" Value="Visible" />
          <Condition Property="IsMouseOver" Value="False" />
        </MultiTrigger.Conditions>
        <MultiTrigger.EnterActions>
          <BeginStoryboard>
            <Storyboard>
              <DoubleAnimation Storyboard.TargetName="PART_HorizontalScrollBar"
                               Storyboard.TargetProperty="Opacity"
                               To="0"
                               Duration="0:0:0.2" />
            </Storyboard>
          </BeginStoryboard>
        </MultiTrigger.EnterActions>
        <MultiTrigger.ExitActions>
          <BeginStoryboard>
            <Storyboard>
              <DoubleAnimation Storyboard.TargetName="PART_HorizontalScrollBar"
                               Storyboard.TargetProperty="Opacity"
                               To="1"
                               Duration="0:0:0.2" />
            </Storyboard>
          </BeginStoryboard>
        </MultiTrigger.ExitActions>
      </MultiTrigger>
    </ControlTemplate.Triggers>
  </ControlTemplate>
 
  <Style x:Key="MaterialDesignScrollViewer" TargetType="ScrollViewer">
    <Setter Property="Template" Value="{StaticResource MaterialDesignScrollViewerTemplate}" />
    <Style.Triggers>
      <MultiTrigger>
        <MultiTrigger.Conditions>
          <Condition Property="wpf:ScrollViewerAssist.IgnorePadding" Value="False" />
          <Condition Property="wpf:ScrollViewerAssist.PaddingMode" Value="Content" />
        </MultiTrigger.Conditions>
        <MultiTrigger.Setters>
          <Setter Property="ContentTemplate">
            <Setter.Value>
              <DataTemplate>
                <ContentControl Margin="{Binding Padding, RelativeSource={RelativeSource AncestorType=ScrollViewer}}">
                  <ContentPresenter Content="{Binding}" />
                </ContentControl>
              </DataTemplate>
            </Setter.Value>
          </Setter>
        </MultiTrigger.Setters>
      </MultiTrigger>
    </Style.Triggers>
  </Style>
</ResourceDictionary>