WPF使用计时器动态更改图像源

3
在WPF中,我有两个图片,需要创建一个闪烁效果(不使用不透明度)。 假设我有a.png和b.png,第一步显示a.png,0.5秒后,将显示b.png,然后再过0.5秒,将显示a.png,并重复循环,不断闪烁。 我已经查阅了论坛,但仍然没有找到vb示例,请帮忙。
2个回答

5

您可以使用适当的动画,无需任何后台代码:

<Window.Resources>
    <BitmapImage x:Key="Image1" UriSource="C:\Users\Public\Pictures\Sample Pictures\Koala.jpg"/>
    <BitmapImage x:Key="Image2" UriSource="C:\Users\Public\Pictures\Sample Pictures\Jellyfish.jpg"/>
</Window.Resources>
...
<Image x:Name="image" Source="{StaticResource Image1}">
    <Image.Triggers>
        <EventTrigger RoutedEvent="Loaded">
            <BeginStoryboard>
                <Storyboard>
                    <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Source"
                                                   Duration="0:0:1"
                                                   RepeatBehavior="Forever">
                        <DiscreteObjectKeyFrame Value="{StaticResource Image2}" 
                                                KeyTime="0:0:0.5"/>
                    </ObjectAnimationUsingKeyFrames>
                </Storyboard>
            </BeginStoryboard>
        </EventTrigger>
    </Image.Triggers>
</Image>

也许你可以用更适合你需求的事件来替换 Loaded 事件。
如果你真的想在代码后台完成,你可以创建一个 DispatcherTimer,将其 Interval 设置为半秒钟,并在计时器的 Tick 事件处理程序中交替设置图像的 Source 属性为两个图像之一。

谢谢你,Clemens。你帮了我很多。 - Fire

0

我不太擅长vb.net,但在c#中你可以这样做

public ImageSource GetImageSourceFromImage(Bitmap pngFile)
        {
            MemoryStream imageStream = new MemoryStream();
            pngFile.Save(imageStream, ImageFormat.Png);
            imageStream.Seek(0, SeekOrigin.Begin);
            return BitmapFrame.Create(imageStream);
        }

这个函数会返回一个图片源,你可以直接将它赋值给你的图像对象。


这与如何使用两个图像创建闪烁效果有什么关系? - Clemens
还有一点需要注意。当你有一个名为 a.png 的文件时,最简单的方法是调用 new BitmapImage(new Uri("path/to/a.png")); 来创建一个 ImageSource。在这里使用 WinForms 的 Bitmap 类并将其编码成流,然后再解码成 WPF 的 BitmapFrame 是没有任何意义的。 - Clemens

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接