在 ScrollViewer 如果需要收到触摸消息,通过 Manipulation 触摸滚动,不能只是通过设置 IsManipulationEnabled 方法,还需要设置 PanningMode 才可以
那么如何知道滚动条的触摸事件是否触发,可以写一个类继承滚动条
    public class StisvearpaHudalserevow : ScrollViewer    {        /// <inheritdoc />        protected override void OnManipulationDelta(ManipulationDeltaEventArgs e)        {            Debug.WriteLine("OnManipulationDelta");            base.OnManipulationDelta(e);        }
        /// <inheritdoc />        protected override void OnManipulationCompleted(ManipulationCompletedEventArgs e)        {            Debug.WriteLine("OnManipulationCompleted");            base.OnManipulationCompleted(e);        }
        /// <inheritdoc />        protected override void OnManipulationStarted(ManipulationStartedEventArgs e)        {            Debug.WriteLine("OnManipulationStarted");            base.OnManipulationStarted(e);        }    }在界面添加这个类,如果有触摸输入就可以通过输出看到了,简单一个界面,可以看到默认的滚动条是不能滚动的

同时触摸的时候没有输出
尝试添加 IsManipulationEnabled 方法
<local:StisvearpaHudalserevow IsManipulationEnabled="True">可以看到有输出但是就是不能滚动
在我博客 WPF 拖动滚动 告诉大家通过 PanningMode 的方法可以让滚动条滚动
只要在初始的过程设置了 PanningMode 因为在代码里面通过 InvalidateProperty 重新设置 IsManipulationEnabled 的值,所以只需要设置 PanningMode 就可以
       /// <summary>        ///     Method which sets IsManipulationEnabled        ///     property based on the PanningMode        /// </summary>        private void OnPanningModeChanged()        {            PanningMode mode = PanningMode;
            // Call InvalidateProperty for IsManipulationEnabledProperty            // to reset previous SetCurrentValueInternal if any.            // Then call SetCurrentValueInternal to            // set the value of these properties if needed.            InvalidateProperty(IsManipulationEnabledProperty);
            if (mode != PanningMode.None)            {                SetCurrentValueInternal(IsManipulationEnabledProperty, BooleanBoxes.TrueBox);            }        }但是如果在触摸的过程,出现了设置 IsManipulationEnabled 为 false 就会触发 OnManipulationCompleted 事件
        protected override void OnManipulationStarted(ManipulationStartedEventArgs e)        {            Debug.WriteLine("OnManipulationStarted");            base.OnManipulationStarted(e);
            Task.Delay(TimeSpan.FromSeconds(3)).ContinueWith(_ => IsManipulationEnabled = false,                TaskScheduler.FromCurrentSynchronizationContext());        }还可以通过设置 IsHitTestVisible = false 触发 OnManipulationCompleted 同时触发之后也没有触摸
   本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。 欢迎转载、使用、重新发布,但务必保留文章署名 林德熙 (包含链接: https://blog.lindexi.com ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我 联系。