0

我有 Flickr 上的图像 URI 列表。我使用 Windows phone Toolkit 中的手势来显示图像并处理轻弹事件。由于图像在网络上,源设置得很好,但是进度条在轻弹时立即折叠(隐藏),因为它已经设置了图像的源并且手机仍然需要下载并显示它。

我希望显示进度条,直到图像完全可见。(使用 WebClient 有用吗?)

这是一个简单的视频,可以准确显示正在发生的事情。不要介意图片,我只是拿起了出现的第一件事。

视频链接

代码如下:

  private void GestureListener_Flick(object sender, FlickGestureEventArgs e)
                {
                    if (((e.Angle <= 180 && e.Angle >= 135) || (e.Angle < 225 && e.Angle > 180)) && e.Direction.ToString().Equals("Horizontal"))
                    {
                        progess_bar.Visibility=Visibility.Visible;
                        if(index<photoslist.Count-1)
                        index++;
                        image.Source = new BitmapImage(new Uri( photoslist[index].LargeUrl , UriKind.Absolute));
                        progess_bar.Visibility = Visibility.Collapsed;
                    }
                    else if (((e.Angle <= 45 && e.Angle >= 0) || (e.Angle < 360 && e.Angle >= 315)) && e.Direction.ToString().Equals("Horizontal"))
                    {
                        progess_bar.Visibility = Visibility.Visible;
                        if (index > 0)
                            index--;
                        else
                            index = 0;
                        image.Source = new BitmapImage(new Uri( photoslist[index].LargeUrl, UriKind.Absolute));
                        progess_bar.Visibility = Visibility.Collapsed;
                    }
                }
4

2 回答 2

0

在 Image 上设置 Source 属性在下载完成之前不会阻止正在运行的线程,因此代码将继续执行并且您的进度条将立即不可见。

如果您想提供真正的进度条功能,则必须手动下载图像并根据进度更新进度条。但是,图像通常不是大文件。在图像下载完成之前,您最好显示某种加载动画。

于 2013-05-15T06:21:55.857 回答
0

对于那些感兴趣的人,我在下面有粗略的代码解决方案。(注意,它没有优化,你可以处理它)

private void GestureListener_Flick(object sender, FlickGestureEventArgs e)
        {
            if (((e.Angle <= 180 && e.Angle >= 135) || (e.Angle < 225 && e.Angle > 180)) && e.Direction.ToString().Equals("Horizontal"))
            {
                if (index < photoslist.Count - 1)
                {
                    index++;
                    downloadImage();
                }
                //image_big.Source = new BitmapImage(new Uri( photoslist[index].LargeUrl , UriKind.Absolute));
            }
            else if (((e.Angle <= 45 && e.Angle >= 0) || (e.Angle < 360 && e.Angle >= 315)) && e.Direction.ToString().Equals("Horizontal"))
            {
                if (index > 0)
                {
                    index--;
                    downloadImage();
                }
                //image_big.Source = new BitmapImage(new Uri( photoslist[index].LargeUrl, UriKind.Absolute));

            }
        }

        private void downloadImage()
        {
            progess_bar.Visibility = Visibility.Visible;
            WebClient wc = new WebClient();
            wc.OpenReadCompleted += new OpenReadCompletedEventHandler(wc_OpenReadCompleted);
            wc.OpenReadAsync(new Uri(photoslist[index].LargeUrl, UriKind.Absolute), wc);
        }

        private void wc_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e)
        {
            if (e.Error == null && !e.Cancelled)
            {
                try
                {
                    BitmapImage image = new BitmapImage();
                    image.SetSource(e.Result);
                    image_big.Source = image;
                    progess_bar.Visibility = Visibility.Collapsed;
                }
                catch (Exception ex)
                {
                    MessageBox.Show("Cannot get the feed right now.Please try later.");
                }
            }
        }
    }
于 2013-05-15T16:35:02.120 回答