0

私は1から5の画像(サーバーから受信したデータに応じて)をにフェッチするビューを持っていますStackPanel、そして今日それらはダウンロードされるたびに(任意のランダムな順序で)単にビューにポップします。すべての画像がレンダリング可能になるまで(つまり、すべてがWebから読み込まれ、表示できるようになるまで)、すべての画像を非表示にします。

これで、すべての画像に、Loaded私が聞くことができるイベントがあります。ただし、true / false値の配列を追跡し、これを常にポーリングすることは悪い考えのように思えます。私が求めていることを達成するためのより良い方法はありますか?

4

1 に答える 1

2

もちろん。次のようなさまざまな画像を表示するとします。

<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();
    }
}

これがお役に立てば幸いです。

于 2013-03-04T21:50:32.020 に答える