VisibilityProperty animieren

  • WPF

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von noBlubb.

    VisibilityProperty animieren

    Abend,

    ich will momentan einen Textblock als Hinweisfeld anzeigen lassen.
    Einblenden, ausblenden klappt wunderbar, aber der Block ist ja dann nur unsichtbar, die darunter liegenden Elemente allerdings nicht klickbar.
    Irgendwie hatte ich gehofft, da die Visibilityeigenschaft als Byte übergeben wird, das mit einer ByteAnimation regeln zu können. So klappt's jedenfalls nicht:

    VB.NET-Quellcode

    1. Dim x1 As New DoubleAnimation
    2. Dim x2 As New DoubleAnimation
    3. Dim z1 As New ByteAnimation
    4. Dim z2 As New ByteAnimation
    5. z1.To = System.Windows.Visibility.Visible
    6. z2.To = System.Windows.Visibility.Hidden
    7. x1.To = 1.0
    8. x2.To = 0.0
    9. x1.Duration = New Duration(TimeSpan.FromSeconds(0.1))
    10. z1.Duration = New Duration(TimeSpan.FromSeconds(0.1))
    11. x2.Duration = New Duration(TimeSpan.FromSeconds(4))
    12. z2.Duration = New Duration(TimeSpan.FromSeconds(0.1))
    13. x2.BeginTime = TimeSpan.FromSeconds(3)
    14. z2.BeginTime = TimeSpan.FromSeconds(7)
    15. txbHint.BeginAnimation(TextBlock.VisibilityProperty, z1, HandoffBehavior.SnapshotAndReplace)
    16. txbHint.BeginAnimation(TextBlock.OpacityProperty, x1, HandoffBehavior.Compose)
    17. txbHint.BeginAnimation(TextBlock.OpacityProperty, x2, HandoffBehavior.Compose)
    18. txbHint.BeginAnimation(TextBlock.VisibilityProperty, z2, HandoffBehavior.Compose)


    Google wollte mir gerade auch nur Lösungen für die OpacityProperty ausspucken, aber das ist doch schon möglich oder?

    Servus
    noblubb
    Was willst du dort animieren?
    Entweder ist das Teil sichtbar oder nicht.
    Ach ja solche Animationen sollten eigentlich im xaml geschehen.


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.

    thefiloe schrieb:

    Entweder ist das Teil sichtbar oder nicht.

    Bitte les doch erst was ich oben geschrieben hab :whistling:
    Es ist zwar unsichtbar, aber nicht weg.

    //Das mit dem Animieren ist weil ich keinen überblick habe wie ich erst nach Ablauf einer bestimmten Zeitspanne dieses Ereignis eintreten lassen soll...



    @hal2000:

    VB.NET-Quellcode

    1. Dim x1 As New DoubleAnimationUsingKeyFrames
    2. Dim z1 As New BooleanAnimationUsingKeyFrames
    3. z1.Duration = New Duration(TimeSpan.FromSeconds(7))
    4. z1.KeyFrames.Add(New DiscreteBooleanKeyFrame(True, Animation.KeyTime.FromTimeSpan(TimeSpan.FromSeconds(0))))
    5. z1.KeyFrames.Add(New DiscreteBooleanKeyFrame(False, Animation.KeyTime.FromTimeSpan(TimeSpan.FromSeconds(7))))
    6. x1.Duration = New Duration(TimeSpan.FromSeconds(7))
    7. x1.KeyFrames.Add(New DiscreteDoubleKeyFrame(1.0, KeyTime.FromTimeSpan(TimeSpan.FromSeconds(0))))
    8. x1.KeyFrames.Add(New DiscreteDoubleKeyFrame(0.9, KeyTime.FromTimeSpan(TimeSpan.FromSeconds(6.5))))
    9. x1.KeyFrames.Add(New DiscreteDoubleKeyFrame(0.7, KeyTime.FromTimeSpan(TimeSpan.FromSeconds(6.6))))
    10. x1.KeyFrames.Add(New DiscreteDoubleKeyFrame(0.5, KeyTime.FromTimeSpan(TimeSpan.FromSeconds(6.7))))
    11. x1.KeyFrames.Add(New DiscreteDoubleKeyFrame(0.3, KeyTime.FromTimeSpan(TimeSpan.FromSeconds(6.8))))
    12. x1.KeyFrames.Add(New DiscreteDoubleKeyFrame(0.2, KeyTime.FromTimeSpan(TimeSpan.FromSeconds(6.9))))
    13. x1.KeyFrames.Add(New DiscreteDoubleKeyFrame(0.1, KeyTime.FromTimeSpan(TimeSpan.FromSeconds(6.95))))
    14. x1.KeyFrames.Add(New DiscreteDoubleKeyFrame(0.0, KeyTime.FromTimeSpan(TimeSpan.FromSeconds(7))))
    15. txbHint.BeginAnimation(TextBlock.IsHitTestVisibleProperty, z1, HandoffBehavior.SnapshotAndReplace)
    16. txbHint.BeginAnimation(TextBlock.OpacityProperty, x1, HandoffBehavior.Compose)


    Funktioniert leider nicht, scheinbar lässt sich der Hittest nicht "durchreichen"?!

    Ach ich depp, wenn zweimal true drinnen steht wird es wohl nicht klappen...
    Code oben funktioniert jetzt, hab's bearbeitet.
    Danke für den Tipp ;)

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „noBlubb“ ()

    Wenn du es weg haben möchtest darfst du es nicht verstecken sondern kollabieren. (collabse)
    Dadurch erhällt es für alle Maße 0.0 und ist praktisch nicht mehr da.


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.
    ...wordurch sich aber das Layout verschieben kann. Es kann anstrengend sein, sowas zu korrigieren.

    @noBlubb: Vergiss nicht, die Animationen wieder zu entfernen (BeginAnimation(Nothing)). Wenn du das nicht tust, wird die Animation immer einmal mehr als beim letzten Mal ausgeführt (parallel) --> Ressourcenverschwendung. Schon wegen solcher Stolperfallen solltest du sowas in XAML schreiben, damit du dir darum keine Sorgen machen musst.
    Gruß
    hal2000
    @thefiloe:
    Das ist richtig, Android-User kennen vielleicht diese schwarz umrandete Benachrichtigung im unteren 1/4 des Bildschirms,
    ungefähr so sieht das aus.
    Problem ist nicht das Layout, sondern das ich die Visibility.Collapse Eigenschaft erst nach 7 Sekunden ändern möchte.
    Und das wenn möglich ohne neuen Thread der sich nach einer gewissen Dauer (Sleep()) wieder zurück meldet.

    VB.NET-Quellcode

    1. 'Erstellen
    2. Dim x1 As New DoubleAnimationUsingKeyFrames
    3. Dim z1 As New BooleanAnimationUsingKeyFrames
    4. 'Füllen
    5. z1.Duration = New Duration(TimeSpan.FromSeconds(7))
    6. z1.KeyFrames.Add(New DiscreteBooleanKeyFrame(True, Animation.KeyTime.FromTimeSpan(TimeSpan.FromSeconds(0))))
    7. z1.KeyFrames.Add(New DiscreteBooleanKeyFrame(False, Animation.KeyTime.FromTimeSpan(TimeSpan.FromSeconds(7))))
    8. 'Füllen
    9. x1.Duration = New Duration(TimeSpan.FromSeconds(7))
    10. x1.KeyFrames.Add(New DiscreteDoubleKeyFrame(1.0, KeyTime.FromTimeSpan(TimeSpan.FromSeconds(0))))
    11. x1.KeyFrames.Add(New DiscreteDoubleKeyFrame(0.9, KeyTime.FromTimeSpan(TimeSpan.FromSeconds(6.5))))
    12. x1.KeyFrames.Add(New DiscreteDoubleKeyFrame(0.7, KeyTime.FromTimeSpan(TimeSpan.FromSeconds(6.6))))
    13. x1.KeyFrames.Add(New DiscreteDoubleKeyFrame(0.5, KeyTime.FromTimeSpan(TimeSpan.FromSeconds(6.7))))
    14. x1.KeyFrames.Add(New DiscreteDoubleKeyFrame(0.3, KeyTime.FromTimeSpan(TimeSpan.FromSeconds(6.8))))
    15. x1.KeyFrames.Add(New DiscreteDoubleKeyFrame(0.2, KeyTime.FromTimeSpan(TimeSpan.FromSeconds(6.9))))
    16. x1.KeyFrames.Add(New DiscreteDoubleKeyFrame(0.1, KeyTime.FromTimeSpan(TimeSpan.FromSeconds(6.95))))
    17. x1.KeyFrames.Add(New DiscreteDoubleKeyFrame(0.0, KeyTime.FromTimeSpan(TimeSpan.FromSeconds(7))))
    18. 'Säubern
    19. txbHint.BeginAnimation(TextBlock.IsHitTestVisibleProperty, Nothing)
    20. txbHint.BeginAnimation(TextBlock.OpacityProperty, Nothing)
    21. 'Animationen beginnen
    22. txbHint.BeginAnimation(TextBlock.IsHitTestVisibleProperty, z1, HandoffBehavior.SnapshotAndReplace)
    23. txbHint.BeginAnimation(TextBlock.OpacityProperty, x1, HandoffBehavior.SnapshotAndReplace)
    24. 'Säubern
    25. z1 = Nothing
    26. x1 = Nothing


    Das mit den doppelten Animationen klingt unpraktisch, aber ich bin nicht wirklich tief im XAML drinnen und wenn ich die IntelliSense richtig verstanden habe, sorg der "handoff"-Parameter dafür das die vorherige Animation "ersetzt" wird. Heißt das sie wird entfernt? Ich habe jetzt mal noch ein z1=Nothing eingefügt um die Animationen quasi wieder freizugeben, das klappt doch so oder verschätze ich mich da?


    Die Box soll einfach beim Ausführen einer Methode erscheinen, 6.5 Sekunden sichtbar sein und danach wieder brav verschwinden.
    Für die Visibility kann ich eben auf diesem Weg nichts reißen, sonst würde ich natürlich Collapse verwenden...

    //BeginAnimation(..,Nothing) hab ich jetzt noch eingefügt...

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „noBlubb“ ()

    z1 = Nothing und x1 = Nothing kann weg.

    VB.NET-Quellcode

    1. txbHint.BeginAnimation(TextBlock.IsHitTestVisibleProperty, Nothing)
    2. txbHint.BeginAnimation(TextBlock.OpacityProperty, Nothing)

    ...sollte an den Anfang der Sub. Grund: Wenn du eine Antimation startest und direkt wieder entfernst, wird sie abgebrochen. entferne die "alte" Animation also erst wenn nötig (eben bevor eine neue gestartet wird). Siehe auch: msdn.microsoft.com/en-us/library/ms598906.aspx

    Edit: Wenn du HandoffBehavior.SnapshotAndReplace verwendest, kannst du dir den Aufruf mit Nothing sparen - wie du schon angedeutet hast, wird die "alte" Animation mit der neuen ersetzt (zumindest laut MSDN).
    Gruß
    hal2000
    Nun ja dir ist klar, dass du auch selbst eine Animation erstellen kannst?
    Das sollte dir helfen msdn.microsoft.com/en-us/library/aa970564.aspx
    codeproject.com/Articles/18379…ng-a-custom-animation-cla


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.