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#语言中所介绍的,文件选取器是应用与系统进行交互的一个接口,通过文件选取器可以在应用中直接与文件系统进行交互,访问不同位置的文件或文件夹,或者将文件存储在指定位置.文件选取器分为对文件进 ...
随机推荐
- MySQL新建用户,授权,删除用户,修改密码
首先要声明一下:一般情况下,修改MySQL密码,授权,是需要有mysql里的root权限的.注:本操作是在WIN命令提示符下,phpMyAdmin同样适用. 用户:phplamp 用户数据库: ...
- 参考:鼠标点击事件(Selenium)
1.鼠标右键点击操作:Actions action = new Actions(driver) ;action.contextClick(driver.findElement(By.xpath(xpa ...
- Learning by doing
Learning by doing 绪论:读了娄老师的公众号中--<做中学(Learning By Doing)>这篇文章后,深有感触,我想到很多自己之前的事情,很多都是每每想的很好,总是 ...
- HDFS体系架构
Master-slaver结构,namenode是中心服务器维护着文件系统树和整个树内的文件目录, 负责整个数据集群的管理.datanode分布在不同的机架上,在客户端和namenode的调度下 存储 ...
- XMPP环境搭建
搭建XMPP环境需要几个辅助工具 1.XAMPP XAMPP(Apache+MySQL+PHP+PERL)是一个功能强大的建 XAMPP 软件站集成软件包. 许多人通过他们自己的经验认 ...
- 微信小程序-视图数据绑定
数据绑定 在逻辑层设置数据例如: Page({ data: { message: 'Hello MINA!' } })//设置了一个属性,名称是message 值为Hello MINA! 在视图显示数 ...
- LBWE更新模式切换问题:缓存清理
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...
- matlab basic operation command
Matlab basic operation: >> 5+6 ans = 11 >> 3*4 ans = 12 >> 2^6 ans = 64 >> 1 ...
- pyqt官方示例
文件夹 PATH 列表 卷序列号为 00000058 F027:7BEC C:. ├─activeqt │ └─webbrowser │ ├─icons │ └─pycache ├─animation ...
- M2事后分析报告
设想和目标 1.我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描述? 这次M2预想的就是解决3个主要问题,1:增加查询自己购买或者发布记录的功能,2:优化 所有的网络连接 ...