MyVirtualizingElement.vb 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. Public Class MyVirtualizingElement(Of T As FrameworkElement)
  2. Inherits FrameworkElement
  3. Private Initializer As Func(Of T)
  4. Public Sub New(Initializer As Func(Of T))
  5. Me.Initializer = Initializer
  6. LazyLoadBehavior.OnFirstEnterScrollViewerViewport(Me, AddressOf Init)
  7. End Sub
  8. ''' <summary>
  9. ''' 实例化此控件。
  10. ''' </summary>
  11. Public Function Init() As T
  12. Dim Element As T = Initializer()
  13. If Parent IsNot Nothing Then
  14. If TypeOf Parent IsNot Panel Then Throw New Exception("MyVirtualizingElement 的父级必须是一个 Panel")
  15. Dim ParentPanel As Panel = Parent
  16. Dim CurrentIndex As Integer = ParentPanel.Children.IndexOf(Me)
  17. ParentPanel.Children.RemoveAt(CurrentIndex)
  18. ParentPanel.Children.Insert(CurrentIndex, Element)
  19. End If
  20. Return Element
  21. End Function
  22. Public Shared Widening Operator CType(Virtualized As MyVirtualizingElement(Of T)) As T
  23. Return Virtualized.Init()
  24. End Operator
  25. End Class
  26. '非泛型形式
  27. Public Class MyVirtualizingElement
  28. Inherits FrameworkElement
  29. Private Initializer As Func(Of FrameworkElement)
  30. Public Sub New(Initializer As Func(Of FrameworkElement))
  31. Me.Initializer = Initializer
  32. LazyLoadBehavior.OnFirstEnterScrollViewerViewport(Me, AddressOf Init)
  33. End Sub
  34. ''' <summary>
  35. ''' 实例化此控件。
  36. ''' </summary>
  37. Public Function Init() As FrameworkElement
  38. Dim Element As FrameworkElement = Initializer()
  39. If Parent IsNot Nothing Then
  40. If TypeOf Parent IsNot Panel Then Throw New Exception("MyVirtualizingElement 的父级必须是一个 Panel")
  41. Dim ParentPanel As Panel = Parent
  42. Dim CurrentIndex As Integer = ParentPanel.Children.IndexOf(Me)
  43. ParentPanel.Children.RemoveAt(CurrentIndex)
  44. ParentPanel.Children.Insert(CurrentIndex, Element)
  45. End If
  46. Return Element
  47. End Function
  48. ''' <summary>
  49. ''' 获取实例化后的控件。
  50. ''' 如果该控件没有实例化,则会立即实例化。
  51. ''' 如果类型错误,则返回原值。
  52. ''' </summary>
  53. Public Shared Function TryInit(Element As FrameworkElement) As FrameworkElement
  54. If GeneralUtils.IsGenericInstanceOf(Element, GetType(MyVirtualizingElement(Of ))) Then
  55. Return CType(Element, Object).Init()
  56. ElseIf TypeOf Element Is MyVirtualizingElement Then
  57. Return CType(Element, MyVirtualizingElement).Init()
  58. Else
  59. Return Element
  60. End If
  61. End Function
  62. End Class