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#语言中所介绍的,文件选取器是应用与系统进行交互的一个接口,通过文件选取器可以在应用中直接与文件系统进行交互,访问不同位置的文件或文件夹,或者将文件存储在指定位置.文件选取器分为对文件进 ...
随机推荐
- 让你的PHP程序真正的实现多线程(PHP多线程类)
通过WEB服务器来实现PHP多线程功能. 当然,对多线程有深入理解的人都知道通过WEB服务器实现的多线程只能模仿多线程的一些效果,并不是真正意义上的多线程. 但不管怎么样,它还是能满足我们的一些需要的 ...
- AndroidManifest.xml详解(下)
本文编辑整理自:http://blog.163.com/hero_213/blog/static/39891214201242835410742/ 八.第三层<activity-alias> ...
- .net平台下获取高精度时间类
原文:http://www.it118.org/specials/321869dd-98cb-431b-b6d2-82d973cd739d/d940a15c-0d36-4369-8de0-b07cf3 ...
- [poj2411] Mondriaan's Dream (状压DP)
状压DP Description Squares and rectangles fascinated the famous Dutch painter Piet Mondriaan. One nigh ...
- Python虚拟开发环境
最近,一直在不同版本的Python之间来回折腾,发现了几个Python虚拟开发环境工具,具体如下: 1. Virtualenv,可以指定开发环境的Python版本.继承已有开发环境配置,virtual ...
- pandas处理数据
读文件 pd.read_csv('path/to/file.txt',header=0,names='ab',index=0) names Columns这个可以不写,制定索引列是第一列,这样就没有序 ...
- My Sql 中要Alter Table的同学请注意!!!
首先我建议你在对MySQL表做DDL操作时: 1 执行 show processlist 查看,要操作的表(数据库对象)是否处于锁状态 if("未锁定") { 执行DDL语句 }e ...
- TOEFL备考计划
一.总则: 1.坚持每一天,充分利用一切可以利用的时间学英语.没有持之以恒的学习和大量的时将做保障,一切都是空谈. 2.每天听写一篇文章,以此文章为中心,展开一天的学习. OG, TOP 3.听说读写 ...
- Win10无法安装提示磁盘布局不受UEFI固件支持怎样解决
微软在推出Win10系统以后,就向Win7和Win8.1系统用户提供了免费升级Win10系统的推送,但是用户在安装Win10系统的时候,却有一部分用户反映,遇到提示“无法安装Windows,因为这台电 ...
- Android获取网络图片
/** * * 访问网络的操作,必须放在工作线程中完成 * */ public class MainActivity extends Activity { static List<HashMap ...