Animation image und sound

  • WPF

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von Picturebox5.

    Animation image und sound

    Hallo zusammen, ich bin neu hier und will mich schon mal vorab entschuldigen wenn es schon einen ähnlichen Eintrag hier im Forum gibt. Meine suche kam leider zu keinem Ergebnis. Zu dem bin ich auch noch Anfänger in WPF.
    Aber nun zu meinem Problem:
    Ich habe ein WrapPanel in dem ein Canvas ist und in diesem wiederum mehrere Images. Einen Sound A und einen Sound B. Nun möchte ich dass Canvas und die Images mit Hidden verschwinden. Dann soll ein Sound A gespielt werden, wenn Sound A fertig ist soll der Canvas mit den Images wieder Visibil gehen und Zeitgleich Sound B gespielt werden.
    Mein Problem ist, dass die Code Reihenfolge nicht eingehalten wird.
    Das ganze wird mit einem Button gesteuert.

    VB.NET-Quellcode

    1. Canvas.Visibility = Visibility.Hidden
    2. My.Computer.Audio.Play("SoundA.wav", AudioPlayMode.WaitToComplete)
    3. My.Computer.Audio.Play("SoundB.wav", AudioPlayMode.Background)
    4. Canvas.Visibility = Visibility.Visible

    Wenn ich den Code so schreibe hat es den Anschein das garnichts passiert, wenn ich aber Canvas.Visibility = Visibility.Visible raus nehme, wird erst der Sound gespielt und dann Canvas.Visiblity = Visibility.Hidden ausgeführt.
    Ich hab auch schon mit Sound und Media Player erfolglos getestet. Selbst mit nem Storyboard hab ich es nicht hinbekommen.
    Ja ist ja klar, er startet es ja auch im GUI-Thread und dein Programm wartet solange ab bis der Sound zu ende gespielt ist.

    Okey.. ran an das Problem :)..

    Mach dir eine Dependency Propertie vom Typ Visibility in deiner Code-Behind Datei von deinem Control/Window (Die nennst du z.B. VisibleAll).
    Stell den Default Wert Standardmäßig auf Hidden.

    Dann bindest du die depPropertie mit Visibility="{Binding VisibleAll}" an dein Canvas und den Images in deiner XAML-Datei.

    -----
    Dann erstellst du dir ein Backgroundworker mit einer Lamda-Expression.
    Ungefähr so:

    VB.NET-Quellcode

    1. VisibleAll = Visibility.Hidden;
    2. Backgroundworker bwg = new Backgroundworker;
    3. bwg.DoWork += (sender, e) => DeinSoundA aufruf;
    4. bwg.RunWorkerCompleted += (sender, e) =>{
    5. VisibleAll = Visibility.Visible;
    6. DeinSoundB aufruf;
    7. };
    8. bwg.RunWorkerAsync();

    Versuch das einfach mal ;)
    Beste Grüße,
    Hallo Fabien,

    danke das du dich meinem Problem annimmst . Mit Dependency Propertie bin ich noch nicht so vertraut und muss mir das erst mal anschaun. In meinem Buch wird das Leider nur angeschnitten und da auch nur in XAMEL mit ner Textbox :( . Keine Ahnung wie ich die Dependency Propertie schreiben soll.
    Gibt es möglicherweise noch eine andere Lösung?
    Ich danke dir trotzdem für den Buchvorschlag, ich werde mir das mal etwas genauer anschauen,.. wenn es zeitlich dazwischen passt. Aber ich glaub deine Version ist Englisch gel, gibts die auch ins Deutsche übersetzt?
    Hier mein Xaml code:

    XML-Quellcode

    1. <WrapPanel x:Name="wrapwuerfel" HorizontalAlignment="Left" Height="220" Margin="1347,820,0,0" VerticalAlignment="Top" Width="238">
    2. <Canvas x:Name="canvaswuerfel" Height="220" Width="238">
    3. <Image x:Name="platte" Stretch="None" Height="220" Width="238" Visibility="Visible" />
    4. <Image x:Name="PictureBox1" Height="30" Canvas.Left="62" Canvas.Top="103" Width="30"/>
    5. <Image x:Name="PictureBox2" Height="30" Canvas.Left="142" Canvas.Top="71" Width="30"/>
    6. <Image x:Name="PictureBox3" Height="28" Canvas.Left="74" Canvas.Top="57" Width="28"/>
    7. <Image x:Name="PictureBox4" Height="28" Canvas.Left="97" Canvas.Top="117" Width="28"/>
    8. <Image x:Name="PictureBox5" Height="28" Canvas.Left="137" Canvas.Top="83" Width="28"/>
    9. <Image x:Name="PictureBox6" Height="31" Canvas.Left="73" Canvas.Top="149" Width="31"/>
    10. <Image x:Name="PictureBox7" Height="29" Canvas.Left="52" Canvas.Top="65" Width="29"/>
    11. <Image x:Name="PictureBox8" Height="27" Canvas.Left="84" Canvas.Top="17" Width="27"/>
    12. <Image x:Name="PictureBox9" Height="30" Canvas.Left="152" Canvas.Top="92" Width="30"/>
    13. <Image x:Name="pb1w" Height="28" Canvas.Left="105" Canvas.Top="87" Width="32"/>
    14. </Canvas>
    15. </WrapPanel>


    Das ganze soll eine Würfelanimation werden. In Image name="Platte" werden Würfelbilder gezeigt, auf die Würfelbilder werden dann verschiedene Farben (Image Name="PictureBoxen") gelegt.
    Es soll erst der Canvas oder WrapPanel mit dem Würfelbild und den Farbklecksen unsichtbar werden. Dann wird ein SoundA abgespielt (Würfel aufnehmen und Schütteln).
    Wenn der SoundA fertig ist, soll der Canvas/WrapPanel mit den neu gemischten Farben sichtbar werden und ein SoundB (Würfel auf den Tisch werfen) abgespielt werden.
    Noch eine Bitte, wenn du Code schreibst wäre mir VB lieber wenn du kannst, weil C# kann ich nicht, hab da auch leider kein Buch zur Hand. Wenn nicht ist das nicht weiter schlimm, dann lieber in C# wie garnicht. Es gibt ja zum Glück decodierer. Oder wäre es sogar vielleicht möglich das ganze in XAML zu schreiben?
    So, hab das Problem jetzt etwas anders gelöst, ist zwar nicht nach meinem Geschmack aber immerhin funktioniert es.
    Zuerst hab ich SoundA und SoundB zusammengesetzt. Es gibt jetzt nur noch einen Sound. Würfel werden aufgenommen, geschüttelt und auf den Tisch geworfen (WueSound).
    Ein Image mit 3 Würfel (wue3.gif)


    Hab mir im XAML ein ObjectAnimationUsingKeyFrames erstellt:

    XML-Quellcode

    1. <Window.Resources>
    2. <Storyboard x:Key="wueanim3">
    3. <ObjectAnimationUsingKeyFrames Storyboard.TargetName="wrapwuerfel" Storyboard.TargetProperty="Visibility" BeginTime="00:00:00">
    4. <DiscreteObjectKeyFrame KeyTime="00:00:00" Value="{x:Static Visibility.Hidden}" />
    5. <DiscreteObjectKeyFrame KeyTime="00:00:04" Value="{x:Static Visibility.Visible}" />
    6. </ObjectAnimationUsingKeyFrames>
    7. </Storyboard>
    8. </Window.Resources>


    Und rufe das Ganze dann im Code auf:

    VB.NET-Quellcode

    1. FindResource("wueanim3").Begin()
    2. My.Computer.Audio.Play("wuesound.wav", AudioPlayMode.Background)
    3. platte.Source = New BitmapImage(New Uri("w3.gif", UriKind.Relative))


    wenn es bessere oder andere Möglichkeiten gibt, bin ich dafür gerne offen.