I love WPF

"jamais sans son interface"

I love WPF

"jamais sans son interface"

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>

 

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Retour en haut