浏览和等待
ImageBrowser程序演示了Image的另一个功能,它允许您浏览本书中某些示例所使用的库存照片。 正如您在下面的XAML文件中看到的那样,Image元素与Label和两个Button视图共享屏幕。 请注意,在Image上设置了PropertyChanged处理程序。 您在第11章“可绑定基础结构”中了解到,PropertyChanged处理程序由BindableObject实现,并在绑定属性更改值时触发。

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"x:Class="ImageBrowser.ImageBrowserPage"><ContentPage.Padding><OnPlatform x:TypeArguments="Thickness"iOS="0, 20, 0, 0" /></ContentPage.Padding><StackLayout><Image x:Name="image"VerticalOptions="CenterAndExpand"PropertyChanged="OnImagePropertyChanged" /><Label x:Name="filenameLabel"HorizontalOptions="Center" /><ActivityIndicator x:Name="activityIndicator" /><StackLayout Orientation="Horizontal"><Button x:Name="prevButton"Text="Previous"IsEnabled="false"HorizontalOptions="CenterAndExpand"Clicked="OnPreviousButtonClicked" /><Button x:Name="nextButton"Text="Next"IsEnabled="false"HorizontalOptions="CenterAndExpand"Clicked="OnNextButtonClicked" /></StackLayout></StackLayout>
</ContentPage>

此页面上还有一个ActivityIndicator。 当程序等待长操作完成(例如下载位图)但通常无法提供有关操作进度的任何信息时,通常会使用此元素。 如果您的程序知道操作的完成部分,则可以使用ProgressBar。 (ProgressBar将在下一章演示。)
ActivityIndi​​cator有一个名为IsRunning的布尔属性。通常,该财产是
false,ActivityIndi​​cator不可见。将该属性设置为true可使ActivityIn?dicator可见。所有这三个平台都实现了一个动画视觉,表明该程序正在运行,但在每个平台上看起来都有点不同。在iOS上它是一个旋转轮,在Android上它是一个旋转的部分圆圈。在Windows设备上,一系列点在屏幕上移动。
为了提供对库存图像的浏览访问,ImageBrowser需要下载包含所有文件名列表的JSON文件。多年来,各种版本的.NET引入了几个能够通过Web下载对象的类。但是,并非所有这些都可用于可移植类库中的.NET版本,该类库具有与Xamarin.Forms兼容的配置文件。可用的类是WebRequest及其后代类HttpWebRequest。
WebRequest.Create方法基于URI返回WebRequest方法。 (返回值实际上是一个HttpWebRequest对象。)BeginGetResponse方法需要一个回调函数,当引用URI的Stream可用于访问时,该函数被调用。通过调用EndGetResponse和GetResponseStream可以访问Stream。
一旦程序在以下代码中访问Stream对象,它就会使用DataCon?tractJsonSerializer类以及在ImageBrowserPage类顶部附近定义的嵌入式ImageList类,将JSON文件转换为ImageList对象:

