MyScrollViewer.vb 1.8 KB

123456789101112131415161718192021222324252627282930313233
  1. Public Class MyScrollViewer
  2. Inherits ScrollViewer
  3. Public Property DeltaMuity 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 Exit Sub
  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)) Then
  12. '如果当前是在对有滚动条的下拉框或文本框执行,则不接管操作
  13. Exit Sub
  14. End If
  15. PerformVerticalOffsetDelta(-e.Delta)
  16. e.Handled = True
  17. End Sub
  18. Public Sub PerformVerticalOffsetDelta(Delta As Double)
  19. AniStart(AaDouble(Sub(AnimDelta As Double)
  20. RealOffset = MathRange(RealOffset + AnimDelta, 0, ExtentHeight - ActualHeight)
  21. ScrollToVerticalOffset(RealOffset)
  22. End Sub, Delta * DeltaMuity, 300,, New AniEaseOutFluent(6)))
  23. End Sub
  24. Private Sub MyScrollViewer_ScrollChanged(sender As Object, e As ScrollChangedEventArgs) Handles Me.ScrollChanged
  25. RealOffset = VerticalOffset
  26. If FrmMain IsNot Nothing AndAlso (e.VerticalChange OrElse e.ViewportHeightChange) Then FrmMain.BtnExtraBack.ShowRefresh()
  27. End Sub
  28. Private Sub MyScrollViewer_IsVisibleChanged(sender As Object, e As DependencyPropertyChangedEventArgs) Handles Me.IsVisibleChanged
  29. FrmMain.BtnExtraBack.ShowRefresh()
  30. End Sub
  31. End Class