Skip to content

Instantly share code, notes, and snippets.

@billw2012
Last active May 10, 2019 10:26
Show Gist options
  • Save billw2012/cdf997b35b93c51bd18af0f645c8d3e5 to your computer and use it in GitHub Desktop.
Save billw2012/cdf997b35b93c51bd18af0f645c8d3e5 to your computer and use it in GitHub Desktop.
ScrollViewer with top and bottom shadows to indicate out of view content (requires a MultiValueConverter to compare values).
<Style x:Key="VerticalScrollViewer" TargetType="{x:Type ScrollViewer}">
<Setter Property="OverridesDefaultStyle" Value="True" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ScrollViewer}">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Grid Grid.Row="0" Grid.Column="0">
<Border
Panel.ZIndex="1"
BorderThickness="0"
ClipToBounds="True">
<Grid>
<Border
Margin="-20,-2,-20,-20"
BorderBrush="Black"
BorderThickness="2">
<Border.Effect>
<DropShadowEffect
BlurRadius="10"
Opacity="1"
ShadowDepth="0" />
</Border.Effect>
<Border.Style>
<Style TargetType="Border">
<Style.Triggers>
<DataTrigger Value="True">
<DataTrigger.Binding>
<MultiBinding Converter="{StaticResource MultiValueEqualityConverter}">
<Binding
ElementName="PART_VerticalScrollBar"
Mode="OneWay"
Path="Value" />
<Binding
ElementName="PART_VerticalScrollBar"
Mode="OneWay"
Path="Minimum" />
</MultiBinding>
</DataTrigger.Binding>
<Setter Property="Visibility" Value="Hidden" />
</DataTrigger>
</Style.Triggers>
</Style>
</Border.Style>
</Border>
<Border
Margin="-20,-20,-20,-2"
BorderBrush="Black"
BorderThickness="2">
<Border.Effect>
<DropShadowEffect
BlurRadius="10"
Opacity="1"
ShadowDepth="0" />
</Border.Effect>
<Border.Style>
<Style TargetType="Border">
<Style.Triggers>
<DataTrigger Value="True">
<DataTrigger.Binding>
<MultiBinding Converter="{StaticResource MultiValueEqualityConverter}">
<Binding
ElementName="PART_VerticalScrollBar"
Mode="OneWay"
Path="Value" />
<Binding
ElementName="PART_VerticalScrollBar"
Mode="OneWay"
Path="Maximum" />
</MultiBinding>
</DataTrigger.Binding>
<Setter Property="Visibility" Value="Hidden" />
</DataTrigger>
</Style.Triggers>
</Style>
</Border.Style>
</Border>
</Grid>
</Border>
<ScrollContentPresenter Panel.ZIndex="0" />
</Grid>
<ScrollBar
x:Name="PART_VerticalScrollBar"
Grid.Row="0"
Grid.Column="1"
Maximum="{TemplateBinding ScrollableHeight}"
ViewportSize="{TemplateBinding ViewportHeight}"
Visibility="{TemplateBinding ComputedVerticalScrollBarVisibility}"
Value="{TemplateBinding VerticalOffset}" />
<ScrollBar
x:Name="PART_HorizontalScrollBar"
Grid.Row="1"
Grid.Column="0"
Maximum="{TemplateBinding ScrollableWidth}"
Orientation="Horizontal"
ViewportSize="{TemplateBinding ViewportWidth}"
Visibility="{TemplateBinding ComputedHorizontalScrollBarVisibility}"
Value="{TemplateBinding HorizontalOffset}" />
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment