在WPF中显示动画gif

时间:2009-10-05 14:17:53

标签: c# wpf user-interface xaml animation

我想在我的XAML中显示动画gif,例如loading ...,因为我的程序正在进行中。我发现这在WPF中不能轻易完成,因为我加载了我的Gif并且它只显示了第一帧。在WPF中显示动画的最佳方法是什么?

3 个答案:

答案 0 :(得分:5)

我有这个问题,直到我发现在WPF4中,您可以模拟自己的关键帧图像动画。首先,将动画分成一系列图像,标题为“Image1.gif”,“Image2,gif”等。将这些图像导入解决方案资源。我假设你把它们放在图像的默认资源位置。

您将使用Image控件。使用以下XAML代码。我删除了非必需品。

<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 :(得分:1)

您可以嵌入MediaElement

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

或winforms PictureBox:

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

但是,我建议在WPF中找到一种方法。看看StoryBoards和动画。如果不知道你想要达到什么目的或为什么要这样做,就很难进一步提出建议。

答案 2 :(得分:0)

只需右键单击.gif文件并更改两个属性:

构建操作:嵌入式资源

复制到输出目录:如果较新则复制

然后

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

并设置继续运行的事件

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