C# 如何知道何时从web加载一组图像?

C# 如何知道何时从web加载一组图像?,c#,image,events,windows-8,C#,Image,Events,Windows 8,我有一个视图,可以将1到5个图像(取决于从服务器接收到的数据)提取到堆栈面板中,而今天,只要下载它们(以任意随机顺序),它们就会弹出视图。我想隐藏所有图像,直到它们都可用于渲染(即,当它们都从web加载并准备好显示时) 现在,每个图像都有一个加载的事件,我可以监听它。然而,跟踪真/假值数组并不断轮询这听起来是个坏主意。有没有更好的方法来完成我的目标?当然。假设您展示了许多不同的图像,如下所示: <Grid Background="Black"> <StackPanel

我有一个视图,可以将1到5个图像(取决于从服务器接收到的数据)提取到
堆栈面板中,而今天,只要下载它们(以任意随机顺序),它们就会弹出视图。我想隐藏所有图像,直到它们都可用于渲染(即,当它们都从web加载并准备好显示时)


现在,每个图像都有一个加载的
事件,我可以监听它。然而,跟踪真/假值数组并不断轮询这听起来是个坏主意。有没有更好的方法来完成我的目标?

当然。假设您展示了许多不同的图像,如下所示:

<Grid Background="Black">
    <StackPanel x:Name="ImageContainer" Opacity="0" Width="100">
        <Image Loaded="Image_Loaded_1" Source="http://www.hdwallpaperspk.com/wp-content/uploads/2013/01/1600x1200_hd_wallpaper_177.jpg" />
        <Image Loaded="Image_Loaded_1" Source="http://www.hdwallpaperspk.com/wp-content/uploads/2013/01/nature-wallpaper-hd1.jpg" />
        <Image Loaded="Image_Loaded_1" Source="http://hidefwalls.com/wp-content/g/hd-2/hd-wallpaper-30.jpg" />
        <Image Loaded="Image_Loaded_1" Source="http://beautifulcoolwallpapers.files.wordpress.com/2011/09/red-tree-wallpaper-hd.jpg" />
        <Image Loaded="Image_Loaded_1" Source="http://hidefwalls.com/wp-content/g/hd-2/at-the-beach-hd-wallpaper-1920x1200.jpg" />
        <Image Loaded="Image_Loaded_1" Source="http://freedomwallpaper.com/wallpaper/funky-wallpaper-hd.jpg" />
        <Image Loaded="Image_Loaded_1" Source="http://walfast.com/wp-content/uploads/2013/02/wallpaper-hd.jpg" />
        <Image Loaded="Image_Loaded_1" Source="http://www.hdwallpaperspk.com/wp-content/uploads/2013/01/hd-wallpaper-6-o-u-ibackgroundz-com_.jpg" />
        <Image Loaded="Image_Loaded_1" Source="http://2.bp.blogspot.com/-dcgYv-SFEu0/TZVuveCkq1I/AAAAAAAAI2A/vK0PXUJ8aKw/s1600/tiger_wallpapers_hd_Bengal_Tiger_hd_wallpaper.jpg" />
    </StackPanel>
</Grid>
object m_ImagesLock = new object();
private List<Image> m_ImagesLoading = new List<Image>();

private void Image_Loaded_1(object sender, RoutedEventArgs e)
{
    lock (m_ImagesLock)
    {
        var _Image = sender as Image;
        m_ImagesLoading.Add(_Image);
        var _Action = new Action(() =>
        {
            m_ImagesLoading.Remove(_Image);
            ImageContainer.Opacity = m_ImagesLoading.Any() ? 0 : 1;
        });
        _Image.ImageOpened += (s, arg) => _Action();
        _Image.ImageFailed += (s, arg) => _Action();
    }
}

然后您可以隐藏它们,直到它们全部加载完毕,如下所示:

<Grid Background="Black">
    <StackPanel x:Name="ImageContainer" Opacity="0" Width="100">
        <Image Loaded="Image_Loaded_1" Source="http://www.hdwallpaperspk.com/wp-content/uploads/2013/01/1600x1200_hd_wallpaper_177.jpg" />
        <Image Loaded="Image_Loaded_1" Source="http://www.hdwallpaperspk.com/wp-content/uploads/2013/01/nature-wallpaper-hd1.jpg" />
        <Image Loaded="Image_Loaded_1" Source="http://hidefwalls.com/wp-content/g/hd-2/hd-wallpaper-30.jpg" />
        <Image Loaded="Image_Loaded_1" Source="http://beautifulcoolwallpapers.files.wordpress.com/2011/09/red-tree-wallpaper-hd.jpg" />
        <Image Loaded="Image_Loaded_1" Source="http://hidefwalls.com/wp-content/g/hd-2/at-the-beach-hd-wallpaper-1920x1200.jpg" />
        <Image Loaded="Image_Loaded_1" Source="http://freedomwallpaper.com/wallpaper/funky-wallpaper-hd.jpg" />
        <Image Loaded="Image_Loaded_1" Source="http://walfast.com/wp-content/uploads/2013/02/wallpaper-hd.jpg" />
        <Image Loaded="Image_Loaded_1" Source="http://www.hdwallpaperspk.com/wp-content/uploads/2013/01/hd-wallpaper-6-o-u-ibackgroundz-com_.jpg" />
        <Image Loaded="Image_Loaded_1" Source="http://2.bp.blogspot.com/-dcgYv-SFEu0/TZVuveCkq1I/AAAAAAAAI2A/vK0PXUJ8aKw/s1600/tiger_wallpapers_hd_Bengal_Tiger_hd_wallpaper.jpg" />
    </StackPanel>
</Grid>
object m_ImagesLock = new object();
private List<Image> m_ImagesLoading = new List<Image>();

private void Image_Loaded_1(object sender, RoutedEventArgs e)
{
    lock (m_ImagesLock)
    {
        var _Image = sender as Image;
        m_ImagesLoading.Add(_Image);
        var _Action = new Action(() =>
        {
            m_ImagesLoading.Remove(_Image);
            ImageContainer.Opacity = m_ImagesLoading.Any() ? 0 : 1;
        });
        _Image.ImageOpened += (s, arg) => _Action();
        _Image.ImageFailed += (s, arg) => _Action();
    }
}
objectm_ImagesLock=newobject();
私有列表m_ImagesLoading=新列表();
私有无效图像\u加载\u 1(对象发送方,路由目标)
{
锁(m_ImagesLock)
{
var_Image=发送方作为映像;
m_ImagesLoading.Add(_Image);
var_Action=新操作(()=>
{
m_Image加载。删除(_Image);
ImageContainer.Opacity=m_ImagesLoading.Any()?0:1;
});
_Image.ImageOpened+=(s,arg)=>\u Action();
_Image.ImageFailed+=(s,arg)=>\u Action();
}
}

我希望这能有所帮助。

谢谢,这正是我想要的。