0

这与我之前的问题有关-我想为网格拆分器设置动画(使面板滑入/滑出视图)。我们非常擅长 VB,并且已经有一个 VB 项目,所以如果可以的话,我们希望继续使用 VB,但大多数 WPF 示例似乎都是在 XAML 或 CS 中。

我有一些简单的 VB 动画代码可以工作,但是:

当然,需要动画的是网格列/行的宽度/高度,这不是依赖属性。我在 CS 中发现了一些巧妙的东西来创建依赖属性,但无法将其转换为 vb。所以我找到了一个简单的解决方法,即在网格单元格中为停靠面板设置动画,捕捉它的大小更改事件并使用这些来设置单元格网格大小。它有效,但我想知道它是否效率较低,因为有两件事是分开改变的?我还必须(当动画完成时)以正确的比例将网格单元大小设置回 *,并将停靠面板大小设置回 auto。

它有效,但似乎有点笨拙 - 有人有一个直接从 VB 制作网格动画的例子还有其他建议吗?

谢谢

4

1 回答 1

0

作为参考,这里是用于为 gridsplitter 设置动画的依赖属性的 VB 代码:

Public Class GridLengthAnimation
Inherits AnimationTimeline
Public Sub New()
End Sub

Public Property From() As GridLength
    Get
        Return DirectCast(GetValue(FromProperty), GridLength)
    End Get
    Set(value As GridLength)
        SetValue(FromProperty, value)
    End Set
End Property

Public Shared ReadOnly FromProperty As DependencyProperty 
  = DependencyProperty.Register("From", GetType(GridLength), 
      GetType(GridLengthAnimation))

Public Property [To]() As GridLength
    Get
        Return DirectCast(GetValue(ToProperty), GridLength)
    End Get
    Set(value As GridLength)
        SetValue(ToProperty, value)
    End Set
End Property

Public Shared ReadOnly ToProperty As DependencyProperty 
   = DependencyProperty.Register("To", GetType(GridLength), 
        GetType(GridLengthAnimation))

Public Overrides ReadOnly Property TargetPropertyType() As Type
    Get
        Return GetType(GridLength)
    End Get
End Property

Protected Overrides Function CreateInstanceCore() As Freezable
    Return New GridLengthAnimation()
End Function

Public Overrides Function GetCurrentValue
      (defaultOriginValue As Object, 
       defaultDestinationValue As Object, 
       animationClock As AnimationClock) As Object
    Dim fromValue As Double = Me.From.Value
    Dim toValue As Double = Me.[To].Value

    If fromValue > toValue Then
        Return New GridLength((1 - animationClock.CurrentProgress.Value) 
             * (fromValue - toValue) + toValue, 
                If(Me.[To].IsStar, GridUnitType.Star, GridUnitType.Pixel))
    Else
          Return New GridLength((animationClock.CurrentProgress.Value) * 
                (toValue - fromValue) + fromValue, 
                   If(Me.[To].IsStar, GridUnitType.Star, GridUnitType.Pixel))
    End If
End Function
End Class
于 2012-10-25T13:17:12.623 回答