<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
  version="2.0">
  <channel>
    <title>Windows Store apps development support</title>
    <atom:link
      href="https://docs.microsoft.com/archive/blogs/win8devsupport/feed.xml"
      rel="self"
      type="application/rss+xml" />
    <link>https://docs.microsoft.com/archive/blogs/win8devsupport/feed.xml</link>
    <description>Epicenter of creative ideas, common tips, best practice for Windows Store app. This blog has been archived and retired. Please visit http://blogs.msdn.com/b/windows8devsupport/ to check update.</description>
    <lastBuildDate>Wed, 17 Apr 2019 03:39:58 GMT</lastBuildDate>
    <language>en-US</language>
    <sy:updatePeriod>hourly</sy:updatePeriod>
    <sy:updateFrequency>1</sy:updateFrequency>
    <item>
      <title>音频与视频-windows store app 与windows phone 8的异同</title>
      <link>https://docs.microsoft.com/archive/blogs/win8devsupport/windows-store-app-windows-phone-8</link>
      <pubDate>Mon, 03 Mar 2014 18:50:05 GMT</pubDate>
      <dc:creator><![CDATA[Robin_Yang]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/win8devsupport/2014/03/03/windows-store-app-windows-phone-8/</guid>
      <description><![CDATA[众所周知，随着Windows 8与Windows phone...]]></description>
      <content:encoded><![CDATA[<p>众所周知，随着Windows 8与Windows phone 8的发布，其给我们带来了比以往任何时候都要紧密相似的两个平台。虽然它们非常的相似，但是在数字音频和视频的实现和技术上也存在相当大的区别。希望这篇博客能帮助您认知和理解这两个平台在媒体技术上的差别。在您看这篇博客之前，我假设您已经熟悉windows 8或者windows phone 8其中的任何一个与媒体相关的技术知识，虽然您对另一个平台不甚了解，但您仅仅需要一些相关的知识便可以将媒体技术从一个平台迁徙到另一个平台。</p>
<p align="left"><strong>音频/视频的相关播放技术</strong></p>
<table border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td colspan="2" valign="top" width="935">
<p align="center"><strong>Audio / Video Playback &ndash; Technology Map</strong></p>
</td>
</tr>
<tr>
<td valign="top" width="468">
<p align="center"><strong>Windows Store</strong></p>
</td>
<td valign="top" width="468">
<p align="center"><strong>Windows Phone 8</strong></p>
</td>
</tr>
<tr>
<td valign="top" width="468">
<p align="left">MediaElement<br />&nbsp; (XAML)</p>
<p align="left">&nbsp;</p>
</td>
<td valign="top" width="468">
<p align="left">MediaElement<br />&nbsp; (XAML)</p>
</td>
</tr>
<tr>
<td valign="top" width="468">
<p align="left">IMFMediaEngine<br />&nbsp; (C++ only)</p>
</td>
<td valign="top" width="468">
<p align="left">IMFMediaEngine<br />&nbsp; (C++ only) (Subset)</p>
<p align="left">&nbsp;</p>
</td>
</tr>
<tr>
<td valign="top" width="468">
<p align="left">WASAPI<br />&nbsp; (C++ only)</p>
</td>
<td valign="top" width="468">
<p align="left">WASAPI<br />&nbsp; (C++ only) (Subset)</p>
<p align="left">&nbsp;</p>
</td>
</tr>
<tr>
<td valign="top" width="468">
<p align="left">XAudio2<br />&nbsp; (C++ only)</p>
</td>
<td valign="top" width="468">
<p align="left">XAudio2<br />&nbsp; (C++ only)</p>
<p align="left">&nbsp;</p>
</td>
</tr>
</tbody>
</table>
<p>MeidaElement 控件能同时在这两个平台是播放音频和视频，但是关于MeidaElement，他们之间也存在一些差异，比如说windows phone 8中，你不能向MeidaElement添加任何的音频和视频效果（如插件）。且在DRM的实现上这两者之间也存在差异。如果你在实现MeidaElement播放音频/视频的时候不做任何花哨或者复杂的处理，那么MeidaElement在这两个平台是可以相互兼容的。</p>
<p>MediaEngine（与上述讨论的MeidaElement 有所不同）是windows 8与Windows phone 8中新的特征，但是MediaEngine只能在C++项目中使用，目前它并不支持托管代码。而且在windows phone 8中该MediaEngine功能与windows 8相比略有减少。比如说在windows phone 8种，MediaEngine仅支持帧服务器模式。此外请记住一点，在windows phone 8中，硬件加速会经常被使用到。</p>
<p>WASAPI 与XAudio2都能在这两个平台使用，但是这些技术仅仅能被C++项目所调用，到目前为止它们并不被托管代码所支持。虽然有关于XAudio2的全部功能都能在这两个平台使用，但是需要注意的一点是在windows phone 8平台，XAudio2仅支持未被压缩的PCM音频。如果想要XAudio2能在Windows phone 8中支持已压缩的PCM音频是非常困难的，因此在Windows phone中，仅仅只能使用WASAPI核心音频API的一部分。</p>
<table border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td colspan="2" valign="top" width="935">
<p align="center"><strong>References</strong></p>
</td>
</tr>
<tr>
<td valign="top" width="423">
<p align="center"><strong>Windows Store app</strong></p>
</td>
<td valign="top" width="513">
<p align="center"><strong>Windows Phone 8 app</strong></p>
</td>
</tr>
<tr>
<td valign="top" width="423">
<p align="left"><a href="http://msdn.microsoft.com/en-us/library/windows/apps/hh452756.aspx">Win32 and COM for Windows Store apps<br />&nbsp; (multimedia)</a></p>
</td>
<td valign="top" width="513">
<p align="left"><a href="http://msdn.microsoft.com/en-us/library/windowsphone/develop/jj206944(v=vs.105).aspx">Native audio APIs for Windows Phone 8</a>&nbsp;</p>
<p align="left">&nbsp;</p>
</td>
</tr>
<tr>
<td valign="top" width="423">
<p align="left"><a href="http://msdn.microsoft.com/en-us/library/windows/desktop/hh447918(v=vs.85).aspx">IMFMediaEngine interface (Windows)</a></p>
</td>
<td valign="top" width="513">
<p align="left"><a href="http://msdn.microsoft.com/en-us/library/windowsphone/develop/jj681688(v=vs.105).aspx">Supported Microsoft Media Foundation APIs<br />&nbsp; for Windows Phone 8</a></p>
<p align="left">&nbsp;</p>
</td>
</tr>
<tr>
<td valign="top" width="423">
<p align="left"><a href="http://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.controls.mediaelement.aspx">MediaElement class (Windows)</a></p>
</td>
<td valign="top" width="513">
<p align="left"><a href="http://msdn.microsoft.com/en-us/library/windowsphone/develop/system.windows.controls.mediaelement(v=vs.105).aspx">MediaElement Class</a></p>
</td>
</tr>
</tbody>
</table>
<p><strong>背景音频</strong><strong></strong></p>
<p>在windows store app与windows phone 8中播放背景音频的差别是在于windows phone 8中BackgroundAudioPlayer与windows store app中MediaElement与Audio标签的使用方式的不同。 BackgroundAudioPlaye是一个静态的类在使用之前并不需要被实例化，但是MediaElement与Audio标签必须要先定义然后才能使用。</p>
<p>在windows store app你仅仅需要设置MsAudioCategory这个属性等于&rdquo;backgroundCapableMedia&rdquo;就可以播放背景音频，但是在windows phone中，您需要建立一个AudioPlayerAgent，然后使它能在后台运行。</p>
<p>最后需要注意的一点是，你经常需要处理用户在锁定屏幕时对这些媒体控件的输入。在windows phone 8平台，我们需要调用这个控件的&ldquo;Universal Volume Control（UVC）&rdquo;；在windows <br />store app中我们仅需要调用这些媒体控件。虽然在这两个平台实现的技术不同但是基本功能是类似的。&nbsp;</p>
<p>&nbsp;</p>
<table border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td colspan="2" valign="top" width="935">
<p align="center"><strong>References</strong></p>
</td>
</tr>
<tr>
<td valign="top" width="423">
<p align="center"><strong>Windows Store app</strong></p>
</td>
<td valign="top" width="513">
<p align="center"><strong>Windows Phone 8 app</strong></p>
</td>
</tr>
<tr>
<td valign="top" width="423">
<p align="left"><a href="http://msdn.microsoft.com/en-us/library/windows/apps/Hh700367.aspx">How to play audio in the background (Windows<br />&nbsp; Store apps using JavaScript and HTML)</a></p>
</td>
<td valign="top" width="513">
<p align="left"><a href="http://msdn.microsoft.com/en-us/library/windowsphone/develop/hh394039(v=vs.105).aspx">Background audio overview for Windows Phone</a></p>
<p align="left">&nbsp;</p>
</td>
</tr>
</tbody>
</table>
<p align="left"><strong>媒体分享</strong></p>
<table border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td colspan="2" valign="top" width="935">
<p align="center"><strong>Sharing Media &ndash; Technology Map</strong></p>
</td>
</tr>
<tr>
<td valign="top" width="468">
<p align="center"><strong>Windows Store (XAML / HTML5)</strong></p>
</td>
<td valign="top" width="468">
<p align="center"><strong>Windows Phone 8 (XAML)</strong></p>
</td>
</tr>
<tr>
<td valign="top" width="468">
<p align="left">DataTransferManager<br />&nbsp; class</p>
</td>
<td valign="top" width="468">
<p align="left">ShareMediaTask<br />&nbsp; Class</p>
<p align="left">&nbsp;</p>
</td>
</tr>
</tbody>
</table>
<p align="left">关于媒体分享，Windows store app与windows phone最大的区别在于在Windows store app中是通过share charm来进行分享，而在windows phone 8种您需要在您的代码中调用ShareMediaTask</p>
<p align="left">在上述两种方式中您可能不能确认您的数据有没有被成功的分享，因为本质上分享是一种&ldquo;被触发和被遗忘&rdquo;的过程。</p>
<p align="left">还需要记住一点是，当你的共享应用程序占据了整个屏幕时，您的Windows phone 8 app有可能会被挂起甚至会被关闭，所以您应保存该程序的运行状态和数据。</p>
<table border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td colspan="2" valign="top" width="935">
<p align="center"><strong>References</strong></p>
</td>
</tr>
<tr>
<td valign="top" width="423">
<p align="center"><strong>Windows Store app</strong></p>
</td>
<td valign="top" width="513">
<p align="center"><strong>Windows Phone 8 app</strong></p>
</td>
</tr>
<tr>
<td valign="top" width="423">
<p align="left"><a href="http://msdn.microsoft.com/en-us/library/windows/apps/Hh758314.aspx">Sharing and receiving content (Windows Store<br />&nbsp; apps using JavaScript and HTML) (Windows)</a></p>
</td>
<td valign="top" width="513">
<p align="left"><a href="http://msdn.microsoft.com/en-us/library/windowsphone/develop/jj207027(v=vs.105).aspx">How to use the share media task for Windows<br />&nbsp; Phone</a></p>
<p align="left">&nbsp;</p>
<p align="left">&nbsp;</p>
</td>
</tr>
</tbody>
</table>]]></content:encoded>
    </item>
    <item>
      <title>Windows Store App设计时数据的应用</title>
      <link>https://docs.microsoft.com/archive/blogs/win8devsupport/windows-store-app</link>
      <pubDate>Thu, 27 Feb 2014 18:56:52 GMT</pubDate>
      <dc:creator><![CDATA[Robin_Yang]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/win8devsupport/2014/02/27/windows-store-app/</guid>
      <description><![CDATA[想象这么一个场景：我们在做开发的时候写了一个GirdView并且对GridView的DataTemplate做了布局以及绑定，于是VS设计器中出现了一个框，但是开发人员并不能很好的预料到如果数据填充进...]]></description>
      <content:encoded><![CDATA[<p>想象这么一个场景：我们在做开发的时候写了一个GirdView并且对GridView的DataTemplate做了布局以及绑定，于是VS设计器中出现了一个框，但是开发人员并不能很好的预料到如果数据填充进去会有什么样的结果，举个例子来说可能长度或者高度设计的不够，导致某个远程图片被缩放变形，同时后期修改会产生大量的项目延迟。</p>
<p>这个时候我们需要使用VS来显示一些设计时数据。</p>
<h4>情况一，数据源为本地数据</h4>
<p>这种情况是最好的，绑定完成之后debug就可以看到数据显示是否符合需求，稍作修改便可。请参考<a href="http://msdn.microsoft.com/zh-cn/library/windows/apps/hh758322.aspx">如何绑定到分层数据并创建主视图/详细信息视图</a>。</p>
<h4>情况二，数据源为远程数据</h4>
<p>当然你可以使用本地数据作为测试，下面这段代码可以在测试时帮助调用一些本地的测试数据</p>
<p>Fake Date</p>
<p>if (Windows.ApplicationModel.DesignMode.DesignModeEnabled)</p>
<p>{&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp; GetSampleData();</p>
<p>}</p>
<p>else GetRealData();</p>
<p>同样的，这种方式也仅仅只能在Debug下才能看到数据显示是否正确，如果想在设计时看到数据，那么我们需要其他的一些代码。</p>
<h4>情况三，设计时显示测试数据</h4>
<p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/55/98/4403.1.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-55-98/4403.1.png"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/55/98/4403.1.png" original-url="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-55-98/4403.1.png" alt="" border="0" /></a><br />&nbsp;<br />上图所示就是在设计时候显示的数据，而作为对比，下图为运行时数据</p>
<p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/55/98/4667.2.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-55-98/4667.2.png"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/55/98/4667.2.png" original-url="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-55-98/4667.2.png" alt="" border="0" /></a></p>
<p>我们需要做的就是</p>
<p>Step1， 定义设计时所需要的数据，我这里创建了一个叫DesignTimeDataCenter的类专门用于放置测试数据</p>
<p>Step2，完善绑定，在此声明下，具有 <strong>d:</strong> 前缀的属性仅在设计时被解释，而在运行时被忽略。所以绑定的属性可以用d:Source 来实现。</p>
<p>Step3，修改排版，让界面看起来更完美。</p>
<p>具体的代码我贴一部分在这里，其他的大家可以在我的SkyDrive上下载，地址为：<a href="http://1drv.ms/1cwIj2c">http://1drv.ms/1cwIj2c</a></p>
<p><strong>MainPage.XAML</strong><strong>文件</strong>：</p>
<p>&lt;Page&nbsp; x:Class="DesignTimeData.MainPage"</p>
<p>&nbsp;&nbsp;&nbsp;xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"</p>
<p>&nbsp;&nbsp;&nbsp;xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"</p>
<p>&nbsp;&nbsp;&nbsp;xmlns:local="using:DesignTimeData"&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;xmlns:d="http://schemas.microsoft.com/expression/blend/2008"</p>
<p>&nbsp;&nbsp;&nbsp;xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"</p>
<p>&nbsp;&nbsp;&nbsp; DataContext="{Binding RelativeSource={RelativeSource Self}}"</p>
<p>&nbsp;&nbsp;&nbsp; d:DataContext="{Binding Source={d:DesignInstance Type=local:DesignTimeDataCenter, IsDesignTimeCreatable=True}}"</p>
<p>&nbsp;&nbsp;&nbsp; mc:Ignorable="d"&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; &lt;Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;GridView ItemsSource="{Binding News}"&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;GridView.ItemTemplate&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;DataTemplate&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;StackPanel Orientation="Horizontal" HorizontalAlignment="Left" Width="500"&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Image Height="100" Margin="10" Source="{Binding Image}"/&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;TextBlock Margin="10" FontSize="25" Text="{Binding Desc}"/&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&lt;/StackPanel&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/DataTemplate&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/GridView.ItemTemplate&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/GridView&gt;</p>
<p>&nbsp;&nbsp;&nbsp; &lt;/Grid&gt;</p>
<p>&lt;/Page&gt;</p>
<p><strong>MainPage.cs</strong></p>
<p>public sealed partial class MainPage : Page</p>
<p>&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public List&lt;RealRecord&gt; News {get; set; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public MainPage()</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.InitializeComponent();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; News = LoadNews();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; List&lt;RealRecord&gt; LoadNews()</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return new List&lt;RealRecord&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new RealRecord {Desc = "Nix Colour Sensor", Image = "../Assets/1.jpg"},</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new RealRecord {Desc = "Site of the Week: Rake It Up", Image = "../Assets/2.jpg"},</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new RealRecord {Desc = "First Look: Noah", Image = "../Assets/3.jpg"},</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new RealRecord {Desc = "New + Noted: Anti:dote", Image = "../Assets/4.jpg"},</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; };</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; public class RealRecord</p>
<p>&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public string Desc { get; set; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public string Image { get; set; }</p>
<p>}</p>
<p><strong>DesignTimeData.cs</strong></p>
<p>&nbsp;&nbsp;&nbsp; public class DesignTimeDataCenter</p>
<p>&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public List&lt;TestRecord&gt; News { get; set; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public DesignTimeDataCenter()</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; News = LoadNews();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; List&lt;TestRecord&gt; LoadNews()</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return new List&lt;TestRecord&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new TestRecord {Desc = "Scene &amp; Heard: Guess who, don&rsquo;t boo", Image = "../Assets/0.jpg"},</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new TestRecord {Desc = "Scene &amp; Heard: Guess who, don&rsquo;t boo", Image = "../Assets/0.jpg"},</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new TestRecord {Desc = "Scene &amp; Heard: Guess who, don&rsquo;t boo", Image = "../Assets/0.jpg"},</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new TestRecord {Desc = "Scene &amp; Heard: Guess who, don&rsquo;t boo", Image = "../Assets/0.jpg"},</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; };</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; public class TestRecord</p>
<p>&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public string Desc { get;set; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public string Image {get; set; }</p>
<p>&nbsp;&nbsp;&nbsp; }</p>]]></content:encoded>
    </item>
    <item>
      <title>RenderTargetBitmap 在windows store app 中的应用</title>
      <link>https://docs.microsoft.com/archive/blogs/win8devsupport/rendertargetbitmap-windows-store-app</link>
      <pubDate>Mon, 27 Jan 2014 18:39:00 GMT</pubDate>
      <dc:creator><![CDATA[Robin_Yang]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/win8devsupport/2014/01/27/rendertargetbitmap-windows-store-app/</guid>
      <description><![CDATA[前言
&nbsp;RenderTargetBitmap 是windows 8.1中一个新的类，它可以将任意的UIElement以bitmap的形式呈现。这篇博客的第一部分将介绍如何在windows...]]></description>
      <content:encoded><![CDATA[<p><strong>前言</strong></p>
<p>&nbsp;RenderTargetBitmap 是windows 8.1中一个新的类，它可以将任意的UIElement以bitmap的形式呈现。这篇博客的第一部分将介绍如何在windows 8.1中使用RenderTargetBitmap。第二部分将介绍在windows store app与WPF中RenderTargetBitmap大小调整方式的差异。UIElement以bitmap的形式呈现时，RenderTargetBitmap如何调整原来的UIElement大小对于你的项目来说是一个难题，但幸运的是这篇文章将会提出一个解决方案，使您可以在windows store app中得到与WPF相同的结果。让我们开始这篇博客的介绍吧。</p>
<p><strong>怎么在</strong><strong>windows 8.1</strong><strong>中使用</strong><strong>RenderTargetBitmap</strong></p>
<p>在windows store app，你可以分以下两种情况来使用RenderTargetBitmap</p>
<ol>
<li>将它当成一个ImageSources使用（用一个image-Element来显示或者通过ImageBrush来显示）</li>
<li>使用它的pixels值（比如说将一个bitmap存储到硬盘或者与其他的app进行分享）</li>
</ol>
<p class="ListParagraphCxSpLast">本节只是介绍一些基础的知识，在MSDN的相关文档里面有详尽的描述：</p>
<ul>
<li><a href="http://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.media.imaging.rendertargetbitmap" target="_blank">RenderTargetBitmap-class </a>(这个网站有关于RenderTargetBitmap的详细描述&nbsp;)</li>
<li><a href="http://code.msdn.microsoft.com/windowsapps/XAML-render-to-bitmap-dd4f549f" target="_blank">XAML render to bitmap sample </a>(一个很好的例子，可以学习如何通过ImageSources和pixels来使用RenderTargetBitmap)</li>
</ul>
<p class="ListParagraph">接下来我们来看一个简单的例子以及开始学习如何将一个UIElement以bitmap的方式呈现。</p>
<p><strong>UIElement</strong><strong>的呈现</strong><strong></strong></p>
<p>在接下来的章节中，我们将通过下面的代码来定义一个Grid并将它作为RenderTargetBitmap的输入.在这个Grid中包含一个image和TextBlock控件。由于这个Grid没有定义任何的行或列，所以TextBlock的内容呈现在图片的上方。</p>
<p>&lt;Grid x:Name="elementToRender" Width="500" Height="500"&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Image Source="Assets/image.jpg" Stretch="UniformToFill"/&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;TextBlock Text="This text is on top of the image" FontSize="40" TextWrapping="Wrap" Margin="50"/&gt;</p>
<p>&lt;/Grid&gt;</p>
<p>上段代码的结果如下：</p>
<p>&nbsp;<a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/55/98/2210.1.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-55-98/2210.1.png"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/55/98/2210.1.png" original-url="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-55-98/2210.1.png" alt="" border="0" /></a></p>
<p>需要注意的是在上面代码中，将Grid的名称定义为elementToRender，我们接下来可以在C#代码中通过该名称来访问Grid。现在我们来看看如何使用该Grid来定义一个RenderTargetBitmap。</p>
<p><strong>用</strong><strong>UIElement</strong><strong>来定义一个</strong><strong>RenderTargetBitmap</strong></p>
<p>你可以通过调用RenderAsync这个方法来定义一个RenderTargetBitmap，该方法的输入参数是一个UIElement，下面的代码是通过将名为elementToRender的Grid来作为该方法的输入参数从而来定义一个RenderTargetBitmap对象：</p>
<p>var bitmap = new RenderTargetBitmap();</p>
<p>&nbsp;await bitmap.RenderAsync(elementToRender);</p>
<p>&nbsp;</p>
<p>通过上述两行代码你可以将UIElement以RenderTargetBitmap的方式呈现。现在你可以像前面章节提到的那样可以通过Imagesource的方法使用RenderTargetBitmap或者可以对其Pixel属性进行访问。</p>
<p><strong>以</strong><strong>Imagesource</strong><strong>的方式来使用</strong><strong>RenderTargetBitmap</strong></p>
<p>由于RenderTargetBitmap类继承自ImageSource，所以您可以直接将其赋值到您定义的任何一个Image-Element的Source-Property上。假设你已经定义了这样一个Image-Element：</p>
<p>&lt;Image x:Name="image" Width="200" Height="200".../&gt;</p>
<p>现在你可以直接将该Image-Element的Source-Property赋值为一个RenderTargetBitmap对象，可以参考以下代码：</p>
<p>private async void ButtonRender_Click(object sender, RoutedEventArgs e)</p>
<p>{</p>
<p>&nbsp; var bitmap = new RenderTargetBitmap();</p>
<p>&nbsp; await bitmap.RenderAsync(elementToRender);</p>
<p>&nbsp; image.Source = bitmap;</p>
<p>}</p>
<p><strong>使用</strong><strong>RenderTargetBitmap</strong><strong>的</strong><strong>Pixels</strong><strong>值</strong><strong>：</strong><strong></strong></p>
<p>如果你想访问RenderTargetBitmap的Pixels数据，你需要在用RenderAsync这个方法将UIElement定义为RenderTargetBitmap后，再调用RenderTargetBitmap的GetPixelsAsync方法来获得其Pixels数据。该方法返回的是一个IBuffer类型，里面存储的是二进制的位图数。这个IBuffer可以转换为一个Byte数组，数组里面的数据是以BGRA8格式存储的。</p>
<p>以下代码示例如何从一个RenderTargetBitmap对象中获得以byte数组类型存储的像素数。需要特别注意的是IBuffer实例调用的ToArray方法是一个扩展方法，你需要在您的项目中加入System.Runtime.InteropServices.WindowsRuntime这个命名空间。</p>
<p>var bitmap = new RenderTargetBitmap();</p>
<p>await bitmap.RenderAsync(elementToRender);</p>
<p>&nbsp;</p>
<p>&nbsp; // Get the pixels</p>
<p>&nbsp; IBuffer pixelBuffer = await bitmap.GetPixelsAsync();</p>
<p>&nbsp; byte[] pixels = pixelBuffer.ToArray();</p>
<p>通过获取的Pixels数据，你可以将您的 RenderTargetBitmap里的内容保存到硬盘，你也可以通过Pixels数据来创建一个WriteableBitmap对象，然后对该对象的内容做某些修改，或者您可以通过share-contract来将该bitmap对象分享给其他的app。下面的代码示例如何通过share-contract来分享bitmap对象。其中在DataRequested事件处理程序中先是获得Pixels数据，然后将其转化为InMemoryRandomAccessStream来向其他的app进行数据分享：</p>
<p>&nbsp; public sealed partial class MainPage : Page</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp; ...</p>
<p>&nbsp;&nbsp;&nbsp; protected override void OnNavigatedTo(NavigationEventArgs e)</p>
<p>&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; base.OnNavigatedTo(e);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DataTransferManager.GetForCurrentView().DataRequested+= MainPage_DataRequested;</p>
<p>&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; protected override void OnNavigatedFrom(NavigationEventArgs e)</p>
<p>&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; base.OnNavigatedFrom(e);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DataTransferManager.GetForCurrentView().DataRequested -= MainPage_DataRequested;</p>
<p>&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp; private async void MainPage_DataRequested(DataTransferManager sender, DataRequestedEventArgs args)</p>
<p>&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var deferral = args.Request.GetDeferral();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var bitmap = new RenderTargetBitmap();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; await bitmap.RenderAsync(elementToRender);</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 1. Get the pixels</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IBuffer pixelBuffer = await bitmap.GetPixelsAsync();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; byte[] pixels = pixelBuffer.ToArray();</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 2. Write the pixels to aInMemoryRandomAccessStream</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var stream = new InMemoryRandomAccessStream();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var encoder = await BitmapEncoder.CreateAsync(BitmapEncoder.BmpEncoderId, stream);</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; encoder.SetPixelData(BitmapPixelFormat.Bgra8, BitmapAlphaMode.Straight, (uint)bitmap.PixelWidth, (uint)bitmap.PixelHeight, 96, 96,</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pixels);</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; await encoder.FlushAsync();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; stream.Seek(0);</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 3. Share it</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; args.Request.Data.SetBitmap(RandomAccessStreamReference.CreateFromStream(stream));</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; args.Request.Data.Properties.Description = "RenderTargetBitmap-Sample";</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; args.Request.Data.Properties.Title = "Wow, here the shared Bitmap :-)";</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; deferral.Complete();</p>
<p>&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp; ...</p>
<p>}</p>
<p>需要注意的一点是，调用GetPixelsAsync这个方法需要额外的开销，因为pixels数据是从显存里获取的。如果你仅仅是调用RenderAsync这个方法，并将RenderTargetBitmap赋值为ImageSource，那么pixels数据还是在显存中且并没有从显存中获得。</p>
<p><strong>RenderTargetBitmap</strong><strong>的局限：</strong><strong></strong></p>
<p>如前所述，通过使用 RenderTargetBitmap，你可以将任意的UIElement以bitmap的形式呈现，但并不完全是这样，它还有一些限制。比如说RenderTargetBitmap 不能捕获MediaElement所显示的视频内容, 并且有些存在于可视化树中但不在屏幕内的UIElment你也无法捕获。你可以在MSDN的文档中看到详细的关于RenderTargetBitmap局限性的描述：<a href="http://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.media.imaging.rendertargetbitmap.aspx">http://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.media.imaging.rendertargetbitmap.aspx</a></p>
<p><strong>大小调整的问题以及解决方案：</strong><strong></strong></p>
<p>假如你是WPF的开发者，当你在windows store app中使用RenderTargetBitmap 时，将会发现一些意想不到的问题。本部分会首先提出这些问题然后再提出相应的解决方案。</p>
<p><strong>问题描述</strong><strong></strong></p>
<p>当一个Elememt包含跨越其边界的子元素时，在windows store app中，当该Element转化为RenderTargetBitmap显示时，该RenderTargetBitmap对象的大小会比原来的Element要大。而在WPF中，该RenderTargetBitmap对象大小不会变，但是子元素会被剪裁。下面的示例说明了这个问题。</p>
<p>该例子显示的是一个Grid Element, 通过对子元素transformed属性的定义可以使子元素跨越Grid的边界：</p>
<p>&lt;Grid x:Name="elementToRender" Height="100" Width="500" Background="Red"&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Rectangle Fill="Yellow" Width="100" Height="100"&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Rectangle.RenderTransform&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;TranslateTransform Y="50"/&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/Rectangle.RenderTransform&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/Rectangle&gt;</p>
<p>&nbsp;&lt;/Grid&gt;</p>
<p>输出结果如下，你可以看到黄色的矩形框超出了Grid的边界：</p>
<p>&nbsp;<a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/55/98/0272.2.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-55-98/0272.2.png"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/55/98/0272.2.png" original-url="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-55-98/0272.2.png" alt="" border="0" /></a></p>
<p>在windows store app中，当我们将Grid以RenderTargetBitmap的形式呈现时，该RenderTargetBitmap对象的大小是500&times;150，而原始的Grid大小是500&times;100，下图显示的是该RenderTargetBitmap的大小，其中灰色部分是超出原始Grid的范围，即使我们在转换的时候强制设置RenderTargetBitmap的大小为500&times;100，其结果还是不变，如下所示：</p>
<p>&nbsp;<a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/55/98/4150.3.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-55-98/4150.3.png"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/55/98/4150.3.png" original-url="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-55-98/4150.3.png" alt="" border="0" /></a></p>
<p>在WPF中,该RenderTargetBitmap的大小为500&times;100，与Grid大小一致，但是Grid里面的子元素被剪裁了，其结果如下：</p>
<p>&nbsp;<a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/55/98/1667.4.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-55-98/1667.4.png"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/55/98/1667.4.png" original-url="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-55-98/1667.4.png" alt="" border="0" /></a></p>
<p><strong>对使用</strong><strong>Clip-property</strong><strong>这个解决办法的探索</strong><strong></strong></p>
<p>为了在windows store app得到WPF一样的结果，我的第一想法是使用Clip-property来剪裁原来的Grid，代码如下：</p>
<p>&lt;Grid x:Name="elementToRender" Height="100" Width="500" Background="Red"&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Grid.Clip&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;RectangleGeometry Rect="0 0 500 100"/&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/Grid.Clip&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Rectangle Fill="Yellow" Width="100" Height="100"&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Rectangle.RenderTransform&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;TranslateTransform Y="50"/&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/Rectangle.RenderTransform&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/Rectangle&gt;</p>
<p>&lt;/Grid&gt;</p>
<p>这段代码得到的结果如下，黄色的子元素部分被剪裁，这与我想要显示的RenderTargetBitmap对象的样式是一致的：</p>
<p>&nbsp;<a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/55/98/0572.5.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-55-98/0572.5.png"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/55/98/0572.5.png" original-url="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-55-98/0572.5.png" alt="" border="0" /></a></p>
<p>但是你将上面剪裁过后的Grid以RenderTargetBitmap对象显示的时候，结果并不是我们所期盼的500 x 100的大小，它的大小仍然是500 x 150。其结果如下图所示，其中超出Grid的大小部分被标记为灰色：</p>
<p>&nbsp;<a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/55/98/1638.6.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-55-98/1638.6.png"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/55/98/1638.6.png" original-url="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-55-98/1638.6.png" alt="" border="0" /></a></p>
<p>这意味着RenderTargetBitmap所显示的大小是原总的UI元素所占空间的大小（这其中包括黄色的矩形框超出Grid边界的大小），所以不管我们有没有对原来的Grid有没有进行剪裁，RenderTargetBitmap的大小总是500 x 150而不是我们所期盼的500 x 100。</p>
<p><strong>最终有效的解决方案</strong><strong></strong></p>
<p>综上所讨论的，使用Clip-property并不是一个有效的解决方案。这个RenderTargetBitmap的大小仍然超过原来Grid的大小。但是使用Clip-property是最终有效解决方案的第一步。第二步时你需要定义一个新的Grid Element，该Grid在可视化树中，且该Grid的子元素包含第一步剪裁后的Grid。你只需要将该Grid以RenderTargetBitmap的形式呈现就会得到我们想要的结果。</p>
<p>在前一部分，我们已经得到了剪裁后的Grid：</p>
<p>&lt;Grid x:Name="elementToRender" Height="100" Width="500" Background="Red"&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Grid.Clip&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;RectangleGeometry Rect="0 0 500 100"/&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/Grid.Clip&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Rectangle Fill="Yellow" Width="100" Height="100"&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Rectangle.RenderTransform&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;TranslateTransform Y="50"/&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/Rectangle.RenderTransform&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/Rectangle&gt;</p>
<p>&lt;/Grid&gt;</p>
<p>第二步我们在可视化树种加入一个新的Grid元素，该Grid子元素包含上述剪裁后的Grid，代码如下：</p>
<p>&lt;Grid x:Name="elementToRender" Height="100" Width="500"&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Grid x:Name="oldElementToRender" Height="100" Width="500" Background="Red"&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Grid.Clip&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;RectangleGeometry Rect="0 0 500 100"/&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/Grid.Clip&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;Rectangle Fill="Yellow" Width="100" Height="100"&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Rectangle.RenderTransform&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;TranslateTransform Y="50"/&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/Rectangle.RenderTransform&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/Rectangle&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/Grid&gt;</p>
<p>&nbsp; &lt;/Grid&gt;<strong></strong></p>
<p>如果你将新加入的Grid以RenderTargetBitmap的形式呈现，你会发现该RenderTargetBitmap大小是我们所期盼的500x100，而不再是500x150.这样我们就会得到与WPF相同的结果。该RenderTargetBitmap最后的结果如下：</p>
<p>&nbsp;<a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/55/98/0830.7.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-55-98/0830.7.png"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/55/98/0830.7.png" original-url="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-55-98/0830.7.png" alt="" border="0" /></a></p>
<p>最后希望该博客能对大家在使用RenderTargetBitmap时有更多的帮助，同时希望大家能更多的用到windows 8.1里面新的内容。</p>
<p>&nbsp;</p>]]></content:encoded>
    </item>
    <item>
      <title>How to use new controls in Windows 8.1 (2)</title>
      <link>https://docs.microsoft.com/archive/blogs/win8devsupport/how-to-use-new-controls-in-windows-8-1-2</link>
      <pubDate>Mon, 30 Dec 2013 22:25:00 GMT</pubDate>
      <dc:creator><![CDATA[Robin_Yang]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/win8devsupport/2013/12/30/how-to-use-new-controls-in-windows-8-1-2/</guid>
      <description><![CDATA[&shy;Before developing an app, you should know which tools can be used to help with designand...]]></description>
      <content:encoded><![CDATA[<p>&shy;Before developing an app, you should know which tools can be used to help with design<br />and layout. In the previous article, we introduced some new features in windows8.1.</p>
<p>Now, let us see more useful new features in this blog.</p>
<p><strong>&nbsp;The Hub Control</strong></p>
<p>Hub control is a new feature introduced in windows 8.1 and can display different categories of content,</p>
<p>each of which maps to the section pages in your app. In windows 8.1,</p>
<p>Hub control provides elements to help you more easily implement&nbsp; the hub design,</p>
<p>which reflects the proper design guidelines and behaviors pattern of your app.</p>
<p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/55/98/8311.1.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-55-98/8311.1.png"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/55/98/8311.1.png" original-url="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-55-98/8311.1.png" alt="" border="0" /></a><br />&nbsp;<br />&nbsp;</p>
<p><strong>Mission</strong><strong>：</strong><strong>display data from different sources</strong></p>
<p>For example, in our app, customers want to display different data sources to a page like News<br />app, one section of page displays sports news and another section displays<br />music news. In the past, we may add two or more GridView or ListView controls<br />in a page and set different data sources to different controls. For now, using<br />each hub section, we can use only one hub control to display data from<br />different sources. And any XAML content can be used to create a visually rich hub page.</p>
<p><strong>Mission: provide each group with different DataTemplates</strong></p>
<p>If you try to make a hub page by ListView or GridView, you should group the<br />GridView and make different groups have different DataTemplates. In the past, we<br />used DataTemplateSelector to achieve this. You should make a ViewModel to get<br />either some data, or class subtype that differentiates one group from another. And<br />you should create your own custom DataTemplateSelector that can make the<br />determination for each group of what type it is.</p>
<p>Below is what we have done:&nbsp;</p>
<p><em>public sealed class ItemGroupTemplateSelector : DataTemplateSelector </em></p>
<p><em>{</em></p>
<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public DataTemplate InventoryItemTemplate { get; set; }</em></p>
<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public DataTemplate RoomItemTemplate { get; set; }</em><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </em></p>
<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; protected override DataTemplate SelectTemplateCore( object item, DependencyObject container )</em></p>
<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</em></p>
<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( item != null )</em></p>
<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</em></p>
<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( item is ViewModelRoomItem )</em></p>
<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</em></p>
<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return this.RoomItemTemplate;</em></p>
<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</em></p>
<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else if( item is ViewModelInventoryItem )</em></p>
<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</em></p>
<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return this.InventoryItemTemplate;</em></p>
<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</em></p>
<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</em><em>&nbsp;</em></p>
<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return null;</em><em>&nbsp;</em></p>
<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</em></p>
<p><em>}</em></p>
<p><strong>Make a Hub Page:</strong></p>
<p>As we have discussed above, making a hub page is so complicated and time-consuming<br />in windows 8. Now with New hub control in windows 8.1, we can easily achieve<br />it. We only need to create some hub sections in hub control and define each hub<br />sections with different DataTemplate.</p>
<p><strong>Hub section:</strong></p>
<p>Basically, the Hub control is a collection of HubSections. You do not add content directly<br />to a hub section; instead, you define the content of your HubSection in a<br />DataTemplate object. Content can either be defined inline or be bound to a data<br />source. Any valid XAML can be used in a hub section. And Each HubSection has two important properties:</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ●Header: used to get or set the section header</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ●ContentTemplate:&nbsp; used to get or set the section content</p>
<p><strong>What we&rsquo;ve done:</strong></p>
<p>What we&rsquo;ve done is only to make different hub section in hub control with different DataTemplates:</p>
<p><strong>XAML</strong><strong>：</strong><strong></strong></p>
<p><em>&lt;Hub Header="Hub control" x:Name="Hubsample"&gt;</em></p>
<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;HubSection&nbsp; Width="700"&gt;</em></p>
<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;HubSection.Background&gt;</em></p>
<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ImageBrush ImageSource="Assets/windows 8.1.png" Stretch="UniformToFill" /&gt;</em></p>
<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/HubSection.Background&gt;</em></p>
<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/HubSection&gt;</em><em>&nbsp;</em></p>
<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;HubSection Header="News" Width="400" &gt;</em></p>
<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;HubSection.ContentTemplate&gt;</em></p>
<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;DataTemplate&gt;</em></p>
<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;TextBlock Text="{Binding Text}"&nbsp; TextWrapping="Wrap" /&gt;</em><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /></em><em></em></p>
<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/DataTemplate&gt;</em></p>
<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/HubSection.ContentTemplate&gt;</em></p>
<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/HubSection&gt;</em></p>
<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;HubSection x:Name="ImagesSection" Header="Images" IsHeaderInteractive="True" MinWidth="620"&gt;</em></p>
<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;HubSection.ContentTemplate&gt;</em></p>
<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;DataTemplate&gt;</em></p>
<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;GridView ItemsSource="{Binding }"&gt;</em></p>
<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;GridView.ItemTemplate&gt;</em></p>
<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;DataTemplate&gt;</em></p>
<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Image Source="{Binding Image}"/&gt;</em></p>
<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/DataTemplate&gt;</em></p>
<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/GridView.ItemTemplate&gt;</em></p>
<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;GridView.ItemsPanel&gt;</em></p>
<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ItemsPanelTemplate&gt;</em></p>
<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;VariableSizedWrapGrid Orientation="Horizontal" ItemHeight="200" ItemWidth="200" MaximumRowsOrColumns="3"&gt;</em></p>
<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/VariableSizedWrapGrid&gt;</em></p>
<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/ItemsPanelTemplate&gt;</em></p>
<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/GridView.ItemsPanel&gt;</em></p>
<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/GridView&gt;</em></p>
<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/DataTemplate&gt;</em></p>
<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/HubSection.ContentTemplate&gt;</em></p>
<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/HubSection&gt;</em></p>
<p><em>&lt;/Hub&gt;</em><strong>&nbsp;</strong></p>
<p><strong>&nbsp;</strong></p>
<p><strong>Result</strong><strong>：</strong><strong></strong></p>
<p>&nbsp;<a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/55/98/6180.2.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-55-98/6180.2.png"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/55/98/6180.2.png" original-url="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-55-98/6180.2.png" alt="" border="0" /></a></p>
<p><strong>Navigate by headers</strong></p>
<p>If you want to make customers navigate to a specific page of your app when they click<br />the header in each HubSection. You can implement this by set<br />IsHeaderInteractive HubSection property to true and hander SectionHeaderClick<br />event in hub control:&nbsp;</p>
<p><em>&lt;Hub Header="Hub control" x:Name="Hubsample" SectionHeaderClick="Hubsample_SectionHeaderClick"&gt;</em></p>
<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;HubSection&nbsp; Width="700" Name="MainSection" IsHeaderInteractive="True"&gt;</em></p>
<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;HubSection.Background&gt;</em></p>
<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ImageBrush ImageSource="Assets/windows 8.1.png" Stretch="UniformToFill" /&gt;</em></p>
<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/HubSection.Background&gt;</em></p>
<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/HubSection&gt;</em></p>
<p><em>&nbsp;</em></p>
<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;HubSection Header="News" Width="400" IsHeaderInteractive="True" Name="NewsSection"&gt;&nbsp; </em></p>
<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&lt;HubSection.ContentTemplate&gt;</em></p>
<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;DataTemplate&gt;</em></p>
<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;TextBlock Text="{Binding Text}"&nbsp;&nbsp;TextWrapping="Wrap" /&gt;</em><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /></em></p>
<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/DataTemplate&gt;</em></p>
<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/HubSection.ContentTemplate&gt;</em></p>
<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/HubSection&gt;</em></p>
<p><em>&hellip;&hellip;.</em></p>
<p><em>&lt;/Hub&gt;</em></p>
<p><em>&nbsp;</em></p>
<p><em>&nbsp; private void Hubsample_SectionHeaderClick(object sender, HubSectionHeaderClickEventArgs e)</em></p>
<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</em></p>
<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; switch(e.Section.Name)</em></p>
<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</em></p>
<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case "NewsSection":</em></p>
<p><em>&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.Frame.Navigate(NewsPage);</em><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </em></p>
<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;</em></p>
<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case "MainSection":</em><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.Frame.Navigate(InforPage);</em></p>
<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;</em></p>
<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .......</em></p>
<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</em></p>
<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</em></p>
<p><strong>Flyout &amp; MenuFlyout</strong></p>
<p>Flyout and MenuFlyout are new controls which introduced in windows 8.1. A Flyout<br />displays lightweight UI that either is informational or requires user <br />interaction. You can use it to collect input from the user, show more details<br />about an item, or ask the user to confirm an action. And a Flyout should show<br />only in response to a tap or a click, as well as always dismiss when you taps<br />outside it. Like Flyout, MenuFlyout let the user choose from a contextual list<br />of simple commands or options.&nbsp;</p>
<p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/55/98/5342.3.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-55-98/5342.3.png"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/55/98/5342.3.png" original-url="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-55-98/5342.3.png" alt="" border="0" /></a></p>
<p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/55/98/7065.4.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-55-98/7065.4.png"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/55/98/7065.4.png" original-url="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-55-98/7065.4.png" alt="" border="0" /></a></p>
<p>&nbsp;</p>
<p><strong>Creat a Flyout &amp; MenuFlyout</strong></p>
<p>In windows 8, the flyout and Menuflyout are actually accomplished with the popup<br />control. Unlike the flyout in JavaScript, the XAML popup must be manually<br />implemented for placement, dismissal, animations, etc. So making a flyout in<br />windows 8 is not very easy.</p>
<p><strong>What we&rsquo;ve done</strong></p>
<p>As new feathers in windows 8.1, we can easily implement flyout or menuflyout,what<br />we&rsquo;ve done as below:</p>
<p><strong>Flyout:</strong></p>
<p>In windows 8.1, Button control has a new Flyout property that can simplify<br />attaching and opening a Flyout control. For another control, you can also<br />attach a <a href="http://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.controls.flyout.aspx">Flyout</a>&nbsp;control to it by using the <a href="http://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.controls.primitives.flyoutbase.attachedflyout.aspx">FlyoutBase.AttachedFlyout</a>&nbsp;attached property.</p>
<p>In XAML page we can code like below:&nbsp;</p>
<p><em>&lt;Button Content="Empty cart"&gt;</em></p>
<p><em>&nbsp;&nbsp;&nbsp; &lt;Button.Flyout&gt;</em></p>
<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Flyout&gt;</em></p>
<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;StackPanel&gt;</em></p>
<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;TextBlock Style="{StaticResource BasicTextStyle}"&gt;</em></p>
<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; All items will be removed. Do you want to continue?</em></p>
<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/TextBlock&gt;</em></p>
<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Button Click="DeleteConfirmation_Click"&gt;Yes, empty my cart&lt;/Button&gt;</em></p>
<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/StackPanel&gt;</em></p>
<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/Flyout&gt;</em></p>
<p><em>&nbsp;&nbsp;&nbsp; &lt;/Button.Flyout&gt;</em></p>
<p><em>&lt;/Button&gt;</em><em>&nbsp;</em></p>
<p>In code-behind, we also can easily add a Flyout to a control. You can use some</p>
<p>code below to add a flyout to TextBlock control:&nbsp;</p>
<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TextBlock textOption = new TextBlock();</em></p>
<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; textOption.Margin = new Thickness(266, 306, 0, 0);</em></p>
<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; textOption.Text = "My option";</em></p>
<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Flyout Myflyout=new Flyout();</em></p>
<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TextBlock MytextBlock=new TextBlock();</em></p>
<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MytextBlock.Text="You can edit this text by tapping it.";</em></p>
<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Myflyout.Content=MytextBlock;</em></p>
<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; textOption.SetValue(FlyoutBase.AttachedFlyoutProperty, Myflyout);</em></p>
<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; grid.Children.Add(textOption);</em></p>
<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; textOption.SetValue(Grid.ColumnProperty, 2);</em></p>
<p><em>&nbsp;</em></p>
<p>To open this <a href="http://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.controls.flyout.aspx">Flyout</a>, handle the <a href="http://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.uielement.tapped.aspx">Tapped</a> event and call the <a href="http://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.controls.primitives.flyoutbase.showattachedflyout.aspx">FlyoutBase.ShowAttachedFlyout</a> method&nbsp;</p>
<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private void textOption_Tapped(object sender, TappedRoutedEventArgs e)</em></p>
<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</em></p>
<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FrameworkElement element = sender as FrameworkElement;</em></p>
<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (element != null)</em></p>
<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</em><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FlyoutBase.ShowAttachedFlyout(element);</em></p>
<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</em></p>
<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</em></p>
<p><em>&nbsp;</em></p>
<p><strong>MeunFlyout:</strong></p>
<p>Similar to Menuflyout, you can define the contents of the menu by adding <a href="http://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.controls.menuflyoutitem.aspx">MenuFlyoutItem</a>, <a href="http://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.controls.togglemenuflyoutitem.aspx">ToggleMenuFlyoutItem</a>, and <a href="http://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.controls.menuflyoutseparator.aspx">MenuFlyoutSeparator</a><br />objects to the <a href="http://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.controls.menuflyout.aspx">MenuFlyout</a>.These objects are for:</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ●<a href="http://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.controls.menuflyoutitem.aspx">MenuFlyoutItem</a>&mdash;Performing an immediate action.</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ●<a href="http://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.controls.togglemenuflyoutitem.aspx">ToggleMenuFlyoutItem</a>&mdash;Switching an option on or off.</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ●<a href="http://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.controls.menuflyoutseparator.aspx">MenuFlyoutSeparator</a>&mdash;Visually separating menu items.</p>
<p>What we&rsquo;ve done like below:&nbsp;</p>
<p><em>&lt;Button Content="Options"&gt;</em></p>
<p><em>&nbsp;&nbsp;&nbsp; &lt;Button.Flyout&gt;</em></p>
<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;MenuFlyout&gt;</em></p>
<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;MenuFlyoutItem Text="Reset" Click="Reset_Click"/&gt;</em></p>
<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;MenuFlyoutSeparator/&gt;</em></p>
<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ToggleMenuFlyoutItem Text="Shuffle" IsChecked="{Binding IsShuffleEnabled,<br />Mode=TwoWay}"/&gt;</em></p>
<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ToggleMenuFlyoutItem Text="Repeat" IsChecked="{Binding IsRepeatEnabled,<br />Mode=TwoWay}"/&gt;</em></p>
<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/MenuFlyout&gt;</em></p>
<p><em>&nbsp;&nbsp;&nbsp; &lt;/Button.Flyout&gt;</em></p>
<p><em>&lt;/Button&gt;</em><em>&nbsp;</em></p>
<p>For ToggleMenuFlyoutItem, if you wondering to update the icon when it was checked.<br />You can right click the ToggleMenuFlyoutItem, and select &ldquo;Edit Template&rdquo;, &ldquo;Edit<br />a Copy&rdquo;, then you will see a dialog asking for create style resource, click&ldquo;OK&rdquo;.</p>
<p>Try to find the following code within the Style:&nbsp;</p>
<p><em>&lt;Path x:Name="CheckGlyph" Data="F1 M 0,58 L 2,56 L 6,60 L 13,51 L<br />15,53 L 6,64 z" Fill="{TemplateBinding Foreground}"<br />FlowDirection="LeftToRight" Height="14"<br />Margin="0,0,10,0" Opacity="0" Stretch="Fill" Width="16"/&gt;</em><em>&nbsp;</em></p>
<p>Replace it with following code:<em>&nbsp;</em></p>
<p><em>&lt;Ellipse x:Name="CheckGlyph" Fill="{TemplateBinding Foreground}"<br />FlowDirection="LeftToRight" Height="14"<br />Margin="0,0,10,0" Opacity="0" Stretch="Fill" Width="16"/&gt;</em><em>&nbsp;</em></p>
<p>When you select a ToggleMenuFlyoutItem,the check icon like below:</p>
<p>&nbsp;<a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/55/98/3301.5.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-55-98/3301.5.png"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/55/98/3301.5.png" original-url="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-55-98/3301.5.png" alt="" border="0" /></a></p>
<p>&nbsp;</p>
<p><strong>&nbsp;</strong></p>]]></content:encoded>
    </item>
    <item>
      <title>如何正确使用Background Task的几点建议</title>
      <link>https://docs.microsoft.com/archive/blogs/win8devsupport/background-task</link>
      <pubDate>Mon, 30 Dec 2013 22:05:00 GMT</pubDate>
      <dc:creator><![CDATA[Robin_Yang]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/win8devsupport/2013/12/30/background-task/</guid>
      <description><![CDATA[前些天，在Windows商店应用论坛搜索了一下&ldquo;热点问题&rdquo;，发现有很多关于Background Task的理解误区。以下是关于如何正确使用Background...]]></description>
      <content:encoded><![CDATA[<p>前些天，在Windows商店应用论坛搜索了一下&ldquo;热点问题&rdquo;，发现有很多关于Background Task的理解误区。以下是关于如何正确使用Background Task的几点建议。</p>
<h3>误区：Background Task不是很有用，因为微软对他做了很多的限制。</h3>
<p>很多刚接触商店应用的开发者都会有类似的想法，但其实是因为在编写桌面应用程序的时候可以把程序运行在后台并且带少量甚至不带限制。当台式机插入电源的时候这种方式的编程是非常理想的，但并不适用于移动设备或者外置设备。Windows 8 以及8.1都是为了移动设备而定制的，运行在移动设备中的商店应用程序需要关注电池的使用量以及用户的选择，在这样的前提之下，很多的Background<br />Task API都做了限制。但是微软对此相当关注，并且有很多关于Background Task方案的内部讨论，这样做的目的是为了满足开发者最基本的移动编程的需求。移动设备未来将会对Background Task进行扩展，敬请期待。</p>
<h3>误区：我有一个运行时间足够长的代码，如果我的应用是处于挂起状态并且我想运行完这段代码，我可以把这段代码放在后台执行，它会自动执行完成。</h3>
<p>这个取决于你的代码运行多长时间，请时刻记住为了节约电池，我们对后台线程做了限制，包括可以运行多少后台任务，每个后台任务运行多久，多少时间触发一次。举个例子在Background Task中你是不可能花3个多小时去下载一个高清版的指环王，但是你可以使用Background Downloader来实现。请记住，Background Task仅仅为小数据量的下载更新而被使用，比如说更新磁贴，更新锁屏图标等，他们并非为下载大量数据而设计的。一般来说，你可以间隔的让你的Background Task触发，执行代码，显示必要的数据，然后继续休息。</p>
<h3>误区：当应用处于不活跃状态时，你可以用一个标准的Background Task来播放音频视频。</h3>
<p>播放背景音乐可以通过使用MediaElement的背景音乐属性或者可以使用&lt;audio/video&gt;的标签。如果想让你的商店应用正常播放背景音乐你需要实现 SystemMediaTransportControls这个类，这个类是替换MediaControl的存在。他们俩做同样的事，都允许用户在锁屏的时候通过硬件按钮或者在锁屏上的控制条来控制音乐的播放。</p>
<h3>误区：当我有权限在锁屏时运行带有计时功能的Background Task的时候我可以无限时运行。</h3>
<p>答案可以说正确也可以说错误。当你的程序被用户赋予在锁屏运行的权利时，你的应用可以正常运行。但如果用户把你的应用从锁屏中删除的话，你的Background Task将不会在锁屏状态下运行。这样的设计是为了最大化保证电池的续航时间。</p>
<h3>误区：如果我的Background Task仅仅耗时1秒，我就不需要注册一个取消的处理事件</h3>
<p>我们必须为Background Task取消做好准备，即使它仅仅耗时1秒乃至更少，Background Task可能因为多种原因而被取消。当你拥有一个长时间运行的Background Task但是你忽略了取消，可能会因此导致数据丢失或者程序错误。为此我们应该在Task运行的时候检查取消请求以确保程序正常运行。我们建议在Background Task代码中多设定检查取消的判定以保证取消事件得以及时传递。虽然这个看起来很麻烦，但的确是一个良好的代码习惯。</p>
<h3>误区：不要把后台任务和异步操作混淆使用</h3>
<p>不当心的话还是很容易把他俩混淆的。假设有这么一种情况，在后台任务中使用了异步操作，但后台任务还没来得及申请挂起之前的短暂停就因为系统锁定而挂起，这样很容易造成异步无法执行完成，导致内存泄漏。</p>
<h3>误区：我需要使用WNS来推送所有的消息，我不可以创建我自己的推送服务。</h3>
<p>这个理解是错误的，我们为此添加了很多网络Trigger API来确保用户可以使用自己的推送服务，但是为了使这些api能正常工作，我们需要维护一个后台的数据连接传输的功能。WNS本身就有很多优点比如说节省开支，节约代码，并且是独立于语言。一般WNS被诟病的问题就在于推送不及时。当我们在鼓励用户使用WNS的时候，也同时鼓励为了确保推送质量的开发者使用网络检测的api，谨记当使用自己的网络监测api的时候也需要为锁屏注册相应事件。</p>
<p><strong>相应的链接可供参考</strong><strong></strong></p>
<p><a href="http://msdn.microsoft.com/en-us/library/windows/apps/hh977046.aspx">Supporting your app with background tasks (Windows Store apps using JavaScript and HTML</a></p>
<p><a href="http://blogs.msdn.com/b/windowsappdev/archive/2012/05/24/being-productive-in-the-background-background-tasks.aspx">Being productive in the background &ndash; background tasks</a></p>
<p><a href="http://msdn.microsoft.com/en-us/library/windows/apps/hh977051.aspx">Guidelines for background tasks (Windows Store apps)</a></p>
<p><a href="http://msdn.microsoft.com/en-us/library/windows/apps/hh977055.aspx">Quickstart: Create and register a background task (Windows Store apps using C#/VB/C++ and XAML)</a></p>
<p><a href="http://msdn.microsoft.com/en-us/library/windows/apps/jj542415.aspx">How to debug a background task (Windows Store apps)</a></p>
<p>&nbsp;</p>]]></content:encoded>
    </item>
    <item>
      <title>How to use new controls in Windows 8.1 (1)</title>
      <link>https://docs.microsoft.com/archive/blogs/win8devsupport/how-to-use-new-controls-in-windows-8-1-1</link>
      <pubDate>Mon, 09 Dec 2013 00:40:00 GMT</pubDate>
      <dc:creator><![CDATA[Robin_Yang]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/win8devsupport/2013/12/09/how-to-use-new-controls-in-windows-8-1-1/</guid>
      <description><![CDATA[Author: James He
&nbsp;
Before developing an app, you should know which tools can be usedto help...]]></description>
      <content:encoded><![CDATA[<p style="text-align: left;">Author: James He</p>
<p style="text-align: left;">&nbsp;</p>
<p>Before developing an app, you should know which tools can be used<br />to help with design and layout. As Windows 8.1 released on Oct.18<sup>th</sup>,<br />some new features are introduced accordingly. Within this article, we will<br />share our experience on using these new controls and try to &ldquo;hack&rdquo; these<br />controls from layout and design.</p>
<div>
<h1><span style="text-decoration: underline;">DatePicker &amp; TimePicker</span></h1>
</div>
<p>DatePicker allows a user to pick a date value. The<br />DatePicker control use three Combobox controls which are month, day and year<br />picker. In our app, we used it as the &ldquo;start date&rdquo; and the &ldquo;end date&rdquo; of the<br />financial product. We also use the TimePicker while setting an alert. Both of<br />them are easy to use and both are new incoming for win8.1, otherwise to drag<br />and drop several Combobox controls are not easy.</p>
<h3><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/55/98/2046.1.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-55-98/2046.1.png"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/55/98/2046.1.png" original-url="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-55-98/2046.1.png" alt="" border="0" /></a><br />&nbsp;<br />&nbsp;&nbsp;Cultural Settings</h3>
<p>Our app is serving for different country products and used<br />by different culture customers, to adjust the DataPicker style to fit the local<br />culture is quite necessary. By the help of Windows.Globalization namespace, we<br />can set CalenderIdentifier to meet the varieties of the culture.</p>
<p>For instance our client is a Japanese user, we&rsquo;d like to set<br />the CalenderIdentifier as &ldquo;JapansesCalender&rdquo; which has a different layout:<br />Year-Month-Date, unlike the default &ldquo;GregorianCalendar&rdquo; Month-Date-Year format,<br />Japanese clients must have a feeling: a local app is better than an<br />international app.</p>
<p>In TimePicker we could set ClockIdentifier as &ldquo;12hour&rdquo; and<br />&ldquo;24hour&rdquo;, 24 hour clock is often used in documentation of care as it prevent<br />the ambiguity of the time, and used as the Military time or Astronomical time<br />in US and Canada, we can say if the client lives in US or Canada, we use 12<br />hour clock otherwise 24 hour clock is used.</p>
<p>&nbsp;</p>
<div>
<h1><span style="text-decoration: underline;">The Header</span></h1>
</div>
<p>&ldquo;Header&rdquo; is a new feature introduced in Win8.1 and can be<br />used as a short description text (label) of a control, in win8 we have to add<br />the TextBlock before the input control to tell our user: <em>Hey, Do something here!</em> But now, our hero &ldquo;Header&rdquo; helps us save<br />our time and shorten our code.</p>
<h3>Mission: Add a Header</h3>
<p>For instance, in our app, our customer has been asked to type<br />in their profile name, we simply drag a TextBox into the page and set the<br />header text &ldquo;What&rsquo;s the profile name?&rdquo;</p>
<p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/55/98/7167.2.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-55-98/7167.2.png"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/55/98/7167.2.png" original-url="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-55-98/7167.2.png" alt="" border="0" /></a></p>
<p>The XAML code is quite simple:</p>
<p>&lt;TextBox Header="What's the profile name?"/&gt;</p>
<p>But you may say: Well, it&rsquo;s good, but I want to customize<br />the text, for instance the header should be a highlighted color instead of<br />white and the font size should be bigger, is it possible? We notice the same<br />issue while developing, the original style cannot fit our requirement, and we<br />shall customize it. Let&rsquo;s do it step by step.</p>
&nbsp;
<h3>Mission: Style a Header</h3>
<p>Do you remember how to style a control in Win8 app? Yes,<br />it&rsquo;s a same action, right click the control, and select &ldquo;Edit Template&rdquo;, &ldquo;Edit<br />a Copy&rdquo;, then you will see a dialog asking for create style resource, click<br />&ldquo;OK&rdquo;.</p>
<p>Try to find the following code within the Style:</p>
<p><em>&lt;ContentPresenter<br />x:Name="HeaderContentPresenter" Grid.ColumnSpan="2"<br />ContentTemplate="{TemplateBinding HeaderTemplate}" Content="{TemplateBinding<br />Header}" Foreground="{ThemeResource<br />TextBoxForegroundHeaderThemeBrush}" FontWeight="Semilight"<br />Margin="0,4,0,4" Grid.Row="0"/&gt;</em></p>
<p>This is the container of the header text, change the<br />foreground color or modify the font size, you could do whatever you want to<br />style the ContentPresenter, furthermore, VisualState can also help to style the<br />header, for instance when the mouse hover the control, change the font size by<br />adding an DoubleAnimation to the VisualState &ldquo;PointOver&rdquo; section.</p>
<p>To customize the header style is a piece of cake.&nbsp;</p>
<h3>Header Template</h3>
<p>We can use a HeaderTemplate if we need more than a simple<br />text header. A HeaderTemplate can host any valid XAML, including elements that<br />can be hit-tested (The default Header does not accept focus and can&rsquo;t be<br />hit-test), such as a Button, the XAML code as below:</p>
<p><em>&lt;TextBox.HeaderTemplate&gt;</em></p>
<p><em>&nbsp;&nbsp; &lt;DataTemplate&gt;</em></p>
<p><em>&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;Button Content="Click Me"<br />Click="Button_Click"/&gt;</em></p>
<p><em>&nbsp;&nbsp; &lt;/DataTemplate&gt;</em></p>
<p><em>&lt;/TextBox.HeaderTemplate&gt;</em></p>
<h3>Header for Control</h3>
<p>Well, we can apply the header to some controls, they are:<br />ComboBox, Slider, DatePicker, TimePicker, TextBox, PasswordBox and RichEditBox.<br />Even the HubSection control do have the header but it is not only a text label<br />but also a user interaction element, we will talk it later in Hub Control<br />section.&nbsp;</p>
<h3>What we&rsquo;ve done</h3>
<p>In our App, customize the header is also necessary for a<br />space saving purpose, we will put the header label on the left instead of on<br />the top.</p>
<p><br /> <a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/55/98/2388.3.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-55-98/2388.3.png"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/55/98/2388.3.png" original-url="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-55-98/2388.3.png" alt="" border="0" /></a><br />&nbsp;</p>
<p>What we&rsquo;ve done is to modify the Style of TextBox as below<br />(some detail setting XAML are omitted):</p>
<p><em>&lt;Grid.ColumnDefinitions&gt;</em></p>
<p><em>&nbsp;&nbsp;&nbsp; &lt;ColumnDefinition<br />Width="auto"/&gt;</em></p>
<p><em>&nbsp;&nbsp;&nbsp; &lt;ColumnDefinition<br />Width="*"/&gt;</em></p>
<p><em>&lt;/Grid.ColumnDefinitions&gt;</em></p>
<p><em>&lt;ContentPresenter<br />x:Name="HeaderContentPresenter" /&gt;</em></p>
<p><em>&lt;Grid<br />Grid.Column="1"&gt;</em></p>
<p><em>&nbsp;&nbsp;&nbsp; &lt;Border<br />x:Name="BackgroundElement" /&gt;</em></p>
<p><em>&nbsp;&nbsp;&nbsp; &lt;Border x:Name="BorderElement"<br />/&gt;</em></p>
<p><em>&nbsp;&nbsp;&nbsp; &lt;ScrollViewer<br />x:Name="ContentElement" /&gt;</em></p>
<p><em>&nbsp;&nbsp;&nbsp; &lt;ContentControl<br />x:Name="PlaceholderTextContentPresenter" /&gt;</em></p>
<p><em>&nbsp;&nbsp;&nbsp; &lt;Button x:Name="DeleteButton"<br />/&gt;</em></p>
<p><em>&nbsp;&nbsp;&nbsp; &lt;ScrollViewer /&gt;</em></p>
<p><em>&lt;/Grid&gt;</em></p>
<p>&nbsp;</p>
<div>
<h1><span style="text-decoration: underline;">Placeholder</span></h1>
</div>
<p>Unlike Header, Placeholder seems to be a notification to a<br />user, for instance in our app, PasswordBox is used, the grey text in the<br />PasswordBox is a hint for the user to pay attention, while typing something,<br />then placeholder text will disappear.</p>
<p><br /> <a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/55/98/7041.4.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-55-98/7041.4.png"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/55/98/7041.4.png" original-url="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-55-98/7041.4.png" alt="" border="0" /></a></p>
<p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/55/98/3125.5.png" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-55-98/3125.5.png"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/55/98/3125.5.png" original-url="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-55-98/3125.5.png" alt="" border="0" /></a>&nbsp;</p>
<h3>Mission: Add &amp; Style the PlaceholderText</h3>
<p>To use the PlaceholderText the following XAML code is used:</p>
<p>&lt;PasswordBox Header="PasswordBox"<br />PlaceholderText="Password should be longer than 8 character "/&gt;</p>
<p>To Style the PlaceholderText, it is quite same as styling<br />the header, the only difference is header container is <em>&lt;ContentPresenter x:Name="HeaderContentPresenter" ...<br />/&gt; </em>while PlaceholderText container is <em>&lt;ContentControl x:Name="PlaceholderTextContentPresenter"<br />.../&gt;</em>.&nbsp;</p>
<h3>Placeholder for Control</h3>
<p>Currently only text based control has this new feature, they<br />are ComboBox, PasswordBox, RichEditBox, SearchBox, TextBox. On Combobox,<br />PlaceholderText can be treated as SelectedIndex = -1 or SelectionItem = null,<br />the text-based control will display the PlaceholderText while its content is<br />empty.&nbsp;</p>
<p>More Controls will be introduced in the next article such as<br />the usage of hub control.</p>]]></content:encoded>
    </item>
    <item>
      <title>Using Free-COM DLL in Windows Store C++ Project</title>
      <link>https://docs.microsoft.com/archive/blogs/win8devsupport/using-free-com-dll-in-windows-store-c-project</link>
      <pubDate>Sun, 19 May 2013 20:18:09 GMT</pubDate>
      <dc:creator><![CDATA[Robin_Yang]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/win8devsupport/2013/05/19/using-free-com-dll-in-windows-store-c-project/</guid>
      <description><![CDATA[It is generally known that migrating Desktop App to Windows Store App is quite a headache. In .NET,...]]></description>
      <content:encoded><![CDATA[<p><span style="font-size: small;">It is <span style="font-family: Calibri;">generally</span> <span style="font-family: Calibri;">known</span> that migrating Desktop App to Windows Store App is quite a headache. In .NET, some namespace cannot be used in Windows Store App, </span>so it is very difficult to deal with when you want to migrate code related to these namespaces.<span style="font-size: small;"> In C++,</span> native code cannot be referenced directly as DLL component to the project. It requires a Windows Runtime shell to redefine all the native custom classes.</p>
<p><br /><span style="font-size: small;"> On the other hand, how to create a common component used for both Desktop App and Windows Store App is also a headache. . NET is okay, but C++ calls for creating two different versions of the component.<br /> <br /> This post will </span>introduce a method about how to use Free-COM dll in Windows Store App.<span style="font-size: small;"> By this way, we can make the migrating components in the form of COM, which can directly </span>be used in Windows Store App. Meanwhile, it succeeds in solving the problem of sharing DLLs between Desktop App and Windows Store App. <span style="font-size: small;">However, this method is not available for .NET Windows Store app, because the NET project does not support the import of COM components.</span></p>
<p><br /><span style="font-size: small;"> The first part describes how to create an ATL COM Server, if you are experienced in it, you can skip it. Or directly download a COM component sample from </span><a href="http://code.msdn.microsoft.com/CppDllCOMServer-27b87d03"><em><span style="color: #0000ff; font-family: Calibri; font-size: small;">In-process C++ COM server (CppDllCOMServer)</span></em></a><span style="font-size: small;">.<br /> <br /> First of all, run Visual Studio as an administrator. T</span>he COM by default is required to be registered at compile time<span style="font-size: small;">. In the menu of New Project, please select </span>ATL project template (<span style="font-size: small;">this template is only supported by Visual Studio professional or higher version</span>)<span style="font-size: small;"> under Visual C++ .</span></p>
<p>We name the solution CppDllCOMServer<span style="font-size: small;">. Then in the popup wizard, please select Dynamic-Link Library (DLL), which only supports process within the COM not for process without the COM or remote COM component in Windows Store. Click Finish.<br /> We can see Visual Studio has automatically generated two projects, CppDllComServer and CppDllComServerPS. Right-click CppDllComServer project -&gt; Add -&gt; class. In the pop-up list, select ATL under Visual C++, select ATL Simple Object. Click Add.<br /> in the ATL Simple Object wizard, we only need to enter SimpleObject for Short Name, Visual Studio will automatically help to fill in for others, as shown in Figure<br /> &nbsp;<a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/55/98/7652.1.jpg" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-55-98/7652.1.jpg"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/55/98/7652.1.jpg" original-url="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-55-98/7652.1.jpg" alt="" border="0" /></a><br /> Click Next, here we do not choose, and then the next step, we can use the default, here must select Apartment for Thread model<br /> &nbsp;<a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/55/98/0537.2.jpg" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-55-98/0537.2.jpg"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/55/98/0537.2.jpg" original-url="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-55-98/0537.2.jpg" alt="" border="0" /></a><br /> Click Finish<br /> Visual Studio will automatically create the required code inside the COM class.<br /> Then we go to class view, we add a method to this class.<br /> Right-click ISimpleObject -&gt; Add -&gt; method<br /> &nbsp;<a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/55/98/1212.3.jpg" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-55-98/1212.3.jpg"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/55/98/1212.3.jpg" original-url="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-55-98/1212.3.jpg" alt="" border="0" /></a><br /> In the next wizard, we add a HelloWorld method,<br /> &nbsp;<a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/55/98/1563.4.jpg" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-55-98/1563.4.jpg"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/55/98/1563.4.jpg" original-url="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-55-98/1563.4.jpg" alt="" border="0" /></a><br /> We choose retval for the parameter&rsquo;s property, this property is different from out, with it we not only get the result from pointer passed into the function, but also can result from the function's return, while out only change the result by modifying the pointer passed to result. Click Add, and then click Finish.<br /> <br /> Visual Studio will automatically generate codes, we only need to modify HelloWorld function in SimpleObject.cpp file.<br /> We add the following code<br /> </span>STDMETHODIMP CSimpleObject::HelloWorld(BSTR* pRet)</p>
<p>{</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Allocate memory for the string.</p>
<p>&nbsp;&nbsp;&nbsp; *pRet = ::SysAllocString(L"HelloWorld");</p>
<p>&nbsp;&nbsp;&nbsp; if (pRet == NULL)</p>
<p>&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return E_OUTOFMEMORY;</p>
<p>&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return S_OK;</p>
<p>}</p>
<p><br /><span style="font-size: small;"> The result outputs HelloWorld<br /> <br /> Then compile the project.<br /> <br /> The second part, we need to generate manifest file which applies to the COM dll.<br /> In the last section, we have successfully compiled a COM dll component, or compiled directly from the download sample. We also need to confirm a few file locations. CppDllCOMServer.dll, which is generated by the COM, the default output file of the project, it should be in solution file folder \ Debug \ <br /> CppDllCOMServer.tlb, which we need to generate manifest, by default it should be in solution folder \ CppDllCOMServer \ Debug.<br /> <br /> After confirming these two files, we can use Developer Command Prompt command line to generate the manifest file.<br /> Position to the project output folder, enter the following command</span></p>
<p class="Code"><span style="font-size: x-small;"><span><span style="font-family: Consolas;">C:\Lab\CppDllCOMServer\C++\Debug&gt;mt.exe -tlb:CppDllCOMServer.tlb -dll:CppDllCOMServer.dll -identity:"CppCOMServerDLL, version=1.0.0.0, processorArchitecture=x86" -out:Application.manifest</span></span></span></p>
<p><span style="font-size: small;">For -Tlb: CppDllCOMServer.tlb parameter, it requires tlb file&rsquo;s specific location, we can copy the file to the folder in the same level of CppDllCOMServer.dll, or use<br /> <span style="font-family: Calibri;">..\ CppDllCOMServer\Debug\CppDllCOMServer.tlb </span>to specific location. If the tlb file in wrong position, it will popup error: Unable to process the <span style="font-family: Calibri;">.tlb file.</span></span></p>
<p><span style="font-size: small;">-Out parameter is to set the file name.<br /> In this way, Manifest file named Application.manifest has been generated in the preset folder.<br /> <br /> If you do not like the way of command line, we can also </span>set the project configuration to generate the manifest<span style="font-size: small;"> .</span></p>
<p><span style="font-size: small;">Right-click <span style="font-family: Calibri;">CppDllComServer-&gt;Properties-&gt;Linker-&gt;Manifest File -&gt;Enable User Account Control(UAC) -&gt; No(/MANIFESTUAC:NO) </span></span><span style="font-size: small;">disabling UAC aims to remove the UAC information inside manifest.<br /> <br /> Manifest Tool-&gt; General -&gt; Assembly Identity fill in<br /> <span style="font-family: Calibri;">&rdquo; CppCOMServerDLL, version=1.0.0.0, processorArchitecture=x86&rdquo;</span></span></p>
<p><span style="font-size: small;"><span style="font-family: Calibri;">Manifest Tool-&gt; Input and Output -&gt;Embed Manifest -&gt; No </span></span></p>
<p><span style="font-size: small;">Manifest Tool-&gt; Input and Output -&gt; Output Manifest File -&gt; fill in the name of Manifest, </span>for example,<span style="font-size: small;">Application.Manifest<br /> Manifest Tool-&gt; Isolated COM -&gt; Type Library File -&gt; fill in TLB file path, for example<br /> To $ (ProjectDir) \ Debug \ CppDllCOMServer.tlb,<br /> Manifest Tool-&gt; Isolated COM -&gt; Component File Name-&gt; fill in the name of DLL CppDllCOMServer.dll<br /> <br /> We can check the Manifest Tool-&gt; Command Line, in which the command basically consistent with last method&rsquo;s<br /> Then compile.<br /> <br /> The File generated from two ways above cannot use directly, we have to make a bit modify for it.<br /> <br /> Find Application.manifest file in the project's folder. Use Notepad to open, the content are same whichever way you generate it.<br /> </span>&lt;?xml version="1.0" encoding="UTF-8" standalone="yes"?&gt;</p>
<p>&lt;assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"&gt;</p>
<p>&nbsp; &lt;assemblyIdentity name="CppCOMServerDLL" version="1.0.0.0" processorArchitecture="x86"&gt;&lt;/assemblyIdentity&gt;</p>
<p>&nbsp; &lt;file name="CppDllCOMServer.dll" hashalg="SHA1"&gt;</p>
<p>&nbsp;&nbsp;&nbsp; &lt;comClass clsid="{09C969C2-969F-4029-A630-BF81E5177893}" tlbid="{EE9C4909-407C-48DC-B58A-09B68B4A79BC}"&gt;&lt;/comClass&gt;</p>
<p>&nbsp;&nbsp;&nbsp; &lt;typelib tlbid="{EE9C4909-407C-48DC-B58A-09B68B4A79BC}" version="1.0" helpdir="" flags="HASDISKIMAGE"&gt;&lt;/typelib&gt;</p>
<p>&nbsp; &lt;/file&gt;</p>
<p>&nbsp; &lt;comInterfaceExternalProxyStub name="ISimpleObject" iid="{810356FC-23AA-4DAD-8A4C-CDF0CB768AE6}" tlbid="{EE9C4909-407C-48DC-B58A-09B68B4A79BC}" proxyStubClsid32="{00020424-0000-0000-C000-000000000046}"&gt;&lt;/comInterfaceExternalProxyStub&gt;</p>
<p>&lt;/assembly&gt;</p>
<p><br /><span style="font-size: small;"> <br /> Here is a critical step, we need to add ThreadingModel = "Apartment" attribute inside comclass node. The last code looks like:<br /> </span><span style="font-size: small;"><span style="font-family: Calibri;">&lt;?xml version="1.0" encoding="UTF-8" standalone="yes"?&gt;</span></span></p>
<p><span style="font-size: small;"><span style="font-family: Calibri;">&lt;assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"&gt;</span></span></p>
<p><span style="font-size: small;"><span style="font-family: Calibri;">&nbsp; &lt;assemblyIdentity name="CppCOMServerDLL" version="1.0.0.0" processorArchitecture="x86"&gt;&lt;/assemblyIdentity&gt;</span></span></p>
<p><span style="font-size: small;"><span style="font-family: Calibri;">&nbsp; &lt;file name="CppDllCOMServer.dll" hashalg="SHA1"&gt;</span></span></p>
<p><span style="font-size: small;"><span style="font-family: Calibri;">&nbsp;&nbsp;&nbsp; &lt;comClass threadingModel="Apartment" clsid="{09C969C2-969F-4029-A630-BF81E5177893}" tlbid="{EE9C4909-407C-48DC-B58A-09B68B4A79BC}"&gt;&lt;/comClass&gt;</span></span></p>
<p><span style="font-size: small;"><span style="font-family: Calibri;">&nbsp;&nbsp;&nbsp; &lt;typelib tlbid="{EE9C4909-407C-48DC-B58A-09B68B4A79BC}" version="1.0" helpdir="" flags="HASDISKIMAGE"&gt;&lt;/typelib&gt;</span></span></p>
<p><span style="font-size: small;"><span style="font-family: Calibri;">&nbsp; &lt;/file&gt;</span></span></p>
<p><span style="font-size: small;"><span style="font-family: Calibri;">&nbsp; &lt;comInterfaceExternalProxyStub name="ISimpleObject" iid="{810356FC-23AA-4DAD-8A4C-CDF0CB768AE6}" tlbid="{EE9C4909-407C-48DC-B58A-09B68B4A79BC}" proxyStubClsid32="{00020424-0000-0000-C000-000000000046}"&gt;&lt;/comInterfaceExternalProxyStub&gt;</span></span></p>
<p><span style="font-size: small;"><span style="font-family: Calibri;">&lt;/assembly&gt;</span></span></p>
<p><br /><span style="font-size: small;"> The third part, we reference this COM component into our Windows Store App.<br /> First, create a C++ project (Blank App template) of Windows Store App, and then drag a TextBlock named tb1 into the MainPage.<br /> <br /> Open containing folder of the App project. Copy the following files from ATL project and then paste into the project folder<br /> CppDllCOMServer.dll<br /> Application.manifest<br /> CppDllCOMServer_i.h (CppDllCOMServer_h.h If you directly use CppDllCOMServer sample, please add this header file)<br /> SimpleObject.h<br /> <br /> Clicking on Show All Files button in project view, we can see red icon in front of the coped files, which means they have not been compiled in this project.<br /> &nbsp;<a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/55/98/4174.5.jpg" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-55-98/4174.5.jpg"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/55/98/4174.5.jpg" original-url="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-55-98/4174.5.jpg" alt="" border="0" /></a><br /> <br /> We need to deploy CppDllCOMServer.dll and Application.manifest together to the installation directory of the project.<br /> Right-click CppDllCOMServer.dll-&gt; added to the project<br /> Right-click again CppDllCOMServer.dll -&gt; Properties<br /> &nbsp;<a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/55/98/8171.6.jpg" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-55-98/8171.6.jpg"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/55/98/8171.6.jpg" original-url="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-55-98/8171.6.jpg" alt="" border="0" /></a><br /> select the Content </span><span style="font-size: small;"><span style="font-family: Calibri;">property to </span>True, select File Type <span style="font-family: Calibri;">property to</span></span><span style="font-size: small;"> Document.<br /> Application.manifest file requires the same operation. Please note that the default value of Application.manifest&rsquo;s File Type <span style="font-family: Calibri;">property </span></span><span style="font-size: small;">is not Document, if it were not be changed, it would participated in Visual Studio compiler and caused saying Application configuration error.<br /> <br /> Next, we are going to call Free-COM's method in ManiPage.xaml.cpp, first of all, to reference the header file<br /> </span>#include "SimpleObject.h"</p>
<p><span style="font-size: small;">For this header file, we have to modify several points to note,<br /> 1 cannot exist ATL&rsquo;s method or namespace.<br /> 2 all inside methods must be public, other protected or private member variables and functions can delete.<br /> (This header file cannot use the macro and class ATL provided, user need to manually implement interface methods, for details please see next example code)<br /> The main purpose of adding this header file is to explain the source of the classes and interfaces in Free-COM in compile time.<br /> <br /> The class implements in the sample either downloaded or built with ATL can change to the following code, which removes the ATL template, and private or protected functions and members.<br /> </span>class SimpleObject : public ISimpleObject</p>
<p>{</p>
<p>public:</p>
<p>&nbsp;&nbsp;&nbsp; // IUnknown</p>
<p>&nbsp;&nbsp;&nbsp; IFACEMETHODIMP QueryInterface(REFIID riid, void **ppv);</p>
<p>&nbsp;&nbsp;&nbsp; IFACEMETHODIMP_(ULONG) AddRef();</p>
<p>&nbsp;&nbsp;&nbsp; IFACEMETHODIMP_(ULONG) Release();</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp; // IDispatch</p>
<p>&nbsp;&nbsp;&nbsp; IFACEMETHODIMP GetTypeInfoCount(UINT *pctinfo);</p>
<p>&nbsp;&nbsp;&nbsp; IFACEMETHODIMP GetTypeInfo(UINT itinfo, LCID lcid, ITypeInfo **pptinfo);</p>
<p>&nbsp;&nbsp;&nbsp; IFACEMETHODIMP GetIDsOfNames(REFIID riid, LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID* rgdispid);</p>
<p>&nbsp;&nbsp;&nbsp; IFACEMETHODIMP Invoke(DISPID dispidMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pdispParams, VARIANT *pvarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr);</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp; // ISimpleObject</p>
<p>&nbsp;&nbsp; // IFACEMETHODIMP get_FloatProperty(FLOAT *pVal);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //IFACEMETHODIMP put_FloatProperty(FLOAT newVal);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IFACEMETHODIMP HelloWorld(BSTR *pRet);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //IFACEMETHODIMP GetProcessThreadID(LONG *pdwProcessId, LONG *pdwThreadId);</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp; SimpleObject();</p>
<p>};</p>
<p><br /><span style="font-size: small;"> Finally, we call this COM in OnNavigatedTo method of MainPage.xaml.cpp, and then modify content inside tb1, please add the following code. And note to check if the following CLSID and IID matches COM dll project (consistent with CppDllCOMServer.idl).<br /> <br /> </span>void MainPage::OnNavigatedTo(NavigationEventArgs^ e)</p>
<p>{</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //Create an instance of the component</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //Interface for ISimpleObject: {810356FC-23AA-4DAD-8A4C-CDF0CB768AE6}</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //CLSID for SimpleObject is {09C969C2-969F-4029-A630-BF81E5177893}</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; const GUID CLSID_SimpleObj = { 0x09C969C2, 0x969F, 0x4029, {0xA6,0x30,0xBF,0x81,0xE5,0x17,0x78,0x93} };</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; const IID ISimpleIID = {0x810356FC,0x23AA,0x4DAD, {0x8A,0x4C,0xCD,0xF0,0xCB,0x76,0x8A,0xE6} };</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HRESULT hr;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MULTI_QI arrMultiQI [1] = {&amp;ISimpleIID, NULL, 0};</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //Use the new CCI API</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hr = CoCreateInstanceFromApp(CLSID_SimpleObj,NULL,CLSCTX_ALL,NULL,1,arrMultiQI);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OutputDebugString(L"Just Called CCIFromApp");</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ISimpleObject *pSimpleObj = reinterpret_cast&lt;ISimpleObject*&gt;(arrMultiQI[0].pItf);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BSTR myBSTR = nullptr;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //Call the COM component to get a BSTR</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hr = pSimpleObj-&gt;HelloWorld(&amp;myBSTR);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OutputDebugString(L"I should have a BSTR now");</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; size_t nlen;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //figure out the size so we can make a local copy</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; nlen = (wcslen(myBSTR))+1;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; wchar_t* sMyString = new wchar_t[nlen];</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //Make a local copy of the string</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; wcscpy_s(sMyString,nlen,myBSTR);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //next call SysFreeString but oleaut32.lib</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //needs added as a linker additional dependency first</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //::SysFreeString(myBSTR);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OutputDebugString(L"The BSTR should be gone now and I have the string");</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //create a string XAML can display</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String^ s = ref new String(myBSTR,nlen);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //display the string</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tb1-&gt;Text=s;</p>
<p>&nbsp;</p>
<p>}</p>
<p><br /><span style="font-size: small;"> Finally, compile and then execute it.<br /> </span>The realization of COM in this doc mainly includes how to manually create a COM object, but does not cover how to create the corresponding COM factory.</p>]]></content:encoded>
    </item>
    <item>
      <title>How to do data conversion in Windows Store app</title>
      <link>https://docs.microsoft.com/archive/blogs/win8devsupport/how-to-do-data-conversion-in-windows-store-app</link>
      <pubDate>Tue, 14 May 2013 22:07:32 GMT</pubDate>
      <dc:creator><![CDATA[Robin_Yang]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/win8devsupport/2013/05/14/how-to-do-data-conversion-in-windows-store-app/</guid>
      <description><![CDATA[Q: How to convert streams in .NET?
A: Here is the list to show the different stream types...]]></description>
      <content:encoded><![CDATA[<p><span style="font-size: small;"><span style="font-family: Calibri;"><strong>Q: How to convert streams in .NET?</strong><strong></strong></span></span></p>
<p><span style="font-size: small;"><span style="font-family: Calibri;">A: Here is the list to show the different stream types conversion.</span></span></p>
<p><span style="font-size: small;"><span style="font-family: Calibri;">Conversion between Stream and IRandomAccessStream</span></span></p>
<div>
<p><span style="font-size: small;"><span style="font-family: Calibri;">// stream to IRandomAccessStream</span></span></p>
<p><span style="font-size: small;"><span style="font-family: Calibri;">var randomAccessStream = new InMemoryRandomAccessStream();</span></span></p>
<p><span style="font-size: small;"><span style="font-family: Calibri;">var outputStream = randomAccessStream.GetOutputStreamAt(0);</span></span></p>
<p><span style="font-size: small;"><span style="font-family: Calibri;">await RandomAccessStream.CopyAsync(stream.AsInputStream(), outputStream);</span></span></p>
<p><span style="font-family: Calibri; font-size: small;">&nbsp;</span></p>
<p><span style="font-size: small;"><span style="font-family: Calibri;">// IRandomAccessStream to stream</span></span></p>
<p><span style="font-size: small;"><span style="font-family: Calibri;">Stream stream = WindowsRuntimeStreamExtensions.AsStreamForRead(randomStream.GetInputStreamAt(0));</span></span></p>
</div>
<div>
<p><span style="font-family: Calibri; font-size: small;">&nbsp;</span></p>
</div>
<p><span style="font-size: small;"><span style="font-family: Calibri;">Conversion between IBuffer and Stream</span></span></p>
<div>
<p><span style="font-size: small;"><span style="font-family: Calibri;">// buffer to stream</span></span></p>
<p><span style="font-size: small;"><span style="font-family: Calibri;">Stream stream = WindowsRuntimeBufferExtensions.AsStream(buffer);</span></span></p>
<p><span style="font-family: Calibri; font-size: small;">&nbsp;</span></p>
<p><span style="font-size: small;"><span style="font-family: Calibri;">// stream to buffer</span></span></p>
<p><span style="font-size: small;"><span style="font-family: Calibri;">MemoryStream memoryStream = new MemoryStream();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></p>
<p><span style="font-size: small;"><span style="font-family: Calibri;">&nbsp;if (stream != null)</span></span></p>
<p><span style="font-size: small;"><span style="font-family: Calibri;">&nbsp;{</span></span></p>
<p><span style="font-size: small;"><span style="font-family: Calibri;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; byte[] bytes = ReadFully(stream);</span></span></p>
<p><span style="font-size: small;"><span style="font-family: Calibri;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (bytes != null)</span></span></p>
<p><span style="font-size: small;"><span style="font-family: Calibri;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></span></p>
<p><span style="font-size: small;"><span style="font-family: Calibri;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var binaryWriter = new BinaryWriter(memoryStream);</span></span></p>
<p><span style="font-size: small;"><span style="font-family: Calibri;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; binaryWriter.Write(bytes);</span></span></p>
<p><span style="font-size: small;"><span style="font-family: Calibri;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></span></p>
<p><span style="font-size: small;"><span style="font-family: Calibri;">&nbsp; } </span></span></p>
<p><span style="font-size: small;"><span style="font-family: Calibri;">&nbsp;IBuffer buffer=WindowsRuntimeBufferExtensions.GetWindowsRuntimeBuffer(memoryStream,0,(int)memoryStream.Length);</span></span></p>
</div>
<div>
<p><span style="font-family: Calibri; font-size: small;">&nbsp;</span></p>
</div>
<p><span style="font-size: small;"><span style="font-family: Calibri;">Conversion between IRandomAccessStream and FileInputStream/FileOutputStream</span></span></p>
<div>
<p><span style="font-size: small;"><span style="font-family: Calibri;">FileInputStream inputStream = randomStream.GetInputStreamAt(0) as FileInputStream;</span></span></p>
<p><span style="font-family: Calibri; font-size: small;">&nbsp;</span></p>
<p><span style="font-size: small;"><span style="font-family: Calibri;">FileOutputStream outStream = randomStream.GetOutputStreamAt(0) as FileOutputStream;</span></span></p>
</div>
<div>
<p><span style="font-family: Calibri; font-size: small;">&nbsp;</span></p>
</div>
<p><span style="font-size: small;"><span style="font-family: Calibri;">Related MSDN Forum Threads </span></span></p>
<p><a href="http://social.msdn.microsoft.com/Forums/en-US/winappswithcsharp/thread/4cda684d-77bf-4a0f-b3bd-a6b6a895bfff"><span style="font-family: Calibri; font-size: small;">http://social.msdn.microsoft.com/Forums/en-US/winappswithcsharp/thread/4cda684d-77bf-4a0f-b3bd-a6b6a895bfff</span></a></p>
<p><a href="http://social.msdn.microsoft.com/Forums/en-US/winappswithcsharp/thread/4b2d1889-d4dd-4980-adef-540db2836239/"><span style="font-family: Calibri; font-size: small;">http://social.msdn.microsoft.com/Forums/en-US/winappswithcsharp/thread/4b2d1889-d4dd-4980-adef-540db2836239/</span></a></p>
<p><a href="http://social.msdn.microsoft.com/Forums/en-US/winappswithcsharp/thread/5d76bbc4-caed-43dc-8d68-6edc47cffd3b/"><span style="font-family: Calibri; font-size: small;">http://social.msdn.microsoft.com/Forums/en-US/winappswithcsharp/thread/5d76bbc4-caed-43dc-8d68-6edc47cffd3b/</span></a></p>
<p><span style="font-family: Calibri; font-size: small;">&nbsp;</span></p>
<p><span style="font-size: small;"><span style="font-family: Calibri;"><strong>Q: How to convert IBuffer and COM IStream in C++/CX?</strong><strong></strong></span></span></p>
<p><span style="font-size: small;"><span style="font-family: Calibri;">A: Conversion between IBuffer and COM IStream</span></span></p>
<div>
<p><span style="font-size: small;"><span style="font-family: Calibri;">// IBuffer to IStream</span></span></p>
<p><span style="font-size: small;"><span style="font-family: Calibri;">IStream* createIStreamFromIBuffer(Streams::IBuffer ^buffer) &nbsp;{</span></span></p>
<p><span style="font-size: small;"><span style="font-family: Calibri;">&nbsp;&nbsp;&nbsp; // convert the IBuffer into an IStream to be used with WIC</span></span></p>
<p><span style="font-size: small;"><span style="font-family: Calibri;">&nbsp;&nbsp;&nbsp; IStream *fileContentsStream;</span></span></p>
<p><span style="font-size: small;"><span style="font-family: Calibri;">&nbsp;&nbsp;&nbsp; HRESULT res = CreateStreamOnHGlobal(NULL, TRUE, &amp;fileContentsStream);</span></span></p>
<p><span style="font-size: small;"><span style="font-family: Calibri;">&nbsp;&nbsp;&nbsp; if (FAILED(res) || !fileContentsStream) {</span></span></p>
<p><span style="font-size: small;"><span style="font-family: Calibri;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw ref new FailureException();</span></span></p>
<p><span style="font-size: small;"><span style="font-family: Calibri;">&nbsp;&nbsp;&nbsp; }</span></span></p>
<p><span style="font-size: small;"><span style="font-family: Calibri;">&nbsp;&nbsp;&nbsp; Streams::DataReader^ dataReader = Streams::DataReader::FromBuffer(buffer);</span></span></p>
<p><span style="font-size: small;"><span style="font-family: Calibri;">&nbsp;&nbsp;&nbsp; // read the data into the stream in chunks of 1MB to preserve memory</span></span></p>
<p><span style="font-size: small;"><span style="font-family: Calibri;">&nbsp;&nbsp;&nbsp; while (dataReader-&gt;UnconsumedBufferLength &gt; 0) {</span></span></p>
<p><span style="font-size: small;"><span style="font-family: Calibri;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; UINT chunkSize = min(1024*1024, dataReader-&gt;UnconsumedBufferLength);</span></span></p>
<p><span style="font-size: small;"><span style="font-family: Calibri;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; auto data = ref new Platform::Array&lt;uint8&gt;(chunkSize);</span></span></p>
<p><span style="font-size: small;"><span style="font-family: Calibri;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dataReader-&gt;ReadBytes(data);</span></span></p>
<p><span style="font-size: small;"><span style="font-family: Calibri;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ULONG written;</span></span></p>
<p><span style="font-size: small;"><span style="font-family: Calibri;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; res = fileContentsStream-&gt;Write(data-&gt;Data, chunkSize, &amp;written);</span></span></p>
<p><span style="font-size: small;"><span style="font-family: Calibri;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (FAILED(res) || written != chunkSize) {</span></span></p>
<p><span style="font-size: small;"><span style="font-family: Calibri;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fileContentsStream-&gt;Release();</span></span></p>
<p><span style="font-size: small;"><span style="font-family: Calibri;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw ref new FailureException();</span></span></p>
<p><span style="font-size: small;"><span style="font-family: Calibri;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></span></p>
<p><span style="font-size: small;"><span style="font-family: Calibri;">&nbsp;&nbsp;&nbsp; }</span></span></p>
<p><span style="font-size: small;"><span style="font-family: Calibri;">&nbsp;&nbsp;&nbsp; return fileContentsStream;</span></span></p>
<p><span style="font-size: small;"><span style="font-family: Calibri;">}</span></span></p>
<p><span style="font-family: Calibri; font-size: small;">&nbsp;</span></p>
<p><span style="font-size: small;"><span style="font-family: Calibri;">//Com buffer to IBufferByteAccess</span></span></p>
<p><span style="font-size: small;"><span style="font-family: Calibri;">IUnknown* pUnk = reinterpret_cast&lt;IUnknown*&gt;(buffer);</span></span></p>
<p><span style="font-size: small;"><span style="font-family: Calibri;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></p>
<p><span style="font-size: small;"><span style="font-family: Calibri;">IBufferByteAccess* pBufferByteAccess = nullptr;</span></span></p>
<p><span style="font-size: small;"><span style="font-family: Calibri;">HRESULT hr = pUnk-&gt;QueryInterface(IID_PPV_ARGS(&amp;pBufferByteAccess);</span></span></p>
</div>
<p><span style="font-size: small;"><span style="font-family: Calibri;">Related MSDN Forum Threads </span></span></p>
<p><a href="http://social.msdn.microsoft.com/Forums/en-US/winappswithnativecode/thread/dc39d796-1a3a-48e1-a095-2609600d01b7/"><span style="font-family: Calibri; font-size: small;">http://social.msdn.microsoft.com/Forums/en-US/winappswithnativecode/thread/dc39d796-1a3a-48e1-a095-2609600d01b7/</span></a></p>
<p><a href="http://social.msdn.microsoft.com/Forums/en-US/winappswithnativecode/thread/5e70aba9-1eb4-4960-88ba-8851bb9df365"><span style="font-family: Calibri; font-size: small;">http://social.msdn.microsoft.com/Forums/en-US/winappswithnativecode/thread/5e70aba9-1eb4-4960-88ba-8851bb9df365</span></a></p>
<p><a href="http://social.msdn.microsoft.com/Forums/br/winappswithnativecode/thread/3acd59e7-389d-4147-95fa-15a9b1ad765c"><span style="font-family: Calibri; font-size: small;">http://social.msdn.microsoft.com/Forums/br/winappswithnativecode/thread/3acd59e7-389d-4147-95fa-15a9b1ad765c</span></a></p>
<p><span style="font-family: Calibri; font-size: small;">&nbsp;</span></p>
<p><span style="font-size: small;"><span style="font-family: Calibri;"><strong>Q: How to convert native char* and String^ in C++/CX?</strong><strong></strong></span></span></p>
<p><span style="font-size: small;"><span style="font-family: Calibri;">A: Conversion between String^ and Char*</span></span></p>
<div>
<p><span style="font-size: small;"><span style="font-family: Calibri;">// String^ to char*</span></span></p>
<p><span style="font-size: small;"><span style="font-family: Calibri;">String^ str1 = "AAAAAAAA";</span></span></p>
<p><span style="font-size: small;"><span style="font-family: Calibri;">wstring wstr( str1-&gt;Data() ); </span></span></p>
<p><span style="font-size: small;"><span style="font-family: Calibri;">int len = WideCharToMultiByte(CP_ACP, 0, wstr.c_str(), wstr.size(), NULL, 0, NULL, NULL); </span></span></p>
<p><span style="font-size: small;"><span style="font-family: Calibri;">char* buffer = new char[len + 1];&nbsp; </span></span></p>
<p><span style="font-size: small;"><span style="font-family: Calibri;">WideCharToMultiByte(CP_ACP, 0, wstr.c_str(), wstr.size(), buffer, len, NULL, NULL); </span></span></p>
<p><span style="font-size: small;"><span style="font-family: Calibri;">buffer[len] = '\0'; </span></span></p>
<p><span style="font-family: Calibri; font-size: small;">&nbsp;</span></p>
<p><span style="font-size: small;"><span style="font-family: Calibri;">//Char* to String^</span></span></p>
<p><span style="font-size: small;"><span style="font-family: Calibri;">std::wstring s2ws(const std::string&amp; s)</span></span></p>
<p><span style="font-size: small;"><span style="font-family: Calibri;">{</span></span></p>
<p><span style="font-size: small;"><span style="font-family: Calibri;">&nbsp;&nbsp;&nbsp; int len;</span></span></p>
<p><span style="font-size: small;"><span style="font-family: Calibri;">&nbsp;&nbsp;&nbsp; int slength = (int)s.length() + 1;</span></span></p>
<p><span style="font-size: small;"><span style="font-family: Calibri;">&nbsp;&nbsp;&nbsp; len = MultiByteToWideChar(CP_ACP, 0, s.c_str(), slength, 0, 0); </span></span></p>
<p><span style="font-size: small;"><span style="font-family: Calibri;">&nbsp;&nbsp;&nbsp; wchar_t* buf = new wchar_t[len];</span></span></p>
<p><span style="font-size: small;"><span style="font-family: Calibri;">&nbsp;&nbsp;&nbsp; MultiByteToWideChar(CP_ACP, 0, s.c_str(), slength, buf, len);</span></span></p>
<p><span style="font-size: small;"><span style="font-family: Calibri;">&nbsp;&nbsp;&nbsp; std::wstring r(buf);</span></span></p>
<p><span style="font-size: small;"><span style="font-family: Calibri;">&nbsp;&nbsp;&nbsp; delete[] buf;</span></span></p>
<p><span style="font-size: small;"><span style="font-family: Calibri;">&nbsp;&nbsp;&nbsp; return r;</span></span></p>
<p><span style="font-size: small;"><span style="font-family: Calibri;">}</span></span></p>
<p><span style="font-family: Calibri; font-size: small;">&nbsp;</span></p>
<p><span style="font-size: small;"><span style="font-family: Calibri;">String ^statusString = ref new String( s2ws(statusHelper).c_str());</span></span></p>
</div>
<p><span style="font-size: small;"><span style="font-family: Calibri;">Related MSDN Forum Threads </span></span></p>
<p><a href="http://social.msdn.microsoft.com/Forums/en-US/winappswithnativecode/thread/c39b3060-0c2d-40b7-aa8c-035f1fad441c"><span style="font-family: Calibri; font-size: small;">http://social.msdn.microsoft.com/Forums/en-US/winappswithnativecode/thread/c39b3060-0c2d-40b7-aa8c-035f1fad441c</span></a></p>
<p><a href="http://social.msdn.microsoft.com/Forums/en-US/winappswithnativecode/thread/48794f27-0db7-4335-bdfe-dca664ca28a9"><span style="font-family: Calibri; font-size: small;">http://social.msdn.microsoft.com/Forums/en-US/winappswithnativecode/thread/48794f27-0db7-4335-bdfe-dca664ca28a9</span></a><span style="font-family: Calibri; font-size: small;">&nbsp;</span></p>]]></content:encoded>
    </item>
    <item>
      <title>Using database in Windows Store apps (I)</title>
      <link>https://docs.microsoft.com/archive/blogs/win8devsupport/using-database-in-windows-store-apps-i</link>
      <pubDate>Wed, 09 Jan 2013 22:00:00 GMT</pubDate>
      <dc:creator><![CDATA[Robin_Yang]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/win8devsupport/2013/01/09/using-database-in-windows-store-apps-i/</guid>
      <description><![CDATA[Author: Aaron Xue
Introduction
There are lots of discussions about using database in Windows Store...]]></description>
      <content:encoded><![CDATA[<p style="text-align: center;"><span style="font-size: small;"><span style="font-family: Calibri;">Author: Aaron Xue</span></span></p>
<p><strong><span style="font-size: small;"><span style="font-family: Calibri;">Introduction</span></span></strong></p>
<p><span style="font-size: small;"><span style="font-family: Calibri;">There are lots of discussions about using database in Windows Store apps in MSDN forum. These discussions mainly focus on the usage of SQL database. Based on this scenario, we developed a series of articles along with sample code and demos used to demonstrate how to access both local database and remote database. </span></span></p>
<p><span style="font-size: small;"><span style="font-family: Calibri;">This topic consists of four categories as below.</span></span></p>
<ol>
<li><span style="font-size: small;"><span style="font-family: Calibri;">Overview of main approaches to access database in Windows Store apps.</span></span></li>
<li><span style="font-size: small;"><span style="font-family: Calibri;">How to access local database:</span></span><ol>
<li><span style="font-size: small;"><span style="font-family: Calibri;">How to use SQLite for Windows Runtime and how to use sqlite-net library to manipulate SQLite database. </span></span></li>
<li><span style="font-size: small;"><span style="font-family: Calibri;">How to use Extensible Storage Engine (ESE) or known as JET APIs. </span></span></li>
</ol></li>
<li><span style="font-size: small;"><span style="font-family: Calibri;">How to use WCF to access database in Windows Store apps.</span></span></li>
<li><span style="font-size: small;"><span style="font-family: Calibri;">How to access remote database.</span></span></li>
</ol>
<p><span style="font-size: small;"><span style="font-family: Calibri;">First, we talk about how to access local database in Windows Store apps. SQLite would be a good choice.</span></span></p>
<p><strong><span style="font-size: small;"><span style="font-family: Calibri;">What is SQLite?</span></span></strong></p>
<p>SQLite&nbsp;is a&nbsp;relational database management system&nbsp;contained in a small Cprogramming&nbsp;library. In contrast to other database management systems, SQLite is not a separate process that is accessed from the client application, but an integral part of it. SQLite's functionality through simple&nbsp;function calls, which reduce&nbsp;latency&nbsp;in database access. SQLite stores the entire database as a single cross-platform&nbsp;file&nbsp;on a host machine.[1] These features make SQLite to be efficient and easy to backup.</p>
<p><strong>Please note:</strong> SQLite doesn&rsquo;t support all the SQL features. The following features are not supported in SQLite.[2]</p>
<ol>
<li><strong>RIGHT JOIN and FULL JOIN</strong></li>
<li><strong>Complete ALTER TABLE support</strong></li>
<li><strong>Complete trigger support</strong></li>
<li><strong>Writing to VIEWs</strong></li>
<li><strong>GRANT and REVOKE</strong></li>
</ol>
<p>&nbsp;</p>
<p>[1].SQLite Wikipedia:<a href="http://en.wikipedia.org/wiki/Sqlite"><span style="color: #0000ff;">http://en.wikipedia.org/wiki/Sqlite</span></a></p>
<p>[2].SQL features that SQLite do not implement:<a href="http://www.sqlite.org/omitted.html"><span style="color: #0000ff;">http://www.sqlite.org/omitted.html</span></a></p>
<p>&nbsp;</p>
<p><strong><span style="font-family: Calibri;"><span style="font-size: small;">Including SQLite in the app</span></span></strong></p>
<p><span style="font-family: Calibri;"><span style="font-size: small;">SQLite team has made a VS extension called SQLite for Windows Runtime. </span></span></p>
<p><span style="font-family: Calibri;"><span style="font-size: small;">Please refer to:</span></span></p>
<p><a href="http://www.sqlite.org/download.html"><span style="color: #0000ff; font-family: Calibri; font-size: small;">http://www.sqlite.org/download.html</span></a></p>
<p>&nbsp;<a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/55/98/4744.0.jpg" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-55-98/4744.0.jpg"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/55/98/4744.0.jpg" original-url="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-55-98/4744.0.jpg" alt="" border="0" /></a></p>
<p><span style="font-family: Calibri;"><span style="font-size: small;">Then we will get a VSIX file which is a extension of Visual Studio. After installing the VSIX file, right click on our application and select Add reference:</span></span></p>
<p>&nbsp;<a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/55/98/6215.1.jpg" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-55-98/6215.1.jpg"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/55/98/6215.1.jpg" original-url="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-55-98/6215.1.jpg" alt="" border="0" /></a></p>
<p><span style="font-family: Calibri;"><span style="font-size: small;">We will see SQLite for Windows Runtime. Please select both C++ runtime package and SQLite package. SQLite need a runtime environment so that it can pass WACK.</span></span></p>
<p><span style="font-family: Calibri;"><span style="font-size: small;">After finishing the step, the SQLite will exist in a sqlite3.dll file. If we want to use it in C# we have to use P/Invoke to get the methods in dll. That&rsquo;s a lot of works. We recommend using sqlite-net. This is a open source, light-weighted library which makes .Net platform to manipulate SQLite database. We can get sqlite-net via Nuget.</span></span></p>
<p><span style="font-family: Calibri;"><span style="font-size: small;">In Tools menu, select as follows:</span></span></p>
<p>&nbsp;<a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/55/98/0576.2.jpg" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-55-98/0576.2.jpg"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/55/98/0576.2.jpg" original-url="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-55-98/0576.2.jpg" alt="" border="0" /></a></p>
<p><span style="font-family: Calibri;"><span style="font-size: small;">Then, input in the console:</span></span></p>
<p>&nbsp;<a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/55/98/4278.3.jpg" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-55-98/4278.3.jpg"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/55/98/4278.3.jpg" original-url="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-55-98/4278.3.jpg" alt="" border="0" /></a></p>
<p><span style="font-family: Calibri;"><span style="font-size: small;">We will get these two files:</span></span></p>
<p>&nbsp;<a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/55/98/3683.4.jpg" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-55-98/3683.4.jpg"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/55/98/3683.4.jpg" original-url="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-55-98/3683.4.jpg" alt="" border="0" /></a></p>
<p><span style="font-family: Calibri;"><span style="font-size: small;">The files call dll methods using P/Invoke and package them into asynchronous methods. We will give some samples to show how to use the async methods.</span></span></p>
<p><strong><span style="font-family: Calibri;"><span style="font-size: small;">Usage of SQLite-net</span></span></strong></p>
<p><strong><span style="font-family: Calibri;"><span style="font-size: small;">Create table:</span></span></strong></p>
<p><span style="font-family: Calibri;"><span style="font-size: small;">I prepare to create 2 tables as the following charts show:</span></span></p>
<p><span style="font-size: small;"><span style="font-family: Calibri;">Persons table</span>：</span></p>
<p>&nbsp;<a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/55/98/7065.5.jpg" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-55-98/7065.5.jpg"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/55/98/7065.5.jpg" original-url="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-55-98/7065.5.jpg" alt="" border="0" /></a></p>
<p><span style="font-size: small;"><span style="font-family: Calibri;">Orders table</span>：</span></p>
<p>&nbsp;<a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/55/98/3833.6.jpg" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-55-98/3833.6.jpg"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/55/98/3833.6.jpg" original-url="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-55-98/3833.6.jpg" alt="" border="0" /></a></p>
<p><span style="font-size: small;"><span style="font-family: Calibri;">XAML</span>：</span></p>
<p>&lt;common:LayoutAwarePage</p>
<p>&nbsp;&nbsp; &nbsp;x:Name="pageRoot"</p>
<p>&nbsp;&nbsp; &nbsp;x:Class="App1.BasicPage1"</p>
<p>&nbsp;&nbsp; &nbsp;DataContext="{Binding DefaultViewModel, RelativeSource={RelativeSource Self}}"</p>
<p>&nbsp;&nbsp; &nbsp;xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"</p>
<p>&nbsp;&nbsp; &nbsp;xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"</p>
<p>&nbsp;&nbsp; &nbsp;xmlns:local="using:App1"</p>
<p>&nbsp;&nbsp; &nbsp;xmlns:common="using:App1.Common"</p>
<p>&nbsp;&nbsp; &nbsp;xmlns:d="http://schemas.microsoft.com/expression/blend/2008"</p>
<p>&nbsp;&nbsp; &nbsp;xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"</p>
<p>&nbsp;&nbsp; &nbsp;mc:Ignorable="d"</p>
<p>&nbsp;&nbsp; &nbsp;&gt;</p>
<p>&nbsp;&nbsp;&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp; &lt;Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}"&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Grid.ColumnDefinitions&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ColumnDefinition Width="*" /&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ColumnDefinition Width="*" /&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/Grid.ColumnDefinitions&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Grid.RowDefinitions&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;RowDefinition Height="*" /&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;RowDefinition Height="100" /&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;RowDefinition Height="200" /&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/Grid.RowDefinitions&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ListView Name="lv1" Grid.Row="0" Grid.Column="0"&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ListView.ItemTemplate&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;DataTemplate&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;StackPanel Orientation="Horizontal"&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;StackPanel.Resources&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Style TargetType="TextBlock"&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Setter Property="Width" Value="150" /&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;Setter Property="TextAlignment" Value="Left" /&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/Style&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/StackPanel.Resources&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;TextBlock Width="50" Text="{Binding ID_P}" /&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;TextBlock Text="{Binding FirstName}" /&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;TextBlock Text="{Binding LastName}" /&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;TextBlock Text="{Binding Address}" /&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;TextBlock Text="{Binding City}" /&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/StackPanel&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/DataTemplate&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/ListView.ItemTemplate&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/ListView&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ListView Name="lv2" Grid.Row="0" Grid.Column="1"&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ListView.ItemTemplate&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;DataTemplate&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;StackPanel Orientation="Horizontal"&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;StackPanel.Resources&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Style TargetType="TextBlock"&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Setter Property="Width" Value="150" /&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Setter Property="TextAlignment" Value="Left" /&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/Style&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/StackPanel.Resources&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;TextBlock Width="50" Text="{Binding ID_O}" /&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;TextBlock Text="{Binding OrderNo}" /&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;TextBlock Text="{Binding ID_P}" /&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/StackPanel&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/DataTemplate&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/ListView.ItemTemplate&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/ListView&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;StackPanel Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="2" Orientation="Horizontal" HorizontalAlignment="Left"&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Button Content="Add 1 line" Click="Button_Click_1" /&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Button Content="Update" Click="Button_Click_2" /&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Button Content="SQL query" Click="Button_Click_3" /&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/StackPanel&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ListView Grid.Row="2" Grid.Column="0" Name="lv3"&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ListView.ItemTemplate&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;DataTemplate&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;StackPanel Orientation="Horizontal"&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;StackPanel.Resources&gt;</p>
<p>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;Style TargetType="TextBlock"&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Setter Property="Width" Value="150" /&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Setter Property="TextAlignment" Value="Left" /&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/Style&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/StackPanel.Resources&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;TextBlock Width="50" Text="{Binding ID_P}" /&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;TextBlock Text="{Binding FirstName}" /&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;TextBlock Text="{Binding LastName}" /&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;TextBlock Text="{Binding Address}" /&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;TextBlock Text="{Binding City}" /&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/StackPanel&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/DataTemplate&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/ListView.ItemTemplate&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/ListView&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ListView Grid.Row="2" Grid.Column="1" Name="lv4"&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ListView.ItemTemplate&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;DataTemplate&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;StackPanel Orientation="Horizontal"&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;StackPanel.Resources&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Style TargetType="TextBlock"&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Setter Property="Width" Value="150" /&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Setter Property="TextAlignment" Value="Left" /&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/Style&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/StackPanel.Resources&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;TextBlock Text="{Binding FirstName}" /&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;TextBlock Text="{Binding LastName}" /&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;TextBlock Text="{Binding OrderNo}" /&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/StackPanel&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/DataTemplate&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/ListView.ItemTemplate&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/ListView&gt;</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp; &lt;/Grid&gt;</p>
<p>&lt;/common:LayoutAwarePage&gt;</p>
<p><span style="font-family: Calibri; font-size: small;">&nbsp;</span></p>
<p><span style="font-size: small;"><span style="font-family: Calibri;">Here are 4 ListView controls, lv1 is used for showing Persons table, lv2 is used for showing Orders table, lv3 is used for showing result1, lv4 is used for showing result2.</span></span></p>
<p><span style="font-size: small;"><span style="font-family: Calibri;">C#:</span></span></p>
<p><span style="font-size: small;"><span style="font-family: Calibri;"></span></span></p>
<p>SQLiteAsyncConnection conn;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; List&lt;Persons&gt; re1;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; List&lt;Orders&gt; re2;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public BasicPage1()</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.InitializeComponent();</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ConnData();</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; InitData();</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private void ConnData()</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var dbPath = Path.Combine(Windows.Storage.ApplicationData.Current.LocalFolder.Path, "db.sqlite");</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; conn = new SQLite.SQLiteAsyncConnection(dbPath);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;}</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private async void InitData()</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var result = await conn.CreateTablesAsync&lt;Persons, Orders&gt;();</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; List&lt;Persons&gt; persons = new List&lt;Persons&gt;()</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new Persons(){FirstName="Adams",LastName="John",Address="Oxford Street",City="London"},</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new Persons(){FirstName="Bush",LastName="George",Address="Fifth Avenue",City="New York"},</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new Persons(){FirstName="Carter",LastName="Thomas",Address="Changan Street",City="Beijing"}</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; };</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; List&lt;Orders&gt; orders = new List&lt;Orders&gt;()</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new Orders(){OrderNo="77895",ID_P=3},</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new Orders(){OrderNo="44678",ID_P=3},</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new Orders(){OrderNo="22456",ID_P=1},</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new Orders(){OrderNo="24562",ID_P=1},</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new Orders(){OrderNo="34764",ID_P=65}</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; };</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; await conn.InsertAllAsync(persons);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; await conn.InsertAllAsync(orders);</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var qu1 = conn.Table&lt;Persons&gt;();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; re1 = await qu1.ToListAsync();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.lv1.ItemsSource = re1;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var qu2 = conn.Table&lt;Orders&gt;();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; re2 = await qu2.ToListAsync();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.lv2.ItemsSource = re2;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p><span style="font-size: small;"><span style="font-family: Calibri;">If the database does not exist, SQLite will create a new one. </span></span></p>
<p><strong><span style="font-size: small;"><span style="font-family: Calibri;">Please note:</span></span></strong></p>
<p><strong><span style="font-size: small;"><span style="font-family: Calibri;">Why should the database be located in the Application data locations?</span></span></strong></p>
<p><span style="font-size: small;"><span style="font-family: Calibri;">Windows Store app is running in a sandbox, there are restrict of reading and writing files.&nbsp; If you&rsquo;re going through the Task Manager, you will find a process named RuntimeBroker. This process is responsible for checking if Windows Store app behaves as it declares. We can access files from Application data locations directly. So, if you want to create a database, it should be located in AppData folder.</span></span></p>
<p><span style="font-size: small;"><span style="font-family: Calibri;">We are using the method SQLiteAsyncConnection. InsertAllAsync(). The method can insert a collection which contains some customized class into related table. It will check the class of the object and decide which table should be inserted into.</span></span></p>
<p><span style="font-size: small;"><span style="font-family: Calibri;">We use SQLiteAsyncConnection.Table&lt;T&gt;() to get the whole table and the data in table. T is the class of table. Then using AsyncQueryTable.ToListAsync() to convert the result into List&lt;T&gt; to display the data.</span></span></p>
<p><span style="font-size: small;"><span style="font-family: Calibri;">Result:</span></span></p>
<p>&nbsp;<a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/55/98/8117.7.jpg" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-55-98/8117.7.jpg"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/55/98/8117.7.jpg" original-url="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-55-98/8117.7.jpg" alt="" border="0" /></a></p>
<p><span style="font-family: Calibri; font-size: small;">&nbsp;</span></p>
<p><strong><span style="font-size: small;"><span style="font-family: Calibri;">Insert one record:</span></span></strong></p>
<p><span style="font-size: small;"><span style="font-family: Calibri;">We call InsertAsync() method:</span></span></p>
<p>private async void Button_Click_1(object sender, RoutedEventArgs e)</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; await conn.InsertAsync(new Persons() { FirstName = "Aaron", LastName = "Xue", Address = "MinHang", City = "Shanghai" });</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var qu = conn.Table&lt;Persons&gt;();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var re = await qu.ToListAsync();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.lv3.ItemsSource = re;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p><span style="font-size: small;"><span style="font-family: Calibri;">Result:</span></span></p>
<p>&nbsp;<a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/55/98/6114.8.jpg" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-55-98/6114.8.jpg"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/55/98/6114.8.jpg" original-url="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-55-98/6114.8.jpg" alt="" border="0" /></a></p>
<p><strong><span style="font-size: small;"><span style="font-family: Calibri;">Update data in table:</span></span></strong></p>
<p><span style="font-size: small;"><span style="font-family: Calibri;">We use ExcuteAsync() method. The method will return a integer which means the rows affected by the SQL statement.</span></span></p>
<p>private async void Button_Click_2(object sender, RoutedEventArgs e)</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string city="Shanghai";</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int i = await conn.ExecuteAsync("UPDATE Persons SET City=? WHERE FirstName='Bush'", city);</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var qu = conn.Table&lt;Persons&gt;();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var re = await qu.ToListAsync();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.lv3.ItemsSource = re;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p><span style="font-size: small;"><span style="font-family: Calibri;">Result:</span></span></p>
<p>&nbsp;<a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/55/98/7776.13.jpg" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-55-98/7776.13.jpg"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/55/98/7776.13.jpg" original-url="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-55-98/7776.13.jpg" alt="" border="0" /></a></p>
<p><span style="font-size: small;"><span style="font-family: Calibri;">Now, let&rsquo;s try to use a little complex SQL statement. </span></span></p>
<p><span style="font-size: small;"><span style="font-family: Calibri;">For example:</span></span></p>
<p><span style="font-size: small;"><span style="font-family: Calibri;">SELECT Persons.FirstName,Persons.LastName,Orders.OrderNo FROM Persons LEFT JOIN Orders ON Persons.ID_P=Orders.ID_P ORDER BY Persons.FirstName</span></span></p>
<p><span style="font-size: small;"><span style="font-family: Calibri;">Code:</span></span></p>
<p>&nbsp; private async void Button_Click_3(object sender, RoutedEventArgs e)</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; List&lt;Result&gt; re = await conn.QueryAsync&lt;Result&gt;("SELECT Persons.FirstName,Persons.LastName,Orders.OrderNo FROM Persons LEFT JOIN Orders ON Persons.ID_P=Orders.ID_P ORDER BY Persons.FirstName");</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.lv4.ItemsSource = re;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p><strong><span style="font-size: small;"><span style="font-family: Calibri;">Please note: </span></span></strong></p>
<p><span style="font-size: small;"><span style="font-family: Calibri;">Here we are using QueryAsync instead ExcuteAsync() or ExcuteScalarAsync(). Because ExcuteAsync() do not return result and ExcuteScalarAsync() can only return scalar result such as &ldquo;int&rdquo;,&rdquo;string&rdquo; etc.&nbsp; </span></span></p>
<p><span style="font-size: small;"><span style="font-family: Calibri;">QueryAsync&lt;T&gt; will pass a class using T and the return is List&lt;T&gt;. That&rsquo;s a great help for us to use or to display the result.</span></span></p>
<p><span style="font-size: small;"><span style="font-family: Calibri;">Result:</span></span></p>
<p>&nbsp;<a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/55/98/3051.9.jpg" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-55-98/3051.9.jpg"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/55/98/3051.9.jpg" original-url="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-55-98/3051.9.jpg" alt="" border="0" /></a></p>
<p><span style="font-family: Calibri; font-size: small;">&nbsp;</span></p>
<p><strong><span style="font-size: small;"><span style="font-family: Calibri;">Package application</span></span></strong></p>
<p><span style="font-size: small;"><span style="font-family: Calibri;">We have already added SQLite for Windows Runtime and C++ Runtime. So the application can&rsquo;t be architecture neutral(We can&rsquo;t select Any CPU). We have to create 3 version of application (x86,x64,ARM), VS will help us to finish the job.</span></span></p>
<p>&nbsp;<a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/55/98/3542.10.jpg" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-55-98/3542.10.jpg"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/55/98/3542.10.jpg" original-url="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-55-98/3542.10.jpg" alt="" border="0" /></a></p>
<p><span style="font-family: Calibri; font-size: small;">&nbsp;</span><span style="font-size: small;"><span style="font-family: Calibri;">Just select 3 version, then we will get:</span></span></p>
<p>&nbsp;<a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/55/98/1376.11.jpg" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-55-98/1376.11.jpg"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/55/98/1376.11.jpg" original-url="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-55-98/1376.11.jpg" alt="" border="0" /></a></p>
<p><strong><span style="font-size: small;"><span style="font-family: Calibri;">WACK(Windows App Cert Kit) result</span></span></strong></p>
<p>&nbsp;<a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/55/98/4520.12.jpg" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-55-98/4520.12.jpg"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/55/98/4520.12.jpg" original-url="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-55-98/4520.12.jpg" alt="" border="0" /></a></p>
<p><span style="font-size: small;"><span style="font-family: Calibri;">The result is Pass.</span></span></p>
<p><span style="font-size: small;"><span style="font-family: Calibri;">You could download the sourcode via SkyDrive</span></span></p>
<p><a href="https://skydrive.live.com/redir?resid=AF599C8D7F814B07!272&amp;authkey=!AIR_ivlJjBHGCW8"><span style="color: #0000ff; font-family: Calibri; font-size: small;">https://skydrive.live.com/redir?resid=AF599C8D7F814B07!272&amp;authkey=!AIR_ivlJjBHGCW8</span></a></p>
<p><span style="font-size: small;"><span style="font-family: Calibri;">Finally, thanks for the great help of Tim Heuer&rsquo;s blog.</span></span></p>]]></content:encoded>
    </item>
    <item>
      <title>Using HTML5/Javascript in Windows Store apps: Data access and storage mechanism (III)</title>
      <link>https://docs.microsoft.com/archive/blogs/win8devsupport/using-html5javascript-in-windows-store-apps-data-access-and-storage-mechanism-iii</link>
      <pubDate>Wed, 09 Jan 2013 21:10:28 GMT</pubDate>
      <dc:creator><![CDATA[Robin_Yang]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/win8devsupport/2013/01/09/using-html5javascript-in-windows-store-apps-data-access-and-storage-mechanism-iii/</guid>
      <description><![CDATA[Introduction
Windows Store app offers lots of methods for data access and storage. And this article...]]></description>
      <content:encoded><![CDATA[<p><strong><span style="color: #365f91;"><span style="font-family: Cambria;">Introduction</span></span></strong></p>
<p><span style="font-size: small;"><span style="font-family: Calibri;">Windows Store app offers lots of methods for data access and storage. And this article will only focus on HTML5/JavaScript programming.</span></span></p>
<p><span style="font-family: Calibri; font-size: small;">In this tutorial, we&rsquo;ll go over Application Data, </span><a href="http://msdn.microsoft.com/en-us/library/windows/apps/hh767327.aspx"><span style="font-family: Calibri; font-size: small;">File API</span></a><span style="font-family: Calibri; font-size: small;"> , </span><a href="http://msdn.microsoft.com/en-us/library/windows/apps/hh779848.aspx"><span style="font-family: Calibri; font-size: small;">HTML5 Web Storage</span></a><span style="font-family: Calibri; font-size: small;">, </span><a href="http://msdn.microsoft.com/en-us/library/windows/apps/hh466139.aspx"><span style="font-family: Calibri; font-size: small;">Indexed Database API</span></a><span style="font-size: small;"><span style="font-family: Calibri;"> and remote data access. With these you can store more data &ndash; and store it more efficiently.</span></span></p>
<p><strong>Handle Large Data</strong></p>
<p><span style="font-size: small;"><span style="font-family: Calibri;">Generally, we can store data with IndexedDB in Windows Store app (Html5/JavaScript). Indexed Database, each app has a quota of 250MB. Among all apps on the device, the limit is 4% of the disk size or 20GB, whichever is smaller. For hard drives that are less than 30GB, the limit among all apps on the device is 375MB. Because of the overall quota among all apps, test your app to ensure its functions properly when it can store very little or even no data because other apps consume the overall quota. </span></span></p>
<p><span style="font-family: Calibri; font-size: small;">And if you want to upload or download large resources, we recommend </span><a href="http://msdn.microsoft.com/en-us/library/windows/apps/xaml/br207242.aspx"><span style="color: #0000ff; font-family: Calibri; font-size: small;">Background Transfer</span></a><span style="font-size: small;"><span style="font-family: Calibri;">. Background Transfer is primarily designed for long-term transfer operations for resources like video, music and large images. For short-term operations involving transfers of smaller resources (i.e. a couple KB), the use of provided HTTP APIs (XHR in JavaScript) is recommended.</span></span></p>
<p><strong>Indexed Database</strong></p>
<p><span style="font-size: small;"><span style="font-family: Calibri;">To demonstrate how to use IndexedDB in a real project, I make a simple application &ldquo;Creating a List with ListView and IndexedDB&rdquo;.</span></span></p>
<p><span style="font-size: small;"><span style="font-family: Calibri;">This application stores all of its data in an IndexedDB database named ListDB. This database is opened/created with the following code:</span></span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var db;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var req = window.msIndexedDB.open("ListDB", 1);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; req.onerror = function () {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; console.log("Could not open database");</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; };</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; req.onupgradeneeded = function (event) {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var newDB = event.target.result;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; newDB.createObjectStore("tasks", { keyPath: "id", autoIncrement: true });</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; };</p>
<p><span style="font-size: small;"><span style="font-family: Calibri;">The msIndexedDB.open() method accepts two parameters: the name of the database to open and the version of the database to open. If a database with a matching version already exists, then calling the msIndexedDB.open() method opens a connection to the existing database. If the database does not exist then the upgradeneeded event is raised. You handle the upgradeneeded event to create a new database. In the code above, the upgradeneeded event handler creates an object store named &ldquo;tasks&rdquo; (An object store roughly corresponds to a database table). When you add items to the tasks object store then each item gets an id property with an auto-incremented value automatically. The code above also includes an error event handler. If the IndexedDB database cannot be opened or created, for whatever reason, an error message is written to the Visual Studio 2012 JavaScript Console window.</span></span></p>
<p><span style="font-size: small;"><span style="font-family: Calibri;">You can bind the datasource and edit the listview as follow:</span></span></p>
<p>&nbsp;&nbsp;&nbsp; // Create the data source</p>
<p>&nbsp;&nbsp;&nbsp; var tasks = new WinJS.Binding.List();</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp; // Open the database</p>
<p>&nbsp;&nbsp;&nbsp; var db;</p>
<p>&nbsp;&nbsp;&nbsp; var req = window.msIndexedDB.open("ListDB", 1);</p>
<p>&nbsp;&nbsp;&nbsp; req.onerror = function () {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; console.log("Could not open database");</p>
<p>&nbsp;&nbsp;&nbsp; };</p>
<p>&nbsp;&nbsp;&nbsp; req.onupgradeneeded = function (event) {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var newDB = event.target.result;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; newDB.createObjectStore("tasks", { keyPath: "id", autoIncrement: true });</p>
<p>&nbsp;&nbsp;&nbsp; };</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp; // Load the data source with data from the database</p>
<p>&nbsp;&nbsp;&nbsp; req.onsuccess = function () {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; db = req.result;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var tran = db.transaction("tasks");</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tran.objectStore("tasks").openCursor().onsuccess = function (event) {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var cursor = event.target.result;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (cursor) {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tasks.dataSource.insertAtEnd(null, cursor.value);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;cursor.continue();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; };</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; };</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp; };</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp; // Add a new task</p>
<p>&nbsp;&nbsp;&nbsp; function addTask(taskToAdd) {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var transaction = db.transaction("tasks", "readwrite");</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var addRequest = transaction.objectStore("tasks").add(taskToAdd);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; addRequest.onsuccess = function (evt) {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; taskToAdd.id = evt.target.result;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tasks.dataSource.insertAtEnd(null, taskToAdd);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp; // Delete an existing task</p>
<p>&nbsp;&nbsp;&nbsp; function deleteTask(listViewItem) {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Database key != ListView key</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var dbKey = listViewItem.data.id;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var listViewKey = listViewItem.key;</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Remove item from db and, if success, remove item from ListView</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var transaction = db.transaction("tasks", "readwrite");</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;var deleteRequest = transaction.objectStore("tasks").delete(dbKey);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; deleteRequest.onsuccess = function () {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tasks.dataSource.remove(listViewKey);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp; // Expose the data source and functions</p>
<p>&nbsp;&nbsp;&nbsp; WinJS.Namespace.define("TaskList", {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tasks: tasks,</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; addTask: addTask,</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; deleteTask: deleteTask</p>
<p>&nbsp;&nbsp;&nbsp; });</p>
<p><span style="font-size: small;"><span style="font-family: Calibri;">And you can download the complete code in attachment.</span></span></p>
<p><strong>Background Transfer</strong></p>
<p><span style="font-size: small;"><span style="font-family: Calibri;">There are two main classes, BackgroundDownloader and BackgroundUploader. BackgroundDownloader is used to configure downloads prior to the actual creation of the download operation using CreateDownload. BackgroundUploader is used to configure upload prior to the actual creation of the upload operation using CreateUpload.</span></span></p>
<p><span style="font-size: small;"><span style="font-family: Calibri;">For example, you can configure and begin a basic download operation as follow:</span></span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var download = null;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var promise = null;</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; function DownloadFile(uriString, fileName) {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Asynchronously create the file in the pictures folder.</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Windows.Storage.KnownFolders.picturesLibrary.createFileAsync(fileName, Windows.Storage.CreationCollisionOption.generateUniqueName).done(function (newFile) {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var uri = Windows.Foundation.Uri(uriString);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var downloader = new Windows.Networking.BackgroundTransfer.BackgroundDownloader();</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Create a new download operation.</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; download = downloader.createDownload(uri, newFile);</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Start the download and persist the promise to be able to cancel the download.</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; promise = download.startAsync().then(complete, error, progress);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }, error);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (err) {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; displayException(err);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; };</p>
<p><span style="font-size: small;"><span style="font-family: Calibri;">You can configure and begin a basic upload operation as follow:</span></span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var upload = null;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var promise = null;</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; function UploadFile(uriString, file) {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var uri = Windows.Foundation.Uri(uriString);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var uploader = new Windows.Networking.BackgroundTransfer.BackgroundUploader();</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Set a header, so the server can save the file (this is specific to the sample server).</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; uploader.setRequestHeader("Filename", file.name);</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Create a new upload operation.</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; upload = uploader.createUpload(uri, file);</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Start the upload and persist the promise to be able to cancel the upload.</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;promise = upload.startAsync().then(complete, error, progress);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (err) {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; displayError(err);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; };</p>
<p><span style="font-family: Calibri; font-size: small;">And there has an </span><a href="http://code.msdn.microsoft.com/windowsapps/Background-Transfer-Sample-d7833f61"><span style="color: #0000ff; font-family: Calibri; font-size: small;">example</span></a><span style="font-size: small;"><span style="font-family: Calibri;"> demonstrating how to use Background Transfer.</span></span></p>
<p><span style="font-family: Calibri; font-size: small;">&nbsp;</span></p>
<p><span style="font-family: Calibri; font-size: small;">&nbsp;</span></p>
<p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Components.PostAttachments/00/10/38/36/98/List.zip" original-url="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-components-postattachments/00-10-38-36-98/List.zip">List.zip</a></p>]]></content:encoded>
    </item>
  </channel>
</rss>