Windows Phone Pivot 模拟 滑动Image Viewer 出现 0x8000ffff 异常

本文探讨了在Silverlight应用中遇到的0x8000ffff异常问题,通过分析和尝试多种解决方案,最终成功实现了多张图片的滑动展示功能。包括查找原因、理解Silverlight渲染原理、使用BitmapImage延迟加载图片等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简介:
  App有多张图片需要展示,打算做一个 类似于 “图片”里面可以滑动的 图片展示页面。
  实现的方式有很多。选个简单的,直接用Pivot来模拟。

问题:
  过程中出现了:0x8000ffff 异常!!!
     我将 ObservableCollection<Uri> 绑定到 ItemTemplete,并且设置ItemSource时候
引发0x8000ffff 异常。完全没有头绪。


使用的代码:

代码如下:
数据
 private ObservableCollection<Uri> _imageUris;

        public ObservableCollection<Uri> ImageUris
        {
            get { return _imageUris; }
            set
            {
                if (_imageUris != value)
                {
                    _imageUris = value;
                    RaisePropertyChanged("ImageUris");
                }
            }
        }

加载数据
protected override void OnNavigatedTo(NavigationEventArgs e)
        {
            base.OnNavigatedTo(e);

            if (PhoneApplicationService.Current.State.ContainsKey("images"))
            {
                object list;
                if (PhoneApplicationService.Current.State.TryGetValue("images", out list))
                {
                    
                    ImageUris = list as ObservableCollection<Uri>; 
                }
            }
         Pivot.ItemSource = ImageUris;
}

XAML 
		<controls:Pivot Title="查看图片"
						Name="Pivot" >
			<controls:Pivot.ItemTemplate>
				<DataTemplate >
					<Image Source="{Binding}" />
				</DataTemplate>
			</controls:Pivot.ItemTemplate>
			
			<controls:Pivot.HeaderTemplate>
				<DataTemplate >
					<Grid>
						<TextBlock Margin="0,0,1,0"
								   TextWrapping="Wrap"
								   d:LayoutOverrides="Width, Height" />
					</Grid>
				</DataTemplate>
			</controls:Pivot.HeaderTemplate>
		</controls:Pivot>



解决问题:

1.找了2 3个小时,开始以为是StaticsResources的问题。网上有说法是绑定名字出错,但是经过检查,
没有错误!

2.然后找到这个文章
http://www.nachmore.com/2010/silverlight-why-do-i-get-0x8000ffff-when-using-writeablebitmap-on-an-element/

Silverlight: Why do I get 0x8000ffff when using WriteableBitmap on an Element


大概是讲:强迫系统去render看不到的控件,会仆街。
按照这个思路,我觉得应该讲BitmapImage加载了,再绑定。

3.那就先将BitmapImage下载来咯,WebClient??好像不太好
我找到这个方案:
http://blog.youkuaiyun.com/moxiaomomo/article/details/7907054

延迟加载BitmapImage

C# 改成这样:

 public ObservableCollection<BitmapImage> Images { get; set; } 

 protected override void OnNavigatedTo(NavigationEventArgs e)
        {
            base.OnNavigatedTo(e);

            if (PhoneApplicationService.Current.State.ContainsKey("images"))
            {
                object list;
                if (PhoneApplicationService.Current.State.TryGetValue("images", out list))
                {
                    
                    ImageUris = list as ObservableCollection<Uri>; 
                }
            }

            Images.Clear();

            foreach (var uri in ImageUris)
            {
                BitmapImage bitmap = new BitmapImage();
                bitmap.CreateOptions = BitmapCreateOptions.BackgroundCreation;
                // 当图片下载完成并解码成功时,会触发ImageOpened
                bitmap.ImageOpened += (s, ex) =>
                {
                    // 添加到图片列表
                    Images.Add(s as BitmapImage); 
                };
                // uri为远程文件地址
                bitmap.UriSource = uri; 
            }


            int index = int.Parse(NavigationContext.QueryString["index"]);
            Pivot.SelectedIndex = index;
            Pivot.ItemsSource = Images;
        }


咔嗒!成了!




历史 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值