0

これは私の以前の質問に関連しています-グリッドスプリッターをアニメーション化したい(パネルをビューにスライドさせたりビューから外したりします)。私たちは VB が得意で、既に VB プロジェクトを持っているので、できれば VB を使い続けたいと思っていますが、ほとんどの WPF の例は XAML または CS にあるようです。

私はいくつかの単純な VB アニメーション コードが動作していますが、:

もちろん、アニメーション化する必要があるのは、グリッドの列/行の幅/高さであり、これは依存プロパティではありません。CS で依存関係プロパティを作成するための巧妙なものを見つけましたが、これを vb に変換できませんでした。そこで、グリッド セルでドックパネルをアニメーション化し、サイズ変更イベントをキャッチし、これらを使用してセル グリッド サイズを設定する簡単な回避策を見つけました。動作しますが、2つのことが別々に変更されているため、効率が悪いのでしょうか? また、(アニメーションが完了したら) グリッド セルのサイズを正しい比率で * に戻し、ドックパネルのサイズを auto に戻す必要があります。

それは機能しますが、少し不器用に思えます-誰かがグリッドのアニメーションをVBから直接動作させる例を持っていますか?

ありがとう

4

1 に答える 1

0

参考までに、グリッドスプリッターをアニメーション化する依存関係プロパティの 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 に答える