Windows Store App Image开发示例
通过上面的介绍,读者已经了解了Image对象及ImageBrush对象的使用方法和常用属性,在实际的开发工作中,比较常用的是Image对象,下面以一个幼儿园识物识字卡应用为例,来帮助读者更好的理解Image对象、ImageBrush对象的使用方法。在本示例中,可以实现随机将若干图片以任意角度摆放在应用界面的任意位置上。同时在这个示例中还会介绍与图片手势操作相关的内容,通过对图片的手势操作可以实现图片的拖动、缩放和旋转效果。
启动Visual Studio 2012,新建一个Windows应用商店的空白应用程序项目,将其命名为GeneralCard,在解决方案资源管理器中新建一个名为Pictures的文件夹,向文件夹中添加一张背景图片和三张准备摆放在界面上的幼儿园识物识字卡图片。
打开MainPage.xaml文件,去除Grid元素自带的背景样式并添加一个<Grid.Background>标签,接着定义一个ImageBrush画刷,设置ImageBrush的ImageSource属性为背景图片的相对路径,这样就完成了背景图片的设置。同时添加一个TextBlock控件用来显示一行文字“幼儿园识物识字卡”,最后在Grid元素中添加一个用来存放显示图片的Canvas控件,并命名为“myCanvas”, 以便在后台代码中通过该名称来引用这个Canvas实例。代码如下所示:
<Grid>
<Grid.Background>
<ImageBrush ImageSource="Pictures/background.jpg"/>
</Grid.Background>
<TextBlock HorizontalAlignment="Left" Margin="47,40,0,0" TextWrapping="Wrap" Text="幼儿园识物识字卡" VerticalAlignment="Top" Height="89" Width="712" FontSize="48"/>
<Canvas x:Name="myCanvas"/>
</Grid>
前台界面设计完成后,打开MainPage.xaml.cs文件编写后台代码。编写代码前,首先介绍一下本示例中用到的类和属性:
q Border类,可以为其他对象设置边框和背景,Border类除了可以设置代表外观样式的属性外,还有RenderTransform属性,这个属性可以设置影响当前UI元素位置变化的信息。
q CompositeTransform类,CompositeTransform类可以向界面元素应用多种转换操作,如摆放角度、位置等。
q Random类,随机数生成器,可以生成需要的随机数。
接下来介绍如何使用后台代码向前台展示图片并对图片添加转换操作。MainPage构造方法的代码如下所示:
public MainPage()
{
this.InitializeComponent();
//存放Image对象的集合
List<Image> images = new List<Image>();
//创建Image对象
Image image = new Image();
image.Source = new BitmapImage(new Uri("ms-appx:///Pictures/bread.jpg"));
images.Add(image);
image = new Image();
image.Source = new BitmapImage(new Uri("ms-appx:///Pictures/apple.jpg"));
images.Add(image);
image = new Image();
image.Source = new BitmapImage(new Uri("ms-appx:///Pictures/meat.jpg"));
images.Add(image);
//随机数生成器
Random random = new Random();
//遍历images集合将图片显示在前台界面
foreach (Image img in images)
{
Border border = new Border();
CompositeTransform compositeTransform = new CompositeTransform();
//设置填充规则
img.Stretch = Stretch.Fill;
img.ManipulationMode = ManipulationModes.All;
//设置转换对象的属性
compositeTransform.Rotation = (double)random.Next();
compositeTransform.TranslateX = (double)random.Next(300, 800);
compositeTransform.TranslateY = (double)random.Next(200, 400);
//设置Border对象的位置变换信息
border.RenderTransform = compositeTransform;
//设置border的边框的颜色
border.BorderBrush = new SolidColorBrush(Colors.Orange);
//设置边框的粗细
border.BorderThickness = new Thickness(3);
border.Width = 200;
border.Height = 150;
//将img对象添加到border的Child属性中
border.Child = img;
//为border的ManipulationDelta事件添加处理方法
border.ManipulationDelta +=Border_ManipulationDelta;
//将border添加到myCanvas控件中
myCanvas.Children.Add(border);
}
}
上面的代码首先创建一个存放Image类对象的列表集合images。接着将图片的路径作为参数初始化一个Uri类的对象,然后将Uri类的对象作为参数获得BitmapImage类的对象,并赋值给Image类对象的Source属性,使用image对象的Add方法将图片添加到images集合中。依照上面的操作共添加三张图片。紧接着实例化一个Random类的对象random,用来生成随机数。
在images集合中添加完图片资源后,接下来遍历这个集合中的每一个Image类型的对象,把每一张图片都放在一个Border元素中,再将这个Border添加到之前定义好的Canvas画布中。在foreach循环中首先实例化一个Border类的对象border和CompositeTransform类的对象compositeTransform,接着分别设置如下属性:
q img对象的Stretch属性,设置图片在Border元素中的填充方式为Fill。
q ManipulationMode属性,设置界面元素的交互行为的可操作类型为All。
q compositeTransform对象的Rotation、TranslateX和TranslateY属性,用之前定义的随机数对象random的Next(int minValue, int maxValue)返回一个介于minValue与 maxValue之间的随机数,分别给这三个属性赋值。
q border对象的RenderTransform,将设置好的compositeTransform对象赋值给border对象的RenderTransform属性,这样就实现了border元素位置的随机摆放。
q border对象的BorderBrush属性,设置border对象的边框颜色,这里通过新建一个单色画刷类对象来对其进行赋值。
q border对象的BorderThickness,设置border对象的边框粗细。
q border对象的Width和Height属性,设置控件的大小。
属性设置完成之后,将img对象赋给border对象的Child属性,通过Canvas对象的Children属性的Add方法将设置好的border对象添加到Canvas画布中。
将图片资源添加到前台界面后,接下来实现border对象的ManipulationDelta事件处理方法Border_ManipulationDelta(),对图片进行拖动、缩放和旋转等操作时执行这个事件处理方法,代码如下所示:
void Border_ManipulationDelta(object sender, ManipulationDeltaRoutedEventArgs e)
{
CompositeTransform imageTransform = (CompositeTransform)((Border)sender).RenderTransform;
//设置图片的坐标位置
imageTransform.Rotation += e.Delta.Rotation;
imageTransform.TranslateX += e.Delta.Translation.X;
imageTransform.TranslateY += e.Delta.Translation.Y;
//设置图片的缩放比例
imageTransform.ScaleX *= e.Delta.Scale;
imageTransform.ScaleY *= e.Delta.Scale;
}
在上面的代码中,ManipulationDeltaRoutedEventArgs类型的参数e会为ManipulationDelta事件提供图像位置变化的相关数据,再将这些数据分别赋给对象的相应属性即可实现拖动、缩放和旋转等操作。首先将参数sender转换为Border类型的对象,将此对象的RenderTransform属性强制转换成CompositeTransform类型,并赋值给imageTransform对象。之后在imageTransform对象的Rotation属性的基础上添加角度变化的值e.Delta.Rotation,设置界面元素的旋转角度。同理根据e.Delta.Translation.X属性和e.Delta.Translation.Y属性设置界面元素移动后的位置。最后根据e.Delta.Scale属性设置界面元素的缩放比例。
启动调试,运行效果如图9-5所示,用户可以将图片摆放在应用界面的任意位置上,而且可以通过手势进行拖动、缩放等交互操作。
图9-5 运行效果图
通过以上内容的讲解,读者已经对Windows应用商店应用中的图像元素有了一定的了解,下面将介绍多媒体元素中的音频和视频元素实现方法。
Windows Store App Image开发示例的更多相关文章
- Windows Store App JavaScript 开发:小球运动示例
通过前面内容的学习,相信读者已经对开发基于JavaScript的Windows应用商店应用有了一定的了解,本小节通过一个小球运动的示例来介绍如何新建一个JavaScript的Windows应用商店项目 ...
- Windows Store App JavaScript 开发:获取文件和文件夹列表
在应用程序中有时可能需要获取用户库中的内容,以便执行相关的操作.如果要获取某个用户库中的内容,需要先获取到这个用户库,获得用户库可以通过Windows.Storage命名空间中的KnownFolder ...
- Windows Store App JavaScript 开发:选取文件和文件夹
前面提到过,文件打开选取器由FileOpenPicker类表示,用于选取或打开文件,而文件夹选取器由FolderPicker类表示,用来选取文件夹.在FileOpenPicker类中,pickSing ...
- Windows Store App JavaScript 开发:模板绑定
WinJS库模板提供了一种格式化显示多条数据的便捷方式,通过这种方式可以将模板与ListView或FlipView等控件结合使用以控制数据的显示格式.定义一个WinJS库模板的方法与定义WinJS库控 ...
- Windows Store App JavaScript 开发:简单对象绑定
简单对象绑定是一种基本的绑定类型,可以实现将一个对象中的数据绑定到HTML元素的属性.下面通过一个示例来演示如何使用HTML5和JavaScript开发一个实现简单对象绑定的Windows应用商店应用 ...
- Windows Store App JavaScript 开发:页内导航
页内导航是在一个页面内根据需要加载其他页面的内容,在开发基于JavaScript的Windows应用商店应用时,可以使用WinJS.Navigation.navigate函数传递要加载的页面地址并使用 ...
- Windows Store App JavaScript 开发:页面加载
在开发基于JavaScript的Windows应用商店应用时,可以使用HtmlControl和PageControl控件加载一个页面,这两个WinJS库控件曾在上面的内容中提到过,HtmlCont ...
- Windows Store App JavaScript 开发:WinJS库控件
在介绍了如何使用标准的HTML控件以及WinJS库中提供的新控件之后,下面来着重介绍WinJS库中几种常用的控件. (1)ListView控件 在开发Windows应用商店应用时可以使用ListVie ...
- Windows Store App JavaScript 开发:文件选取器
正如前面章节C#语言中所介绍的,文件选取器是应用与系统进行交互的一个接口,通过文件选取器可以在应用中直接与文件系统进行交互,访问不同位置的文件或文件夹,或者将文件存储在指定位置.文件选取器分为对文件进 ...
随机推荐
- SQLServer控制用户访问权限表
连接地址:http://www.cnblogs.com/yxyht/archive/2013/03/22/2975880.html 一.需求 在管理数据库过程中,我们经常需要控制某个用户访问数据库的权 ...
- Cenots7编译Opencv3.1错误:下载ippicv,解决方案
在centos7上安装Opencv的时候,停在了下载ippicv的地方,一直都下载不下来. ippicv是一个并行计算库,其实可以不用的. 如果不想用这个并行计算库,在做Cmake的时候用参数关闭即可 ...
- async和await
总结下博客园中看到的async和await public static class TaskAsyncHelper { /// <summary> /// 将一个方法function异步运 ...
- Ubuntu上Docker安装Trouble Shooting
(我的环境是Mint7.1,相当于Ubuntu14.04) 1,首先,根据docker.com上的安装指导来安装docker,这里就不重复了,参考: https://docs.docker.com/i ...
- tomcat7+jdk1.8一键安装脚本
#!/bin/bash #--------------------------------------------------------------------- # # Author : 大象无形 ...
- phpstrom正则替换
- TCP/IP详解学习笔记
TCP/IP详解学习笔记(1)-基本概念 TCP/IP详解学习笔记(2)-数据链路层 TCP/IP详解学习笔记(3)-IP协议,ARP协议,RARP协议 TCP/IP详解学习笔记(4)-ICMP协议, ...
- eclipse最有用快捷键整理
在网上搜eclipse快捷键,可以搜出一大堆,大多罗列了n多的快捷键,估计大部分人看了以后都会头大的,我也头大,不过我一一尝试了一遍,整理出了eclipse最常用最有用,写代码必须用到的一些快捷键,大 ...
- in_array,array_search的使用
写一个数组里面有小写a-z 大写A-Z 以及数字,把相似的数字和字母都剔除 无论大小写:将括号内的数字剔除(0,o,2,Z,1,i) $arr1 = range("a", ...
- 在myeclipse下安装svn的几种方式
方法一:在线安装 1.打开HELP->MyEclipse Configuration Center.切换到SoftWare标签页. 2.点击Add Site 打开对话框,在对话框Name输入Sv ...