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