0

In my WPF page I need to scroll vertically and inside (this ScrollViewer) I need several horizontal scrolls. At the beginning i had the problem was that when I pointed with my mouse on the inside ScrollViewer area I cant scroll the page (vertically).I found a post: https://serialseb.com/blog/2007/09/03/wpf-tips-6-preventing-scrollviewer-from/ it resolved my mouse problem, but now I have the same problem on Touch display. I can't use my finger to vertically scroll on the inside scrollviewer. Anyone has any idea to change the below code to let it work for touch display? Thanks

public class ScrollViewerCorrector
{
    public static bool GetFixScrolling(DependencyObject obj)
    {
        return (bool)obj.GetValue(FixScrollingProperty);
    }

    public static void SetFixScrolling(DependencyObject obj, bool value)
    {
        obj.SetValue(FixScrollingProperty, value);
    }

    public static readonly DependencyProperty FixScrollingProperty =
        DependencyProperty.RegisterAttached("FixScrolling", typeof(bool), typeof(ScrollViewerCorrector), new FrameworkPropertyMetadata(false, ScrollViewerCorrector.OnFixScrollingPropertyChanged));

    public static void OnFixScrollingPropertyChanged(object sender, DependencyPropertyChangedEventArgs e)
    {
        ScrollViewer viewer = sender as ScrollViewer;
        if (viewer == null)
            throw new ArgumentException("The dependency property can only be attached to a ScrollViewer", "sender");

        if ((bool)e.NewValue == true)
            viewer.PreviewMouseWheel += HandlePreviewMouseWheel;

        else if ((bool)e.NewValue == false)
            viewer.PreviewMouseWheel -= HandlePreviewMouseWheel;
    }

    private static List<MouseWheelEventArgs> _reentrantList = new List<MouseWheelEventArgs>();

    private static void HandlePreviewMouseWheel(object sender, MouseWheelEventArgs e)
    {
        var scrollControl = sender as ScrollViewer;

        if (!e.Handled && sender != null && !_reentrantList.Contains(e))
        {
            var previewEventArg = new MouseWheelEventArgs(e.MouseDevice, e.Timestamp, e.Delta)
            {
                RoutedEvent = UIElement.PreviewMouseWheelEvent,
                Source = sender
            };

            var originalSource = e.OriginalSource as UIElement;
            _reentrantList.Add(previewEventArg);
            originalSource.RaiseEvent(previewEventArg);
            _reentrantList.Remove(previewEventArg);

            // at this point if no one else handled the event in our children, we do our job

            if (!previewEventArg.Handled && ((e.Delta > 0 && scrollControl.VerticalOffset == 0)
                || (e.Delta <= 0 && scrollControl.VerticalOffset >= scrollControl.ExtentHeight - scrollControl.ViewportHeight)))
            {
                e.Handled = true;
                var eventArg = new MouseWheelEventArgs(e.MouseDevice, e.Timestamp, e.Delta);
                eventArg.RoutedEvent = UIElement.MouseWheelEvent;
                eventArg.Source = sender;
                var parent = (UIElement)((FrameworkElement)sender).Parent;
                parent.RaiseEvent(eventArg);
            }
        }
    }
}
Peter Csala
  • 17,736
  • 16
  • 35
  • 75
  • What specific part of the code here does not work for you? – o_w Aug 05 '20 at 13:47
  • This code works fine for mouse wheel event. I don't know how to modify this code for touch event, especially for touch scroll. – George Geng Aug 05 '20 at 18:49
  • Seems to work with Manipulation events once Panning mode is set: https://stackoverflow.com/questions/43648434/wpf-touch-panning-scroll-event-handler – o_w Aug 06 '20 at 06:41

0 Answers0