Que tipo de controle que eu deveria usar - Image
, MediaElement
, etc.?
.net
wpf
animated-gif
pata de ferro
fonte
fonte
Respostas:
Não consegui obter a resposta mais popular para esta pergunta (acima, por Dario), para funcionar corretamente. O resultado foi uma animação estranha e irregular com artefatos estranhos. Melhor solução que encontrei até agora: https://github.com/XamlAnimatedGif/WpfAnimatedGif
Você pode instalá-lo com o NuGet
PM> Install-Package WpfAnimatedGif
e para usá-lo, em um novo espaço de nome na janela onde você deseja adicionar a imagem gif e usá-la como abaixo
O pacote é realmente legal, você pode definir alguns atributos como abaixo
e você também pode usá-lo no seu código:
Edição: Suporte Silverlight
Conforme o comentário de josh2112, se você deseja adicionar suporte GIF animado ao seu projeto Silverlight, use github.com/XamlAnimatedGif/XamlAnimatedGif
fonte
img
aqui?Postei uma solução estendendo o controle de imagem e usando o Decodificador Gif. O decodificador gif tem uma propriedade de quadros. Eu animar a
FrameIndex
propriedade. O eventoChangingFrameIndex
altera a propriedade de origem para o quadro correspondente aoFrameIndex
(que está no decodificador). Eu acho que o gif tem 10 quadros por segundo.Exemplo de uso (XAML):
fonte
Int32AnimationUsingKeyFrames
gf.Frames[0].MetaData.GetQuery("/grctlext/Delay")
(retorna um ushort que é a duração do quadro em centenas de segundos)Também fiz uma pesquisa e encontrei várias soluções diferentes em apenas um tópico nos antigos fóruns do MSDN. (o link não funcionou mais, por isso eu o removi)
A mais simples de executar parece ser usar um
PictureBox
controle WinForms e foi assim (alterou algumas coisas do segmento, a maioria do mesmo modo).Adicione uma referência a
System.Windows.Forms
,WindowsFormsIntegration
eSystem.Drawing
ao seu projeto primeiro.Em seguida, no
Window_Loaded
manipulador, você definiria apictureBoxLoading.ImageLocation
propriedade para o caminho do arquivo de imagem que deseja mostrar.O
MediaElement
controle foi mencionado nesse encadeamento, mas também é mencionado que é um controle bastante pesado; portanto, havia várias alternativas, incluindo pelo menos 2 controles homebrewed baseados noImage
controle; portanto, é o mais simples.fonte
AllowTransparency="True"
. Se isso produzirá ou não os resultados que você tem em mente é outra questão. Eu mesmo não tentei, mas aposto queWindowsFormsHost
isso não se tornaria transparente. O resto doWindow
poder. Você simplesmente terá que tentar, eu acho.Que tal esse pequeno aplicativo: Código por trás:
XAML:
fonte
<MediaElement LoadedBehavior="Play" Source="{Binding MyGifFile}" >
- O MyGifFile é apenas o nome do arquivo (e o caminho) do meu gif animado.ListBox
, ou ligar-se? Eu tentei sem ligação, basta colocar o caminho do arquivo na fonte e ele aparece, mas não anima. Se eu usar a ligação, mesmo com aListBox
, ela não será exibida para mim - isso me dará uma exceção de que o caminho do meu arquivo está incorreto, mesmo que seja o mesmo que eu uso quando aparece.É muito simples se você usar
<MediaElement>
:fonte
public string SpinnerLogoPath => Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"Assets\images\mso_spinninglogo_blue_2.gif");
. Certifique-se de definir o arquivo como Build = Content e copie para o diretório de saída.Aqui está minha versão do controle de imagem animada. Você pode usar a propriedade padrão Source para especificar a fonte da imagem. Eu melhorei ainda mais. Eu sou russo, o projeto é russo, então os comentários também estão em russo. Mas de qualquer maneira você deve entender tudo sem comentários. :)
fonte
Eu uso esta biblioteca: https://github.com/XamlAnimatedGif/WpfAnimatedGif
Primeiro, instale a biblioteca em seu projeto (usando o Package Manager Console):
Em seguida, use esse trecho no arquivo XAML:
Espero que ajude.
Fonte: https://github.com/XamlAnimatedGif/WpfAnimatedGif
fonte
Basicamente, a mesma solução PictureBox acima, mas desta vez com o code-behind para usar um Recurso Incorporado em seu projeto:
No XAML:
Em Code-Behind:
fonte
Modifiquei o código de Mike Eshva e o fiz funcionar melhor. Você pode usá-lo com 1frame jpg png bmp ou mutil-frame gif. Se você deseja vincular uma uri ao controle, vincule as propriedades UriSource ou deseja fluxo de memória que você liga a propriedade Source, que é uma BitmapImage.
Este é um controle personalizado. Você precisa criá-lo no WPF App Project e excluir a substituição do modelo com estilo.
fonte
Eu tive esse problema, até descobrir que, no WPF4, você pode simular suas próprias animações de imagem de quadro-chave. Primeiro, divida sua animação em uma série de imagens, nomeie-as como "Image1.gif", "Image2, gif" e assim por diante. Importe essas imagens para os recursos da sua solução. Suponho que você os coloque no local do recurso padrão para imagens.
Você vai usar o controle de imagem. Use o seguinte código XAML. Eu removi os não essenciais.
fonte
Obrigado pelo seu post, Joel, que me ajudou a resolver a ausência de suporte do WPF para GIFs animados. Apenas adicionando um pouco de código, já que tive um tempo enorme ao definir a propriedade pictureBoxLoading.Image devido à API do Winforms.
Eu tive que definir a Ação de compilação da minha imagem gif animada como "Conteúdo" e o diretório Copiar para saída como "Copiar se mais novo" ou "sempre". Então, na MainWindow (), chamei esse método. O único problema é que, quando tentei descartar o fluxo, ele me deu um gráfico de envelope vermelho em vez da minha imagem. Vou ter que resolver esse problema. Isso removeu a dor de carregar uma BitmapImage e transformá-la em um Bitmap (que obviamente matou minha animação porque não é mais um gif).
fonte
.ImageLocation
vez de.Image
. Ele tinha o método errado..ImageLocation
funciona a partir da raiz do projeto Visual Studio, então digamos que você tenha umaImages
pasta, seu caminho é entãoimgBox.ImageLocation = "/Images/my.gif";
. Se você tem uma pasta chamadaViews
onde você tem uma vista que vai mostrar a imagem, para receber de volta atéImages
, você teria que usar 2 pontos:imgBox.ImageLocation = "../Images/my.gif";
.Eu tentei todo o caminho acima, mas cada um tem sua falta, e graças a todos vocês, eu trabalho meu próprio GifImage:
Uso:
Como não causaria vazamento de memória e animava a própria linha do tempo da imagem gif, você pode experimentá-lo.
fonte
IsAutoStart
, mas, caso contrário, funcionou como um campeão!Anteriormente, eu enfrentava um problema semelhante, precisava reproduzir
.gif
arquivos no seu projeto. Eu tive duas escolhas:usando o PictureBox do WinForms
usando uma biblioteca de terceiros, como WPFAnimatedGif de codeplex.com.
A versão com
PictureBox
não funcionou para mim e o projeto não pôde usar bibliotecas externas para isso. Então eu fiz isso por mim mesmoBitmap
com ajudaImageAnimator
. Porque, o padrãoBitmapImage
não suporta a reprodução de.gif
arquivos.Exemplo completo:
XAML
Code behind
Bitmap
não suporta a diretiva URI , por isso carrego o.gif
arquivo do diretório atual.fonte
Pequena melhoria no
GifImage.Initialize()
método, que lê o tempo de quadro adequado dos metadados do GIF.fonte
Não tenho certeza se isso foi resolvido, mas a melhor maneira é usar a biblioteca WpfAnimatedGid . É muito fácil, simples e direto de usar. Requer apenas 2 linhas de código XAML e cerca de 5 linhas de código C # no código por trás.
Você verá todos os detalhes necessários de como isso pode ser usado lá. Isto é o que eu também usei em vez de reinventar a roda
fonte
Adicionando à resposta principal que recomenda o uso de WpfAnimatedGif , você deve adicionar as seguintes linhas no final se estiver trocando uma imagem por um GIF para garantir que a animação seja realmente executada:
Portanto, seu código será semelhante a:
fonte
Verifique meu código, espero que isso tenha ajudado :)
ou
fonte
Uma alternativa para aguardar animação no WPF é:
Ele mostrará uma barra de progresso animada.
fonte