先吐槽一下,xamarin到现在为止,虽然开发一下应用尚可,对于一些简单的app开发使用xamarin-forms方式开发,虽然有一些优势,可以省下开发三个平台共同功能的时间,但是当我们随着项目深入的时候难免遇到需要在特点平台特性的问题,微软在xamarin中虽然提供了方法让我们使用自定义的平台特性,但是当我们重写三各平台特性的时候,总有让人砸掉电脑的冲动,不仅需要去研究三个平台的不同特性,而且还需要在三个平台同时重写,即使能参考原平台的代码,也由于微软的封装并不特别完美,导致在许多时候,我们需要花费大把的时间在重写上,由于当前的xamarin文档并不完整,而且版本更新频繁和不稳定(即使标志为稳定版),经常遇到无文档可以借鉴的尴尬,相对于原生平台开发,综合来看并不划算。
吐槽完毕,看下列问题,在app开发中经常用到listview这个控件,使用了这个控件难免的用到异步加载数据这种方式,但是在winRT内核中,我们申明的Task并不能去操作前天的主线程,所以,当我们使用Task加载数据返回呈现数据的时候,在IOS和android下没有问题的代码,在设置为UWP平台时就会报线程异常,不能对listview的数据源Add()、Insert()。这时需对UWP平台做特殊处理。方式代码如下:
if (Device.OS == TargetPlatform.Windows) { Device.BeginInvokeOnMainThread(() => { mailList.Insert(index, mail); }); } //或者 if (Device.OS == TargetPlatform.Windows) { Device.BeginInvokeOnMainThread(() => { mailList.Add(mail); }); }
当我们申明listview的数据源类型为ObservableCollection<T>类型的时候,我们经常使用这个集合类来更改我们的数据,但是有用UWP的平台特性,使得我们在更改model的属性来更改显现效果时一样会报线程异常。
于是对应的要修改掉ObservableCollection<T>集合的OnPropertyChanged方法,示例如下:
1 public class MailInfo : INotifyPropertyChanged 2 { 3 public event PropertyChangedEventHandler PropertyChanged; 4 void OnPropertyChanged([CallerMemberName] string propertyName = null) 5 { 6 var hanlder = PropertyChanged; 7 if (hanlder != null) 8 { 9 if (Device.OS == TargetPlatform.Windows) 10 { 11 Device.BeginInvokeOnMainThread(() => 12 { 13 hanlder(this, new PropertyChangedEventArgs(propertyName)); 14 }); 15 } 16 else 17 { 18 hanlder(this, new PropertyChangedEventArgs(propertyName)); 19 } 20 } 21 } 22 public MailInfo() 23 { 24 25 } 26 [PrimaryKey, AutoIncrement] 27 public int Id { get; set; } 28 /// <summary> 29 /// 发件人 30 /// </summary> 31 public string MailFrom { get; set; } 32 /// <summary> 33 /// 收件人 34 /// </summary> 35 public string MailTo { get; set; } 36 /// <summary> 37 /// 邮件标题 38 /// </summary> 39 public string Subject { get; set; } 40 41 string detail; 42 /// <summary> 43 /// 邮件内容 44 /// </summary> 45 [Ignore] 46 public string Detail 47 { 48 get 49 { 50 return detail; 51 } 52 set 53 { 54 if (!value.Equals(detail, StringComparison.Ordinal)) 55 { 56 detail = value; 57 58 OnPropertyChanged("Detail"); 59 } 60 } 61 } 62 63 64 /// <summary> 65 /// 邮件唯一编号 66 /// </summary> 67 [Indexed] 68 public int UniqueID_Server { get; set; } 69 70 MessageImportance importanceType; 71 /// <summary> 72 /// 邮件重要性 Low = 0,Normal = 1,High = 2, 73 /// </summary> 74 public MessageImportance MessageImportanceType 75 { 76 get 77 { 78 return importanceType; 79 } 80 set 81 { 82 if (!value.Equals(importanceType)) 83 { 84 importanceType = value; 85 86 OnPropertyChanged("MessageImportanceType"); 87 } 88 } 89 } 90 91 bool hasAttachment; 92 /// <summary> 93 /// 是否有附件 94 /// </summary> 95 [Ignore] 96 public bool HasAttachment 97 { 98 get 99 { 100 return hasAttachment; 101 } 102 set 103 { 104 if (!value.Equals(hasAttachment)) 105 { 106 hasAttachment = value; 107 OnPropertyChanged("HasAttachment"); 108 } 109 } 110 } 111 112 113 114 }
经以上处理可解决UWP线程冲突问题。如有更好方式,欢迎留言交流。