Jaki rodzaj sterowania należy używać - Image
, MediaElement
itp?
.net
wpf
animated-gif
żelazna pazur
źródło
źródło
Odpowiedzi:
Nie mogłem uzyskać najpopularniejszej odpowiedzi na to pytanie (powyżej autorstwa Dario), aby działać poprawnie. Rezultatem była dziwna, niespokojna animacja z dziwnymi artefaktami. Najlepsze rozwiązanie, jakie do tej pory znalazłem: https://github.com/XamlAnimatedGif/WpfAnimatedGif
Możesz zainstalować go za pomocą NuGet
PM> Install-Package WpfAnimatedGif
i użyć go, w nowej przestrzeni nazw w oknie, w którym chcesz dodać obraz gif i użyć go jak poniżej
Pakiet jest naprawdę schludny, możesz ustawić niektóre atrybuty, takie jak poniżej
i możesz go również użyć w kodzie:
EDYCJA: Wsparcie Silverlight
Zgodnie z komentarzem josh2112, jeśli chcesz dodać obsługę animowanego GIF do projektu Silverlight, użyj github.com/XamlAnimatedGif/XamlAnimatedGif
źródło
img
tu jestZamieszczam rozwiązanie rozszerzające kontrolę obrazu i korzystające z dekodera Gif. Dekoder gif ma właściwość frames. Animuję
FrameIndex
nieruchomość. ZdarzenieChangingFrameIndex
zmienia właściwość source na ramkę odpowiadającąFrameIndex
(czyli w dekoderze). Myślę, że gif ma 10 klatek na sekundę.Przykład użycia (XAML):
źródło
Int32AnimationUsingKeyFrames
gf.Frames[0].MetaData.GetQuery("/grctlext/Delay")
liczbę klatek na sekundę za pomocą (zwraca ushort, który jest czasem trwania ramki w setkach sekund)Ja również szukałem i znalazłem kilka różnych rozwiązań w jednym wątku na starych forach MSDN. (link już nie działał, więc go usunąłem)
Najprostszym do wykonania wydaje się użycie WinForm
PictureBox
formantu i poszło tak (zmieniło kilka rzeczy z wątku, w większości takie same).Dodaj odwołanie do
System.Windows.Forms
,WindowsFormsIntegration
iSystem.Drawing
do swojego projektu.Następnie w
Window_Loaded
module obsługi ustawiszpictureBoxLoading.ImageLocation
właściwość na ścieżkę pliku obrazu, którą chcesz wyświetlić.MediaElement
Kontrola została wymieniona w tym wątku, ale jest również wspomnieć, że jest to dość ciężki kontrola, więc było wiele alternatyw, w tym co najmniej 2 homebrewed kontroli na podstawieImage
kontroli, więc jest to najprostsze.źródło
AllowTransparency="True"
. To, czy to przyniesie wyniki, o których myślisz, to inna sprawa. Sam tego nie próbowałem, ale założę się, że wWindowsFormsHost
ogóle nie stałoby się to przejrzyste. ResztaWindow
potęgi. Myślę, że po prostu będziesz musiał spróbować.Co powiesz na tę małą aplikację: Kod za:
XAML:
źródło
<MediaElement LoadedBehavior="Play" Source="{Binding MyGifFile}" >
- MyGifFile to tylko nazwa pliku (i ścieżka) mojego animowanego gifa.ListBox
lub wiązaniem w ogóle? Próbowałem bez wiązania, po prostu wstaw ścieżkę do pliku źródłowego i pojawi się, ale nie będzie animowana. Jeśli użyję wiązania, nawet zListBox
, w ogóle nie wyjdzie, dla mnie - da mi wyjątek, że moja ścieżka do pliku jest niepoprawna, nawet jeśli jest to ta sama, której używam, kiedy się pojawia.To bardzo proste, jeśli używasz
<MediaElement>
:źródło
public string SpinnerLogoPath => Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"Assets\images\mso_spinninglogo_blue_2.gif");
. Pamiętaj, aby ustawić plik na Build = Content i skopiować do katalogu wyjściowego.Oto moja wersja kontroli animowanego obrazu. Do określenia źródła obrazu można użyć standardowej właściwości Źródło. Udoskonaliłem to. Jestem Rosjaninem, projekt jest rosyjski, więc komentarze są również w języku rosyjskim. Ale i tak powinieneś być w stanie zrozumieć wszystko bez komentarzy. :)
źródło
Korzystam z tej biblioteki: https://github.com/XamlAnimatedGif/WpfAnimatedGif
Najpierw zainstaluj bibliotekę w swoim projekcie (używając konsoli Menedżera pakietów):
Następnie użyj tego fragmentu kodu do pliku XAML:
Mam nadzieję, że pomoże.
Źródło: https://github.com/XamlAnimatedGif/WpfAnimatedGif
źródło
Zasadniczo to samo rozwiązanie PictureBox powyżej, ale tym razem z kodem do użycia Embedded Resource w projekcie:
W XAML:
W Code-Behind:
źródło
Zmodyfikowałem kod Mike'a Eshvy i sprawiłem, że działa lepiej. Możesz go używać z 1frame jpg png bmp lub mutil-frame gif. Jeśli chcesz powiązać uri z kontrolką, powiąż właściwości UriSource lub jeśli chcesz powiązać dowolne strumień pamięci, który wiąże właściwość Source, którą jest BitmapImage.
To jest kontrola niestandardowa. Musisz go utworzyć w WPF App Project i usunąć stylowe zastąpienie szablonu.
źródło
Miałem ten problem, dopóki nie odkryłem, że w WPF4 możesz symulować własne animacje klatek kluczowych. Najpierw podziel animację na serię obrazów, nadaj im tytuł „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.
Będziesz używać kontroli obrazu. Użyj następującego kodu XAML. Usunąłem to, co nieistotne.
źródło
Dzięki za twój post Joel, pomogło mi to rozwiązać brak wsparcia WPF dla animowanych GIF-ów. Właśnie dodałem trochę kodu, ponieważ miałem trochę czasu z ustawieniem właściwości pictureBoxLoading.Image ze względu na interfejs API Winforms.
Musiałem ustawić akcję kompilacji mojego animowanego obrazu gif jako „Treść”, a katalog Kopiuj do pliku wyjściowego na „Kopiuj, jeśli nowszy” lub „zawsze”. Następnie w MainWindow () wywołałem tę metodę. Jedynym problemem jest to, że kiedy próbowałem pozbyć się strumienia, dało mi to czerwoną grafikę koperty zamiast mojego obrazu. Będę musiał rozwiązać ten problem. To usunęło ból związany z ładowaniem BitmapImage i zamianą go w Bitmapę (co oczywiście zabiło moją animację, ponieważ nie jest już gifem).
źródło
.ImageLocation
zamiast.Image
. On miał niewłaściwą metodę..ImageLocation
działa z katalogu głównego projektu Visual Studio, więc powiedzmy, że maszImages
folder, twoja ścieżka jest wtedyimgBox.ImageLocation = "/Images/my.gif";
. Jeśli masz folder o nazwieViews
gdzie masz widok, który pokaże obraz, aby wrócić doImages
, trzeba by użyć 2 punkty:imgBox.ImageLocation = "../Images/my.gif";
.Próbowałem już wyżej, ale każdy ma swoją krótkość, a dzięki Wam wypracowuję własny GifImage:
Stosowanie:
Ponieważ nie spowoduje to wycieku pamięci i animuje własną linię czasu obrazu gif, możesz spróbować.
źródło
IsAutoStart
, ale w przeciwnym razie działało jak mistrz!Wcześniej miałem podobny problem, musiałem odtworzyć
.gif
plik w twoim projekcie. Miałem dwie możliwości:przy użyciu PictureBox z WinForms
za pomocą biblioteki innej firmy, takiej jak WPFAnimatedGif z codeplex.com.
Wersja z
PictureBox
nie działała dla mnie, a projekt nie mógł dla niej używać bibliotek zewnętrznych. Więc udało mi się toBitmap
z pomocąImageAnimator
. Ponieważ standardBitmapImage
nie obsługuje odtwarzania.gif
plików.Pełny przykład:
XAML
Code behind
Bitmap
nie obsługuje dyrektywy URI , więc ładuję.gif
plik z bieżącego katalogu.źródło
Małe ulepszenie
GifImage.Initialize()
metody, która odczytuje właściwe taktowanie ramki z metadanych GIF.źródło
Nie jestem pewien, czy problem został rozwiązany, ale najlepszym sposobem jest użycie biblioteki WpfAnimatedGid . Jest bardzo łatwy, prosty i prosty w użyciu. Wymaga tylko 2 linii kodu XAML i około 5 linii kodu C # w kodzie z tyłu.
Zobaczysz wszystkie niezbędne szczegóły, w jaki sposób można go tam wykorzystać. Tego właśnie użyłem zamiast ponownie wynaleźć koło
źródło
Dodając do głównej odpowiedzi, która zaleca użycie WpfAnimatedGif , musisz dodać następujące linie na końcu, jeśli zamieniasz obraz za pomocą Gif, aby upewnić się, że animacja faktycznie się wykonuje:
Twój kod będzie wyglądał następująco:
źródło
Sprawdź mój kod, mam nadzieję, że to ci pomogło :)
lub
źródło
Alternatywą dla animacji oczekiwania w WPF jest:
Wyświetli animowany pasek postępu.
źródło