MyScrollViewer.vb 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. Public Class MyScrollViewer
  2. Inherits ScrollViewer
  3. Public Property DeltaMult As Double = 1
  4. Private RealOffset As Double
  5. Private Sub MyScrollViewer_PreviewMouseWheel(sender As Object, e As MouseWheelEventArgs) Handles Me.PreviewMouseWheel
  6. If e.Delta = 0 OrElse ActualHeight = 0 OrElse ScrollableHeight = 0 Then Return
  7. Dim SourceType = e.Source.GetType
  8. If Content.TemplatedParent Is Nothing AndAlso (
  9. (GetType(ComboBox).IsAssignableFrom(SourceType) AndAlso CType(e.Source, ComboBox).IsDropDownOpen) OrElse
  10. (GetType(TextBox).IsAssignableFrom(SourceType) AndAlso CType(e.Source, TextBox).AcceptsReturn) OrElse
  11. GetType(ComboBoxItem).IsAssignableFrom(SourceType) OrElse
  12. (TypeOf e.Source Is Visual AndAlso
  13. PresentationSource.FromVisual(e.Source)?.RootVisual?.GetType().FullName = "System.Windows.Controls.Primitives.PopupRoot")) Then
  14. '如果当前是在对有滚动条的下拉框或文本框执行,则不接管操作
  15. Return
  16. End If
  17. e.Handled = True
  18. PerformVerticalOffsetDelta(-e.Delta)
  19. '关闭 Tooltip (#2552)
  20. '通过 IsOpen 关闭 Tooltip 而不是降低 Border 不透明度 (#5744)
  21. Application.ShowingTooltips.ForEach(Sub(tooltip) tooltip.IsOpen = False)
  22. End Sub
  23. Public Sub PerformVerticalOffsetDelta(Delta As Double)
  24. AniStart(
  25. AaDouble(
  26. Sub(AnimDelta As Double)
  27. RealOffset = (RealOffset + AnimDelta).Clamp(0, ExtentHeight - ActualHeight)
  28. ScrollToVerticalOffset(RealOffset)
  29. End Sub, Delta * DeltaMult, 300,, New AniEaseOutFluent(6)))
  30. End Sub
  31. Private Sub MyScrollViewer_ScrollChanged(sender As Object, e As ScrollChangedEventArgs) Handles Me.ScrollChanged
  32. RealOffset = VerticalOffset
  33. If FrmMain IsNot Nothing AndAlso (e.VerticalChange OrElse e.ViewportHeightChange) Then FrmMain.BtnExtraBack.ShowRefresh()
  34. End Sub
  35. Private Sub MyScrollViewer_IsVisibleChanged(sender As Object, e As DependencyPropertyChangedEventArgs) Handles Me.IsVisibleChanged
  36. FrmMain.BtnExtraBack.ShowRefresh()
  37. End Sub
  38. Public ScrollBar As MyScrollBar
  39. Private Sub Load() Handles Me.Loaded
  40. ScrollBar = GetTemplateChild("PART_VerticalScrollBar")
  41. End Sub
  42. Private Sub MyScrollViewer_PreviewGotKeyboardFocus(sender As Object, e As KeyboardFocusChangedEventArgs) Handles Me.PreviewGotKeyboardFocus
  43. If e.NewFocus IsNot Nothing AndAlso TypeOf e.NewFocus Is MySlider Then e.Handled = True '#3854,阻止获得焦点时自动滚动
  44. End Sub
  45. End Class