ScrollViewer внутри ScrollViewer WPF - PullRequest
0 голосов
/ 05 августа 2020

На моей странице WPF мне нужно прокручивать вертикально, а внутри (этот ScrollViewer) мне нужно несколько горизонтальных прокруток. Вначале у меня была проблема, когда я указал мышкой на внутреннюю область ScrollViewer, я не мог прокрутить страницу (по вертикали). Я нашел сообщение: https://serialseb.com/blog/2007/09/03/wpf-tips-6-preventing-scrollviewer-from/, это решило мою проблему с мышью, но теперь у меня такая же проблема с сенсорным дисплеем. Я не могу использовать палец для вертикальной прокрутки внутренней прокрутки. У кого-нибудь есть идея изменить приведенный ниже код, чтобы он работал на сенсорном дисплее? Спасибо

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);
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...