Slider滑動條連續滑動
阿新 • • 發佈:2022-05-15
記錄一個問題,在此感謝同事( 拚忘 - 部落格園 )提供的編碼方案
問題:如下圖所示 需要支援觸控(或滑鼠)按壓在1上支援滑動操作,目前僅僅在2上可以滑動操作,1上只能點選操作無法滑動。
1 Slider滑動條支援拖動,需要將move事件轉換觸發PreviewMouseLeftButtonDownEvent事件模擬滑動操作。
2 捕捉裝置,鎖定在當前Slider上
解決方案:
第一步 建立SliderAttach
public static class SliderAttach { public static bool GetMoveToPointOnDrag(DependencyObject obj) { return(bool)obj.GetValue(MoveToPointOnDragProperty); } public static void SetMoveToPointOnDrag(DependencyObject obj, bool value) { obj.SetValue(MoveToPointOnDragProperty, value); } /// <summary> /// 滾動條點選拖動附加屬性 /// </summary> public static readonly DependencyProperty MoveToPointOnDragProperty = DependencyProperty.RegisterAttached("MoveToPointOnDrag", typeof(bool), typeof(SliderAttach), new PropertyMetadata { PropertyChangedCallback = (obj, changeEvent) => { var isDown = false; if (!(bool)changeEvent.NewValue) return; var slider = (Slider)obj;if (!(slider.Parent is FrameworkElement parent)) return; parent.PreviewMouseDown += (sender, args) => { isDown = true; }; slider.MouseMove += (obj2, mouseEvent) => { if (mouseEvent.LeftButton != MouseButtonState.Pressed || !isDown) return; if (!slider.IsMouseCaptured) slider.CaptureMouse(); slider.RaiseEvent(new MouseButtonEventArgs(mouseEvent.MouseDevice, mouseEvent.Timestamp, MouseButton.Left) { RoutedEvent = UIElement.PreviewMouseLeftButtonDownEvent, Source = mouseEvent.Source, }); }; parent.PreviewMouseUp += (sender, args) => { isDown = false; slider.ReleaseMouseCapture(); }; } }); }
第二步: Slider 設定附件屬性
<Slider resources:SliderAttach.MoveToPointOnDrag="True"/>