public partial class ImageBrowserPage : ContentPage
{[DataContract]class ImageList{[DataMember(Name = "photos")]public List<string> Photos = null;}WebRequest request;ImageList imageList;int imageListIndex = 0;public ImageBrowserPage(){InitializeComponent();// Get list of stock photos.Uri uri = new Uri("https://developer.xamarin.com/demo/stock.json");request = WebRequest.Create(uri);request.BeginGetResponse(WebRequestCallback, null);}void WebRequestCallback(IAsyncResult result){Device.BeginInvokeOnMainThread(() =>{try{Stream stream = request.EndGetResponse(result).GetResponseStream();// Deserialize the JSON into imageList;var jsonSerializer = new DataContractJsonSerializer(typeof(ImageList));imageList = (ImageList)jsonSerializer.ReadObject(stream);if (imageList.Photos.Count > 0)FetchPhoto();}catch (Exception exc){filenameLabel.Text = exc.Message;}});}void OnPreviousButtonClicked(object sender, EventArgs args){imageListIndex--;FetchPhoto();}void OnNextButtonClicked(object sender, EventArgs args){imageListIndex++;FetchPhoto();}void FetchPhoto(){// Prepare for new image.image.Source = null;string url = imageList.Photos[imageListIndex];// Set the filename.filenameLabel.Text = url.Substring(url.LastIndexOf('/') + 1);// Create the UriImageSource.UriImageSource imageSource = new UriImageSource{Uri = new Uri(url + "?Width=1080"),CacheValidity = TimeSpan.FromDays(30)};// Set the Image source.image.Source = imageSource;// Enable or disable buttons.prevButton.IsEnabled = imageListIndex > 0;nextButton.IsEnabled = imageListIndex < imageList.Photos.Count - 1;}void OnImagePropertyChanged(object sender, PropertyChangedEventArgs args){if (args.PropertyName == "IsLoading"){activityIndicator.IsRunning = ((Image)sender).IsLoading;}}
}

WebRequestCallback方法的整个主体都包含在lambda函数中,该函数是Device.BeginInvokeOnMainThread方法的参数。 WebRequest下载由辅助执行线程中的URI引用的文件。这可以确保操作不会阻止正在处理用户界面的程序的主线程。回调方法也在此辅助线程中执行。但是,可以访问Xamarin.Forms应用程序中的用户界面对象
仅来自主线程。
Device.BeginInvokeOnMainThread方法的目的是解决此问题。此方法的参数排队等待在程序的主线程中运行,并可以安全地访问用户界面对象。
当您单击这两个按钮时,对FetchPhoto的调用使用UriImageSource来下载新位图。这可能需要一秒钟左右。 Image类定义一个名为IsLoading的Boolean属性,当Image处于加载(或下载)位图的过程中时,该属性为true。 IsLoading由可绑定属性IsLoadingProperty支持。这也意味着每当IsLoading更改值时,都会触发PropertyChanged事件。该程序使用PropertyChanged事件处理程序 - 类的最底部的OnImagePropertyChanged方法 - 将ActivityIndi​​cator的IsRunning prop.erty设置为与Image的IsLoading属性相同的值。
您将在第16章“数据绑定”中看到,您的应用程序如何链接IsLoading和IsRunning等属性,以便它们在没有任何显式事件处理程序的情况下保持相同的值。
这是ImageBrowser的实际应用:

某些图像设置了EXIF方向标志,如果特定平台忽略该标志,则图像会侧向显示。
如果以横向模式运行此程序,您将发现按钮消失。 这个程序的更好的布局选项是Grid,第17章对此进行了演示。

第十三章:位图(五)相关推荐

  1. 第五——十三章的作业

    第五章 1.团队模式和团队的开发模式有什么关系? 答:团队模式指团队的分工模式,团队内部的结构,团队开发模式指团队开发的流程及步骤 2.如果你领头开展一个全新的项目,你要怎么选择"合适&qu ...

  2. 【正点原子STM32连载】第五十三章 DSP测试实验 摘自【正点原子】MiniPro STM32H750 开发指南_V1.1

