Skip to content

Instantly share code, notes, and snippets.

@1saeedsalehi
Created February 17, 2019 12:52
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save 1saeedsalehi/75004c21c917033a94dd46c323032ea6 to your computer and use it in GitHub Desktop.
Save 1saeedsalehi/75004c21c917033a94dd46c323032ea6 to your computer and use it in GitHub Desktop.
using System;
using System.Windows.Controls;
using System.Windows.Input;
namespace XeRetail.FrontOffice.UI.CustomControls
{
public class TouchScroller : ScrollViewer
{
private double _firstMousePosition;
private bool _isScrolling;
private double _scrollingPace;
public TouchScroller()
{
_scrollingPace = 0.1;
var middleMousePosition = double.NaN;
PreviewMouseLeftButtonDown += (s, e) => { _firstMousePosition = e.GetPosition(this).Y; };
MouseLeftButtonUp += (s, e) =>
{
middleMousePosition = double.NaN;
IsScrolling = false;
};
PreviewMouseMove += (s, e) =>
{
if (e.LeftButton == MouseButtonState.Pressed)
{
var lastMousePosition = e.GetPosition(this).Y;
if (double.IsNaN(middleMousePosition)) middleMousePosition = _firstMousePosition;
ScrollToVerticalOffset(VerticalOffset - (lastMousePosition - middleMousePosition) * _scrollingPace);
middleMousePosition = lastMousePosition;
if (IsScrolling == false)
if (Math.Abs(lastMousePosition - _firstMousePosition) > 10)
IsScrolling = true;
}
};
AddHandler(MouseLeftButtonUpEvent,
new MouseButtonEventHandler((o, arg) =>
{
middleMousePosition = double.NaN;
IsScrolling = false;
}),
true);
}
public bool IsScrolling
{
get => _isScrolling;
set
{
if (_isScrolling == value)
return;
_isScrolling = value;
RaiseIsScrollingChanged?.Invoke(this, value);
}
}
public void SetScrollingPace(double pace)
{
_scrollingPace = pace;
}
public event EventHandler<bool> RaiseIsScrollingChanged;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment