2009-10-05 4 views
10

Vorrei visualizzare un file di animazione come il caricamento ... nel mio XAML mentre la mia procedura sta procedendo. Ho scoperto che questo non può essere fatto facilmente in WPF mentre caricavo la mia Gif e mostra solo il primo fotogramma. Quali sono i modi migliori per visualizzare un'animazione in WPF.visualizza un'animazione gif in WPF

+0

possibile duplicato di [Come faccio ad avere una gif animata per lavorare in WPF?] (Http://stackoverflow.com/questions/210922/how-do-i- get-an-animated-gif-to-work-in-wpf) –

+0

[Aggiunta di "Caricamento" -immagine in cima a ListView] (http://stackoverflow.com/questions/1492096/adding-loading-image-on- top-of-listview) – hakre

risposta

1

Si potrebbe incorporare un MediaElement

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

o WinForms PictureBox:

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

Tuttavia, vi consiglio di trovare un modo per fare questo in WPF. Dai un'occhiata a StoryBoards e animazioni. Senza sapere cosa stai cercando di ottenere o perché vuoi farlo, è difficile consigliarlo ulteriormente.

5

Ho avuto questo problema, fino a quando ho scoperto che in WPF4, è possibile simulare le proprie animazioni di immagini di fotogrammi chiave. Per prima cosa, dividi l'animazione in una serie di immagini, intitolandole qualcosa come "Image1.gif", "Immagine2, gif" e così via. Importa queste immagini nelle risorse della tua soluzione. Suppongo che tu li abbia inseriti nella posizione predefinita delle risorse per le immagini.

Stai per utilizzare il controllo Immagine. Utilizza il seguente codice XAML. Ho rimosso i non essenziali.

<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

Ho adottato questo per un gioco Windows Phone su cui stavo lavorando, e ha funzionato a meraviglia! (Si badi bene, non è possibile farlo con 'EventTrigger's ma basta spostare il codice in uno storyboard normale) – GONeale

+0

Ottengo l'errore" DiscreteObjectKeyFrames non supportato in WPF ". –

0

Basta fare clic destro sul file .gif e modificare due proprietà:

Corporatura Azione: Risorsa incorporata

Copia nella directory di output: Copia se più recente

Poi

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

e impostare Event Per continuare l'esecuzione

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