Windows phone 7 Pivot中的图像被多次下载和解码?

Windows phone 7 Pivot中的图像被多次下载和解码?,windows-phone-7,windows-phone-8,Windows Phone 7,Windows Phone 8,我将Pivot的ItemsSource属性设置为包含3个URL字符串的列表 奇怪的事情发生了: 使用下面的模板,ImageOpen事件将被调用6次而不是3次 如果我将BitmapImage的CreateOptions设置为“BackgroundCreation”,ImageOpen事件可以被调用数百次,而没有明显的原因 如果我将Pivot放在UserControl中,并对BitmapImage使用“BackgroundCreation”选项,则图像根本不会在Pivot中渲染,尽管调用了Imag

我将Pivot的ItemsSource属性设置为包含3个URL字符串的列表

奇怪的事情发生了:

  • 使用下面的模板,ImageOpen事件将被调用6次而不是3次
  • 如果我将BitmapImage的CreateOptions设置为“BackgroundCreation”,ImageOpen事件可以被调用数百次,而没有明显的原因
  • 如果我将Pivot放在UserControl中,并对BitmapImage使用“BackgroundCreation”选项,则图像根本不会在Pivot中渲染,尽管调用了ImageOpen事件(数百次)
同样的行为发生在WP7和WP8上。我非常惊讶,因为我刚刚创建了一个ImageGallery用户控件,该控件下面使用了一个Pivot,我想利用BackgroundCreation选项将解码工作转移到后台线程,但有了这样的症状,它似乎毫无意义:(

1) 支点

2) 代码隐藏

 public partial class MainPage : PhoneApplicationPage
    {
        int c = 0;
        List<string> list = new List<string>()
                             {
                            "http://d24w6bsrhbeh9d.cloudfront.net/photo/6298284_460s.jpg", "http://d24w6bsrhbeh9d.cloudfront.net/photo/6291760_460s.jpg", "http://d24w6bsrhbeh9d.cloudfront.net/photo/6298282_460s.jpg",  
                             }; 
        // Constructor
        public MainPage()
        {
            InitializeComponent();
        }

        private void UIElement_OnTap(object sender, GestureEventArgs e)
        {
            c = 0;
            gallery.ItemsSource = list;

        }

        private void BitmapImage_OnImageOpened(object sender, RoutedEventArgs e)
        {
            c++;
            Debug.WriteLine("opened - {0}", c);
        }

        private void BitmapImage_OnImageFailed(object sender, ExceptionRoutedEventArgs e)
        {
            Debug.WriteLine("failed");
        }
    }
public部分类主页:PhoneApplicationPage
{
int c=0;
列表=新列表()
{
"http://d24w6bsrhbeh9d.cloudfront.net/photo/6298284_460s.jpg", "http://d24w6bsrhbeh9d.cloudfront.net/photo/6291760_460s.jpg", "http://d24w6bsrhbeh9d.cloudfront.net/photo/6298282_460s.jpg",  
}; 
//建造师
公共主页()
{
初始化组件();
}
私有void UIElement_OnTap(对象发送方、GestureEventArgs e)
{
c=0;
gallery.ItemsSource=列表;
}
私有无效位图图像\u OnImageOpened(对象发送方,RoutedEventArgs e)
{
C++;
WriteLine(“opened-{0}”,c);
}
私有无效BitmapImage\u OnImageFailed(对象发送方,例外RoutedEventArgs e)
{
Debug.WriteLine(“失败”);
}
}

为了让您更好地了解正在发生的事情,您可以查看以下代码片段:

private void BitmapImage_OnImageOpened(object sender, RoutedEventArgs e)
{
    BitmapImage image = (BitmapImage)sender;

    Debug.WriteLine("opened - {0}", image.UriSource.ToString());
}
一开始,当您按下按钮时,您会注意到列表中的第一个图像似乎加载了两次:

即使删除了
DelayCreation
标志,也会得到相同的结果,因为默认情况下会设置该标志

现在,如果我们用WireShark(连接到自组织网络的手机)检查这个会发生什么

注意:我在这里使用不同的图像URL)

该图像只下载一次,因此就其本身而言,您不需要担心额外的数据。您看到它被触发两次的原因似乎是,它一次为源触发,另一次为图像触发

从技术上讲,如果您要这样做,也是一样的:

List<BitmapImage> list = new List<BitmapImage>();

// Constructor
public MainPage()
{
    InitializeComponent();

    BitmapImage image = new BitmapImage();
    image.UriSource = new Uri("http://timenerdworld.files.wordpress.com/2012/08/new-microsoft-logo.jpg");
    image.ImageOpened += image_ImageOpened;

    list.Add(image);
}

void image_ImageOpened(object sender, RoutedEventArgs e)
{
    Debug.WriteLine("opened image from bitmap");
}

private void UIElement_OnTap(object sender, GestureEventArgs e)
{
    gallery.ItemsSource = list;
}

private void BitmapImage_OnImageOpened(object sender, RoutedEventArgs e)
{
    Image image = (Image)sender;

    Debug.WriteLine("opened - {0}", ((BitmapImage)image.Source).UriSource.ToString());
}
List List=新列表();
//建造师
公共主页()
{
初始化组件();
BitmapImage=新的BitmapImage();
image.UriSource=新Uri(“http://timenerdworld.files.wordpress.com/2012/08/new-microsoft-logo.jpg");
image.ImageOpened+=image\u ImageOpened;
列表。添加(图像);
}
无效图像\u图像已打开(对象发送器,路由目标e)
{
WriteLine(“从位图打开的图像”);
}
私有void UIElement_OnTap(对象发送方、GestureEventArgs e)
{
gallery.ItemsSource=列表;
}
私有无效位图图像\u OnImageOpened(对象发送方,RoutedEventArgs e)
{
图像=(图像)发送方;
WriteLine(“opened-{0}”,((BitmapImage)image.Source.UriSource.ToString());
}
因此,不,图像不会被下载两次

List<BitmapImage> list = new List<BitmapImage>();

// Constructor
public MainPage()
{
    InitializeComponent();

    BitmapImage image = new BitmapImage();
    image.UriSource = new Uri("http://timenerdworld.files.wordpress.com/2012/08/new-microsoft-logo.jpg");
    image.ImageOpened += image_ImageOpened;

    list.Add(image);
}

void image_ImageOpened(object sender, RoutedEventArgs e)
{
    Debug.WriteLine("opened image from bitmap");
}

private void UIElement_OnTap(object sender, GestureEventArgs e)
{
    gallery.ItemsSource = list;
}

private void BitmapImage_OnImageOpened(object sender, RoutedEventArgs e)
{
    Image image = (Image)sender;

    Debug.WriteLine("opened - {0}", ((BitmapImage)image.Source).UriSource.ToString());
}