2009-10-05 21 views
10

Chciałbym wyświetlić animacji gif, takich jak ładowanie ... w moim XAML, jak moja procedura postępuje. Dowiedziałem się, że nie można tego łatwo zrobić w WPF, ponieważ załadowałem mój GIF i pokazuje on tylko pierwszą klatkę. Jakie są najlepsze sposoby wyświetlania animacji w WPF.wyświetlanie animacji gif w WPF

+0

możliwy duplikat [Jak uzyskać animowany gif do pracy w WPF?] (Http://stackoverflow.com/questions/210922/how-do-i- get-an-animated-gif-to-work-in-wpf) –

+0

[Dodanie "Ładowanie" -image na ListView] (http://stackoverflow.com/questions/1492096/adding-loading-image-on- top-of-listview) – hakre

Odpowiedz

1

Można osadzić MediaElement

<MediaElement LoadedBehavior="Play" Source="path/to.file" /> 

lub WinForm PictureBox:

<wfi:WindowsFormsHost> 
     <winForms:PictureBox x:Name="pictureBoxLoading"> 
     </winForms:PictureBox> 
    </wfi:WindowsFormsHost> 

Jednakże, polecam znalezienie sposobu, aby to zrobić w WPF. Rzuć okiem na StoryBoards i animacje. Nie wiedząc, co próbujesz osiągnąć lub dlaczego chcesz to zrobić, ciężko jest ci doradzić dalej.

5

Miałem ten problem, dopóki nie odkryłem, że w WPF4 można symulować własne animacje klatek kluczowych. Najpierw podziel animację na serię obrazów, zatytułując je jako "Image1.gif", "Image2, gif" i tak dalej. Zaimportuj te obrazy do zasobów rozwiązania. Zakładam, że umieściłeś je w domyślnej lokalizacji zasobów dla obrazów.

Użyjesz sterowania obrazem. Użyj następującego kodu XAML. Usunąłem inne niż niezbędne.

<Image Name="Image1"> 
    <Image.Triggers> 
     <EventTrigger RoutedEvent="Image.Loaded" 
     <EventTrigger.Actions> 
      <BeginStoryboard> 
       <Storyboard> 
        <ObjectAnimationUsingKeyFrames Duration="0:0:1" Storyboard.TargetProperty="Source" RepeatBehavior="Forever"> 
         <DiscreteObjectKeyFrames KeyTime="0:0:0"> 
         <DiscreteObjectKeyFrame.Value> 
          <BitmapImage UriSource="Images/Image1.gif"/> 
         </DiscreteObjectKeyFrame.Value> 
         </DiscreteObjectKeyFrames> 
        <DiscreteObjectKeyFrames KeyTime="0:0:0.25"> 
         <DiscreteObjectKeyFrame.Value> 
          <BitmapImage UriSource="Images/Image2.gif"/> 
         </DiscreteObjectKeyFrame.Value> 
        </DiscreteObjectKeyFrames> 
        <DiscreteObjectKeyFrames KeyTime="0:0:0.5"> 
         <DiscreteObjectKeyFrame.Value> 
          <BitmapImage UriSource="Images/Image3.gif"/> 
         </DiscreteObjectKeyFrame.Value> 
        </DiscreteObjectKeyFrames> 
        <DiscreteObjectKeyFrames KeyTime="0:0:0.75"> 
         <DiscreteObjectKeyFrame.Value> 
          <BitmapImage UriSource="Images/Image4.gif"/> 
         </DiscreteObjectKeyFrame.Value> 
        </DiscreteObjectKeyFrames> 
        <DiscreteObjectKeyFrames KeyTime="0:0:1"> 
         <DiscreteObjectKeyFrame.Value> 
          <BitmapImage UriSource="Images/Image5.gif"/> 
         </DiscreteObjectKeyFrame.Value> 
        </DiscreteObjectKeyFrames> 
        </ObjectAnimationUsingKeyFrames> 
       </Storyboard> 
      </BeginStoryboard> 
     </EventTrigger.Actions> 
     </EventTrigger> 
    </Image.Triggers> 
</Image> 
+1

Zaadoptowałem to dla gry Windows Phone, nad którą pracowałem, i to działało! (Pamiętaj, nie możesz tego zrobić za pomocą 'EventTrigger's, ale po prostu przenieś kod do normalnego storyboardu) – GONeale

+0

Otrzymuję błąd" DiscreteObjectKeyFrames nie są obsługiwane w WPF ". –

0

wystarczy kliknąć prawym przyciskiem na plik .gif i zmienić dwie właściwości:

Budowa Działanie: osadzonego zasobu

Kopiuj do wyjścia katalogu: Skopiuj jeśli Nowszy

Następnie

<MediaElement x:Name="myGif" UnloadedBehavior="Manual" Source="giphy_s.gif" MediaEnded="MediaElement_MediaEnded"/> 

i ustawić wydarzenie dla kontynuować uruchamianie

private void MediaElement_MediaEnded(object sender, RoutedEventArgs e) 
     { 
      myGif.Position = new TimeSpan(0, 0, 1); 
      myGif.Play(); 
     } 
Powiązane problemy