Simple ScrollViewer With Offset in DP
if you want a ScollWiever with offsets use
public class ScrollViewerEx : ScrollViewer, INotifyPropertyChanged
{
static ScrollViewerEx()
{
//ScrollViewer.VerticalOffsetProperty.OverrideMetadata(typeof(ScrollViewerEx),
// new FrameworkPropertyMetadata(0.0, (d, e) =>
// {
// ScrollViewerEx control = d as ScrollViewerEx;
// control.ScrollToVerticalOffset((double)e.NewValue);
// }));
//ScrollViewer.HorizontalOffsetProperty.OverrideMetadata(typeof(ScrollViewerEx),
// new FrameworkPropertyMetadata(0.0, (d, e) =>
// {
// ScrollViewerEx control = d as ScrollViewerEx;
// control.ScrollToHorizontalOffset((double)e.NewValue);
// }));
}
#region VerticalOffset (DP)
public new double VerticalOffset
{
get { return (double)GetValue(VerticalOffsetProperty); }
set { SetValue(VerticalOffsetProperty, value); }
}
// Using a DependencyProperty as the backing store for VerticalOffset. This enables animation, styling, binding, etc...
public new static readonly DependencyProperty VerticalOffsetProperty =
DependencyProperty.Register(
"VerticalOffset",
typeof(double),
typeof(ScrollViewerEx),
new FrameworkPropertyMetadata(0.0, FrameworkPropertyMetadataOptions.AffectsRender , new PropertyChangedCallback(VerticalOffsetChanged))
);
private static void VerticalOffsetChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
ScrollViewerEx control = d as ScrollViewerEx;
control.ScrollToVerticalOffset((double)e.NewValue);
}
#endregion
#region HorizontalOffset (DP)
public new double HorizontalOffset
{
get { return (double)GetValue(HorizontalOffsetProperty); }
set { SetValue(HorizontalOffsetProperty, value); }
}
// Using a DependencyProperty as the backing store for HorizontalOffset. This enables animation, styling, binding, etc...
public static new readonly DependencyProperty HorizontalOffsetProperty =
DependencyProperty.Register(
"HorizontalOffset",
typeof(double),
typeof(ScrollViewerEx),
new FrameworkPropertyMetadata(0.0, FrameworkPropertyMetadataOptions.AffectsRender , new PropertyChangedCallback(HorizontalOffsetChanged))
);
private static void HorizontalOffsetChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
ScrollViewerEx control = d as ScrollViewerEx;
control.ScrollToHorizontalOffset((double)e.NewValue);
}
#endregion
protected override void OnPreviewMouseWheel(MouseWheelEventArgs e)
{
e.Handled = true;
base.OnPreviewMouseWheel(e);
}
ScrollBar verticalScrollBar = null;
ScrollBar horizontalScrollBar = null;
public event PropertyChangedEventHandler PropertyChanged;
public override void OnApplyTemplate()
{
base.OnApplyTemplate();
verticalScrollBar = GetTemplateChild("PART_VerticalScrollBar") as ScrollBar;
horizontalScrollBar = GetTemplateChild("PART_VerticalScrollBar") as ScrollBar;
this.Loaded += (ss, ee) =>
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("VerticalMaximum"));
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("HorizontalMaximum"));
};
}
public double? VerticalMaximum => verticalScrollBar?.Maximum;
public double? HorizontalMaximum => horizontalScrollBar?.Maximum;
}
and you can animate then with
<Storyboard x:Key="Storyboard1">
<DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(local:ScrollViewerEx.VerticalOffset)"
Storyboard.TargetName="scrollViewerEx">
<EasingDoubleKeyFrame KeyTime="0"
Value="0" />
<EasingDoubleKeyFrame KeyTime="0:0:20"
Value="{Binding VerticalMaximum, ElementName=scrollViewerEx}" />
</DoubleAnimationUsingKeyFrames>
</Storyboard>
and for sample
<local:ScrollViewerEx x:Name="scrollViewerEx"
HorizontalAlignment="Left"
Height="195"
Margin="830,40,0,0"
VerticalAlignment="Top"
VerticalScrollBarVisibility="Hidden"
HorizontalScrollBarVisibility="Hidden"
Width="245">
<TextBlock Margin="0 0 0 0"
VerticalAlignment="Stretch"
HorizontalAlignment="Stretch">
<Run Text=" " /><LineBreak />
<Run Text=" " /><LineBreak />
<Run Text=" " /><LineBreak />
<Run Text=" " /><LineBreak />
<Run Text=" " /><LineBreak />
<Run Text=" " /><LineBreak />
<Run Text=" " /><LineBreak />
<Run Text=" " /><LineBreak />
<Run Text=" " /><LineBreak />
<Run Text=" " /><LineBreak />
<Run Text=" " /><LineBreak />
<Run Text="aaaaaaaaaaaaaaaaaaaa" /><LineBreak />
<Run Text="bbbbbbbbbbbbbbbbbbb" /><LineBreak />
<Run Text="aaaaaaaaaaaaaaaaaaaa" /><LineBreak />
<Run Text="bbbbbbbbbbbbbbbbbbb" /><LineBreak />
<Run Text="aaaaaaaaaaaaaaaaaaaa" /><LineBreak />
<Run Text="bbbbbbbbbbbbbbbbbbb" /><LineBreak />
<Run Text="aaaaaaaaaaaaaaaaaaaa" /><LineBreak />
<Run Text="bbbbbbbbbbbbbbbbbbb" /><LineBreak />
<Run Text="aaaaaaaaaaaaaaaaaaaa" /><LineBreak />
<Run Text="bbbbbbbbbbbbbbbbbbb" /><LineBreak />
<Run Text="aaaaaaaaaaaaaaaaaaaa" /><LineBreak />
<Run Text="bbbbbbbbbbbbbbbbbbb" /><LineBreak />
<Run Text="aaaaaaaaaaaaaaaaaaaa" /><LineBreak />
<Run Text="bbbbbbbbbbbbbbbbbbb" /><LineBreak />
<Run Text="aaaaaaaaaaaaaaaaaaaa" /><LineBreak />
<Run Text="bbbbbbbbbbbbbbbbbbb" /><LineBreak />
<Run Text="aaaaaaaaaaaaaaaaaaaa" /><LineBreak />
<Run Text="bbbbbbbbbbbbbbbbbbb" /><LineBreak />
<Run Text="aaaaaaaaaaaaaaaaaaaa" /><LineBreak />
<Run Text="bbbbbbbbbbbbbbbbbbb" /><LineBreak />
<Run Text="aaaaaaaaaaaaaaaaaaaa" /><LineBreak />
<Run Text="bbbbbbbbbbbbbbbbbbb" /><LineBreak />
<Run Text="aaaaaaaaaaaaaaaaaaaa" /><LineBreak />
<Run Text="bbbbbbbbbbbbbbbbbbb" /><LineBreak />
<Run Text="aaaaaaaaaaaaaaaaaaaa" /><LineBreak />
<Run Text="bbbbbbbbbbbbbbbbbbb" /><LineBreak />
<Run Text="aaaaaaaaaaaaaaaaaaaa" /><LineBreak />
<Run Text="bbbbbbbbbbbbbbbbbbb" /><LineBreak />
<Run Text="aaaaaaaaaaaaaaaaaaaa" /><LineBreak />
<Run Text="bbbbbbbbbbbbbbbbbbb" /><LineBreak />
<Run Text="aaaaaaaaaaaaaaaaaaaa" /><LineBreak />
<Run Text="bbbbbbbbbbbbbbbbbbb" /><LineBreak />
<Run Text="aaaaaaaaaaaaaaaaaaaa" /><LineBreak />
<Run Text="bbbbbbbbbbbbbbbbbbb" /><LineBreak />
<Run Text="aaaaaaaaaaaaaaaaaaaa" /><LineBreak />
<Run Text="bbbbbbbbbbbbbbbbbbb" /><LineBreak />
<Run Text="aaaaaaaaaaaaaaaaaaaa" /><LineBreak />
<Run Text="bbbbbbbbbbbbbbbbbbb" /><LineBreak />
<Run Text="aaaaaaaaaaaaaaaaaaaa" /><LineBreak />
<Run Text="bbbbbbbbbbbbbbbbbbb" /><LineBreak />
<Run Text="aaaaaaaaaaaaaaaaaaaa" /><LineBreak />
<Run Text="bbbbbbbbbbbbbbbbbbb" /><LineBreak />
<Run Text="aaaaaaaaaaaaaaaaaaaa" /><LineBreak />
<Run Text="bbbbbbbbbbbbbbbbbbb" /><LineBreak />
<Run Text="aaaaaaaaaaaaaaaaaaaa" /><LineBreak />
<Run Text="bbbbbbbbbbbbbbbbbbb" /><LineBreak />
<Run Text="aaaaaaaaaaaaaaaaaaaa" /><LineBreak />
<Run Text="bbbbbbbbbbbbbbbbbbb" /><LineBreak />
<Run Text="aaaaaaaaaaaaaaaaaaaa" /><LineBreak />
<Run Text="bbbbbbbbbbbbbbbbbbb" /><LineBreak />
<Run Text="aaaaaaaaaaaaaaaaaaaa" /><LineBreak />
<Run Text="ccccccccccccc" /><LineBreak />
<Run Text="bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" /><LineBreak /><Run Text="cccccccccccccccccccc" /><LineBreak /><Run Text="dddddddddddddddddddddd" /><LineBreak /><Run Text="eeeeeeeeeeeeeeeeeeeeeee" /><LineBreak /><Run Text="fffffffffffffffffffffffff" /><LineBreak /><Run Text="ggggggggggggggggggggggg" /><LineBreak /><Run Text="hhhhhhhhhhhhhhhhhhhh" /><LineBreak /><Run Text="iiiiiiiiiiiiiiiiiiiiiiiiiiiii" /><LineBreak /><Run Text="jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj" /><LineBreak /><Run Text="kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk" /><LineBreak /><Run Text="lllllllllllllllllllllllllllllllllllllllllllllllllllll" /><LineBreak /><Run Text="mmmmmmmmmmmmmmmmmmmmmmmmmm" /><LineBreak /><Run Text="nnnnnnnnnnnnnnnnnnnnnn" /><LineBreak /><Run Text="oooooooooooooooooooooo" /><LineBreak /><Run Text="pppppppppppppppppppppppppp" /><LineBreak /><Run Text="qqqqqqqqqqqqqqqqqqqq" /><LineBreak /><Run Text="rrrrrrrrrrrrrrrrrrrrrrrrr" />
<LineBreak /><LineBreak /><LineBreak /><LineBreak /><LineBreak /><LineBreak /><LineBreak /><LineBreak /><LineBreak /><LineBreak /><LineBreak /><LineBreak /><LineBreak /><LineBreak /><LineBreak /><LineBreak /><LineBreak />
</TextBlock>
</local:ScrollViewerEx>
