Was Steuerungstyp soll ich verwenden - Image
, MediaElement
usw.?
.net
wpf
animated-gif
Eisenpfote
quelle
quelle
Antworten:
Ich konnte nicht die beliebteste Antwort auf diese Frage (oben von Dario) bekommen, um richtig zu funktionieren. Das Ergebnis war eine seltsame, abgehackte Animation mit seltsamen Artefakten. Beste Lösung, die ich bisher gefunden habe: https://github.com/XamlAnimatedGif/WpfAnimatedGif
Sie können es mit NuGet installieren
PM> Install-Package WpfAnimatedGif
und um es zu verwenden, in einem neuen Namespace im Fenster, in dem Sie das GIF-Bild hinzufügen und wie folgt verwenden möchten
Das Paket ist wirklich ordentlich, Sie können einige Attribute wie unten festlegen
und Sie können es auch in Ihrem Code verwenden:
BEARBEITEN: Silverlight-Unterstützung
Wenn Sie gemäß dem Kommentar von josh2112 Ihrem Silverlight-Projekt animierte GIF-Unterstützung hinzufügen möchten, verwenden Sie github.com/XamlAnimatedGif/XamlAnimatedGif
quelle
img
hierIch poste eine Lösung, die die Bildsteuerung erweitert und den Gif-Decoder verwendet. Der GIF-Decoder verfügt über eine Frames-Eigenschaft. Ich animiere das
FrameIndex
Grundstück. Das EreignisChangingFrameIndex
ändert die Quelleigenschaft in den Rahmen, der dem entsprichtFrameIndex
(dh im Decoder). Ich denke, dass das GIF 10 Bilder pro Sekunde hat.Anwendungsbeispiel (XAML):
quelle
Int32AnimationUsingKeyFrames
gf.Frames[0].MetaData.GetQuery("/grctlext/Delay")
(gibt eine kurze Zeit zurück, die die Frame-Dauer in Hunderten von Sekunden darstellt)Auch ich habe eine Suche durchgeführt und in nur einem Thread in den alten MSDN-Foren verschiedene Lösungen gefunden. (Link hat nicht mehr funktioniert, also habe ich ihn entfernt)
Die einfachste Ausführung scheint die Verwendung von WinForms zu sein
PictureBox
Steuerelement .Fügen Sie zuerst einen Verweis auf
System.Windows.Forms
,WindowsFormsIntegration
undSystem.Drawing
zu Ihrem Projekt hinzu.Dann würden Sie im
Window_Loaded
Handler diepictureBoxLoading.ImageLocation
Eigenschaft auf den Bilddateipfad setzen, den Sie anzeigen möchten.Das
MediaElement
Steuerelement wurde in diesem Thread erwähnt, es wird jedoch auch erwähnt, dass es sich um ein ziemlich schweres Steuerelement handelt. Daher gab es eine Reihe von Alternativen, darunter mindestens zwei selbstgebraute Steuerelemente, die auf dem Steuerelement basieren.Image
Dies ist also das einfachste.quelle
AllowTransparency="True"
. Ob dies zu den gewünschten Ergebnissen führt oder nicht, ist eine andere Frage. Ich habe es selbst nicht versucht, aber ich würde wetten, dass dasWindowsFormsHost
überhaupt nicht transparent wird. Der Rest derWindow
Macht. Du musst es einfach versuchen, denke ich.Wie wäre es mit dieser winzigen App: Code dahinter:
XAML:
quelle
<MediaElement LoadedBehavior="Play" Source="{Binding MyGifFile}" >
Laufen bringen - genau das - Die MyGifFile ist nur der Dateiname (und der Pfad) meines animierten Gifs.ListBox
oder überhaupt zu binden? Ich habe es ohne Bindung versucht, nur den Dateipfad in die Quelle eingefügt und es wird angezeigt, aber nicht animiert. Wenn ich die Bindung selbst mit der verwendeListBox
, wird sie für mich überhaupt nicht angezeigt. Dies gibt mir die Ausnahme, dass mein Dateipfad falsch ist, obwohl er derselbe ist, für den ich ihn verwende, wenn er angezeigt wird.Es ist sehr einfach, wenn Sie verwenden
<MediaElement>
:quelle
public string SpinnerLogoPath => Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"Assets\images\mso_spinninglogo_blue_2.gif");
. Stellen Sie sicher, dass die Datei auf Build = Content gesetzt und in das Ausgabeverzeichnis kopiert wird.Hier ist meine Version der animierten Bildsteuerung. Sie können die Standardeigenschaft Source zum Angeben der Bildquelle verwenden. Ich habe es weiter verbessert. Ich bin ein Russe, das Projekt ist russisch, daher sind die Kommentare auch auf Russisch. Aber trotzdem solltest du alles ohne Kommentare verstehen können. :) :)
quelle
Ich benutze diese Bibliothek: https://github.com/XamlAnimatedGif/WpfAnimatedGif
Installieren Sie zunächst die Bibliothek in Ihrem Projekt (mithilfe der Package Manager-Konsole):
Verwenden Sie dann dieses Snippet in der XAML-Datei:
Ich hoffe es hilft.
Quelle: https://github.com/XamlAnimatedGif/WpfAnimatedGif
quelle
Grundsätzlich die gleiche PictureBox-Lösung wie oben, diesmal jedoch mit dem Code-Behind, um eine eingebettete Ressource in Ihrem Projekt zu verwenden:
In XAML:
Im Code-Behind:
quelle
Ich habe den Code von Mike Eshva geändert und dafür gesorgt, dass er besser funktioniert. Sie können ihn entweder mit 1frame jpg png bmp oder mutil-frame gif verwenden. Speicherstrom, den Sie an die Quelleigenschaft binden, die ein BitmapImage ist.
Dies ist ein benutzerdefiniertes Steuerelement. Sie müssen es in WPF App Project erstellen und die Vorlagenüberschreibung mit Stil löschen.
quelle
Ich hatte dieses Problem, bis ich herausfand, dass Sie in WPF4 Ihre eigenen Keyframe-Bildanimationen simulieren können. Teilen Sie Ihre Animation zunächst in eine Reihe von Bildern auf und benennen Sie sie mit "Image1.gif", "Image2, gif" usw. Importieren Sie diese Bilder in Ihre Lösungsressourcen. Ich gehe davon aus, dass Sie sie am Standardspeicherort für Bilder ablegen.
Sie werden das Bildsteuerelement verwenden. Verwenden Sie den folgenden XAML-Code. Ich habe das Unwesentliche entfernt.
quelle
Vielen Dank für Ihren Beitrag Joel, es hat mir geholfen, die fehlende Unterstützung von WPF für animierte GIFs zu beheben. Ich habe nur ein wenig Code hinzugefügt, da ich verdammt viel Zeit mit dem Festlegen der pictureBoxLoading.Image-Eigenschaft aufgrund der Winforms-API hatte.
Ich musste die Build-Aktion meines animierten GIF-Bildes auf "Inhalt" und das Verzeichnis "In Ausgabeverzeichnis kopieren" auf "Kopieren, wenn neuer" oder "immer" setzen. Dann habe ich im MainWindow () diese Methode aufgerufen. Das einzige Problem ist, dass ich beim Versuch, den Stream zu entsorgen, anstelle meines Bildes eine rote Umschlaggrafik erhielt. Ich muss das Problem lösen. Dies beseitigte den Schmerz, ein BitmapImage zu laden und in eine Bitmap zu ändern (was meine Animation offensichtlich tötete, weil es kein GIF mehr ist).
quelle
.ImageLocation
statt zu setzen.Image
. Er hatte die falsche Methode..ImageLocation
funktioniert im Stammverzeichnis des Visual Studio-Projekts. Angenommen, Sie haben einenImages
Ordner, dann lautet Ihr PfadimgBox.ImageLocation = "/Images/my.gif";
. Wenn Sie einen Ordner mit dem Namen haben,Views
in dem Sie eine Ansicht haben, in der das BildImages
angezeigt wird, müssen Sie zwei Punkte verwenden :imgBox.ImageLocation = "../Images/my.gif";
.Ich habe den ganzen Weg oben versucht, aber jeder hat seine Kürze, und dank euch allen arbeite ich mein eigenes GifImage aus:
Verwendung:
Da dies keinen Speicherverlust verursachen und die eigene Zeitleiste des GIF-Bilds animieren würde, können Sie es versuchen.
quelle
IsAutoStart
, aber ansonsten hat es wie ein Champion funktioniert!Zuvor hatte ich ein ähnliches Problem: Ich musste eine
.gif
Datei in Ihrem Projekt abspielen . Ich hatte zwei Möglichkeiten:mit PictureBox von WinForms
Verwenden einer Bibliothek eines Drittanbieters wie WPFAnimatedGif von codeplex.com.
Version mit
PictureBox
hat bei mir nicht funktioniert und das Projekt konnte keine externen Bibliotheken dafür verwenden. Also habe ich esBitmap
mit Hilfe für mich selbst geschafftImageAnimator
. Weil StandardBitmapImage
die Wiedergabe von nicht unterstützt.gif
Dateien .Vollständiges Beispiel:
XAML
Code behind
Bitmap
unterstützt keine URI- Direktive, daher lade ich eine.gif
Datei aus dem aktuellen Verzeichnis.quelle
Kleine Verbesserung der
GifImage.Initialize()
Methode, die das richtige Frame-Timing aus GIF-Metadaten liest.quelle
Ich bin nicht sicher, ob dies behoben wurde, aber der beste Weg ist, die WpfAnimatedGid-Bibliothek zu verwenden . Es ist sehr einfach, unkompliziert und unkompliziert zu bedienen. Es sind nur 2 Zeilen XAML-Code und etwa 5 Zeilen C # -Code im Code dahinter erforderlich.
Sie sehen alle notwendigen Details, wie dies dort verwendet werden kann. Das habe ich auch benutzt, anstatt das Rad neu zu erfinden
quelle
Wenn Sie der Hauptantwort hinzufügen, die die Verwendung von WpfAnimatedGif empfiehlt , müssen Sie am Ende die folgenden Zeilen hinzufügen, wenn Sie ein Bild mit einem Gif austauschen, um sicherzustellen, dass die Animation tatsächlich ausgeführt wird:
Ihr Code sieht also folgendermaßen aus:
quelle
Überprüfen Sie meinen Code, ich hoffe das hat Ihnen geholfen :)
oder
quelle
Eine Alternative zur Warteanimation in WPF ist:
Es wird ein animierter Fortschrittsbalken angezeigt.
quelle