    1)实验平台:正点原子MiniPro H750开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=677017430560 3)全套实验源码+手册+视频 ...

  3. 第十三章 使用动态SQL(五)

    文章目录 第十三章 使用动态SQL(五) 从结果集中返回特定的值 %Print()方法 %GetRow()和%GetRows()方法 rset.name属性 第十三章 使用动态SQL(五) 从结果集中 ...

  4. 吴恩达机器学习训练秘籍整理三十三到三十五章(五)

    第三十三章 为何与人类表现水平进行对比: 许多机器学习系统的设计目的是想要自动化一些人类可以处理得很好的事情,可举的例子有图像识别.语音识别以及垃圾邮件分类等等.此外,有许多理由表明在处理人类擅长的任 ...

  5. 实验5-9 使用函数输出水仙花数_正点原子STM32F407探索者开发板资料连载第五十三章 手写识别实验

    1)实验平台:alientek 阿波罗 STM32F767 开发板 2)摘自<STM32F7 开发指南(HAL 库版)>关注官方微信号公众号,获取更多资料:正点原子 第五十三章 手写识别实 ...

  6. 【正点原子Linux连载】第五十三章 异步通知实验 -摘自【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.0

    1)实验平台:正点原子阿尔法Linux开发板 2)平台购买地址:https://item.taobao.com/item.htm?id=603672744434 2)全套实验源码+手册+视频下载地址: ...

  7. [转]Windows Shell 编程 第十三章 【来源:http://blog.csdn.net/wangqiulin123456/article/details/7988004】...

    第十三章 Windows脚本环境 现在的许多开发人员以前都是在MS-DOS环境下编程的.几乎所有人都接触过批处理文件--一种基于文本命令的文件.这种文件使你能够在一个可执行命令中组合多个指令.批处理文 ...

  8. stm32 ucosii消息队列 串口_正点原子STM32F407探索者开发板资料连载第六十三章 UCOSII 实验...

    1)实验平台:alientek 阿波罗 STM32F767 开发板 2)摘自<STM32F7 开发指南(HAL 库版)>关注官方微信号公众号,获取更多资料:正点原子 http://weix ...

  9. 第十三章 Perl的面向对象编程

    第十三章 Perl的面向对象编程 by flamephoenix 一.模块简介 二.Perl中的类 三.创建类 四.构造函数 实例变量 五.方法 六.方法的输出 七.方法的调用 八.重载 九.析构函数 ...

  10. 《构建之法》第十三章学习总结

    第十三章的内容是关于各种测试方法和测试的设计方法. 一个软件开发团队统一思想首先要从基本名词解释开始,第一节为我们解释了一些基本名词并进行分类(例:Bug是指软件的缺陷,可以分解为症状(Symptom ...

最新文章

  1. java课程设计 mysql_Java课程设计---安装解压版mysyql
  2. 获取后台集合并遍历_java集合类汇总,终于出总结了,再也不用担心混淆了
  3. 如何理解李飞飞价值十亿美金的“人文AI”计划 ?
  4. 【37.50%】【codeforces 745B】Hongcow Solves A Puzzle
  5. nyist 一笔画问题
  6. GridSearchCV和RandomizedSearchCV调参
  7. Facebook有1万名员工在研发AR/VR设备 占员工总数近1/5
  8. 一维二维_更高效的一维、二维材料过渡态搜索
  9. ConTeXt 标题前后的空白
  10. php laravel 优点,Laravel 特点有哪些?
  11. UIScrollView 滚动视图 (实例)
  12. FPGA 常用存储器比较
  13. 过年不回家,压岁钱、份子钱省下来了吗?
  14. 动态加载网上或者本地场景的后续
  15. ElementUI table的行高设置
  16. 35岁以上的IT人士如果有一天被公司裁员了,该怎么办?
  17. 41 岁蚂蚁金服总裁助理去世; 华为首款 5G 手机欧洲上市;库克首谈 5G iPhone | 极客头条...
  18. 3、简单了解Angular应用的启动过程
  19. 小D课堂 - 新版本微服务springcloud+Docker教程_3-05 服务注册和发现Eureka Server搭建实战...
  20. mysql删除密码代码_mysql 用户新建、受权、删除。密码修改

热门文章

  1. sql,插入最大值加1
  2. C#枚举数值与名称的转换
  3. 关于团队发展的若干想法(欢迎讨论)
  4. 机器人学习--智能移动机器人的有关技术演讲(浙大-熊蓉教授-2021年)
  5. Android studio | Unused import statement
  6. java中定义类头的修饰符,JAVA中定义类头时能使用的修饰符是什么
  7. python怎么限制输出精度_谈谈关于Python里面小数点精度控制的问题
  8. 怎么将多个html组合_技巧分享之在HTML元素中添加逼真阴影的教程
  9. python爬虫bilibili_Python爬虫 bilibili视频弹幕提取过程详解
  10. 基于倒谱法、自相关法、短时幅度差法的基音频率估计算法(MATLAB及验证)