Public
Class
CustomScrollViewer
Inherits
ScrollViewer
Shared
Sub
New
()
DefaultStyleKeyProperty.OverrideMetadata(
GetType
(CustomScrollViewer),
New
FrameworkPropertyMetadata(
GetType
(CustomScrollViewer)))
End
Sub
Public
Property
ScrollBarThumbBrush
As
Brush
Get
Return
GetValue(ScrollBarThumbBrushProperty)
End
Get
Set
(
ByVal
value
As
Brush)
SetValue(ScrollBarThumbBrushProperty, value)
End
Set
End
Property
Public
Shared
ReadOnly
ScrollBarThumbBrushProperty
As
DependencyProperty = DependencyProperty.Register(
"ScrollBarThumbBrush"
,
GetType
(Brush),
GetType
(CustomScrollBar),
New
PropertyMetadata(Brushes.Gray))
End
Class
In the above class, I have created a ScrollBarThumbBrush property which we can use to set Brush for Thumb in ScrollBar. And following in the XAML style for CustomScrollViewer control
<
Style
TargetType
=
"my:CustomScrollViewer"
>
<
Setter
Property
=
"Template"
>
<
Setter.Value
>
<
ControlTemplate
TargetType
=
"my:CustomScrollViewer"
>
<
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
=
"Corner"
Grid.Column
=
"1"
Fill
=
"{DynamicResource {x:Static SystemColors.ControlBrushKey}}"
Grid.Row
=
"1"
/>
<
ScrollContentPresenter
x:Name
=
"PART_ScrollContentPresenter"
CanContentScroll
=
"{TemplateBinding CanContentScroll}"
CanHorizontallyScroll
=
"False"
CanVerticallyScroll
=
"False"
ContentTemplate
=
"{TemplateBinding ContentTemplate}"
Content
=
"{TemplateBinding Content}"
Grid.Column
=
"0"
Margin
=
"{TemplateBinding Padding}"
Grid.Row
=
"0"
/>
<
ScrollBar
x:Name
=
"PART_VerticalScrollBar"
AutomationProperties.AutomationId
=
"VerticalScrollBar"
Cursor
=
"Arrow"
Grid.Column
=
"1"
Maximum
=
"{TemplateBinding ScrollableHeight}"
Minimum
=
"0"
Grid.Row
=
"0"
Visibility
=
"{TemplateBinding ComputedVerticalScrollBarVisibility}"
Value
=
"{Binding VerticalOffset, Mode=OneWay, RelativeSource={RelativeSource TemplatedParent}}"
ViewportSize
=
"{TemplateBinding ViewportHeight}"
/>
<
ScrollBar
x:Name
=
"PART_HorizontalScrollBar"
AutomationProperties.AutomationId
=
"HorizontalScrollBar"
Cursor
=
"Arrow"
Grid.Column
=
"0"
Maximum
=
"{TemplateBinding ScrollableWidth}"
Minimum
=
"0"
Orientation
=
"Horizontal"
Grid.Row
=
"1"
Visibility
=
"{TemplateBinding ComputedHorizontalScrollBarVisibility}"
Value
=
"{Binding HorizontalOffset, Mode=OneWay, RelativeSource={RelativeSource TemplatedParent}}"
ViewportSize
=
"{TemplateBinding ViewportWidth}"
/>
</
Grid
>
</
ControlTemplate
>
</
Setter.Value
>
</
Setter
>
</
Style
>
Now to allow Thumb change color dynamically we need to change the Style of ScrollBar and read ScrollBarThumbBrush property. As you can see in above XAML Style CustomScrollViewer contains a ScrollBar control, so CustomScrollViewer is Ancestor of ScrollBar. So we are going to use following binding code to read ScrollBarThumbBrush property value in ScrollBar.
Fill="{Binding Path=ScrollBarThumbBrush, RelativeSource={RelativeSource AncestorType=my:CustomScrollViewer}}"
Below is the complete Style of ScrollBar control
<
Style
TargetType
=
"ScrollBar"
>
<
Setter
Property
=
"Stylus.IsPressAndHoldEnabled"
Value
=
"False"
/>
<
Setter
Property
=
"Stylus.IsFlicksEnabled"
Value
=
"False"
/>
<
Setter
Property
=
"Background"
Value
=
"#FFF0F0F0"
/>
<
Setter
Property
=
"BorderBrush"
Value
=
"#FFF0F0F0"
/>
<
Setter
Property
=
"Foreground"
Value
=
"{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"
/>
<
Setter
Property
=
"BorderThickness"
Value
=
"1,0"
/>
<
Setter
Property
=
"Width"
Value
=
"{DynamicResource {x:Static SystemParameters.VerticalScrollBarWidthKey}}"
/>
<
Setter
Property
=
"MinWidth"
Value
=
"{DynamicResource {x:Static SystemParameters.VerticalScrollBarWidthKey}}"
/>
<
Setter
Property
=
"Template"
>
<
Setter.Value
>
<
ControlTemplate
TargetType
=
"ScrollBar"
>
<
Grid
x:Name
=
"Bg"
SnapsToDevicePixels
=
"True"
>
<
Grid.RowDefinitions
>
<
RowDefinition
MaxHeight
=
"{DynamicResource {x:Static SystemParameters.VerticalScrollBarButtonHeightKey}}"
/>
<
RowDefinition
Height
=
"1E-05*"
/>
<
RowDefinition
MaxHeight
=
"{DynamicResource {x:Static SystemParameters.VerticalScrollBarButtonHeightKey}}"
/>
</
Grid.RowDefinitions
>
<
Border
BorderBrush
=
"{TemplateBinding BorderBrush}"
BorderThickness
=
"{TemplateBinding BorderThickness}"
Background
=
"{TemplateBinding Background}"
Grid.Row
=
"1"
/>
<
RepeatButton
x:Name
=
"PART_LineUpButton"
Command
=
"ScrollBar.LineUpCommand"
IsEnabled
=
"{TemplateBinding IsMouseOver}"
>
<
RepeatButton.Style
>
<
Style
TargetType
=
"{x:Type RepeatButton}"
>
<
Setter
Property
=
"FocusVisualStyle"
>
<
Setter.Value
>
<
Style
>
<
Setter
Property
=
"Control.Template"
>
<
Setter.Value
>
<
ControlTemplate
>
<
Rectangle
Margin
=
"2"
SnapsToDevicePixels
=
"True"
Stroke
=
"{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"
StrokeThickness
=
"1"
StrokeDashArray
=
"1 2"
/>
</
ControlTemplate
>
</
Setter.Value
>
</
Setter
>
</
Style
>
</
Setter.Value
>
</
Setter
>
<
Setter
Property
=
"BorderThickness"
Value
=
"1"
/>
<
Setter
Property
=
"HorizontalContentAlignment"
Value
=
"Center"
/>
<
Setter
Property
=
"VerticalContentAlignment"
Value
=
"Center"
/>
<
Setter
Property
=
"Padding"
Value
=
"1"
/>
<
Setter
Property
=
"Focusable"
Value
=
"False"
/>
<
Setter
Property
=
"IsTabStop"
Value
=
"False"
/>
<
Setter
Property
=
"Template"
>
<
Setter.Value
>
<
ControlTemplate
TargetType
=
"{x:Type RepeatButton}"
>
<
Border
x:Name
=
"border"
BorderBrush
=
"#FFF0F0F0"
BorderThickness
=
"1"
Background
=
"#FFF0F0F0"
SnapsToDevicePixels
=
"True"
>
<
ContentPresenter
x:Name
=
"contentPresenter"
ContentTemplate
=
"{TemplateBinding ContentTemplate}"
Content
=
"{TemplateBinding Content}"
ContentStringFormat
=
"{TemplateBinding ContentStringFormat}"
Focusable
=
"False"
HorizontalAlignment
=
"{TemplateBinding HorizontalContentAlignment}"
Margin
=
"{TemplateBinding Padding}"
SnapsToDevicePixels
=
"{TemplateBinding SnapsToDevicePixels}"
VerticalAlignment
=
"{TemplateBinding VerticalContentAlignment}"
/>
</
Border
>
<
ControlTemplate.Triggers
>
<
Trigger
Property
=
"IsMouseOver"
Value
=
"True"
>
<
Setter
Property
=
"Background"
TargetName
=
"border"
Value
=
"#FFDADADA"
/>
<
Setter
Property
=
"BorderBrush"
TargetName
=
"border"
Value
=
"#FFDADADA"
/>
</
Trigger
>
<
Trigger
Property
=
"IsPressed"
Value
=
"True"
>
<
Setter
Property
=
"Background"
TargetName
=
"border"
Value
=
"#FF606060"
/>
<
Setter
Property
=
"BorderBrush"
TargetName
=
"border"
Value
=
"#FF606060"
/>
</
Trigger
>
<
Trigger
Property
=
"IsEnabled"
Value
=
"False"
>
<
Setter
Property
=
"Opacity"
TargetName
=
"contentPresenter"
Value
=
"0.56"
/>
<
Setter
Property
=
"Background"
TargetName
=
"border"
Value
=
"#FFF0F0F0"
/>
<
Setter
Property
=
"BorderBrush"
TargetName
=
"border"
Value
=
"#FFF0F0F0"
/>
</
Trigger
>
</
ControlTemplate.Triggers
>
</
ControlTemplate
>
</
Setter.Value
>
</
Setter
>
</
Style
>
</
RepeatButton.Style
>
<
Path
x:Name
=
"ArrowTop"
Data
=
"M0,4C0,4 0,6 0,6 0,6 3.5,2.5 3.5,2.5 3.5,2.5 7,6 7,6 7,6 7,4 7,4 7,4 3.5,0.5 3.5,0.5 3.5,0.5 0,4 0,4z"
Fill
=
"#FF606060"
Margin
=
"3,4,3,3"
Stretch
=
"Uniform"
/>
</
RepeatButton
>
<
Track
x:Name
=
"PART_Track"
IsDirectionReversed
=
"True"
IsEnabled
=
"{TemplateBinding IsMouseOver}"
Grid.Row
=
"1"
>
<
Track.DecreaseRepeatButton
>
<
RepeatButton
Command
=
"ScrollBar.PageUpCommand"
>
<
RepeatButton.Style
>
<
Style
TargetType
=
"{x:Type RepeatButton}"
>
<
Setter
Property
=
"OverridesDefaultStyle"
Value
=
"True"
/>
<
Setter
Property
=
"Background"
Value
=
"Transparent"
/>
<
Setter
Property
=
"Focusable"
Value
=
"False"
/>
<
Setter
Property
=
"IsTabStop"
Value
=
"False"
/>
<
Setter
Property
=
"Template"
>
<
Setter.Value
>
<
ControlTemplate
TargetType
=
"{x:Type RepeatButton}"
>
<
Rectangle
Fill
=
"{TemplateBinding Background}"
Height
=
"{TemplateBinding Height}"
Width
=
"{TemplateBinding Width}"
/>
</
ControlTemplate
>
</
Setter.Value
>
</
Setter
>
</
Style
>
</
RepeatButton.Style
>
</
RepeatButton
>
</
Track.DecreaseRepeatButton
>
<
Track.IncreaseRepeatButton
>
<
RepeatButton
Command
=
"ScrollBar.PageDownCommand"
>
<
RepeatButton.Style
>
<
Style
TargetType
=
"{x:Type RepeatButton}"
>
<
Setter
Property
=
"OverridesDefaultStyle"
Value
=
"True"
/>
<
Setter
Property
=
"Background"
Value
=
"Transparent"
/>
<
Setter
Property
=
"Focusable"
Value
=
"False"
/>
<
Setter
Property
=
"IsTabStop"
Value
=
"False"
/>
<
Setter
Property
=
"Template"
>
<
Setter.Value
>
<
ControlTemplate
TargetType
=
"{x:Type RepeatButton}"
>
<
Rectangle
Fill
=
"{TemplateBinding Background}"
Height
=
"{TemplateBinding Height}"
Width
=
"{TemplateBinding Width}"
/>
</
ControlTemplate
>
</
Setter.Value
>
</
Setter
>
</
Style
>
</
RepeatButton.Style
>
</
RepeatButton
>
</
Track.IncreaseRepeatButton
>
<
Track.Thumb
>
<
Thumb
>
<
Thumb.Style
>
<
Style
TargetType
=
"{x:Type Thumb}"
>
<
Setter
Property
=
"OverridesDefaultStyle"
Value
=
"True"
/>
<
Setter
Property
=
"IsTabStop"
Value
=
"False"
/>
<
Setter
Property
=
"Template"
>
<
Setter.Value
>
<
ControlTemplate
TargetType
=
"{x:Type Thumb}"
>
<
Rectangle
x:Name
=
"rectangle"
Fill
=
"{Binding Path=ScrollBarThumbBrush, RelativeSource={RelativeSource AncestorType=my:CustomScrollViewer}}"
Height
=
"{TemplateBinding Height}"
SnapsToDevicePixels
=
"True"
Width
=
"{TemplateBinding Width}"
/>
<
ControlTemplate.Triggers
>
<
Trigger
Property
=
"IsMouseOver"
Value
=
"True"
>
<
Setter
Property
=
"Fill"
TargetName
=
"rectangle"
Value
=
"#FFA6A6A6"
/>
</
Trigger
>
<
Trigger
Property
=
"IsDragging"
Value
=
"True"
>
<
Setter
Property
=
"Fill"
TargetName
=
"rectangle"
Value
=
"#FF606060"
/>
</
Trigger
>
</
ControlTemplate.Triggers
>
</
ControlTemplate
>
</
Setter.Value
>
</
Setter
>
</
Style
>
</
Thumb.Style
>
</
Thumb
>
</
Track.Thumb
>
</
Track
>
<
RepeatButton
x:Name
=
"PART_LineDownButton"
Command
=
"ScrollBar.LineDownCommand"
IsEnabled
=
"{TemplateBinding IsMouseOver}"
Grid.Row
=
"2"
>
<
RepeatButton.Style
>
<
Style
TargetType
=
"{x:Type RepeatButton}"
>
<
Setter
Property
=
"FocusVisualStyle"
>
<
Setter.Value
>
<
Style
>
<
Setter
Property
=
"Control.Template"
>
<
Setter.Value
>
<
ControlTemplate
>
<
Rectangle
Margin
=
"2"
SnapsToDevicePixels
=
"True"
Stroke
=
"{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"
StrokeThickness
=
"1"
StrokeDashArray
=
"1 2"
/>
</
ControlTemplate
>
</
Setter.Value
>
</
Setter
>
</
Style
>
</
Setter.Value
>
</
Setter
>
<
Setter
Property
=
"BorderThickness"
Value
=
"1"
/>
<
Setter
Property
=
"HorizontalContentAlignment"
Value
=
"Center"
/>
<
Setter
Property
=
"VerticalContentAlignment"
Value
=
"Center"
/>
<
Setter
Property
=
"Padding"
Value
=
"1"
/>
<
Setter
Property
=
"Focusable"
Value
=
"False"
/>
<
Setter
Property
=
"IsTabStop"
Value
=
"False"
/>
<
Setter
Property
=
"Template"
>
<
Setter.Value
>
<
ControlTemplate
TargetType
=
"{x:Type RepeatButton}"
>
<
Border
x:Name
=
"border"
BorderBrush
=
"#FFF0F0F0"
BorderThickness
=
"1"
Background
=
"#FFF0F0F0"
SnapsToDevicePixels
=
"True"
>
<
ContentPresenter
x:Name
=
"contentPresenter"
ContentTemplate
=
"{TemplateBinding ContentTemplate}"
Content
=
"{TemplateBinding Content}"
ContentStringFormat
=
"{TemplateBinding ContentStringFormat}"
Focusable
=
"False"
HorizontalAlignment
=
"{TemplateBinding HorizontalContentAlignment}"
Margin
=
"{TemplateBinding Padding}"
SnapsToDevicePixels
=
"{TemplateBinding SnapsToDevicePixels}"
VerticalAlignment
=
"{TemplateBinding VerticalContentAlignment}"
/>
</
Border
>
<
ControlTemplate.Triggers
>
<
Trigger
Property
=
"IsMouseOver"
Value
=
"True"
>
<
Setter
Property
=
"Background"
TargetName
=
"border"
Value
=
"#FFDADADA"
/>
<
Setter
Property
=
"BorderBrush"
TargetName
=
"border"
Value
=
"#FFDADADA"
/>
</
Trigger
>
<
Trigger
Property
=
"IsPressed"
Value
=
"True"
>
<
Setter
Property
=
"Background"
TargetName
=
"border"
Value
=
"#FF606060"
/>
<
Setter
Property
=
"BorderBrush"
TargetName
=
"border"
Value
=
"#FF606060"
/>
</
Trigger
>
<
Trigger
Property
=
"IsEnabled"
Value
=
"False"
>
<
Setter
Property
=
"Opacity"
TargetName
=
"contentPresenter"
Value
=
"0.56"
/>
<
Setter
Property
=
"Background"
TargetName
=
"border"
Value
=
"#FFF0F0F0"
/>
<
Setter
Property
=
"BorderBrush"
TargetName
=
"border"
Value
=
"#FFF0F0F0"
/>
</
Trigger
>
</
ControlTemplate.Triggers
>
</
ControlTemplate
>
</
Setter.Value
>
</
Setter
>
</
Style
>
</
RepeatButton.Style
>
<
Path
x:Name
=
"ArrowBottom"
Data
=
"M0,2.5C0,2.5 0,0.5 0,0.5 0,0.5 3.5,4 3.5,4 3.5,4 7,0.5 7,0.5 7,0.5 7,2.5 7,2.5 7,2.5 3.5,6 3.5,6 3.5,6 0,2.5 0,2.5z"
Fill
=
"#FF606060"
Margin
=
"3,4,3,3"
Stretch
=
"Uniform"
/>
</
RepeatButton
>
</
Grid
>
<
ControlTemplate.Triggers
>
<
MultiDataTrigger
>
<
MultiDataTrigger.Conditions
>
<
Condition
Binding
=
"{Binding IsMouseOver, ElementName=PART_LineDownButton}"
Value
=
"true"
/>
<
Condition
Binding
=
"{Binding IsPressed, ElementName=PART_LineDownButton}"
Value
=
"true"
/>
</
MultiDataTrigger.Conditions
>
<
Setter
Property
=
"Fill"
TargetName
=
"ArrowBottom"
Value
=
"White"
/>
</
MultiDataTrigger
>
<
MultiDataTrigger
>
<
MultiDataTrigger.Conditions
>
<
Condition
Binding
=
"{Binding IsMouseOver, ElementName=PART_LineUpButton}"
Value
=
"true"
/>
<
Condition
Binding
=
"{Binding IsPressed, ElementName=PART_LineUpButton}"
Value
=
"true"
/>
</
MultiDataTrigger.Conditions
>
<
Setter
Property
=
"Fill"
TargetName
=
"ArrowTop"
Value
=
"White"
/>
</
MultiDataTrigger
>
<
MultiDataTrigger
>
<
MultiDataTrigger.Conditions
>
<
Condition
Binding
=
"{Binding IsMouseOver, ElementName=PART_LineDownButton}"
Value
=
"true"
/>
<
Condition
Binding
=
"{Binding IsPressed, ElementName=PART_LineDownButton}"
Value
=
"false"
/>
</
MultiDataTrigger.Conditions
>
<
Setter
Property
=
"Fill"
TargetName
=
"ArrowBottom"
Value
=
"Black"
/>
</
MultiDataTrigger
>
<
MultiDataTrigger
>
<
MultiDataTrigger.Conditions
>
<
Condition
Binding
=
"{Binding IsMouseOver, ElementName=PART_LineUpButton}"
Value
=
"true"
/>
<
Condition
Binding
=
"{Binding IsPressed, ElementName=PART_LineUpButton}"
Value
=
"false"
/>
</
MultiDataTrigger.Conditions
>
<
Setter
Property
=
"Fill"
TargetName
=
"ArrowTop"
Value
=
"Black"
/>
</
MultiDataTrigger
>
<
Trigger
Property
=
"IsEnabled"
Value
=
"False"
>
<
Setter
Property
=
"Fill"
TargetName
=
"ArrowTop"
Value
=
"#FFBFBFBF"
/>
<
Setter
Property
=
"Fill"
TargetName
=
"ArrowBottom"
Value
=
"#FFBFBFBF"
/>
</
Trigger
>
</
ControlTemplate.Triggers
>
</
ControlTemplate
>
</
Setter.Value
>
</
Setter
>
<
Style.Triggers
>
<
Trigger
Property
=
"Orientation"
Value
=
"Horizontal"
>
<
Setter
Property
=
"Width"
Value
=
"Auto"
/>
<
Setter
Property
=
"MinWidth"
Value
=
"0"
/>
<
Setter
Property
=
"Height"
Value
=
"{DynamicResource {x:Static SystemParameters.HorizontalScrollBarHeightKey}}"
/>
<
Setter
Property
=
"MinHeight"
Value
=
"{DynamicResource {x:Static SystemParameters.HorizontalScrollBarHeightKey}}"
/>
<
Setter
Property
=
"BorderThickness"
Value
=
"0,1"
/>
<
Setter
Property
=
"Template"
>
<
Setter.Value
>
<
ControlTemplate
TargetType
=
"{x:Type ScrollBar}"
>
<
Grid
x:Name
=
"Bg"
SnapsToDevicePixels
=
"True"
>
<
Grid.ColumnDefinitions
>
<
ColumnDefinition
MaxWidth
=
"{DynamicResource {x:Static SystemParameters.HorizontalScrollBarButtonWidthKey}}"
/>
<
ColumnDefinition
Width
=
"1E-05*"
/>
<
ColumnDefinition
MaxWidth
=
"{DynamicResource {x:Static SystemParameters.HorizontalScrollBarButtonWidthKey}}"
/>
</
Grid.ColumnDefinitions
>
<
Border
BorderBrush
=
"{TemplateBinding BorderBrush}"
BorderThickness
=
"{TemplateBinding BorderThickness}"
Background
=
"{TemplateBinding Background}"
Grid.Column
=
"1"
/>
<
RepeatButton
x:Name
=
"PART_LineLeftButton"
Command
=
"ScrollBar.LineLeftCommand"
IsEnabled
=
"{TemplateBinding IsMouseOver}"
>
<
RepeatButton.Style
>
<
Style
TargetType
=
"{x:Type RepeatButton}"
>
<
Setter
Property
=
"FocusVisualStyle"
>
<
Setter.Value
>
<
Style
>
<
Setter
Property
=
"Control.Template"
>
<
Setter.Value
>
<
ControlTemplate
>
<
Rectangle
Margin
=
"2"
SnapsToDevicePixels
=
"True"
Stroke
=
"{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"
StrokeThickness
=
"1"
StrokeDashArray
=
"1 2"
/>
</
ControlTemplate
>
</
Setter.Value
>
</
Setter
>
</
Style
>
</
Setter.Value
>
</
Setter
>
<
Setter
Property
=
"BorderThickness"
Value
=
"1"
/>
<
Setter
Property
=
"HorizontalContentAlignment"
Value
=
"Center"
/>
<
Setter
Property
=
"VerticalContentAlignment"
Value
=
"Center"
/>
<
Setter
Property
=
"Padding"
Value
=
"1"
/>
<
Setter
Property
=
"Focusable"
Value
=
"False"
/>
<
Setter
Property
=
"IsTabStop"
Value
=
"False"
/>
<
Setter
Property
=
"Template"
>
<
Setter.Value
>
<
ControlTemplate
TargetType
=
"{x:Type RepeatButton}"
>
<
Border
x:Name
=
"border"
BorderBrush
=
"#FFF0F0F0"
BorderThickness
=
"1"
Background
=
"#FFF0F0F0"
SnapsToDevicePixels
=
"True"
>
<
ContentPresenter
x:Name
=
"contentPresenter"
ContentTemplate
=
"{TemplateBinding ContentTemplate}"
Content
=
"{TemplateBinding Content}"
ContentStringFormat
=
"{TemplateBinding ContentStringFormat}"
Focusable
=
"False"
HorizontalAlignment
=
"{TemplateBinding HorizontalContentAlignment}"
Margin
=
"{TemplateBinding Padding}"
SnapsToDevicePixels
=
"{TemplateBinding SnapsToDevicePixels}"
VerticalAlignment
=
"{TemplateBinding VerticalContentAlignment}"
/>
</
Border
>
<
ControlTemplate.Triggers
>
<
Trigger
Property
=
"IsMouseOver"
Value
=
"True"
>
<
Setter
Property
=
"Background"
TargetName
=
"border"
Value
=
"#FFDADADA"
/>
<
Setter
Property
=
"BorderBrush"
TargetName
=
"border"
Value
=
"#FFDADADA"
/>
</
Trigger
>
<
Trigger
Property
=
"IsPressed"
Value
=
"True"
>
<
Setter
Property
=
"Background"
TargetName
=
"border"
Value
=
"#FF606060"
/>
<
Setter
Property
=
"BorderBrush"
TargetName
=
"border"
Value
=
"#FF606060"
/>
</
Trigger
>
<
Trigger
Property
=
"IsEnabled"
Value
=
"False"
>
<
Setter
Property
=
"Opacity"
TargetName
=
"contentPresenter"
Value
=
"0.56"
/>
<
Setter
Property
=
"Background"
TargetName
=
"border"
Value
=
"#FFF0F0F0"
/>
<
Setter
Property
=
"BorderBrush"
TargetName
=
"border"
Value
=
"#FFF0F0F0"
/>
</
Trigger
>
</
ControlTemplate.Triggers
>
</
ControlTemplate
>
</
Setter.Value
>
</
Setter
>
</
Style
>
</
RepeatButton.Style
>
<
Path
x:Name
=
"ArrowLeft"
Data
=
"M3.18,7C3.18,7 5,7 5,7 5,7 1.81,3.5 1.81,3.5 1.81,3.5 5,0 5,0 5,0 3.18,0 3.18,0 3.18,0 0,3.5 0,3.5 0,3.5 3.18,7 3.18,7z"
Fill
=
"#FF606060"
Margin
=
"3"
Stretch
=
"Uniform"
/>
</
RepeatButton
>
<
Track
x:Name
=
"PART_Track"
Grid.Column
=
"1"
IsEnabled
=
"{TemplateBinding IsMouseOver}"
>
<
Track.DecreaseRepeatButton
>
<
RepeatButton
Command
=
"ScrollBar.PageLeftCommand"
>
<
RepeatButton.Style
>
<
Style
TargetType
=
"{x:Type RepeatButton}"
>
<
Setter
Property
=
"OverridesDefaultStyle"
Value
=
"True"
/>
<
Setter
Property
=
"Background"
Value
=
"Transparent"
/>
<
Setter
Property
=
"Focusable"
Value
=
"False"
/>
<
Setter
Property
=
"IsTabStop"
Value
=
"False"
/>
<
Setter
Property
=
"Template"
>
<
Setter.Value
>
<
ControlTemplate
TargetType
=
"{x:Type RepeatButton}"
>
<
Rectangle
Fill
=
"{TemplateBinding Background}"
Height
=
"{TemplateBinding Height}"
Width
=
"{TemplateBinding Width}"
/>
</
ControlTemplate
>
</
Setter.Value
>
</
Setter
>
</
Style
>
</
RepeatButton.Style
>
</
RepeatButton
>
</
Track.DecreaseRepeatButton
>
<
Track.IncreaseRepeatButton
>
<
RepeatButton
Command
=
"ScrollBar.PageRightCommand"
>
<
RepeatButton.Style
>
<
Style
TargetType
=
"{x:Type RepeatButton}"
>
<
Setter
Property
=
"OverridesDefaultStyle"
Value
=
"True"
/>
<
Setter
Property
=
"Background"
Value
=
"Transparent"
/>
<
Setter
Property
=
"Focusable"
Value
=
"False"
/>
<
Setter
Property
=
"IsTabStop"
Value
=
"False"
/>
<
Setter
Property
=
"Template"
>
<
Setter.Value
>
<
ControlTemplate
TargetType
=
"{x:Type RepeatButton}"
>
<
Rectangle
Fill
=
"{TemplateBinding Background}"
Height
=
"{TemplateBinding Height}"
Width
=
"{TemplateBinding Width}"
/>
</
ControlTemplate
>
</
Setter.Value
>
</
Setter
>
</
Style
>
</
RepeatButton.Style
>
</
RepeatButton
>
</
Track.IncreaseRepeatButton
>
<
Track.Thumb
>
<
Thumb
>
<
Thumb.Style
>
<
Style
TargetType
=
"{x:Type Thumb}"
>
<
Setter
Property
=
"OverridesDefaultStyle"
Value
=
"True"
/>
<
Setter
Property
=
"IsTabStop"
Value
=
"False"
/>
<
Setter
Property
=
"Template"
>
<
Setter.Value
>
<
ControlTemplate
TargetType
=
"{x:Type Thumb}"
>
<
Rectangle
x:Name
=
"rectangle"
Fill
=
"{Binding Path=ScrollBarThumbBrush, RelativeSource={RelativeSource AncestorType=my:CustomScrollViewer}}"
Height
=
"{TemplateBinding Height}"
SnapsToDevicePixels
=
"True"
Width
=
"{TemplateBinding Width}"
/>
<
ControlTemplate.Triggers
>
<
Trigger
Property
=
"IsMouseOver"
Value
=
"True"
>
<
Setter
Property
=
"Fill"
TargetName
=
"rectangle"
Value
=
"#FFA6A6A6"
/>
</
Trigger
>
<
Trigger
Property
=
"IsDragging"
Value
=
"True"
>
<
Setter
Property
=
"Fill"
TargetName
=
"rectangle"
Value
=
"#FF606060"
/>
</
Trigger
>
</
ControlTemplate.Triggers
>
</
ControlTemplate
>
</
Setter.Value
>
</
Setter
>
</
Style
>
</
Thumb.Style
>
</
Thumb
>
</
Track.Thumb
>
</
Track
>
<
RepeatButton
x:Name
=
"PART_LineRightButton"
Grid.Column
=
"2"
Command
=
"ScrollBar.LineRightCommand"
IsEnabled
=
"{TemplateBinding IsMouseOver}"
>
<
RepeatButton.Style
>
<
Style
TargetType
=
"{x:Type RepeatButton}"
>
<
Setter
Property
=
"FocusVisualStyle"
>
<
Setter.Value
>
<
Style
>
<
Setter
Property
=
"Control.Template"
>
<
Setter.Value
>
<
ControlTemplate
>
<
Rectangle
Margin
=
"2"
SnapsToDevicePixels
=
"True"
Stroke
=
"{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"
StrokeThickness
=
"1"
StrokeDashArray
=
"1 2"
/>
</
ControlTemplate
>
</
Setter.Value
>
</
Setter
>
</
Style
>
</
Setter.Value
>
</
Setter
>
<
Setter
Property
=
"BorderThickness"
Value
=
"1"
/>
<
Setter
Property
=
"HorizontalContentAlignment"
Value
=
"Center"
/>
<
Setter
Property
=
"VerticalContentAlignment"
Value
=
"Center"
/>
<
Setter
Property
=
"Padding"
Value
=
"1"
/>
<
Setter
Property
=
"Focusable"
Value
=
"False"
/>
<
Setter
Property
=
"IsTabStop"
Value
=
"False"
/>
<
Setter
Property
=
"Template"
>
<
Setter.Value
>
<
ControlTemplate
TargetType
=
"{x:Type RepeatButton}"
>
<
Border
x:Name
=
"border"
BorderBrush
=
"#FFF0F0F0"
BorderThickness
=
"1"
Background
=
"#FFF0F0F0"
SnapsToDevicePixels
=
"True"
>
<
ContentPresenter
x:Name
=
"contentPresenter"
ContentTemplate
=
"{TemplateBinding ContentTemplate}"
Content
=
"{TemplateBinding Content}"
ContentStringFormat
=
"{TemplateBinding ContentStringFormat}"
Focusable
=
"False"
HorizontalAlignment
=
"{TemplateBinding HorizontalContentAlignment}"
Margin
=
"{TemplateBinding Padding}"
SnapsToDevicePixels
=
"{TemplateBinding SnapsToDevicePixels}"
VerticalAlignment
=
"{TemplateBinding VerticalContentAlignment}"
/>
</
Border
>
<
ControlTemplate.Triggers
>
<
Trigger
Property
=
"IsMouseOver"
Value
=
"True"
>
<
Setter
Property
=
"Background"
TargetName
=
"border"
Value
=
"#FFDADADA"
/>
<
Setter
Property
=
"BorderBrush"
TargetName
=
"border"
Value
=
"#FFDADADA"
/>
</
Trigger
>
<
Trigger
Property
=
"IsPressed"
Value
=
"True"
>
<
Setter
Property
=
"Background"
TargetName
=
"border"
Value
=
"#FF606060"
/>
<
Setter
Property
=
"BorderBrush"
TargetName
=
"border"
Value
=
"#FF606060"
/>
</
Trigger
>
<
Trigger
Property
=
"IsEnabled"
Value
=
"False"
>
<
Setter
Property
=
"Opacity"
TargetName
=
"contentPresenter"
Value
=
"0.56"
/>
<
Setter
Property
=
"Background"
TargetName
=
"border"
Value
=
"#FFF0F0F0"
/>
<
Setter
Property
=
"BorderBrush"
TargetName
=
"border"
Value
=
"#FFF0F0F0"
/>
</
Trigger
>
</
ControlTemplate.Triggers
>
</
ControlTemplate
>
</
Setter.Value
>
</
Setter
>
</
Style
>
</
RepeatButton.Style
>
<
Path
x:Name
=
"ArrowRight"
Data
=
"M1.81,7C1.81,7 0,7 0,7 0,7 3.18,3.5 3.18,3.5 3.18,3.5 0,0 0,0 0,0 1.81,0 1.81,0 1.81,0 5,3.5 5,3.5 5,3.5 1.81,7 1.81,7z"
Fill
=
"#FF606060"
Margin
=
"3"
Stretch
=
"Uniform"
/>
</
RepeatButton
>
</
Grid
>
<
ControlTemplate.Triggers
>
<
MultiDataTrigger
>
<
MultiDataTrigger.Conditions
>
<
Condition
Binding
=
"{Binding IsMouseOver, ElementName=PART_LineRightButton}"
Value
=
"true"
/>
<
Condition
Binding
=
"{Binding IsPressed, ElementName=PART_LineRightButton}"
Value
=
"true"
/>
</
MultiDataTrigger.Conditions
>
<
Setter
Property
=
"Fill"
TargetName
=
"ArrowRight"
Value
=
"White"
/>
</
MultiDataTrigger
>
<
MultiDataTrigger
>
<
MultiDataTrigger.Conditions
>
<
Condition
Binding
=
"{Binding IsMouseOver, ElementName=PART_LineLeftButton}"
Value
=
"true"
/>
<
Condition
Binding
=
"{Binding IsPressed, ElementName=PART_LineLeftButton}"
Value
=
"true"
/>
</
MultiDataTrigger.Conditions
>
<
Setter
Property
=
"Fill"
TargetName
=
"ArrowLeft"
Value
=
"White"
/>
</
MultiDataTrigger
>
<
MultiDataTrigger
>
<
MultiDataTrigger.Conditions
>
<
Condition
Binding
=
"{Binding IsMouseOver, ElementName=PART_LineRightButton}"
Value
=
"true"
/>
<
Condition
Binding
=
"{Binding IsPressed, ElementName=PART_LineRightButton}"
Value
=
"false"
/>
</
MultiDataTrigger.Conditions
>
<
Setter
Property
=
"Fill"
TargetName
=
"ArrowRight"
Value
=
"Black"
/>
</
MultiDataTrigger
>
<
MultiDataTrigger
>
<
MultiDataTrigger.Conditions
>
<
Condition
Binding
=
"{Binding IsMouseOver, ElementName=PART_LineLeftButton}"
Value
=
"true"
/>
<
Condition
Binding
=
"{Binding IsPressed, ElementName=PART_LineLeftButton}"
Value
=
"false"
/>
</
MultiDataTrigger.Conditions
>
<
Setter
Property
=
"Fill"
TargetName
=
"ArrowLeft"
Value
=
"Black"
/>
</
MultiDataTrigger
>
<
Trigger
Property
=
"IsEnabled"
Value
=
"False"
>
<
Setter
Property
=
"Fill"
TargetName
=
"ArrowLeft"
Value
=
"#FFBFBFBF"
/>
<
Setter
Property
=
"Fill"
TargetName
=
"ArrowRight"
Value
=
"#FFBFBFBF"
/>
</
Trigger
>
</
ControlTemplate.Triggers
>
</
ControlTemplate
>
</
Setter.Value
>
</
Setter
>
</
Trigger
>
</
Style.Triggers
>
</Style>
Now we can use the CustomScrollViewer control and set ScrollBarThumbBrush property as shown in following code in the project where we need Thumb color as per our requirement.
<
my:CustomScrollViewer
ScrollBarThumbBrush
=
"Blue"
HorizontalScrollBarVisibility
=
"Visible"
VerticalScrollBarVisibility
=
"Visible"
>
<
Grid
Width
=
"600"
Height
=
"600"
/>
</
my:CustomScrollViewer
>
No comments:
Post a Comment