<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:atom="https://www.w3.org/2005/Atom" xmlns:sy="https://purl.org/rss/1.0/modules/syndication/" xmlns:dc="https://purl.org/dc/elements/1.1/" xmlns:content="https://purl.org/rss/1.0/modules/content/" xmlns:wfw="https://wellformedweb.org/CommentAPI/" xmlns:slash="https://purl.org/rss/1.0/modules/slash/"
  version="2.0">
  <channel>
    <title>马宁的Windows Embedded研究</title>
    <atom:link
      href="https://docs.microsoft.com/archive/blogs/ninma/feed.xml"
      rel="self"
      type="application/rss+xml" />
    <link>https://docs.microsoft.com/archive/blogs/ninma/feed.xml</link>
    <description />
    <lastBuildDate>Tue, 16 Apr 2019 05:50:01 GMT</lastBuildDate>
    <language>en-US</language>
    <sy:updatePeriod>hourly</sy:updatePeriod>
    <sy:updateFrequency>1</sy:updateFrequency>
    <item>
      <title>马宁的Windows Phone 7.1初体验（三）——Tile</title>
      <link>https://docs.microsoft.com/archive/blogs/ninma/windows-phone-7-1tile</link>
      <pubDate>Tue, 02 Aug 2011 11:35:45 GMT</pubDate>
      <dc:creator><![CDATA[ninma]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/ninma/2011/08/02/windows-phone-7-1tile/</guid>
      <description><![CDATA[作者：马宁  前边介绍Push Notification时，其实已经谈到了Tile Notification。在Windows Phone 7.1中，Smart...]]></description>
      <content:encoded><![CDATA[<p><b>作者：马宁</b></p>  <p>前边介绍Push Notification时，其实已经谈到了Tile Notification。在Windows Phone 7.1中，Smart Tile得到了极大的提高。我们不但可以控制Tile的动画显示、内容和背景切换，而且还能够为同一个应用提供两个Tile，比如一个天气预报的应用程序，就可以在手机的首页上显示多个Tile，一个是北京的天气，另一个是上海的天气等。</p>  <h3>实现Application Tile</h3>  <p>MSDN上的文章写的又臭又长，其实挺简单的事情，弄得那么复杂。我试着改写了一下例子，加入到应用的一个Button点击事件里：</p>  <pre class="csharpcode">            <span class="rem">// Application Tile is always the first Tile, even if it is not pinned to Start.</span>
            ShellTile TileToFind = ShellTile.ActiveTiles.First();

            <span class="rem">// Set the properties to update for the Application Tile.</span>
            <span class="rem">// Empty strings for the text values and URIs will result in the property being cleared.</span>
            StandardTileData NewTileData = <span class="kwrd">new</span> StandardTileData
            {
                Title = <span class="str">&quot;Title&quot;</span>,
                BackgroundImage = <span class="kwrd">new</span> Uri(<span class="str">&quot;Background.png&quot;</span>, UriKind.Relative),
                Count = 2,
                BackTitle = <span class="str">&quot;Back Tilte&quot;</span>,
                BackBackgroundImage = <span class="kwrd">new</span> Uri(<span class="str">&quot;Background2.png&quot;</span>, UriKind.Relative),
                BackContent = <span class="str">&quot;This is BackContent&quot;</span>
            };

            <span class="rem">// Update the Application Tile</span>
            TileToFind.Update(NewTileData);</pre>


<p>首先，我们要引用Microsoft.Phone.Shell命名空间，然后通过ShellTile.ActiveTiles.First()方法来获取应用最主要的ShellTile.每个应用至少会有一个Tile，所以不用担心该对象为空。然后我们创建一个StandardTileData对象，为其中的属性赋值。属性分为两组，每组都会有背景图片、标题和内容，显示位置如下图所示。如果设置两组Tile属性，则Tile在显示一段时间后会自动切换。最后，我们调用ShellTile对象的Update方法，将StandardTileData对象传递进去，就完成了新Tile的设置。BackgroundImage和BackBackgroundImage指定的是图片的URI，可以是本地的图片，也可以是来自网络的图片。我们使用的两个图片，都是以Content方式加入到工程中的图片。</p>

<p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/3835.clip_image002_1FA6DFB3.jpg" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-22-76-metablogapi/3835.clip_5F00_image002_5F00_1FA6DFB3.jpg"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="clip_image002" border="0" alt="clip_image002" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/3823.clip_image002_thumb_68E984AE.jpg" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-22-76-metablogapi/3823.clip_5F00_image002_5F00_thumb_5F00_68E984AE.jpg" width="527" height="226" /></a></p>

<p>当我们将程序部署到设备或模拟器上时，首先会在Application List里出现对应的图标。我们长按图标，会出现一个菜单，选择Pin to start，会将应用程序的图标显示到手机首页上。</p>

<p>运行应用程序，点击Button后，Tile会被更新成新的式样。两张背景和内容会交替显示，显示效果如下图所示：</p>

<p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/6165.clip_image004_00348920.jpg" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-22-76-metablogapi/6165.clip_5F00_image004_5F00_00348920.jpg"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="clip_image004" border="0" alt="clip_image004" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/8712.clip_image004_thumb_25BE0681.jpg" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-22-76-metablogapi/8712.clip_5F00_image004_5F00_thumb_5F00_25BE0681.jpg" width="269" height="500" /></a> <a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/2451.clip_image006_43BC1475.jpg" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-22-76-metablogapi/2451.clip_5F00_image006_5F00_43BC1475.jpg"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="clip_image006" border="0" alt="clip_image006" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/4431.clip_image006_thumb_62928853.jpg" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-22-76-metablogapi/4431.clip_5F00_image006_5F00_thumb_5F00_62928853.jpg" width="271" height="500" /></a> <a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/3835.clip_image008_60E1BC7F.jpg" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-22-76-metablogapi/3835.clip_5F00_image008_5F00_60E1BC7F.jpg"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="clip_image008" border="0" alt="clip_image008" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/2845.clip_image008_thumb_05FF06EC.jpg" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-22-76-metablogapi/2845.clip_5F00_image008_5F00_thumb_5F00_05FF06EC.jpg" width="268" height="499" /></a></p>

<h3>实现 Secondary Tile</h3>

<p>在完成了Application Tile的显示之后，我们接下来要实现更复杂的Secondary Tile，当然，我们可以添加多个Tile。在实现Secondary Tile时，有两个技术点需要实现，一个是Tile的添加与显示；另一个则是，程序启动时如何区分是由哪个Tile点击启动应用的。</p>

<p>首先，我们来看如何添加Secondary Tile的代码：</p>

<pre class="csharpcode">            <span class="rem">// Look to see whether the Tile already exists and if so, don't try to create it again.</span>
            ShellTile TileToFind = ShellTile.ActiveTiles.FirstOrDefault(x =&gt; x.NavigationUri.ToString().Contains(<span class="str">&quot;DefaultTitle=FromTile&quot;</span>));

            <span class="rem">// Create the Tile if we didn't find that it already exists.</span>
            <span class="kwrd">if</span> (TileToFind == <span class="kwrd">null</span>)
            {
                <span class="rem">// Create the Tile object and set some initial properties for the Tile.</span>
                <span class="rem">// The Count value of 12 shows the number 12 on the front of the Tile. Valid values are 1-99.</span>
                <span class="rem">// A Count value of 0 indicates that the Count should not be displayed.</span>
                StandardTileData NewTileData = <span class="kwrd">new</span> StandardTileData
                {
                    BackgroundImage = <span class="kwrd">new</span> Uri(<span class="str">&quot;Background.png&quot;</span>, UriKind.Relative),
                    Title = <span class="str">&quot;Secondary Tile&quot;</span>,
                    Count = 12,
                    BackTitle = <span class="str">&quot;Back of Tile&quot;</span>,
                    BackContent = <span class="str">&quot;Welcome to the back of the Tile&quot;</span>,
                    BackBackgroundImage = <span class="kwrd">new</span> Uri(<span class="str">&quot;Background2.png&quot;</span>, UriKind.Relative)
                };

                <span class="rem">// Create the Tile and pin it to Start. This will cause a navigation to Start and a deactivation of our application.</span>
                ShellTile.Create(<span class="kwrd">new</span> Uri(<span class="str">&quot;/MainPage.xaml?DefaultTitle=FromTile&quot;</span>, UriKind.Relative), NewTileData);
            }
            <span class="kwrd">else</span>
            {
                TileToFind.Delete();
            }</pre>


<p>首先调用ShellTile.ActiveTiles.FirstOrDefault方法，获取在NavigationUri属性中包含“DefaultTitle=FromTile”字样的ShellTile对象，如果获取到的ShellTile对象为空，则创建Secondary Tile，否则调用ShellTile的Delete方法，删除这个Tile。</p>

<p>创建Secondary Tile的过程，首先创建StandardTileData对象，将显示的各个参数进行赋值，这一步与Application Tile相同；然后，调用ShellTile的Create方法，第一个参数是URI，即点击该Tile后，调用Page的命令行，可以包含参数，第二个参数是StandardTileData对象，用于指定显示式样。</p>

<p>需要注意的是，如果Page命令行指定不对，会引起用户点击Tile时，应用直接退出，由于无法调试，第一次接触这个问题时，会找不到具体的原因。</p>

<p>Secondary Tile显示效果如下：</p>

<p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/7635.clip_image010_2B88844D.jpg" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-22-76-metablogapi/7635.clip_5F00_image010_5F00_2B88844D.jpg"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="clip_image010" border="0" alt="clip_image010" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/4118.clip_image010_thumb_2324AEF6.jpg" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-22-76-metablogapi/4118.clip_5F00_image010_5F00_thumb_5F00_2324AEF6.jpg" width="253" height="470" /></a> <a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/2055.clip_image012_4F6135DA.jpg" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-22-76-metablogapi/2055.clip_5F00_image012_5F00_4F6135DA.jpg"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="clip_image012" border="0" alt="clip_image012" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/2376.clip_image012_thumb_5FF930C8.jpg" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-22-76-metablogapi/2376.clip_5F00_image012_5F00_thumb_5F00_5FF930C8.jpg" width="248" height="468" /></a></p>

<p>接下来，我们就要处理区分不同Tile点击的事件了，需要重载MainForm的OnNavigatedTo方法：</p>

<pre class="csharpcode">        <span class="kwrd">protected</span> <span class="kwrd">override</span> <span class="kwrd">void</span> OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
        {
            <span class="kwrd">string</span> <span class="kwrd">value</span> = <span class="kwrd">null</span>;

            <span class="kwrd">if</span> (<span class="kwrd">this</span>.NavigationContext.QueryString != <span class="kwrd">null</span>)
            {
                <span class="kwrd">this</span>.NavigationContext.QueryString.TryGetValue(<span class="str">&quot;DefaultTitle&quot;</span>, <span class="kwrd">out</span> <span class="kwrd">value</span>);
                <span class="kwrd">if</span> (<span class="kwrd">value</span> != <span class="kwrd">null</span>)
                {
                    textBoxTitle.Text = <span class="kwrd">value</span>;
                }
                <span class="kwrd">else</span>
                {
                    textBoxTitle.Text = <span class="str">&quot;FromMain&quot;</span>;
                }
            }

            <span class="kwrd">base</span>.OnNavigatedTo(e);
        }</pre>


<p>通过NavigationContext.QueryString的TryGetValue方法来获取DefaultTitle参数的值，如果无法获取到该值，则认为该点击来自第一个Tile，相反则来自第二个Tile。我们将参数显示在主页面的文本框里，当然，实际应用中可以有更加复杂的业务逻辑。界面显示效果如下：</p>

<p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/7167.clip_image014_5E4864F4.jpg" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-22-76-metablogapi/7167.clip_5F00_image014_5F00_5E4864F4.jpg"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="clip_image014" border="0" alt="clip_image014" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/5516.clip_image014_thumb_55E48F9D.jpg" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-22-76-metablogapi/5516.clip_5F00_image014_5F00_thumb_5F00_55E48F9D.jpg" width="280" height="526" /></a></p>

<p>到这里，我们简单介绍了如何添加Tile、修改Tile内容，除此之外，还有如何修改Tile的初始值，指定Tile更新的时间间隔等。在这里，我们就不介绍了，大家可以参考又臭又长的MSDN文档，这部分不长，我可以保证。</p>

<h3>写在最后</h3>

<p>好了，到这里，我们正式将Windows Phone 7.1中的Tile编程的内容介绍完了。Windows Phone采用的是HUB方式，对于功能进行分类，所以，就要求Tile具备更丰富的显示方式和展现形式。而且，多个应用可以对应于一个Tile，同样一个应用也可以对应多个Tile，这样极大提高了主页与应用之间交互的丰富程度。</p>

<p>当然，具体的Tile，还要在实际的开发中使用，才能真正了解其优缺点。</p>

<h3>OpenXLive杯Windows Phone游戏开发大赛</h3>

<p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/7673.clip_image016_300E693A.jpg" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-22-76-metablogapi/7673.clip_5F00_image016_5F00_300E693A.jpg"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="clip_image016" border="0" alt="clip_image016" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/6661.clip_image016_thumb_12B91170.jpg" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-22-76-metablogapi/6661.clip_5F00_image016_5F00_thumb_5F00_12B91170.jpg" width="212" height="225" /></a></p>

<p>OpenXLive杯Windows Phone游戏开发大赛，是由OpenXLive联合国内知名的开发者社区：DevDiv、智机网、WPMind、Silverlight银光中国和XNA游戏世界，一起举办的针对Windows Phone游戏开发的比赛。</p>

<p><a href="https://www.openxlive.net/posts/news/40">https://www.openxlive.net/posts/news/40</a></p>]]></content:encoded>
    </item>
    <item>
      <title>马宁的Windows Phone 7.1初体验（二）——Push Notification</title>
      <link>https://docs.microsoft.com/archive/blogs/ninma/windows-phone-7-1push-notification</link>
      <pubDate>Mon, 01 Aug 2011 10:25:25 GMT</pubDate>
      <dc:creator><![CDATA[ninma]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/ninma/2011/08/01/windows-phone-7-1push-notification/</guid>
      <description><![CDATA[作者：马宁  Push Notification并不是Windows Phone 7.1的新功能，但是之前的文章里对这部分都缺少详细的分析，所以姑且就把Push...]]></description>
      <content:encoded><![CDATA[<p><b>作者：马宁</b></p>  <p>Push Notification并不是Windows Phone 7.1的新功能，但是之前的文章里对这部分都缺少详细的分析，所以姑且就把Push Notification放到这部分里吧。</p>  <p>很多iOS开发者都将WP7里的Push Notification说成抄袭iOS的产物，孰不知，微软才是Push Notification技术的先行者，Windows Mobile时代的Push Mail技术可以说是独步天下，连Symbian也要授权使用相关的技术。</p>  <p>Push Notification的技术为什么越来越重要，其实这跟移动设备的特点紧密相关，移动设备网络的不稳定性，决定了以Socket为代表的强连接方式并不适用，所以大家更多选择HTTP协议作为主要的通讯方式。但是HTTP的特点是，设备找服务器很容易，通过URL就可以了，但服务器找设备就难上加难了，因为设备会随时切换移动网络，IP地址之类的经常性失效。当然设备端轮询的方式可以解决这个问题，但移动设备的电源、网络都是稀缺资源。所以，OS级别的Push Notification技术就变成了一种珍贵的战略资源，而且，在封闭式的操作系统中，只有OS厂商提供的Push Notification才能够获得最好的效率。</p>  <h3>Push Notification简介</h3>  <p>目前，Windows Phone支持三种Push Notification方式：Toast Notifications、Tile Notifications和Raw Notifications，我不想翻译成中文名字了，因为“吐司”之类的翻译无法帮助理解。</p>  <p>Toast Notifications，当我们的程序没有运行时，我们希望有一种形式可以通知用户，并且让用户调用对应的应用，就像收到SMS时，调用Messaging程序一样。运行效果如下图，当用户点击Toast时，可以调用对应的程序。</p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/7875.clip_image002_2456698C.jpg" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-22-76-metablogapi/7875.clip_5F00_image002_5F00_2456698C.jpg"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="clip_image002" border="0" alt="clip_image002" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/0116.clip_image002_thumb_09A9CD73.jpg" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-22-76-metablogapi/0116.clip_5F00_image002_5F00_thumb_5F00_09A9CD73.jpg" width="340" height="213" /></a></p>  <p>Tile Notifications，用于更新启动界面上的Tile，可以通过Tile Notifications设置Tile的背景图片、Count和Title等属性，各属性显示位置如下图所示。我们可以通过该技术来提示用户，我们的应用有新的事件发生，比如SNS上有多少新的回复等。</p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/3175.clip_image004_410FDEA1.jpg" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-22-76-metablogapi/3175.clip_5F00_image004_5F00_410FDEA1.jpg"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="clip_image004" border="0" alt="clip_image004" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/2502.clip_image004_thumb_662D290D.jpg" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-22-76-metablogapi/2502.clip_5F00_image004_5F00_thumb_5F00_662D290D.jpg" width="343" height="148" /></a></p>  <p>Raw Notifications，最简单，当你的应用程序运行时，可以接收Raw Notification信息，如果程序没有运行，则接受不到Raw Notification。</p>  <p>接下来，我们会以Toast Notifications为例详细介绍，Push Notification的原理和使用方法。</p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/7701.clip_image006_049769F7.jpg" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-22-76-metablogapi/7701.clip_5F00_image006_5F00_049769F7.jpg"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="clip_image006" border="0" alt="clip_image006" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/0028.clip_image006_thumb_1B763B73.jpg" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-22-76-metablogapi/0028.clip_5F00_image006_5F00_thumb_5F00_1B763B73.jpg" width="643" height="422" /></a></p>  <p>首先，还是引用这张广为流传的图示吧，确实是目前能够找到的最详细的示意图了。下面是步骤叙述：</p>  <p>1-3，应用通过调用HttpNotificationChannel接口，向Microsoft Push Notification Service (MPNS)请求一个URI，这个URI会在服务器端发送Notification消息时，作为验证发送目标的唯一标识；这样做的一个好处是，当同一个设备上有多个应用在监听Notification时，不会相互干扰。</p>  <p>4. 应用会将获得的URI传到自己的服务器上，这个URI会存储在自己的服务器上，用于发送Push Notification时调用。URI的传递和存储方式，由开发者自己决定，不过要保证传输过程的加密，以及存储时的安全性。接下来的实例里，传递和存储URI的方式就很有创意。</p>  <p>5-6. 当服务器端有信息要通知应用时，需要向MPNS发起一个Http请求，而MPNS将请求转发到相应的设备上，设备上的应用接到Push Notification的消息后，进行相应的处理。</p>  <p>其实过程挺简单，被MSDN文档说得神乎其神。接下来，我们挨个看一下各个类型的Notification。偷点懒，不自己写Sample Code了，请大家去下面的链接里下载。不过注意Sample Code的更新，最近有同学因为更新不及时，而影响了开发进度。</p>  <p><a href="https://msdn.microsoft.com/en-us/library/ff431744(VS.92).aspx">https://msdn.microsoft.com/en-us/library/ff431744(VS.92).aspx</a></p>  <h3>初始化 Notifications</h3>  <p>首先是Toast Notifications，这种Notification在实际应用中最为有效，不但可以提示用户有新的消息，而且还让用户选择是否打开当时的应用。不过比起iOS的Notifications来，Toast Notifications能够容纳的信息量实在有限。所以，开发者要适当“浓缩”需要推送的消息。</p>  <p>我们按照调用的顺序，依次来分析代码，首先来看客户端部分ToastNotificationClient的代码：</p>  <pre class="csharpcode">            <span class="rem">/// Holds the push channel that is created or found.</span>
            HttpNotificationChannel pushChannel;

            <span class="rem">// The name of our push channel.</span>
            <span class="kwrd">string</span> channelName = <span class="str">&quot;ToastSampleChannel&quot;</span>;

            InitializeComponent();

            <span class="rem">// Try to find the push channel.</span>
            pushChannel = HttpNotificationChannel.Find(channelName);

            <span class="rem">// If the channel was not found, then create a new connection to the push service.</span>
            <span class="kwrd">if</span> (pushChannel == <span class="kwrd">null</span>)
            {
                pushChannel = <span class="kwrd">new</span> HttpNotificationChannel(channelName);

                <span class="rem">// Register for all the events before attempting to open the channel.</span>
                pushChannel.ChannelUriUpdated += <span class="kwrd">new</span> EventHandler&lt;NotificationChannelUriEventArgs&gt;(PushChannel_ChannelUriUpdated);
                pushChannel.ErrorOccurred += <span class="kwrd">new</span> EventHandler&lt;NotificationChannelErrorEventArgs&gt;(PushChannel_ErrorOccurred);

                <span class="rem">// Register for this notification only if you need to receive the notifications while your application is running.</span>
                pushChannel.ShellToastNotificationReceived += <span class="kwrd">new</span> EventHandler&lt;NotificationEventArgs&gt;(PushChannel_ShellToastNotificationReceived);

                pushChannel.Open();

                <span class="rem">// Bind this new channel for toast events.</span>
                pushChannel.BindToShellToast();

            }
            <span class="kwrd">else</span>
            {
                <span class="rem">// The channel was already open, so just register for all the events.</span>
                pushChannel.ChannelUriUpdated += <span class="kwrd">new</span> EventHandler&lt;NotificationChannelUriEventArgs&gt;(PushChannel_ChannelUriUpdated);
                pushChannel.ErrorOccurred += <span class="kwrd">new</span> EventHandler&lt;NotificationChannelErrorEventArgs&gt;(PushChannel_ErrorOccurred);

                <span class="rem">// Register for this notification only if you need to receive the notifications while your application is running.</span>
                pushChannel.ShellToastNotificationReceived += <span class="kwrd">new</span> EventHandler&lt;NotificationEventArgs&gt;(PushChannel_ShellToastNotificationReceived);

                <span class="rem">// Display the URI for testing purposes. Normally, the URI would be passed back to your web service at this point.</span>
                System.Diagnostics.Debug.WriteLine(pushChannel.ChannelUri.ToString());
                MessageBox.Show(String.Format(<span class="str">&quot;Channel Uri is {0}&quot;</span>,
                    pushChannel.ChannelUri.ToString()));

            }</pre>

<pre class="csharpcode">&#160;</pre>

<pre class="csharpcode">&#160;</pre>


<p>&#160;</p>

<p>代码比较多，我们逐步来看，首先要声明一个HttpNotificationChannel的变量，命名空间为Microsoft.Phone.Notification。接下来，声明该Notification Channel的名称，该名称是Channel的唯一标识名，不能与其他Channel重复。接下来，我们调用HttpNotificationChannel的静态方法Find来查找，当前的Channel是否存在，如果存在则返回HttpNotificationChannel对象实例，不存在则返回空。如果该程序从未在当前设备上运行过，则HttpNotificationChannel对象为空，只要运行过一次，则能够通过Find方法来获取对象实例。</p>

<p>先来说未创建Channel的情况，创建HttpNotificationChannel的对象，并将Channel名称作为参数传递进去。然后处理该对象的两个事件：ChannelUriUpdated和ErrorOccurred。当URI发生变化时，会触发ChannelUriUpdated事件，我们在创建Channel对象时，会触发该事件，另外一个ErrorOccurred事件，则用于错误处理。</p>

<p>当程序已经在运行时，默认是接收不到Toast Notification消息的，所以，我们还需要处理ShellToastNotificationReceived事件，当程序运行时，也可以接收到相应的消息。</p>

<p>然后调用HttpNotificationChannel的Open方法，打开该Channel，最后是BindToShellToast方法，通知Shell，该Notification的Channel已经被创建。</p>

<p>获取Channel后的代码与之大体类似，但我们可以通过HttpNotificationChannel的ChannelUri属性来获取Channel的URI，该URI值就是需要传递给我们自己服务器的唯一值，标记了该设备上的该Channel。</p>

<p>而创建Channel后，我们也可以获取URI的值，不过我们需要在ChannelUriUpdated事件处理函数里获取该URI值：</p>

<pre class="csharpcode">        <span class="kwrd">void</span> PushChannel_ChannelUriUpdated(<span class="kwrd">object</span> sender, NotificationChannelUriEventArgs e)
        {

            Dispatcher.BeginInvoke(() =&gt;
            {
                <span class="rem">// Display the new URI for testing purposes.   Normally, the URI would be passed back to your web service at this point.</span>
                System.Diagnostics.Debug.WriteLine(e.ChannelUri.ToString());
                MessageBox.Show(String.Format(<span class="str">&quot;Channel Uri is {0}&quot;</span>,
                    e.ChannelUri.ToString()));

            });
        }</pre>


<p>到此为止，我们已经完成了Notification Channel的创建，并且获得了唯一标识的URI。</p>

<h3>触发Notification</h3>

<p>接下来，我们来看Server的代码。我们自己的Server与Microsoft Push Notification Server（MPNS）之间是通过Http协议，使用HttpWebRequest来发送请求。理论上来说，我们也可以使用客户端程序向MPNS发送Notification请求。为什么要用ASP.NET来编写，最主要的原因还是在于客户端应用要将URI传递给Server端，显然基于ASP.NET的Web应用在这方面是最容易的。</p>

<p>不过我们的实例中，没有客户端将URI传递给服务器端的代码，而是采用了最简单的办法：由开发者直接将URI拷贝到ASP.NET的Web应用中。</p>

<p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/8880.clip_image008_47468F62.jpg" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-22-76-metablogapi/8880.clip_5F00_image008_5F00_47468F62.jpg"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="clip_image008" border="0" alt="clip_image008" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/2117.clip_image008_thumb_173C3DE1.jpg" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-22-76-metablogapi/2117.clip_5F00_image008_5F00_thumb_5F00_173C3DE1.jpg" width="596" height="379" /></a></p>

<p>接下来，我们来看Server端的代码：</p>

<pre class="csharpcode">            <span class="kwrd">try</span>
            {
                <span class="rem">// Get the Uri that the Microsoft Push Notification Service returns to the Push Client when creating a notification channel.</span>
                <span class="rem">// Normally, a web service would listen for Uri's coming from the web client and maintain a list of Uri's to send</span>
                <span class="rem">// notifications out to.</span>
                <span class="kwrd">string</span> subscriptionUri = TextBoxUri.Text.ToString();


                HttpWebRequest sendNotificationRequest = (HttpWebRequest)WebRequest.Create(subscriptionUri);

                <span class="rem">// We will create a HTTPWebRequest that posts the toast notification to the Microsoft Push Notification Service.</span>
                <span class="rem">// HTTP POST is the only allowed method to send the notification.</span>
                sendNotificationRequest.Method = <span class="str">&quot;POST&quot;</span>;

                <span class="rem">// The optional custom header X-MessageID uniquely identifies a notification message. </span>
                <span class="rem">// If it is present, the // same value is returned in the notification response. It must be a string that contains a UUID.</span>
                <span class="rem">// sendNotificationRequest.Headers.Add(&quot;X-MessageID&quot;, &quot;&lt;UUID&gt;&quot;);</span>

                <span class="rem">// Create the toast message.</span>
                <span class="kwrd">string</span> toastMessage = <span class="str">&quot;&lt;?xml version=\&quot;1.0\&quot; encoding=\&quot;utf-8\&quot;?&gt;&quot;</span> +
                <span class="str">&quot;&lt;wp:Notification xmlns:wp=\&quot;WPNotification\&quot;&gt;&quot;</span> +
                   <span class="str">&quot;&lt;wp:Toast&gt;&quot;</span> +
                        <span class="str">&quot;&lt;wp:Text1&gt;&quot;</span> + TextBoxTitle.Text.ToString() + <span class="str">&quot;&lt;/wp:Text1&gt;&quot;</span> +
                        <span class="str">&quot;&lt;wp:Text2&gt;&quot;</span> + TextBoxSubTitle.Text.ToString() + <span class="str">&quot;&lt;/wp:Text2&gt;&quot;</span> +
                        <span class="str">&quot;&lt;wp:Param&gt;/Page2.xaml?NavigatedFrom=Toast Notification&quot;</span> + TextBoxSubTitle.Text.ToString() + <span class="str">&quot;&lt;/wp:Param&gt;&quot;</span> +
                   <span class="str">&quot;&lt;/wp:Toast&gt; &quot;</span> +
                <span class="str">&quot;&lt;/wp:Notification&gt;&quot;</span>;

                <span class="rem">// Sets the notification payload to send.</span>
                <span class="kwrd">byte</span>[] notificationMessage = Encoding.Default.GetBytes(toastMessage);

                <span class="rem">// Sets the web request content length.</span>
                sendNotificationRequest.ContentLength = notificationMessage.Length;
                sendNotificationRequest.ContentType = <span class="str">&quot;text/xml&quot;</span>;
                sendNotificationRequest.Headers.Add(<span class="str">&quot;X-WindowsPhone-Target&quot;</span>, <span class="str">&quot;toast&quot;</span>);
                sendNotificationRequest.Headers.Add(<span class="str">&quot;X-NotificationClass&quot;</span>, <span class="str">&quot;2&quot;</span>);


                <span class="kwrd">using</span> (Stream requestStream = sendNotificationRequest.GetRequestStream())
                {
                    requestStream.Write(notificationMessage, 0, notificationMessage.Length);
                }

                <span class="rem">// Send the notification and get the response.</span>
                HttpWebResponse response = (HttpWebResponse)sendNotificationRequest.GetResponse();
                <span class="kwrd">string</span> notificationStatus = response.Headers[<span class="str">&quot;X-NotificationStatus&quot;</span>];
                <span class="kwrd">string</span> notificationChannelStatus = response.Headers[<span class="str">&quot;X-SubscriptionStatus&quot;</span>];
                <span class="kwrd">string</span> deviceConnectionStatus = response.Headers[<span class="str">&quot;X-DeviceConnectionStatus&quot;</span>];

                <span class="rem">// Display the response from the Microsoft Push Notification Service.  </span>
                <span class="rem">// Normally, error handling code would be here.  In the real world, because data connections are not always available,</span>
                <span class="rem">// notifications may need to be throttled back if the device cannot be reached.</span>
                TextBoxResponse.Text = notificationStatus + <span class="str">&quot; | &quot;</span> + deviceConnectionStatus + <span class="str">&quot; | &quot;</span> + notificationChannelStatus;
            }
            <span class="kwrd">catch</span> (Exception ex)
            {
                TextBoxResponse.Text = <span class="str">&quot;Exception caught sending update: &quot;</span> + ex.ToString();
            }</pre>


<p>Server端程序的主体是调用HttpWebRequest对象，来实现HTTP POST的方法。发送的消息以XML形式呈现，在上面代码中表现为toastMessage字符串，wp:Toast指定Notification类型，wp:Text1指定标题，wp:Text2指定子标题，wp:Param指定传递的参数。</p>

<p>请大家注意wp:Param，我们可以认为该参数相当于调用了客户端应用中NavigationService的Navigate方法，必须确认客户端有指定的页面可以进行跳转。当用户点击Toast Notification的提示条时，客户端应用会调用wp:Param，从而跳转到指定界面上。</p>

<p>我们可以通过该参数来传递一些参数，比如标识本次Notification是由哪条消息引发的。不过该参数中不应该包括敏感信息、安全信息，因为无法保证这些信息的安全。最好的办法是，传递一个ID值，当客户端访问服务器时，由服务器端判断该ID是否有效。</p>

<p>接下来，我们还要为HTTP 头添加自定义字段，这部分参考Sample Code就可以了。</p>

<h3>接收Notification</h3>

<p>当Server端代码完成后，我们回到客户端，看一下当MPNS找到设备后，如何触发我们的客户端代码。首先是Page2.xaml的OnNavigatedTo方法：</p>

<pre class="csharpcode">        <span class="kwrd">protected</span> <span class="kwrd">override</span> <span class="kwrd">void</span> OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
        {
            <span class="kwrd">base</span>.OnNavigatedTo(e);

            <span class="rem">//  If we navigated to this page</span>
            <span class="rem">// from the MainPage, the DefaultTitle parameter will be &quot;FromMain&quot;.  If we navigated here</span>
            <span class="rem">// when the secondary Tile was tapped, the parameter will be &quot;FromTile&quot;.</span>
            textBlockFrom.Text = <span class="str">&quot;Navigated here from &quot;</span> + <span class="kwrd">this</span>.NavigationContext.QueryString[<span class="str">&quot;NavigatedFrom&quot;</span>];
        }</pre>


<p>通过NavigationContext.QueryString属性来获取自定义参数，试过传两个参数，后一个收到不到，目前成功的是传递一个参数的情况。</p>

<p>还有一种情况是，当客户端程序运行时，接收到Toast Notification时，该如何处理：</p>

<pre class="csharpcode">        <span class="kwrd">void</span> PushChannel_ShellToastNotificationReceived(<span class="kwrd">object</span> sender, NotificationEventArgs e)
        {
            StringBuilder message = <span class="kwrd">new</span> StringBuilder();
            <span class="kwrd">string</span> relativeUri = <span class="kwrd">string</span>.Empty;

            message.AppendFormat(<span class="str">&quot;Received Toast {0}:\n&quot;</span>, DateTime.Now.ToShortTimeString());

            <span class="rem">// Parse out the information that was part of the message.</span>
            <span class="kwrd">foreach</span> (<span class="kwrd">string</span> key <span class="kwrd">in</span> e.Collection.Keys)
            {
                message.AppendFormat(<span class="str">&quot;{0}: {1}\n&quot;</span>, key, e.Collection[key]);

                <span class="kwrd">if</span> (<span class="kwrd">string</span>.Compare(
                    key,
                    <span class="str">&quot;wp:Param&quot;</span>,
                    System.Globalization.CultureInfo.InvariantCulture,
                    System.Globalization.CompareOptions.IgnoreCase) == 0)
                {
                    relativeUri = e.Collection[key];
                }
            }

            <span class="rem">// Display a dialog of all the fields in the toast.</span>
            Dispatcher.BeginInvoke(() =&gt; MessageBox.Show(message.ToString()));

        }</pre>


<p>该方法是HttpNotificationChannel的ShellToastNotificationReceived事件处理函数，具体内容不详细解释了。</p>

<h3>Tile Notifications</h3>

<p>Tile Notification是另一种Notification，主要用于在Windows Phone的首页上显示Smart Tile。很多内置的WP应用可以显示Tile上的自定义显示，比如Messaging程序里可以显示当前未读的短信有多少。Tile Notification可以帮助我们实现类似的功能，通常的一个用法是，首先发送一条Toast Notification，如果用户不理睬，可以发送一条Tile Notification，在Smart Tile上显示提示，让用户在方便时，再处理该条请求。</p>

<p>Tile Notification的实现代码与Toast Notification类似，所以，我们不在这里列出全部源代码了，只是列出与上面不同的部分代码。</p>

<p>首先来看Server部分的代码：</p>

<pre class="csharpcode">                <span class="rem">// Create the tile message.</span>
                <span class="kwrd">string</span> tileMessage = <span class="str">&quot;&lt;?xml version=\&quot;1.0\&quot; encoding=\&quot;utf-8\&quot;?&gt;&quot;</span> +
                <span class="str">&quot;&lt;wp:Notification xmlns:wp=\&quot;WPNotification\&quot;&gt;&quot;</span> +
                    <span class="str">&quot;&lt;wp:Tile&gt;&quot;</span> +
                      <span class="str">&quot;&lt;wp:BackgroundImage&gt;&quot;</span> + TextBoxBackgroundImage.Text + <span class="str">&quot;&lt;/wp:BackgroundImage&gt;&quot;</span> +
                      <span class="str">&quot;&lt;wp:Count&gt;&quot;</span> + TextBoxCount.Text + <span class="str">&quot;&lt;/wp:Count&gt;&quot;</span> +
                      <span class="str">&quot;&lt;wp:Title&gt;&quot;</span> + TextBoxTitle.Text + <span class="str">&quot;&lt;/wp:Title&gt;&quot;</span> +
                      <span class="str">&quot;&lt;wp:BackBackgroundImage&gt;&quot;</span> + TextBoxBackBackgroundImage.Text + <span class="str">&quot;&lt;/wp:BackBackgroundImage&gt;&quot;</span> +
                      <span class="str">&quot;&lt;wp:BackTitle&gt;&quot;</span> + TextBoxBackTitle.Text + <span class="str">&quot;&lt;/wp:BackTitle&gt;&quot;</span> +
                      <span class="str">&quot;&lt;wp:BackContent&gt;&quot;</span> + TextBoxBackContent.Text + <span class="str">&quot;&lt;/wp:BackContent&gt;&quot;</span> +
                   <span class="str">&quot;&lt;/wp:Tile&gt; &quot;</span> +
                <span class="str">&quot;&lt;/wp:Notification&gt;&quot;</span>;

                <span class="rem">// Sets the notification payload to send.</span>
                <span class="kwrd">byte</span>[] notificationMessage = Encoding.Default.GetBytes(tileMessage);

                <span class="rem">// Sets the web request content length.</span>
                sendNotificationRequest.ContentLength = notificationMessage.Length;
                sendNotificationRequest.ContentType = <span class="str">&quot;text/xml&quot;</span>;
                sendNotificationRequest.Headers.Add(<span class="str">&quot;X-WindowsPhone-Target&quot;</span>, <span class="str">&quot;token&quot;</span>);
                sendNotificationRequest.Headers.Add(<span class="str">&quot;X-NotificationClass&quot;</span>, <span class="str">&quot;1&quot;</span>);</pre>


<p>TileMessage与ToastMessage大体类似，标签变为wp:Tile，而其中包括的数据分为两组：BackgroundImage、Title和Content，显示位置可以参考文章前面的示意图。BackgroundImage可以是本地的资源，也可以是远程的图片链接。</p>

<p>接下来是客户端的部分代码：</p>

<pre class="csharpcode">                pushChannel = <span class="kwrd">new</span> HttpNotificationChannel(channelName);

                <span class="rem">// Register for all the events before attempting to open the channel.</span>
                pushChannel.ChannelUriUpdated += <span class="kwrd">new</span> EventHandler&lt;NotificationChannelUriEventArgs&gt;(PushChannel_ChannelUriUpdated);
                pushChannel.ErrorOccurred += <span class="kwrd">new</span> EventHandler&lt;NotificationChannelErrorEventArgs&gt;(PushChannel_ErrorOccurred);

                pushChannel.Open();

                <span class="rem">// Bind this new channel for Tile events.</span>
                pushChannel.BindToShellTile();</pre>


<p>Tile Notification无需添加任何额外的代码，在调用HttpNotificationChannel的Open方法后，还需要调用BindToShellTile的方法，通知Shell绑定该Tile Notification。</p>

<h3>Raw Notifications</h3>

<p>Raw Notification的用法最简单，在程序运行时，收到Raw Notification时，更新应用程序界面上的某些元素。</p>

<p>首先，我们来看Server端的代码：</p>

<pre class="csharpcode">                <span class="rem">// Create the raw message.</span>
                <span class="kwrd">string</span> rawMessage = <span class="str">&quot;&lt;?xml version=\&quot;1.0\&quot; encoding=\&quot;utf-8\&quot;?&gt;&quot;</span> +
                <span class="str">&quot;&lt;root&gt;&quot;</span> +
                    <span class="str">&quot;&lt;Value1&gt;&quot;</span> + TextBoxValue1.Text.ToString() + <span class="str">&quot;&lt;Value1&gt;&quot;</span> +
                    <span class="str">&quot;&lt;Value2&gt;&quot;</span> + TextBoxValue2.Text.ToString() + <span class="str">&quot;&lt;Value2&gt;&quot;</span> +
                <span class="str">&quot;&lt;/root&gt;&quot;</span>;

                <span class="rem">// Sets the notification payload to send.</span>
                <span class="kwrd">byte</span>[] notificationMessage = Encoding.Default.GetBytes(rawMessage);

                <span class="rem">// Sets the web request content length.</span>
                sendNotificationRequest.ContentLength = notificationMessage.Length;
                sendNotificationRequest.ContentType = <span class="str">&quot;text/xml&quot;</span>;
                sendNotificationRequest.Headers.Add(<span class="str">&quot;X-NotificationClass&quot;</span>, <span class="str">&quot;3&quot;</span>);</pre>


<p>RawMessage非常简单，只需要指定Value1, Value2就可以了，这些值是自定义的，然后指定HTTP头的X-NotificationgClass的值为3，代表Raw Notification。</p>

<p>接下来是客户端代码的片段：</p>

<pre class="csharpcode">pushChannel = <span class="kwrd">new</span> HttpNotificationChannel(channelName);
pushChannel.HttpNotificationReceived += <span class="kwrd">new</span> EventHandler&lt;HttpNotificationEventArgs&gt;(PushChannel_HttpNotificationReceived);
pushChannel.Open();


        <span class="kwrd">void</span> PushChannel_HttpNotificationReceived(<span class="kwrd">object</span> sender, HttpNotificationEventArgs e)
        {
            <span class="kwrd">string</span> message;

            <span class="kwrd">using</span> (System.IO.StreamReader reader = <span class="kwrd">new</span> System.IO.StreamReader(e.Notification.Body))
            {
                message = reader.ReadToEnd();
            }


            Dispatcher.BeginInvoke(() =&gt;
                MessageBox.Show(String.Format(<span class="str">&quot;Received Notification {0}:\n{1}&quot;</span>,
                    DateTime.Now.ToShortTimeString(), message))
                    );
        }</pre>


<p>HttpNotificationChannel创建完成后，只需要调用Open方法即可，不需要绑定到Shell上。另外，还需要处理HttpNotificationChannel的HttpNotificationReceived事件处理函数，具体的代码不解释了。</p>

<h3>写在最后</h3>

<p>好了，到这里，我们正式将Windows Phone 7.1中的Push Notification介绍完了。为了增加用户黏性，Push Notification可能是一种非常有效的方式，但是请开发者谨慎使用，如果太多的垃圾信息影响用户体验，那是得不偿失的。另外，我们还需要为Push Notification搭建一个Web服务器，这对于普通开发人员来说，也是一个很难接受的成本。</p>

<h3>OpenXLive杯Windows Phone游戏开发大赛</h3>

<p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/0535.clip_image010_09F5B4CE.jpg" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-22-76-metablogapi/0535.clip_5F00_image010_5F00_09F5B4CE.jpg"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="clip_image010" border="0" alt="clip_image010" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/0385.clip_image010_thumb_7A72A2FE.jpg" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-22-76-metablogapi/0385.clip_5F00_image010_5F00_thumb_5F00_7A72A2FE.jpg" width="212" height="225" /></a></p>

<p>OpenXLive杯Windows Phone游戏开发大赛，是由OpenXLive联合国内知名的开发者社区：DevDiv、智机网、WPMind、Silverlight银光中国和XNA游戏世界，一起举办的针对Windows Phone游戏开发的比赛。</p>

<p><a href="https://www.openxlive.net/posts/news/40">https://www.openxlive.net/posts/news/40</a></p>]]></content:encoded>
    </item>
    <item>
      <title>Kinect for Windows SDK开发初体验（二）操作Camera</title>
      <link>https://docs.microsoft.com/archive/blogs/ninma/kinect-for-windows-sdkcamera</link>
      <pubDate>Sat, 18 Jun 2011 00:27:42 GMT</pubDate>
      <dc:creator><![CDATA[ninma]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/ninma/2011/06/18/kinect-for-windows-sdkcamera/</guid>
      <description><![CDATA[&#160;  作者：马宁  Kinect SDK出来之后，不到24小时，很多Geek们已经将自己的示例发布到网上去了。可见，好东西肯定会被大家认可的，不好的东西投入再多的宣传也没用。...]]></description>
      <content:encoded><![CDATA[<p>&#160;</p>  <p>作者：马宁</p>  <p>Kinect SDK出来之后，不到24小时，很多Geek们已经将自己的示例发布到网上去了。可见，好东西肯定会被大家认可的，不好的东西投入再多的宣传也没用。</p>  <p>这一篇我们就要正式进入Kinect的编程世界了，介绍我们如何从Camera获取图像信息。先来介绍一下Kinect的整体结构，省得大家在后边的介绍中被某些名词弄晕。</p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/5758.image_thumb3_7105826D.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-22-76-metablogapi/5758.image_5F00_thumb3_5F00_7105826D.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image_thumb[3]" border="0" alt="image_thumb[3]" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/8176.image_thumb3_thumb_396FC17F.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-22-76-metablogapi/8176.image_5F00_thumb3_5F00_thumb_5F00_396FC17F.png" width="494" height="324" /></a> </p>  <p>Kinect一共有三个Camera，其中中间的一个是RGB Camera，用来获取640x480的彩色图像，每秒钟最多获取30帧图像；两侧是两个景深(3D Depth)传感器，用来检测玩家的相对位置，原理和人眼立体成像是一样的，不过这两个传感器使用的是红外线，所以说奥巴马玩不了Kinect的人一定是居心叵测。Kinect两侧是麦克风，下边还有一个可移动底座，用来调整Kinect的仰角。</p>  <h3>Kinect开发环境</h3>  <p>今天我们主要是操作RGB Camera和Depth Sensor，首先，我们要完成Kinect开发环境的配置：</p>  <p>第一步，创建WPF工程</p>  <p>打开Visual Studio 2010，创建一个WPF工程，名叫KinectWpfDemo：</p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/0552.21_6540156E.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-22-76-metablogapi/0552.21_5F00_6540156E.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="21" border="0" alt="21" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/8585.21_thumb_632316A5.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-22-76-metablogapi/8585.21_5F00_thumb_5F00_632316A5.png" width="601" height="414" /></a> </p>  <p>当然，由于Kinect SDK中包含基于.NET的程序集，除了WPF外，我们使用.NET WinForm或XNA框架都可以，目前还没有人在Silverlight平台上实验成功。</p>  <p>第二步，添加Kinect程序集的引用</p>  <p>在Solution Explorer中，右键单击KinectWpfDemo，在右键菜单中选择“Add Reference…”。在弹出的对话框中，我们在.NET标签页里，选择“Microsoft.Research.Kinect”程序集。如下图所示：</p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/3113.22_0121249A.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-22-76-metablogapi/3113.22_5F00_0121249A.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="22" border="0" alt="22" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/3704.22_thumb_1E46CCA4.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-22-76-metablogapi/3704.22_5F00_thumb_5F00_1E46CCA4.png" width="542" height="434" /></a> </p>  <p>第三步，添加Coding4Fun Kinect Toolkit</p>  <p>这是一个可选项，不过为了之后的编程方便，建议大家添加一个。Coding4Fun Kinect Toolkit的下载地址：</p>  <p><a href="https://c4fkinect.codeplex.com/">https://c4fkinect.codeplex.com/</a></p>  <p>解压缩后，一共有五个文件，针对WinForm、WPF平台，还有一个Microsoft.Expression.Drawing.dll。我们通过Add Reference，将Coding4Fun.Kinect.Wpf.dll添加进来。</p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/2234.23_02C1CAA1.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-22-76-metablogapi/2234.23_5F00_02C1CAA1.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="23" border="0" alt="23" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/6355.23_thumb_3A940EC4.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-22-76-metablogapi/6355.23_5F00_thumb_5F00_3A940EC4.png" width="372" height="515" /></a> </p>  <h3>获取RGB Camera数据</h3>  <p>第四步，添加控件</p>  <p>双击打开MainWindow.xaml，在设计器中添加两个Image控件，一个用于显示RGB图像，另一个用于显示Depth信息。</p>  <p>第五步，引用命名空间</p>  <p>打开MainWindow.xaml.cs文件，在文件头部添加对于Kinect对象的引用：</p>  <pre class="csharpcode"><span class="kwrd">using</span> Microsoft.Research.Kinect.Nui;

<span class="kwrd">using</span> Microsoft.Research.Kinect.Audio;

<span class="kwrd">using</span> Coding4Fun.Kinect.Wpf;</pre>


<p>回到MainWindow.xaml的设计器中，在属性窗口中选择Event，找到Loaded和Closed两个方法，分别双击，添加两个事件的处理函数：</p>

<p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/8400.25_7840F680.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-22-76-metablogapi/8400.25_5F00_7840F680.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="25" border="0" alt="25" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/2642.25_thumb_^8D5C.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-22-76-metablogapi/2642.25_5F00_thumb_5F00_5E008D5C.png" width="372" height="455" /></a> </p>

<p>在MainWindow.xaml.cs文件的MainWindow类中，声明Runtime的变量：</p>

<p>Runtime nui;</p>

<p>然后，在Loaded事件的处理函数中添加Runtime初始化的代码：</p>

<pre class="csharpcode"><span class="kwrd">private</span> <span class="kwrd">void</span> Window_Loaded(<span class="kwrd">object</span> sender, RoutedEventArgs e)

{

nui = <span class="kwrd">new</span> Runtime();

nui.Initialize(RuntimeOptions.UseColor| RuntimeOptions.UseDepth | RuntimeOptions.UseDepthAndPlayerIndex | RuntimeOptions.UseSkeletalTracking);

}</pre>


<p>接下来是Closed事件中关闭Runtime的代码：</p>

<pre class="csharpcode"><span class="kwrd">private</span> <span class="kwrd">void</span> Window_Closed(<span class="kwrd">object</span> sender, EventArgs e)

{

nui.Uninitialize();

}</pre>


<p></p>

<p>Runtime对象是Kinect SDK中最主要的一个类，所有针对Kinect的操作都由Runtime类进行了封装。Runtime的构造函数没有接受任何参数，但有一个显式的初始化函数Initialize，接受RuntimeOptions参数，指定调用Kinect的哪些功能。其中RuntimeOptions.UseColor表示使用RGB Camera，而RuntimeOptions.UseDepth则表示使用Depth传感器。</p>

<p>初始化工作完成之后，我们要通过RGB Camera来获取实时的图像数据了。我们首先要声明一个事件处理方法，来接收视频数据的信息：</p>

<pre class="csharpcode">nui.VideoFrameReady += <span class="kwrd">new</span> EventHandler&lt;ImageFrameReadyEventArgs&gt;(nui_VideoFrameReady);</pre>


<p>然后是事件处理函数：</p>

<pre class="csharpcode"><span class="kwrd">void</span> nui_VideoFrameReady(<span class="kwrd">object</span> sender, ImageFrameReadyEventArgs e)

{

PlanarImage imageData = e.ImageFrame.Image;

image1.Source = BitmapSource.Create(imageData.Width, imageData.Height, 96, 96,

PixelFormats.Bgr32, <span class="kwrd">null</span>, imageData.Bits, imageData.Width * imageData.BytesPerPixel);

<span class="rem">//image1.Source = e.ImageFrame.ToBitmapSource();</span>

}</pre>


<p></p>

<p>提示：Getting Started上提供的Sample Code有误，需要将最后一个参数中的data.Width改为imageData.Width才可以正常运行。</p>

<p>VideoFrameReady事件会传递一个ImageFrameReadyEventArgs参数给事件处理函数，其中的ImageFrame会包含关于图片的各种信息，比如Type变量指定了图像是来自RGB还是Depth，Resolution变量指定了分辨率，而Image中以byte[]数组的方式保存了图像的真实数据。</p>

<p>然后的工作就是根据PlanarImage中包括的数据来创建一个Bitmap对象，然后将其传递给Image控件，显示到WPF程序的界面上。</p>

<p>最后，我们还要在构造函数里打开视频流，来获取视频数据：</p>

<pre class="csharpcode">nui.VideoStream.Open(ImageStreamType.Video, 2, ImageResolution.Resolution640x480, ImageType.Color);</pre>


<p>第一个参数是ImageStreamType，用来指定打开的设备流类型；第二个参数是PoolSize，指定缓冲区的数量，至少为2，保证一个Buffer进行绘制，另一个Buffer进行数据填充；第三个参数指定Camera的分辨率；第四个参数则是获取的图片类型。</p>

<p>显示效果如下图所示：</p>

<p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/7851.24Copy_35157853.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-22-76-metablogapi/7851.24Copy_5F00_35157853.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="24 - Copy" border="0" alt="24 - Copy" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/5775.24Copy_thumb_4BF449CF.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-22-76-metablogapi/5775.24Copy_5F00_thumb_5F00_4BF449CF.png" width="616" height="412" /></a> </p>

<p>上面的示例代码，没有使用Coding4Fun的Helper类，如果使用的话，则代码如下：</p>

<pre class="csharpcode"><span class="kwrd">void</span> nui_VideoFrameReady(<span class="kwrd">object</span> sender, ImageFrameReadyEventArgs e)

{

image1.Source = e.ImageFrame.ToBitmapSource();

e.ImageFrame.ToBitmapSource().Save(<span class="str">&quot;catpure.jpg&quot;</span>, ImageFormat.Jpeg);

}</pre>


<p></p>

<p>Helper类使用了C#的Extension Methods，为ImageFrame增加了一些转换方法。我们还可以将图像保存为文件，考虑到文件系统存储的效率文件，建议大家不用每张都存。</p>

<h3>获取Depth信息</h3>

<p>接下来我们要获取Depth信息了，过程与RGB Camera类似。首先要确保Runtime对象被初始化时，已经添加了RuntimeOptions.UseDepth的属性，否则设备无法正常打开。</p>

<p>然后，添加获取Depth数据的事件处理，并打开Depth的数据流，这次的分辨率是320x240：</p>

<pre class="csharpcode">nui.DepthFrameReady += <span class="kwrd">new</span> EventHandler&lt;ImageFrameReadyEventArgs&gt;(nui_DepthFrameReady);

nui.DepthStream.Open(ImageStreamType.Depth, 2, ImageResolution.Resolution320x240, ImageType.Depth);</pre>


<p></p>

<p>下面是事件处理函数，在另外一个Image函数里，显示Depth图像：</p>

<pre class="csharpcode"><span class="kwrd">void</span> nui_DepthFrameReady(<span class="kwrd">object</span> sender, ImageFrameReadyEventArgs e)

{

image2.Source = e.ImageFrame.ToBitmapSource(); 

}</pre>


<p></p>

<p>偷懒，所以使用了Coding4Fun的Helper类。程序运行的效果如下：</p>

<p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/2664.24_573D5E0C.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-22-76-metablogapi/2664.24_5F00_573D5E0C.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="24" border="0" alt="24" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/0820.24_thumb_030DB1FC.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-22-76-metablogapi/0820.24_5F00_thumb_5F00_030DB1FC.png" width="650" height="435" /></a> </p>

<h3>写到最后</h3>

<p>这一篇中，我们完成了Kinect开发环境的配置、添加了Coding4Fun Kinect Toolkit、从RGB Camera和Depth Sensor中获取了图像信息。</p>

<p>接下来，我们就要进入Kinect动作捕捉部分了。</p>]]></content:encoded>
    </item>
    <item>
      <title>Kinect for Windows SDK开发初体验（一）环境配置</title>
      <link>https://docs.microsoft.com/archive/blogs/ninma/kinect-for-windows-sdk</link>
      <pubDate>Thu, 16 Jun 2011 12:26:55 GMT</pubDate>
      <dc:creator><![CDATA[ninma]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/ninma/2011/06/16/kinect-for-windows-sdk/</guid>
      <description><![CDATA[作者：马宁  万众期待的Kinect for Windows...]]></description>
      <content:encoded><![CDATA[<p>作者：马宁</p>  <p>万众期待的Kinect for Windows SDK终于在广大开发者的千呼万唤中发布了beta版，作为历史上销售最快的消费电子产品，早就有无数人想将其用于其他领域了。微软虽然在硬件接口上制造了一点小障碍，但并没有对Kinect的输出做任何加密。于是，基于Kinect的各种应用层出不穷，也有开源社区提供了针对Kinect的USB驱动程序，比如OpenKinect等。</p>  <p>微软从谏如流，推出了官方版的Kinect for Windows SDK，终于让广大开发者可以名正言顺地使用Kinect SDK了。我希望能够在第一时间为国内开发者提供Kinect开发相关的介绍，根据微软官方提供的指南，从浅入深，将自己摸索Kinect SDK 的过程记录下来。</p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/2311.2_34EAFC22.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-22-76-metablogapi/2311.2_5F00_34EAFC22.png"><img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="2" border="0" alt="2" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/3858.2_thumb_330A808E.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-22-76-metablogapi/3858.2_5F00_thumb_5F00_330A808E.png" width="533" height="355" /></a> </p>  <h3>安装环境</h3>  <p>首先来说，Kinect for Windows SDK的下载地址：</p>  <p><a href="https://research.microsoft.com/en-us/um/redmond/projects/kinectsdk/download.aspx">https://research.microsoft.com/en-us/um/redmond/projects/kinectsdk/download.aspx</a></p>  <p>Kinect SDK目前只支持Windows 7，分为x86和x64两个版本。开发工具方面还需要.NET Framework 4.0和Visual Studio 2010 （最低Express版本）的支持。</p>  <p>Kinect SDK的视频开发教程：</p>  <p><a href="https://channel9.msdn.com/Series/KinectSDKQuickstarts?sort=recent#tab_sortBy_recent">https://channel9.msdn.com/Series/KinectSDKQuickstarts?sort=recent#tab_sortBy_recent</a></p>  <p>Kinect SDK的开发指南：</p>  <p><a href="https://research.microsoft.com/en-us/um/redmond/projects/kinectsdk/guides.aspx">https://research.microsoft.com/en-us/um/redmond/projects/kinectsdk/guides.aspx</a></p>  <p>Kinect SDK的官方论坛：</p>  <p><a href="https://social.msdn.microsoft.com/Forums/en-US/kinectsdk/threads">https://social.msdn.microsoft.com/Forums/en-US/kinectsdk/threads</a></p>  <p>硬件设备的需求是：Kinect for Xbox 360 sensor和Xbox 360 Kinect AC Adapter/ Power Supply。</p>  <p>如果您购买的是单独的Kinect，将包含Kinect AC Adapter/ Power Supply。但是如果您购买的是XBOX 360 Slim和Kinect的套装，就需要单独购买Kinect AC Adapter/ Power Supply。下面是亚马逊上的产品链接：</p>  <p><a href="https://www.amazon.com/Xbox-360-Kinect-Adapter-Power-Supply/dp/B004IXRXGY/ref=sr_1_1?ie=UTF8&amp;qid=1308247174&amp;sr=8-1">https://www.amazon.com/Xbox-360-Kinect-Adapter-Power-Supply/dp/B004IXRXGY/ref=sr_1_1?ie=UTF8&amp;qid=1308247174&amp;sr=8-1</a></p>  <h3>安装步骤</h3>  <h4>1. 硬件安装</h4>  <p>下面的图片是Kinect和AC Adapter/ Power Supply：</p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/7587.WP_000094_6298794D.jpg" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-22-76-metablogapi/7587.WP_5F00_000094_5F00_6298794D.jpg"><img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="WP_000094" border="0" alt="WP_000094" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/5025.WP_000094_thumb_24DB6BC4.jpg" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-22-76-metablogapi/5025.WP_5F00_000094_5F00_thumb_5F00_24DB6BC4.jpg" width="548" height="412" /></a> </p>  <p>按照接口连接好后，将USB插入到PC上，AC Adapter电源是可以支持220V的，所以不需要转换器直接插到电源上就可以。</p>  <h4>2. Kinect SDK安装</h4>  <p>Kinect SDK的安装过程非常简单，无需任何设置，直接安装即可。</p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/6433.1_04247C52.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-22-76-metablogapi/6433.1_5F00_04247C52.png"><img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="1" border="0" alt="1" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/4370.1_thumb_557E4DA2.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-22-76-metablogapi/4370.1_5F00_thumb_5F00_557E4DA2.png" width="575" height="451" /></a> </p>  <h4>3. 环境测试</h4>  <p>Kinect SDK安装完成后，我们将Kinect转接口的USB接口插入到PC中。PC会发现新硬件，并且自动查找驱动程序安装。下图是安装完成后的示意图：</p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/1830.evm1_784EE985.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-22-76-metablogapi/1830.evm1_5F00_784EE985.png"><img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="evm1" border="0" alt="evm1" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/3806.evm1_thumb_49A8BAD6.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-22-76-metablogapi/3806.evm1_5F00_thumb_5F00_49A8BAD6.png" width="549" height="356" /></a> </p>  <h4>4. 测试程序</h4>  <p>我们打开Kinect SDK中自带的Sample Skeletal Viewer就可以很方便地检测Kinect设备是否与PC已经连接好了。</p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/7041.evm2_0387D7F6.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-22-76-metablogapi/7041.evm2_5F00_0387D7F6.png"><img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="evm2" border="0" alt="evm2" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/4478.evm2_thumb_0F0D6F68.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-22-76-metablogapi/4478.evm2_5F00_thumb_5F00_0F0D6F68.png" width="633" height="240" /></a> </p>  <p>为了测试，逼得我不得不闪亮出镜了。以后Kinect调试，说不定还真要请一个人站在那里，实现敏捷开发中的“双人编程”……</p>  <h3>写到最后</h3>  <p>我们今天关于Kinect的介绍就到这里，在Kinect SDK的发布会上展示了很多有意思的DEMO，可见Kinect的应用前景是无限广阔的。下图就是一个Kinect与虚拟增强现实整合的案例：</p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/7633.4_1B1EC3C2.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-22-76-metablogapi/7633.4_5F00_1B1EC3C2.png"><img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="4" border="0" alt="4" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/1777.4_thumb_32C5D55B.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-22-76-metablogapi/1777.4_5F00_thumb_5F00_32C5D55B.png" width="558" height="318" /></a> </p>  <p>下一节，我们会深入Kinect真实的开发环境，来编写第一个Kinect的应用程序。</p>]]></content:encoded>
    </item>
    <item>
      <title>马宁的Windows Phone 7.1初体验——XNA与Silverlight集成</title>
      <link>https://docs.microsoft.com/archive/blogs/ninma/windows-phone-7-1xnasilverlight</link>
      <pubDate>Thu, 16 Jun 2011 09:10:20 GMT</pubDate>
      <dc:creator><![CDATA[ninma]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/ninma/2011/06/16/windows-phone-7-1xnasilverlight/</guid>
      <description><![CDATA[关于Windows Phone Mango真真假假的图片、视频已经在网上流传很久了，微软发布的Windows Phone 7.1 SDK可以让我们看到一部分Mango支持的功能。...]]></description>
      <content:encoded><![CDATA[<p>关于Windows Phone Mango真真假假的图片、视频已经在网上流传很久了，微软发布的Windows Phone 7.1 SDK可以让我们看到一部分Mango支持的功能。</p>  <p>普通用户对Mango的关注更多停留在多语言、多任务等方面，但对于开发者来说，Mango还有很多有趣的功能。我会试着将自己感兴趣的一些功能写出来，变成一个系列。</p>  <p>首先，大家要安装Windows Phone 7的SDK和Windows Phone 7.1 SDK的Beta 版，下载地址如下：</p>  <p><a href="https://www.microsoft.com/downloads/en/details.aspx?FamilyID=77586864-ab15-40e1-bc38-713a95a56a05">https://www.microsoft.com/downloads/en/details.aspx?FamilyID=77586864-ab15-40e1-bc38-713a95a56a05</a></p>  <h3>创建工程</h3>  <p>关于Windows Phone 7.1的第一个功能是XNA与Silverlight的集成。Windows Phone里有两个Framework，Silverlight是做应用的，而XNA是做游戏开发的。Silverlight有一套非常好用的UI设计工具和控件体系，而XNA对于动画效果的处理又远远超过Silverlight。但是在WP7里，Silverlight和XNA必须是分开的，所以当Silverlight应用需要高性能显示，或者XNA游戏里需要编写UI时，都会碰到很多困难。</p>  <p>于是，在WP 7.1里，提供了XNA与Silverlight集成的功能。接下来，我们就来看一下，如何创建一个Silverlight和XNA集成的应用。</p>  <p>打开Visual Studio 2010，选择File-New Project，在Visual C#里找到Silverlight for Windows Phone，然后选择其中的“Windows Phone 3D Graphics Application”，这个名字有足够的迷惑性，XNA的2D也是支持的。如下图：</p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/2768.2_3752B678.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-22-76-metablogapi/2768.2_5F00_3752B678.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="2" border="0" alt="2" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/4762.2_thumb_398BECDC.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-22-76-metablogapi/4762.2_5F00_thumb_5F00_398BECDC.png" width="710" height="492" /></a> </p>  <p>创建过程没有什么特殊的地方，创建完成后的工程如下图所示：</p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/6355.3_09CD82B6.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-22-76-metablogapi/6355.3_5F00_09CD82B6.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="3" border="0" alt="3" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/0523.3_thumb_2893D0C7.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-22-76-metablogapi/0523.3_5F00_thumb_5F00_2893D0C7.png" width="326" height="506" /></a> </p>  <p>说实话，XNA与Silverlight集成的实现并不算优雅，有点叠床架屋的感觉。整个Solution里分为三个Project，其中GraphicsApp1是我们的主程序，主要的逻辑代码都是在这个工程里的，这是一个典型的Silverlight程序，包含了App.xaml和MainPage.xmal，多出来一个GamePage.xaml，这个是XNA的页面。除此之外，还有两个Library，分别叫做GraphicsApp1Library和GraphicsApp1LibraryContent，后边是XNA的Content库，前边一个应该是为了能够让Silverlight加载XNA资源所做的适配库。</p>  <p>直接运行程序，我们会看到下面的界面，点击HomePage的Play按钮，我们就进入了XNA的GamePage界面：</p>  <p>&#160;<a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/3568.4_1AA13F32.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-22-76-metablogapi/3568.4_5F00_1AA13F32.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="4" border="0" alt="4" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/3187.4_thumb_06E42FD1.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-22-76-metablogapi/3187.4_5F00_thumb_5F00_06E42FD1.png" width="277" height="517" /></a> <a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/3286.5_470A237E.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-22-76-metablogapi/3286.5_5F00_470A237E.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="5" border="0" alt="5" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/6758.5_thumb_16B328FB.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-22-76-metablogapi/6758.5_5F00_thumb_5F00_16B328FB.png" width="279" height="515" /></a> </p>  <h3>GamePage探秘</h3>  <p>接下来，我们看一下GamePage.xaml的结构，看看这个看似普通的XAML页面里具体做了什么事情。首先是GamePage.xaml，如下：</p>  <pre class="csharpcode"><span class="kwrd">&lt;</span><span class="html">phone:PhoneApplicationPage</span> 
    <span class="attr">x:Class</span><span class="kwrd">=&quot;GraphicsApp2.GamePage&quot;</span>
    <span class="attr">xmlns</span><span class="kwrd">=&quot;https://schemas.microsoft.com/winfx/2006/xaml/presentation&quot;</span>
    <span class="attr">xmlns:x</span><span class="kwrd">=&quot;https://schemas.microsoft.com/winfx/2006/xaml&quot;</span>
    <span class="attr">xmlns:phone</span><span class="kwrd">=&quot;clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone&quot;</span>
    <span class="attr">xmlns:shell</span><span class="kwrd">=&quot;clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone&quot;</span>
    <span class="attr">xmlns:d</span><span class="kwrd">=&quot;https://schemas.microsoft.com/expression/blend/2008&quot;</span>
    <span class="attr">xmlns:mc</span><span class="kwrd">=&quot;https://schemas.openxmlformats.org/markup-compatibility/2006&quot;</span>
    <span class="attr">FontFamily</span><span class="kwrd">=&quot;{StaticResource PhoneFontFamilyNormal}&quot;</span>
    <span class="attr">FontSize</span><span class="kwrd">=&quot;{StaticResource PhoneFontSizeNormal}&quot;</span>
    <span class="attr">Foreground</span><span class="kwrd">=&quot;{StaticResource PhoneForegroundBrush}&quot;</span>
    <span class="attr">SupportedOrientations</span><span class="kwrd">=&quot;Portrait&quot;</span> <span class="attr">Orientation</span><span class="kwrd">=&quot;Portrait&quot;</span>
    <span class="attr">mc:Ignorable</span><span class="kwrd">=&quot;d&quot;</span> <span class="attr">d:DesignHeight</span><span class="kwrd">=&quot;800&quot;</span> <span class="attr">d:DesignWidth</span><span class="kwrd">=&quot;480&quot;</span>
    <span class="attr">shell:SystemTray</span>.<span class="attr">IsVisible</span><span class="kwrd">=&quot;False&quot;</span><span class="kwrd">&gt;</span>

    <span class="rem">&lt;!--No XAML content as the page is rendered entirely with XNA--&gt;</span>
    
<span class="kwrd">&lt;/</span><span class="html">phone:PhoneApplicationPage</span><span class="kwrd">&gt;</span></pre>


<p>&#160;</p>

<p>什么都没有……所有的显示都是由XNA控制的。接下来，我们去看GamePage.xaml.cs，首先来看引用程序集的部分：</p>

<pre class="csharpcode"><span class="kwrd">using</span> Microsoft.Xna.Framework;

<span class="kwrd">using</span> Microsoft.Xna.Framework.Content;

<span class="kwrd">using</span> Microsoft.Xna.Framework.Graphics;</pre>


<p>引用了三个XNA的命名空间，接下来是变量声明：</p>

<pre class="csharpcode">GameTimer timer;

ContentManager content;

SpriteBatch spriteBatch;

Texture2D texture;

Vector2 spritePosition;</pre>

<p>除了GameTimer是生面孔外，其他几个都是老熟人，GameTimer也好理解，Silverlight是事件驱动的Framework，如果想定时更新的话，必须要加入一个Timer。接下来，是GamePage的构造函数：</p>

<pre class="csharpcode">        <span class="kwrd">public</span> GamePage()
        {
            InitializeComponent();

            <span class="rem">// Get the application's ContentManager</span>
            content = (Application.Current <span class="kwrd">as</span> App).Content;

            <span class="rem">// Create a timer for this page</span>
            timer = <span class="kwrd">new</span> GameTimer();
            timer.UpdateInterval = TimeSpan.FromTicks(333333);
            timer.Update += OnUpdate;
            timer.Draw += OnDraw;
        }</pre>

<p>ContentManager对象是来自于App的Content属性，我们不会再有一个派生自Microsoft.Xna.Framework.Game的Host类了。然后是GameTimer的初始化工作，指定更新时间间隔，然后为Update和Draw事件添加方法。我不知道理解的是否正确，但有可能是GameTimer类重新实现了XNA Framework的机制。</p>

<p>然后是两个重载的Navigated函数：</p>

<pre class="csharpcode">        <span class="kwrd">protected</span> <span class="kwrd">override</span> <span class="kwrd">void</span> OnNavigatedTo(NavigationEventArgs e)
        {
            <span class="rem">// Set the sharing mode of the graphics device to turn on XNA rendering</span>
            SharedGraphicsDeviceManager.Current.GraphicsDevice.SetSharingMode(<span class="kwrd">true</span>);

            <span class="rem">// Create a new SpriteBatch, which can be used to draw textures.</span>
            spriteBatch = <span class="kwrd">new</span> SpriteBatch(SharedGraphicsDeviceManager.Current.GraphicsDevice);

            <span class="rem">// TODO: use this.content to load your game content here</span>

            <span class="rem">// Start the timer</span>
            timer.Start();

            <span class="kwrd">base</span>.OnNavigatedTo(e);
        }

        <span class="kwrd">protected</span> <span class="kwrd">override</span> <span class="kwrd">void</span> OnNavigatedFrom(NavigationEventArgs e)
        {
            <span class="rem">// Stop the timer</span>
            timer.Stop();

            <span class="rem">// Set the sharing mode of the graphics device to turn off XNA rendering</span>
            SharedGraphicsDeviceManager.Current.GraphicsDevice.SetSharingMode(<span class="kwrd">false</span>);

            <span class="kwrd">base</span>.OnNavigatedFrom(e);
        }</pre>


<p>&#160;</p>

<p>OnNavigatedTo函数实现了LoadContent的功能，第一句话值得注意，我们要首先打开GraphicsDevice的SetSharingMode为true，才能够让XNA元素正常的显示出来。这句话也交代了XNA最主要的类GraphicsDeviceManager的去向，被放到一个静态的SharedGraphicsDeviceManager对象里去了。</p>

<p>创建SpriteBatch和加载资源的过程不再叙述，最后要调用GameTimer的Start方法，来启动XNA的时间驱动机制，与之对应的是OnNavigatedFrom函数中，我们还需要调用GameTimer的Stop方法，来关闭时间驱动机制。</p>

<p>最后是熟悉的OnUpdate和OnDraw方法，就数这两个函数原汁原味地保留了XNA的特点。</p>

<pre class="csharpcode">        <span class="rem">/// &lt;summary&gt;</span>
        <span class="rem">/// Allows the page to run logic such as updating the world,</span>
        <span class="rem">/// checking for collisions, gathering input, and playing audio.</span>
        <span class="rem">/// &lt;/summary&gt;</span>
        <span class="kwrd">private</span> <span class="kwrd">void</span> OnUpdate(<span class="kwrd">object</span> sender, GameTimerEventArgs e)
        {
            <span class="rem">// TODO: Add your update logic here</span>
        }

        <span class="rem">/// &lt;summary&gt;</span>
        <span class="rem">/// Allows the page to draw itself.</span>
        <span class="rem">/// &lt;/summary&gt;</span>
        <span class="kwrd">private</span> <span class="kwrd">void</span> OnDraw(<span class="kwrd">object</span> sender, GameTimerEventArgs e)
        {
            SharedGraphicsDeviceManager.Current.GraphicsDevice.Clear(Microsoft.Xna.Framework.Color.CornflowerBlue);

            <span class="rem">// TODO: Add your drawing code here</span>
        }</pre>


<p>&#160;</p>

<h3>添加Silverlight控件</h3>

<p>如果只是在Silverlight应用里添加一个XNA的页面，恐怕还没有太大的吸引力。我们还应该让XNA和Silverlight能够在一个页面上显示。首先我们要打开GamePage.xaml文件，找到下面的代码：</p>

<pre class="csharpcode"><span class="rem">&lt;!--No XAML content as the page is rendered entirely with XNA--&gt;</span></pre>


<p>将下列代码替换上面的注释：</p>

<pre class="csharpcode">    <span class="rem">&lt;!-- LayoutRoot is the root grid where all page content is placed --&gt;</span>
    <span class="kwrd">&lt;</span><span class="html">Grid</span> <span class="attr">x:Name</span><span class="kwrd">=&quot;LayoutRoot&quot;</span><span class="kwrd">&gt;</span>
        <span class="kwrd">&lt;</span><span class="html">Grid.RowDefinitions</span><span class="kwrd">&gt;</span>
            <span class="kwrd">&lt;</span><span class="html">RowDefinition</span> <span class="attr">Height</span><span class="kwrd">=&quot;Auto&quot;</span><span class="kwrd">/&gt;</span>
            <span class="kwrd">&lt;</span><span class="html">RowDefinition</span> <span class="attr">Height</span><span class="kwrd">=&quot;*&quot;</span><span class="kwrd">/&gt;</span>
            <span class="kwrd">&lt;</span><span class="html">RowDefinition</span> <span class="attr">Height</span><span class="kwrd">=&quot;Auto&quot;</span><span class="kwrd">/&gt;</span>
        <span class="kwrd">&lt;/</span><span class="html">Grid.RowDefinitions</span><span class="kwrd">&gt;</span>

        <span class="rem">&lt;!-- Toggles the visibility of the ColorPanel --&gt;</span>
        <span class="kwrd">&lt;</span><span class="html">Button</span> <span class="attr">Grid</span>.<span class="attr">Row</span><span class="kwrd">=&quot;0&quot;</span> <span class="attr">x:Name</span><span class="kwrd">=&quot;ColorPanelToggleButton&quot;</span> <span class="attr">Click</span><span class="kwrd">=&quot;ColorPanelToggleButton_Click&quot;</span> <span class="attr">Margin</span><span class="kwrd">=&quot;1,0,-1,0&quot;</span><span class="kwrd">&gt;</span>Toggle Color Panel<span class="kwrd">&lt;/</span><span class="html">Button</span><span class="kwrd">&gt;</span>

        <span class="rem">&lt;!-- Arrange buttons in a horizontal line by using StackPanel --&gt;</span>
        <span class="kwrd">&lt;</span><span class="html">StackPanel</span> <span class="attr">x:Name</span><span class="kwrd">=&quot;ColorPanel&quot;</span> <span class="attr">Grid</span>.<span class="attr">Row</span><span class="kwrd">=&quot;2&quot;</span>  <span class="attr">Height</span><span class="kwrd">=&quot;100&quot;</span> <span class="attr">Orientation</span><span class="kwrd">=&quot;Horizontal&quot;</span> <span class="attr">HorizontalAlignment</span><span class="kwrd">=&quot;Center&quot;</span> <span class="attr">Visibility</span><span class="kwrd">=&quot;Visible&quot;</span><span class="kwrd">&gt;</span>
            <span class="rem">&lt;!-- Buttons to set the rectangle to specific colors --&gt;</span>
            <span class="kwrd">&lt;</span><span class="html">Button</span> <span class="attr">Click</span><span class="kwrd">=&quot;redButton_Click&quot;</span> <span class="attr">HorizontalAlignment</span><span class="kwrd">=&quot;Center&quot;</span> <span class="attr">Height</span><span class="kwrd">=&quot;75&quot;</span> <span class="attr">VerticalAlignment</span><span class="kwrd">=&quot;Center&quot;</span> <span class="attr">BorderThickness</span><span class="kwrd">=&quot;3&quot;</span> <span class="attr">Background</span><span class="kwrd">=&quot;Firebrick&quot;</span> <span class="attr">Width</span><span class="kwrd">=&quot;75&quot;</span> <span class="kwrd">/&gt;</span>
            <span class="kwrd">&lt;</span><span class="html">Button</span> <span class="attr">Click</span><span class="kwrd">=&quot;greenButton_Click&quot;</span> <span class="attr">HorizontalAlignment</span><span class="kwrd">=&quot;Center&quot;</span> <span class="attr">Height</span><span class="kwrd">=&quot;75&quot;</span> <span class="attr">VerticalAlignment</span><span class="kwrd">=&quot;Center&quot;</span> <span class="attr">BorderThickness</span><span class="kwrd">=&quot;3&quot;</span> <span class="attr">Background</span><span class="kwrd">=&quot;Lime&quot;</span> <span class="attr">Width</span><span class="kwrd">=&quot;75&quot;</span> <span class="kwrd">/&gt;</span>
            <span class="kwrd">&lt;</span><span class="html">Button</span> <span class="attr">Click</span><span class="kwrd">=&quot;blueButton_Click&quot;</span> <span class="attr">HorizontalAlignment</span><span class="kwrd">=&quot;Center&quot;</span> <span class="attr">Height</span><span class="kwrd">=&quot;75&quot;</span> <span class="attr">VerticalAlignment</span><span class="kwrd">=&quot;Center&quot;</span> <span class="attr">BorderThickness</span><span class="kwrd">=&quot;3&quot;</span> <span class="attr">Background</span><span class="kwrd">=&quot;Blue&quot;</span> <span class="attr">Width</span><span class="kwrd">=&quot;75&quot;</span> <span class="kwrd">/&gt;</span>
        <span class="kwrd">&lt;/</span><span class="html">StackPanel</span><span class="kwrd">&gt;</span>
    <span class="kwrd">&lt;/</span><span class="html">Grid</span><span class="kwrd">&gt;</span></pre>

<p>如果编译的话，会提示没有Button对应的事件处理函数。</p>

<h3>添加代码</h3>

<p>下面部分和MSDN提供的示例代码不同，我试图找到一种更简单的办法来更改颜色。首先，我们在GraphicsApp1LibraryContent工程里找到redRect.jpg，右键单击，选择Open With，然后在列表里选择Paint，用画图打开文件后，将整个图片涂成白色。做完这个工作后，记得一定要重新编译整个工程。</p>

<p>接下来，我们声明Color变量，并且在构造函数里赋初始值。</p>

<pre class="csharpcode">Color bgColor;

<span class="kwrd">public</span> GamePage()

{

<span class="rem">    // ...</span>
 
    bgColor = Color.Red;

}</pre>


<p>&#160;</p>

<p>然后我们增加事件处理函数，首先是控制颜色是否显示的控件：</p>

<pre class="csharpcode">        <span class="rem">// Toggle the visibility of the StackPanel named &quot;ColorPanel&quot;</span>
        <span class="kwrd">private</span> <span class="kwrd">void</span> ColorPanelToggleButton_Click(<span class="kwrd">object</span> sender, RoutedEventArgs e)
        {
            <span class="kwrd">if</span> (System.Windows.Visibility.Visible == ColorPanel.Visibility)
            {
                ColorPanel.Visibility = System.Windows.Visibility.Collapsed;
            }
            <span class="kwrd">else</span>
            {
                ColorPanel.Visibility = System.Windows.Visibility.Visible;
            }
        }</pre>

<p>然后是切换颜色的几个Button的处理函数：</p>

<pre class="csharpcode">        <span class="rem">// Switch to the red rectangle</span>
        <span class="kwrd">private</span> <span class="kwrd">void</span> redButton_Click(<span class="kwrd">object</span> sender, RoutedEventArgs e)
        {
            bgColor = Color.Red;
        }

        <span class="rem">// Switch to the green rectangle</span>
        <span class="kwrd">private</span> <span class="kwrd">void</span> greenButton_Click(<span class="kwrd">object</span> sender, RoutedEventArgs e)
        {
            bgColor = Color.Green;
        }

        <span class="rem">// Switch to the blue rectangle</span>
        <span class="kwrd">private</span> <span class="kwrd">void</span> blueButton_Click(<span class="kwrd">object</span> sender, RoutedEventArgs e)
        {
            bgColor = Color.Blue;
        }</pre>


<p>&#160;</p>

<p>最后，我们在OnDraw函数里，找到下面的代码：</p>

<pre class="csharpcode">spriteBatch.Draw(texture, spritePosition, Color.White);</pre>

<p>换成下面的代码：</p>

<pre class="csharpcode">spriteBatch.Draw(texture, spritePosition, bgColor); </pre>


<p>这样我们就可以为白色的材质绘制出不同的颜色了。</p>

<p>现在程序可以编译通过了，但是运行程序后，Silverlight的控件却没办法显示出来。原因是Silverlight控件必须经过特殊的处理，才能够显示出来。首先要声明一个UIElementRenderer变量：</p>

<pre class="csharpcode"><span class="rem">// For rendering the XAML onto a texture</span>

UIElementRenderer elementRenderer;</pre>

<p>然后，在GamePage的构造函数里，添加下面的代码：</p>

<pre class="csharpcode"><span class="rem">// Use the LayoutUpdate event to know when the page layout </span>

<span class="rem">// has completed so we can create the UIElementRenderer</span>

LayoutUpdated += <span class="kwrd">new</span> EventHandler(GamePage_LayoutUpdated);</pre>

<p>添加GamePage_LayoutUpdated的函数，在函数中创建UIElementRenderer的对象：</p>

<pre class="csharpcode">        <span class="kwrd">void</span> GamePage_LayoutUpdated(<span class="kwrd">object</span> sender, EventArgs e)
        {
            <span class="rem">// Create the UIElementRenderer to draw the XAML page to a texture.</span>

            <span class="rem">// Check for 0 because when we navigate away the LayoutUpdate event</span>
            <span class="rem">// is raised but ActualWidth and ActualHeight will be 0 in that case.</span>
            <span class="kwrd">if</span> (ActualWidth &gt; 0 &amp;&amp; ActualHeight &gt; 0 &amp;&amp; elementRenderer == <span class="kwrd">null</span>)
            {
                elementRenderer = <span class="kwrd">new</span> UIElementRenderer(<span class="kwrd">this</span>, (<span class="kwrd">int</span>)ActualWidth, (<span class="kwrd">int</span>)ActualHeight);
            }
        }</pre>


<p>&#160;</p>

<p>最后，在OnDraw函数里，添加下面的代码：</p>

<pre class="csharpcode">        <span class="rem">/// &lt;summary&gt;</span>
        <span class="rem">/// Allows the page to draw itself.</span>
        <span class="rem">/// &lt;/summary&gt;</span>
        <span class="kwrd">private</span> <span class="kwrd">void</span> OnDraw(<span class="kwrd">object</span> sender, GameTimerEventArgs e)
        {
            SharedGraphicsDeviceManager.Current.GraphicsDevice.Clear(Color.Black);

            <span class="rem">// TODO: Add your drawing code here</span>
            <span class="rem">// Render the Silverlight controls using the UIElementRenderer</span>
            elementRenderer.Render();


            <span class="rem">// Draw the sprite</span>
            spriteBatch.Begin();
            spriteBatch.Draw(texture, spritePosition, bgColor); <span class="rem">//Color.White);</span>
            spriteBatch.DrawString(StartFont, <span class="str">&quot;Hello, XNA&quot;</span>, <span class="kwrd">new</span> Vector2(50), Color.Blue);

            <span class="rem">// Using the texture from the UIElementRenderer, </span>
            <span class="rem">// draw the Silverlight controls to the screen</span>
            spriteBatch.Draw(elementRenderer.Texture, Vector2.Zero, Color.White);


            spriteBatch.End();
        }</pre>

<p>再运行程序时，我们就可以看到Silverlight控件了，点击颜色控件，方块会切换成对应的颜色。如下图所示：</p>

<p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/3036.6_3434DE2D.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-22-76-metablogapi/3036.6_5F00_3434DE2D.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="6" border="0" alt="6" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/8838.6_thumb_4745E50C.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-22-76-metablogapi/8838.6_5F00_thumb_5F00_4745E50C.png" width="299" height="562" /></a> </p>

<h3>加载XNA资源</h3>

<p>到这里，我们的体验基本上告一段落了，但是我试了一下是否能够正常加载XNA的字体，所以就写了最后这部分。</p>

<p>右键点击GraphicsApp1LibraryContent，选择Add – New Item。在对话框中选择Sprite Font，我们将字体命名为StartFont。在打开的字体文件中，我们将Size改成30，如下面所示：</p>

<pre class="csharpcode">    <span class="rem">&lt;!--</span>
<span class="rem">    Size is a float value, measured in points. Modify this value to change</span>
<span class="rem">    the size of the font.</span>
<span class="rem">    --&gt;</span>
    <span class="kwrd">&lt;</span><span class="html">Size</span><span class="kwrd">&gt;</span>30<span class="kwrd">&lt;/</span><span class="html">Size</span><span class="kwrd">&gt;</span></pre>

<p>回到GamePage.xaml.cs文件中，我们首先声明SpriteFont变量：</p>

<pre class="csharpcode">SpriteFont StartFont;</pre>


<p>然后，在OnNavigatedTo函数中，添加字体加载的代码：</p>

<pre class="csharpcode">        <span class="kwrd">protected</span> <span class="kwrd">override</span> <span class="kwrd">void</span> OnNavigatedTo(NavigationEventArgs e)
        {

            <span class="rem">// Set the sharing mode of the graphics device to turn on XNA rendering</span>
            SharedGraphicsDeviceManager.Current.GraphicsDevice.SetSharingMode(<span class="kwrd">true</span>);

            spriteBatch = <span class="kwrd">new</span> SpriteBatch(SharedGraphicsDeviceManager.Current.GraphicsDevice);

            <span class="rem">// TODO: use this.content to load your game content here</span>
            texture = content.Load&lt;Texture2D&gt;(<span class="str">&quot;redRect&quot;</span>);
            StartFont = content.Load&lt;SpriteFont&gt;(<span class="str">&quot;StartFont&quot;</span>);</pre>

<p>最后，在OnDraw函数里，添加字体的绘制函数：</p>

<pre class="csharpcode">spriteBatch.DrawString(StartFont, <span class="str">&quot;Hello, XNA&quot;</span>, <span class="kwrd">new</span> Vector2(50), Color.Blue);</pre>


<p>程序运行的效果如下：</p>

<p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/4162.7_054ED9F1.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-22-76-metablogapi/4162.7_5F00_054ED9F1.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="7" border="0" alt="7" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/5078.7_thumb_5EAD2118.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-22-76-metablogapi/5078.7_5F00_thumb_5F00_5EAD2118.png" width="323" height="602" /></a> </p>

<h3>另一条路</h3>

<p>除了在Silverlight for Windows Phone创建Windows Phone 3D Graphics Application外，我们还能够通过另一种方式创建XNA与Silverlight整合的应用程序。</p>

<p>在XNA Game Studio 4.0中，选择Windows Phone Rich Graphics Application：</p>

<p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/6574.1_40229495.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-22-76-metablogapi/6574.1_5F00_40229495.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="1" border="0" alt="1" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/4073.1_thumb_2BACA93D.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-22-76-metablogapi/4073.1_5F00_thumb_5F00_2BACA93D.png" width="714" height="495" /></a> </p>

<p>通过这个向导创建的程序，与上面创建的程序大同小异，只是界面略有不同。运行界面如下：</p>

<p>&#160;<a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/0675.8_6266B1E9.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-22-76-metablogapi/0675.8_5F00_6266B1E9.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="8" border="0" alt="8" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/5086.8_thumb_5D544E6D.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-22-76-metablogapi/5086.8_5F00_thumb_5F00_5D544E6D.png" width="270" height="503" /></a> <a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/1108.9_0E16BA3F.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-22-76-metablogapi/1108.9_5F00_0E16BA3F.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="9" border="0" alt="9" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/5751.9_thumb_58FA0541.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-22-76-metablogapi/5751.9_5F00_thumb_5F00_58FA0541.png" width="272" height="506" /></a> </p>

<h3>写在最后</h3>

<p>好了，到这里，我们正式将Windows Phone 7.1中的Silverlight与XNA整合应用介绍完了。在XNA游戏中，我们可以使用Silverlight来创建界面；也可以在Silverlight应用中编写高性能的3D界面。</p>

<h3>OpenXLive杯Windows Phone游戏开发大赛</h3>

<p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/7532.clip_image019_24A59061.jpg" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-22-76-metablogapi/7532.clip_5F00_image019_5F00_24A59061.jpg"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="clip_image019" border="0" alt="clip_image019" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/3730.clip_image019_thumb_304AB1C6.jpg" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-22-76-metablogapi/3730.clip_5F00_image019_5F00_thumb_5F00_304AB1C6.jpg" width="212" height="225" /></a></p>

<p>OpenXLive杯Windows Phone游戏开发大赛，是由OpenXLive联合国内知名的开发者社区：DevDiv、智机网、WPMind、Silverlight银光中国和XNA游戏世界，一起举办的针对Windows Phone游戏开发的比赛。</p>

<p><a href="https://www.openxlive.net/posts/news/40">https://www.openxlive.net/posts/news/40</a></p>]]></content:encoded>
    </item>
    <item>
      <title>如何将OpenXLive添加到WP7 Silverlight游戏中</title>
      <link>https://docs.microsoft.com/archive/blogs/ninma/openxlivewp7-silverlight</link>
      <pubDate>Sat, 02 Apr 2011 00:23:14 GMT</pubDate>
      <dc:creator><![CDATA[ninma]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/ninma/2011/04/02/openxlivewp7-silverlight/</guid>
      <description><![CDATA[OpenXLive beta版发布已经有一个半月的时间了，得到了开发者和玩家的好评，目前已经有五款OpenXLive游戏进入Windows Phone...]]></description>
      <content:encoded><![CDATA[<p>OpenXLive beta版发布已经有一个半月的时间了，得到了开发者和玩家的好评，目前已经有五款OpenXLive游戏进入Windows Phone Marketplace，其中的7bomb和Super Hoops都取得了非常骄人的成绩。</p>  <p>当OpenXLive在XNA游戏中大展身手的同时，我们也听到了一些来自Silverlight程序员的抱怨。在Windows Phone 7中虽然提供了XNA的游戏开发平台，但相当一部分的游戏是采用Silverlight开发的。毕竟对于显示性能不高的游戏来说，Silverlight是一个颇具魅力的快速开发工具。</p>  <p>幸好，我们在最初的架构设计上考虑了未来支持Silverlight的可能性，所以将业务逻辑部分封装到了OpenXLive.dll中，而将XNA上的XLiveForm窗体和控件库封装到了OpenXLive.Forms.dll中。我们只需要在Silverlight中调用OpenXLive中的功能即可。</p>  <p>在提供了一个OpenXLive on Silverlight的简单示例代码后，我们发现对Silverlight游戏的支持仍旧不够。首先，我们只提供了Leaderboard部分的示例代码，在缺乏文档的情况下，开发其他功能的UI是很困难的；其次，开发者并不希望自己动手写一个Silverlight UI，而只是想简单地在游戏中加入OpenXLive的支持，就像在XNA游戏中那样。</p>  <p>所以，我们重新定义了OpenXLive Silverlight的功能，实现了OpenXLive中的所有功能，并将其封装到了OpenXLive.Silverlight.dll中。在开发过程中，我们尽力保持XNA和Silverlight框架的一致性，如果您使用过OpenXLive XNA版本，在Silverlight版本中，您会有一种似曾相识的感觉，这正是我们所希望的。</p>  <p>需要提示的一点是，OpenXLive的Silverlight和XNA版本共同使用了一个逻辑程序集——OpenXLive.dll，所以他们在功能上是一致的。</p>  <p>未来，我们会将OpenXLive Silverlight加入到OpenXLive SDK中，并提供Visual Studio模板。在某一个时间点上，我们会考虑对OpenXLive Silverlight进行开源，让开发者能够方便的将OpenXLive Silverlight修改成自己想要的样子。</p>  <h3>OpenXLive简介</h3>  <p>微软为Windows Phone 7上的XNA和Silverlight游戏开发提供了非常好的开发工具和应用程序框架，使得开发者可以更加容易地开发出生动有趣的游戏来。但是随着开发的深入，我们发现，虽然我们开发的游戏品质可以和大公司的产品相媲美，但比起大公司游戏的用户体验还是相差很多。因为，我们必须将很多时间用于周边功能的开发，比如：启动界面(Splash Screen), 积分榜(Leaderboard)和游戏成就(Achievement)等，更不要奢谈为游戏加入SNS功能，比如：查看在线用户(Online Player)、云存储(Cloud Storage)等在线功能了。这些周边功能的开发时间，可能要超过游戏本身的开发时间，那我们该怎么办呢？</p>  <p>OpenXLive正在想办法帮助个人开发者和小团队开发者，使他们在最短的时间内拥有以上这些只有大公司才可能拥有的游戏功能。</p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/1541.openxlivelogo_4F7880AF.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-22-76-metablogapi/1541.openxlivelogo_5F00_4F7880AF.png"><img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="openxlive logo" border="0" alt="openxlive logo" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/8475.openxlivelogo_thumb_179616BF.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-22-76-metablogapi/8475.openxlivelogo_5F00_thumb_5F00_179616BF.png" width="367" height="99" /></a> </p>  <p>OpenXLive是一种为Windows Phone 7智能手机游戏开发者提供的云端在线服务。支持开发者为单机游戏增加云端和SNS功能，帮助开发者以最小的工作量将云端服务集成到自己的游戏中。这些云端服务包括：积分榜、游戏成就、在线对战、Social Network和云端存储等功能。与Open XLive类似的服务，还有iOS上的OpenFeint。</p>  <p>OpenXLive目前支持Windows Phone的XNA与Silverlight开发框架，不需要开发者编写UI代码，即可在游戏中方便地调用OpenXLive的界面及功能。由于XNA和Silverlight是两个不同的应用程序框架，所以，OpenXLive提供了不同的引用方式来支持XNA和Silverlight游戏。</p>  <p>本文讨论的是如何将OpenXLive加入到Silverlight游戏中，如果您的游戏采用XNA编写，请查看《OpenXLive开发入门》，链接如下：</p>  <p><a href="https://wiki.openxlive.net/Getting-Started-with-Open-XLive.ashx">https://wiki.openxlive.net/Getting-Started-with-Open-XLive.ashx</a></p>  <h3>添加引用</h3>  <p>您可以在下面的链接中下载单独的OpenXLive Silverlight SDK:</p>  <p><a title="https://resource.openxlive.com/resource/Download/ad686043-d477-4d5a-bc83-f27520a3d600" href="https://resource.openxlive.com/resource/Download/ad686043-d477-4d5a-bc83-f27520a3d600">https://resource.openxlive.com/resource/Download/ad686043-d477-4d5a-bc83-f27520a3d600</a></p>  <p>首先，我们假设您已经有了基于Silverlight开发的Windows Phone游戏。如果您想从头创建一个OpenXLive Silverlight游戏，您可以参考下一节《OpenXLive Silverlight向导使用》。</p>  <p>我们采用的示例工程OpenXLiveGameSilverlight，您可以在OpenXLive的资源网站中找到。</p>  <p>首先，我们在OpenXLive SDK的bin文件夹下找到OpenXLive.dll和OpenXLive.Silverlight.dll，将其拷贝到工程所在的目录中。</p>  <p>然后，在Visual Studio 2010中，打开OpenXLiveGameSilverlight工程，在Solution Explorer中找到References节点，右键单击啊，选择Add References，在对话框中选择Browse页面，找到工程目录下的OpenXLive.dll和OpenXLive.Silverlight.dll，将两个程序集的引用加入到工程中。</p>  <p>添加成功后，如下图所示：</p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/0167.SLDemo1_25A4DFEF.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-22-76-metablogapi/0167.SLDemo1_5F00_25A4DFEF.png"><img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="SLDemo1" border="0" alt="SLDemo1" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/2146.SLDemo1_thumb_1404CF57.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-22-76-metablogapi/2146.SLDemo1_5F00_thumb_5F00_1404CF57.png" width="312" height="401" /></a> </p>  <h3>修改初始页面</h3>  <p>在引用添加完成之后，我们还要修改WMAppMainifest.xml文件，使Silverlight游戏启动时，启动OpenXLive.Silverlight中所包含的Startup页面。</p>  <p>在工程的Propertes节点下找到WMAppMainifest.xml文件，双击打开，如下图所示：</p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/7532.SLDemo2_6ACD114B.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-22-76-metablogapi/7532.SLDemo2_5F00_6ACD114B.png"><img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="SLDemo2" border="0" alt="SLDemo2" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/1172.SLDemo2_thumb_27A1931E.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-22-76-metablogapi/1172.SLDemo2_5F00_thumb_5F00_27A1931E.png" width="376" height="376" /></a> </p>  <p>WMAppMainifest.xml文件的结构如下：</p>  <pre class="csharpcode"><span class="kwrd">&lt;?</span><span class="html">xml</span> <span class="attr">version</span><span class="kwrd">=&quot;1.0&quot;</span> <span class="attr">encoding</span><span class="kwrd">=&quot;utf-8&quot;</span>?<span class="kwrd">&gt;</span>

<span class="kwrd">&lt;</span><span class="html">Deployment</span> <span class="attr">xmlns</span><span class="kwrd">=&quot;https://schemas.microsoft.com/windowsphone/2009/deployment&quot;</span> <span class="attr">AppPlatformVersion</span><span class="kwrd">=&quot;7.0&quot;</span><span class="kwrd">&gt;</span>
  <span class="kwrd">&lt;</span><span class="html">App</span> <span class="attr">xmlns</span><span class="kwrd">=&quot;&quot;</span> <span class="attr">ProductID</span><span class="kwrd">=&quot;{3cf35939-f7f6-4808-969c-22d520f6a526}&quot;</span> <span class="attr">Title</span><span class="kwrd">=&quot;OpenXLiveGameSilverlight&quot;</span> <span class="attr">RuntimeType</span><span class="kwrd">=&quot;Silverlight&quot;</span> <span class="attr">Version</span><span class="kwrd">=&quot;1.0.0.0&quot;</span> <span class="attr">Genre</span><span class="kwrd">=&quot;apps.normal&quot;</span>  <span class="attr">Author</span><span class="kwrd">=&quot;OpenXLiveGameSilverlight author&quot;</span> <span class="attr">Description</span><span class="kwrd">=&quot;Sample description&quot;</span> <span class="attr">Publisher</span><span class="kwrd">=&quot;OpenXLiveGameSilverlight&quot;</span><span class="kwrd">&gt;</span>
    <span class="kwrd">&lt;</span><span class="html">IconPath</span> <span class="attr">IsRelative</span><span class="kwrd">=&quot;true&quot;</span> <span class="attr">IsResource</span><span class="kwrd">=&quot;false&quot;</span><span class="kwrd">&gt;</span>ApplicationIcon.png<span class="kwrd">&lt;/</span><span class="html">IconPath</span><span class="kwrd">&gt;</span>
    <span class="kwrd">&lt;</span><span class="html">Capabilities</span><span class="kwrd">&gt;</span>
      <span class="kwrd">&lt;</span><span class="html">Capability</span> <span class="attr">Name</span><span class="kwrd">=&quot;ID_CAP_GAMERSERVICES&quot;</span><span class="kwrd">/&gt;</span>
    <span class="kwrd">&lt;/</span><span class="html">Capabilities</span><span class="kwrd">&gt;</span>
    <span class="kwrd">&lt;</span><span class="html">Tasks</span><span class="kwrd">&gt;</span>
      <span class="kwrd">&lt;</span><span class="html">DefaultTask</span>  <span class="attr">Name</span> <span class="kwrd">=&quot;_default&quot;</span> <span class="attr">NavigationPage</span><span class="kwrd">=&quot;OpenXLive.Silverlight;component/Forms/StartupPage.xaml&quot;</span><span class="kwrd">/&gt;</span>
    <span class="kwrd">&lt;/</span><span class="html">Tasks</span><span class="kwrd">&gt;</span>
    <span class="kwrd">&lt;</span><span class="html">Tokens</span><span class="kwrd">&gt;</span>
      <span class="kwrd">&lt;</span><span class="html">PrimaryToken</span> <span class="attr">TokenID</span><span class="kwrd">=&quot;OpenXLiveGameSilverlightToken&quot;</span> <span class="attr">TaskName</span><span class="kwrd">=&quot;_default&quot;</span><span class="kwrd">&gt;</span>
        <span class="kwrd">&lt;</span><span class="html">TemplateType5</span><span class="kwrd">&gt;</span>
          <span class="kwrd">&lt;</span><span class="html">BackgroundImageURI</span> <span class="attr">IsRelative</span><span class="kwrd">=&quot;true&quot;</span> <span class="attr">IsResource</span><span class="kwrd">=&quot;false&quot;</span><span class="kwrd">&gt;</span>Background.png<span class="kwrd">&lt;/</span><span class="html">BackgroundImageURI</span><span class="kwrd">&gt;</span>
          <span class="kwrd">&lt;</span><span class="html">Count</span><span class="kwrd">&gt;</span>0<span class="kwrd">&lt;/</span><span class="html">Count</span><span class="kwrd">&gt;</span>
          <span class="kwrd">&lt;</span><span class="html">Title</span><span class="kwrd">&gt;</span>OpenXLiveGameSilverlight<span class="kwrd">&lt;/</span><span class="html">Title</span><span class="kwrd">&gt;</span>
        <span class="kwrd">&lt;/</span><span class="html">TemplateType5</span><span class="kwrd">&gt;</span>
      <span class="kwrd">&lt;/</span><span class="html">PrimaryToken</span><span class="kwrd">&gt;</span>
    <span class="kwrd">&lt;/</span><span class="html">Tokens</span><span class="kwrd">&gt;</span>
  <span class="kwrd">&lt;/</span><span class="html">App</span><span class="kwrd">&gt;</span>
<span class="kwrd">&lt;/</span><span class="html">Deployment</span><span class="kwrd">&gt;</span></pre>


<p>在WMAppMainifest.xml文件中找到<b>DefaultTask</b>节点，并将其中的NavigationPage改为”OpenXLive.Silverlight;component/Forms/StartupPage.xaml”。这样能保证Silverlight游戏启动之后，会首先启动OpenXLive的Startup页面。</p>

<p>接下来，我们还要完成对XLiveSLFormManager对象的初始化工作。打开工程中的App.xaml.cs文件，首先在文件顶部加入对OpenXLive.Silverlight的引用：</p>

<pre class="csharpcode"><span class="kwrd">using</span> OpenXLive.Silverlight;</pre>


<p>然后，在App类中找到<b>Application_Launching</b>方法，加入XLiveSLFormManager对象的创建操作：</p>

<pre class="csharpcode">        <span class="rem">// Code to execute when the application is launching (eg, from Start)</span>
        <span class="rem">// This code will not execute when the application is reactivated</span>
        <span class="kwrd">private</span> <span class="kwrd">void</span> Application_Launching(<span class="kwrd">object</span> sender, LaunchingEventArgs e)
        {
            XLiveSLFormManager manager = <span class="kwrd">new</span> XLiveSLFormManager(<span class="kwrd">this</span>, <span class="str">&quot;xxxxxxxxxxxxxxxx&quot;</span>);
        }</pre>


<p>其中，第一个参数为App实例的引用，第二个参数为SecretKey，该Key是在OpenXLive网站上创建游戏时，由系统生成的，作为OpenXLive系统识别游戏的唯一标识符，请保证这个SecretKey的安全，以防止其他游戏进行仿冒。</p>

<p>更多详细情况，请查看《在开发者网站上创建OpenXLive游戏》，链接如下：</p>

<p><a href="https://wiki.openxlive.net/Tutorial-4-Create-OpenXLive-Game-in-website.ashx">https://wiki.openxlive.net/Tutorial-4-Create-OpenXLive-Game-in-website.ashx</a></p>

<p>当然，我们也可以在App类中创建一个static的FormManager属性，用于在程序的其他地方调用XLiveSLFormManager对象，但这一步不是必须的，代码如下：</p>

<pre class="csharpcode">        <span class="kwrd">public</span> <span class="kwrd">static</span> XLiveSLFormManager FromManager { get; <span class="kwrd">internal</span> set; }

        <span class="rem">// Code to execute when the application is launching (eg, from Start)</span>
        <span class="rem">// This code will not execute when the application is reactivated</span>
        <span class="kwrd">private</span> <span class="kwrd">void</span> Application_Launching(<span class="kwrd">object</span> sender, LaunchingEventArgs e)
        {
            FromManager = <span class="kwrd">new</span> XLiveSLFormManager(<span class="kwrd">this</span>, <span class="str">&quot;xxxxxxxxxxxxxxxxxx&quot;</span>);
        }</pre>


<p>我们运行程序，能够看到下面的界面，是不是有一种似曾相识的感觉？点击Game Center和Leaderboards，我们可以进入相关的界面：</p>

<p align="center"><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/7382.SLDemo3_308DD305.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-22-76-metablogapi/7382.SLDemo3_5F00_308DD305.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="SLDemo3" border="0" alt="SLDemo3" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/4744.SLDemo3_thumb_5D731013.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-22-76-metablogapi/4744.SLDemo3_5F00_thumb_5F00_5D731013.png" width="197" height="365" /></a>&#160;&#160; <a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/6254.SL2_14C8FB75.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-22-76-metablogapi/6254.SL2_5F00_14C8FB75.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="SL2" border="0" alt="SL2" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/3531.SL2_thumb_2ABF413A.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-22-76-metablogapi/3531.SL2_5F00_thumb_5F00_2ABF413A.png" width="197" height="365" /></a>&#160; <a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/7652.SL3_42960293.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-22-76-metablogapi/7652.SL3_5F00_42960293.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="SL3" border="0" alt="SL3" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/8322.SL3_thumb_4B926847.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-22-76-metablogapi/8322.SL3_5F00_thumb_5F00_4B926847.png" width="196" height="364" /></a> </p>

<p>目前OpenXLive Silverlight只支持竖屏（Portrait）显示，未来我们会加入对于横屏（Landscape）的支持。另外，除了Startup界面之外，其他OpenXLive界面都是黑色背景，这样做主要是为了节省系统资源。</p>

<h3>添加背景和事件处理</h3>

<p>接下来，为了美化启动界面，我们要加入背景图片。添加背景图片的操作非常简单：在Solution Explorer中，选择Project节点，右键单击，选择Add – Existing Item，在选择一副PNG或JPG的图片，尺寸最好是800x480，这样能够有效保证图片不变形。</p>

<p>另外请确认一下，我们加入的图片Build Action为Resource，且Copy to Output Directory选择“Do not copy”。</p>

<p>然后，回到App.xaml.cs文件的Application_Launching方法中：</p>

<pre class="csharpcode">        <span class="rem">// Code to execute when the application is launching (eg, from Start)</span>
        <span class="rem">// This code will not execute when the application is reactivated</span>
        <span class="kwrd">private</span> <span class="kwrd">void</span> Application_Launching(<span class="kwrd">object</span> sender, LaunchingEventArgs e)
        {
            FromManager = <span class="kwrd">new</span> XLiveSLFormManager(<span class="kwrd">this</span>, <span class="str">&quot;xxxxxxxxxxxxxxxxxxx&quot;</span>);
            StartupPage.BackgroundPath = <span class="str">&quot;/OpenXLiveGameSilverlight;component/OpenXLive.Portrait.png&quot;</span>;
        }</pre>


<p>我们要为StartupPage添加BackgroundPath，示例代码的写法是针对游戏本身的资源，也可以指定一个来自Web的链接，不过出于显示效果的考虑，建议您不要这么做。OpenXLiveGameSilverlight，是资源所在程序集的名称；component/OpenXLive.Portrait.png，是资源的引用路径，如果资源包含在一个文件夹中，写法应该是component/MyFolder/OpenXLive.Portrait.png。</p>

<p>最后提醒，请大家千万不要忘记字符串前面的“/”，没有这个符号，程序将抛出异常。</p>

<p>接下来，我们要加入Startup页面的事件处理函数，当用户点击某一个按钮时，会触发一个事件操作。我们在下面增加了其中两个按钮的事件处理方法：</p>

<pre class="csharpcode">        <span class="kwrd">public</span> <span class="kwrd">static</span> XLiveSLFormManager FromManager { get; <span class="kwrd">internal</span> set; }

        <span class="rem">// Code to execute when the application is launching (eg, from Start)</span>
        <span class="rem">// This code will not execute when the application is reactivated</span>
        <span class="kwrd">private</span> <span class="kwrd">void</span> Application_Launching(<span class="kwrd">object</span> sender, LaunchingEventArgs e)
        {
            FromManager = <span class="kwrd">new</span> XLiveSLFormManager(<span class="kwrd">this</span>, <span class="str">&quot;xxxxxxxxxxxxxxxxxx&quot;</span>);
            StartupPage.BackgroundPath = <span class="str">&quot;/OpenXLiveGameSilverlight;component/OpenXLive.Portrait.png&quot;</span>;
            StartupPage.NewGameButtonClick += <span class="kwrd">new</span> EventHandler(StartupPage_NewGameButtonClick);
            StartupPage.AboutButtonClick += <span class="kwrd">new</span> EventHandler(StartupPage_AboutButtonClick);
        }

        <span class="kwrd">void</span> StartupPage_AboutButtonClick(<span class="kwrd">object</span> sender, EventArgs e)
        {
            MessageBox.Show(<span class="str">&quot;OpenXLive Silverlight Demo 1.0&quot;</span>);
        }

        <span class="kwrd">void</span> StartupPage_NewGameButtonClick(<span class="kwrd">object</span> sender, EventArgs e)
        {
            <span class="kwrd">this</span>.RootFrame.Navigate(<span class="kwrd">new</span> Uri(<span class="str">&quot;/MainPage.xaml&quot;</span>, UriKind.Relative));
        }</pre>


<p>AboutButtonClick的处理函数非常简单，只是调用了Message来显示游戏的版本信息。而NewGameButtonClick则是为了调用开发人员自己编写的Silverlight游戏界面，这个界面应该存在于Silverlight游戏的程序集中。</p>

<p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/6786.SL1_655678A9.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-22-76-metablogapi/6786.SL1_5F00_655678A9.png"><img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="SL1" border="0" alt="SL1" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/7536.SL1_thumb_2F5137F5.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-22-76-metablogapi/7536.SL1_5F00_thumb_5F00_2F5137F5.png" width="237" height="441" /></a> </p>

<p>最后，我们得到的Silverlight启动界面就是上图这样。我们在Silverlight的界面中，没有增加Exit选项，因为Silverlight界面默认不支持退出操作，只能通过按Back键来退出程序。</p>

<h3>使用Wizard创建新游戏</h3>

<p>接下来，我们要介绍如何使用Visual Studio 2010的Template来创建一个OpenXLive Silverlight游戏。OpenXLive Silverlight的模板会包括在OpenXLive SDK中，如果您安装了OpenXLive SDK，就可以在Visual Studio 2010中创建基于Silverlight的游戏了。</p>

<p>首先，打开Visual Studio 2010，在File菜单中选择New-Project，在New Project对话框中，选择Visual C#下的Silverlight for Windows Phone中的OpenXLive Silverlight节点，然后选择创建OpenXLiveSilverlightGame。</p>

<p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/6683.Wizard1_4F4BF918.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-22-76-metablogapi/6683.Wizard1_5F00_4F4BF918.png"><img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="Wizard1" border="0" alt="Wizard1" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/8105.Wizard1_thumb_609C0E56.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-22-76-metablogapi/8105.Wizard1_5F00_thumb_5F00_609C0E56.png" width="657" height="393" /></a> </p>

<p>OpenXLiveSilverlightGame工程创建完毕后，如果直接编译，会得到下列的错误提示：</p>

<p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/4314.Wizard2_6E1E58F7.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-22-76-metablogapi/4314.Wizard2_5F00_6E1E58F7.png"><img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="Wizard2" border="0" alt="Wizard2" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/4807.Wizard2_thumb_5F933705.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-22-76-metablogapi/4807.Wizard2_5F00_thumb_5F00_5F933705.png" width="631" height="148" /></a> </p>

<p>这个错误是为了提醒开发者，要在OpenXLive开发者网站上创建自己的游戏，获取游戏对应的Secret Key，才能够正常使用OpenXLive的在线功能。</p>

<p>获取Secret Key的方法，请参考《在开发者网站上创建OpenXLive游戏》，链接如下：</p>

<p><a href="https://wiki.openxlive.net/Tutorial-4-Create-OpenXLive-Game-in-website.ashx">https://wiki.openxlive.net/Tutorial-4-Create-OpenXLive-Game-in-website.ashx</a></p>

<p>打开App.xaml.cs文件，找到下面的代码：</p>

<pre class="csharpcode"><span class="kwrd">public</span> <span class="kwrd">static</span> XLiveSLFormManager FromManager { get; <span class="kwrd">internal</span> set; }

<span class="preproc">#error</span> Please full your game Secret Key <span class="kwrd">in</span> below code
<span class="kwrd">private</span> <span class="kwrd">string</span> APISecretKey = <span class="str">&quot;xxxxxxxxxxxxxxxxxxxxxxxxxxxx&quot;</span>;

<span class="rem">// Code to execute when the application is launching (eg, from Start)</span>
<span class="rem">// This code will not execute when the application is reactivated</span>
<span class="kwrd">private</span> <span class="kwrd">void</span> Application_Launching(<span class="kwrd">object</span> sender, LaunchingEventArgs e)
{
    FromManager = <span class="kwrd">new</span> XLiveSLFormManager(<span class="kwrd">this</span>, APISecretKey);
    StartupPage.BackgroundPath = <span class="str">&quot;/OpenXLiveSilverlightGame2;component/OpenXLive.Portrait.png&quot;</span>;
    StartupPage.NewGameButtonClick += <span class="kwrd">new</span> EventHandler(StartupPage_NewGameButtonClick);
    StartupPage.AboutButtonClick += <span class="kwrd">new</span> EventHandler(StartupPage_AboutButtonClick);
}</pre>


<p>开发者将Secret Key加入到高亮显示部分，并且注释掉#error代码，我们的工程就可以正常编译了。</p>

<p>我们也可以修改New Game Button的事件处理函数，来决定调用哪个Silverlight窗体。</p>

<pre class="csharpcode"><span class="kwrd">void</span> StartupPage_NewGameButtonClick(<span class="kwrd">object</span> sender, EventArgs e)
{
    <span class="kwrd">this</span>.RootFrame.Navigate(<span class="kwrd">new</span> Uri(<span class="str">&quot;/MainPage.xaml&quot;</span>, UriKind.Relative));
}</pre>


<p>到这里，我们就介绍完了如何通过Visual Studio 2010向导来创建OpenXLive Silverlight游戏的方法。</p>

<h3>写在最后</h3>

<p>我们用几乎与XNA版本相同的顺序，叙述了如何将OpenXLive Silverlight加入到Windows Phone Silverlight的游戏中去。接下来，我们会介绍，如何提交成绩、提交成就，考虑到Silverlight的界面编程更加容易，我们并不会提供一个标准的成绩提交界面，该界面只会以示例代码的形式出现。</p>

<p><a href="https://wiki.openxlive.net/OpenXLive-Silverlight.ashx">https://wiki.openxlive.net/OpenXLive-Silverlight.ashx</a></p>

<h3>引用</h3>

<p><strong>OpenXLive</strong><strong>官方网站</strong></p>

<p><a href="https://www.openxlive.net/">https://www.openxlive.net/</a><strong> </strong></p>

<p><strong>OpenXLive</strong><strong>开发者网站</strong><strong> </strong></p>

<p><a href="https://developer.openxlive.net/">https://developer.openxlive.net/</a><strong> </strong></p>

<p><strong>OpenXLive</strong><strong>开发入门</strong><strong></strong></p>

<p><a href="https://wiki.openxlive.net/Getting-Started-with-Open-XLive.ashx">https://wiki.openxlive.net/Getting-Started-with-Open-XLive.ashx</a></p>]]></content:encoded>
    </item>
    <item>
      <title>OpenXLive——开启Windows Phone 7游戏社交平台新时代</title>
      <link>https://docs.microsoft.com/archive/blogs/ninma/openxlivewindows-phone-7</link>
      <pubDate>Sat, 05 Mar 2011 20:10:06 GMT</pubDate>
      <dc:creator><![CDATA[ninma]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/ninma/2011/03/05/openxlivewindows-phone-7/</guid>
      <description><![CDATA[&#160;  介绍      OpenXLive是Windows Phone...]]></description>
      <content:encoded><![CDATA[<p>&#160;</p>  <h3>介绍</h3>  <p><b><i></i></b></p>  <p><b><i><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/2063.clip_image002_4EAFCC6B.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-22-76-metablogapi/2063.clip_5F00_image002_5F00_4EAFCC6B.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="clip_image002" border="0" alt="clip_image002" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/0005.clip_image002_thumb_046511C6.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-22-76-metablogapi/0005.clip_5F00_image002_5F00_thumb_5F00_046511C6.png" width="240" height="50" /></a></i></b></p>  <p>OpenXLive是Windows Phone 7上的游戏竞技和社交网络SNS平台，允许开发者以最小的工作量为自己的游戏增加游戏竞技服务和社交网络SNS功能。OpenXLive是由Fulcrum Mobile Networks, Inc.开发运营的。同类的应用还有iPhone上的OpenFeint和Plus+等。</p>  <h3>背景</h3>  <p>我们今天看到只是移动互联网的黎明，App Store无疑是移动互联网时代的第一缕曙光。App Store将开发者从传统软件公司、软件发布渠道中解放出来，只要有创意，哪怕是个人或者小团队，都可以获得巨大的成功。随着App Store模式的确立，无数开发者迎来了前所未有的机遇。</p>  <p>在迎来机遇的同时，困难也接踵而至。以游戏开发为例，优秀的个人、小团队开发者们可以完成创意、美工、编程等工作。但是，面对一些非核心领域时，个人开发者和小团队往往有些力不从心。比如，我们需要提供在线积分榜、游戏成就、社交网络，这些功能虽然不是必须的，但却有利于提高玩家的游戏体验和用户黏性。</p>  <p>但如果增加这些功能，对于小团队来说，成本无疑是高昂的，如果游戏数量比较少，那么这些非核心功能的开发量，甚至要超越游戏本身的开发量。</p>  <p>于是，Game Center应运而生，他们为开发者提供游戏在线功能、甚至将这些功能的UI也一并实现，用户只需要增加几行代码，就拥有了以前大型游戏公司才能拥有的在线功能。这其中，iPhone上的OpenFeint无疑是目前运营最为成功的第三方Game Center类在线服务。</p>  <p>Windows Phone 7为开发者提供了XBox Live的支持，但是开发者必须自己开发相应的UI来支持XBox Live。而且XBox Live是一个封闭式的收费系统，虽然拥有非常酷的功能，但比起开放的SNSN来，在社交性上要打一些折扣。</p>  <p>OpenXLive为开发者提供了完整的游戏竞技功能和相应UI的支持，使开发者可以方便地将OpenXLive嵌入到自己的游戏中，而无需为开发UI而烦恼。而且为开发者和玩家提供了SNS功能，只要轻轻一点，就可以添加好友、查看好友的游戏成就。</p>  <p><b><i><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/6862.clip_image004_54C6F339.jpg" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-22-76-metablogapi/6862.clip_5F00_image004_5F00_54C6F339.jpg"><img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="clip_image004" border="0" alt="clip_image004" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/5807.clip_image004_thumb_0A7C3894.jpg" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-22-76-metablogapi/5807.clip_5F00_image004_5F00_thumb_5F00_0A7C3894.jpg" width="497" height="269" /></a></i></b></p>  <p align="center"><b><i>&lt;</i></b><b><i>客户端UI</i></b><b><i>截图&gt;</i></b></p>  <p>OpenXLive提供了真实的社交网络功能，允许玩家在手机客户端和Web上查看好友信息和游戏成绩的情况。OpenXLive为每一个玩家提供了个人主页，来展示自己在游戏中取得的丰功伟绩，还可以在好友的消息上进行转发和评论。未来，OpenXLive会和其他社交网络平台更加紧密地结合在一起。</p>  <p>移动互联网时代，我们真正需要的是，一个开放式、永远免费、欢迎所有人、跨越平台、没有疆域、不带有任何偏见的游戏社交平台。</p>  <p><b><i><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/1007.clip_image006_1DBCEF33.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-22-76-metablogapi/1007.clip_5F00_image006_5F00_1DBCEF33.png"><img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="clip_image006" border="0" alt="clip_image006" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/3731.clip_image006_thumb_73F9743F.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-22-76-metablogapi/3731.clip_5F00_image006_5F00_thumb_5F00_73F9743F.png" width="353" height="409" /></a></i></b></p>  <p align="center"><b><i>&lt;</i></b><b><i>个人主页截图&gt;</i></b></p>  <p>OpenXLive还为游戏开发者提供了游戏的官网服务。个人开发者和小团队很难有资源维护自己的网站，提供官网主页可以帮助开发者更好地推广自己的游戏，并且及时收集玩家反馈。游戏官网还提供了对于下载人数和在线人数的计数器功能。</p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/0435.clip_image008_0A6C12C7.jpg" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-22-76-metablogapi/0435.clip_5F00_image008_5F00_0A6C12C7.jpg"><img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="clip_image008" border="0" alt="clip_image008" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/7041.clip_image008_thumb_4165F100.jpg" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-22-76-metablogapi/7041.clip_5F00_image008_5F00_thumb_5F00_4165F100.jpg" width="388" height="417" /></a></p>  <p align="center"><b><i>&lt;</i></b><b><i>游戏官网&gt;</i></b></p>  <h3>功能</h3>  <p>· <b>Leaderboard</b><b>积分榜</b><b></b></p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/5807.clip_image010_5B59B122.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-22-76-metablogapi/5807.clip_5F00_image010_5F00_5B59B122.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="clip_image010" border="0" alt="clip_image010" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/0447.clip_image010_thumb_6BF1AC10.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-22-76-metablogapi/0447.clip_5F00_image010_5F00_thumb_5F00_6BF1AC10.png" width="80" height="107" /></a></p>  <p>让全世界都知道你是这个游戏中的最强者！积分榜，用来记录你的游戏成绩，让你和全世界的玩家分享你超凡的游戏成绩。</p>  <p>积分榜，无疑是游戏中最核心的游戏功能之一。街机时代，我们甚至为将某台街机上的前三名都写上自己的名字而奋斗。互联网时代，我们不再满足于在一台游戏机上开疆拓土。看一下这个世界上最牛玩家的成绩，将来登顶那个世界之巅，也许是很多玩家的心愿。</p>  <p>OpenXLive提供了在线积分榜的功能，玩家可以查看这个游戏中积分最高的成绩，也可以查看好友在这个游戏中的表现，还可以查看自己在游戏积分榜中所处的位置。</p>  <p>对于开发者来说，OpenXLive提供了三种数据类型：整型数、浮点数和时间段。时间段成绩用于赛车类、竞速类的游戏。相比于其他积分榜服务只提供一种数据类型来说，OpenXLive无疑是一个进步。</p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/6305.clip_image012_51450FF7.jpg" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-22-76-metablogapi/6305.clip_5F00_image012_5F00_51450FF7.jpg"><img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="clip_image012" border="0" alt="clip_image012" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/4336.clip_image012_thumb_56474DA6.jpg" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-22-76-metablogapi/4336.clip_5F00_image012_5F00_thumb_5F00_56474DA6.jpg" width="401" height="216" /></a></p>  <p>除了Windows Phone上的积分榜外，我们还可以在WEB端查看游戏积分的情况。在游戏官网主页上，点击Leaderboard，就可以查看游戏的积分榜。</p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/5228.clip_image014_6D925217.jpg" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-22-76-metablogapi/5228.clip_5F00_image014_5F00_6D925217.jpg"><img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="clip_image014" border="0" alt="clip_image014" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/2502.clip_image014_thumb_4BC67986.jpg" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-22-76-metablogapi/2502.clip_5F00_image014_5F00_thumb_5F00_4BC67986.jpg" width="404" height="367" /></a></p>  <p>· <b>Achievements</b><b>游戏成就</b><b></b></p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/5734.clip_image016_1C285AFA.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-22-76-metablogapi/5734.clip_5F00_image016_5F00_1C285AFA.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="clip_image016" border="0" alt="clip_image016" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/5238.clip_image016_thumb_5AADA8A0.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-22-76-metablogapi/5238.clip_5F00_image016_5F00_thumb_5F00_5AADA8A0.png" width="80" height="107" /></a></p>  <p>一个个游戏成就，像一枚枚勋章，记录了你在游戏中的成长历程。篝火边，用成就，告诉你的朋友，你是如何成为游戏中最强的勇士。</p>  <p>游戏成就无疑是一个划时代的创新，将玩家以前只能通过口头传播的丰功伟绩，比如“我满血通关”，用可视化的方式呈现出来。游戏成就最早出现在XBox Live中，在SONY PSN的奖杯系统中壮大。现在，游戏成就已经成为设计精良的游戏大作中最吸引人的一部分，有的玩家甚至为了获取一些稀世成就，而反复通关，大大增加了游戏的生命周期。</p>  <p>同样，游戏成就的设计、实现难度也是非常巨大的。OpenXLive提供了一个在线平台，可以获取、展现玩家获取的游戏成就。开发者只需要在OpenXLive开发者网站上完成对于游戏成就的编辑，将成就代码加入到游戏中。获取、展现游戏成就的功能，都会有OpenXLive实现。</p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/8461.clip_image018_1528A875.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-22-76-metablogapi/8461.clip_5F00_image018_5F00_1528A875.png"><img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="clip_image018" border="0" alt="clip_image018" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/1537.clip_image018_thumb_6B652D81.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-22-76-metablogapi/1537.clip_5F00_image018_5F00_thumb_5F00_6B652D81.png" width="482" height="259" /></a></p>  <p>在游戏主页和玩家主页上，也会显示玩家所获取的游戏成就：</p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/3000.clip_image020_13B45FD6.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-22-76-metablogapi/3000.clip_5F00_image020_5F00_13B45FD6.png"><img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="clip_image020" border="0" alt="clip_image020" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/6242.clip_image020_thumb_2DA81FF8.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-22-76-metablogapi/6242.clip_5F00_image020_5F00_thumb_5F00_2DA81FF8.png" width="420" height="205" /></a></p>  <p>· <b>Social Network</b><b>社交网络</b><b></b></p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/7416.clip_image022_04BD0AEF.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-22-76-metablogapi/7416.clip_5F00_image022_5F00_04BD0AEF.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="clip_image022" border="0" alt="clip_image022" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/3286.clip_image022_thumb_3503DFA5.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-22-76-metablogapi/3286.clip_5F00_image022_5F00_thumb_5F00_3503DFA5.png" width="80" height="107" /></a></p>  <p>告诉你，这世界上还有多少兄弟姐妹和你一起在游戏中奋战。找到他们，和他们成为好友，一起开始一段冒险的路程。</p>  <p>SNS的魅力无法阻挡，在互联网上充满了SNS游戏时，手机游戏的领域仍然以单机游戏为主。这无疑是个充满想象力的空间。社交游戏，认为游戏应该和好友去玩；网络游戏，认为玩家是虚拟世界中的一个化身。</p>  <p>OpenXLive试图在游戏与好友之间搭起一座桥梁，你可以查看游戏中所有的在线用户，并且简单的将他们添加为好友；也可以查看好友的状态、成绩、游戏成就和最新的消息。</p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/5165.clip_image024_2CA00A4E.jpg" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-22-76-metablogapi/5165.clip_5F00_image024_5F00_2CA00A4E.jpg"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="clip_image024" border="0" alt="clip_image024" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/7725.clip_image024_thumb_2AEF3E7A.jpg" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-22-76-metablogapi/7725.clip_5F00_image024_5F00_thumb_5F00_2AEF3E7A.jpg" width="241" height="397" /></a> <a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/5672.clip_image026_3E2FF519.jpg" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-22-76-metablogapi/5672.clip_5F00_image026_5F00_3E2FF519.jpg"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="clip_image026" border="0" alt="clip_image026" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/2548.clip_image026_thumb_63B9727A.jpg" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-22-76-metablogapi/2548.clip_5F00_image026_5F00_thumb_5F00_63B9727A.jpg" width="240" height="398" /></a></p>  <p>当然我们也支持WEB端的个人主页。</p>  <p>· <b>My Center</b><b>个人中心</b><b></b></p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/8311.clip_image028_53CA2DB6.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-22-76-metablogapi/8311.clip_5F00_image028_5F00_53CA2DB6.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="clip_image028" border="0" alt="clip_image028" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/3443.clip_image028_thumb_6057DAD2.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-22-76-metablogapi/3443.clip_5F00_image028_5F00_thumb_5F00_6057DAD2.png" width="80" height="107" /></a></p>  <p>这里有你过去、现在和将来的故事。你的积分、你的成就、你玩过的游戏、你的好友，这是你值得珍藏的一页。</p>  <p>还记得第一次玩仙剑奇侠传时流过的眼泪吗？人是一种回忆的动物，如果有一个地方，能够帮助你珍藏这些青葱岁月时的记忆，哪怕只是内心深处的一个小角落，你是否愿意经常去看看呢？</p>  <p>My Center提供的就是这么一个小角落，让你看到过往的记忆与荣耀。无论过去多少年，你的游戏、你的成就、你的成绩，就在那里，不失不灭。</p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/8420.clip_image030_57F4057B.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-22-76-metablogapi/8420.clip_5F00_image030_5F00_57F4057B.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="clip_image030" border="0" alt="clip_image030" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/7840.clip_image030_thumb_556AD3BD.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-22-76-metablogapi/7840.clip_5F00_image030_5F00_thumb_5F00_556AD3BD.png" width="231" height="382" /></a></p>  <p>· <b>Cloud Storage</b><b>云存储</b><b></b></p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/4213.clip_image032_52E1A1FF.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-22-76-metablogapi/4213.clip_5F00_image032_5F00_52E1A1FF.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="clip_image032" border="0" alt="clip_image032" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/2541.clip_image032_thumb_5CC6936A.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-22-76-metablogapi/2541.clip_5F00_image032_5F00_thumb_5F00_5CC6936A.png" width="80" height="107" /></a></p>  <p>不想让别人发现你在游戏中的秘密？把它放在云端吧。你可以在任何地方，打开尘封的秘密。</p>  <p>即将上线……</p>  <p>· <b>Game Announcement</b><b>游戏公告</b><b></b></p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/4617.clip_image034_69544086.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-22-76-metablogapi/4617.clip_5F00_image034_5F00_69544086.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="clip_image034" border="0" alt="clip_image034" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/1070.clip_image034_thumb_0EDDBDE8.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-22-76-metablogapi/1070.clip_5F00_image034_5F00_thumb_5F00_0EDDBDE8.png" width="80" height="107" /></a></p>  <p>告诉你游戏中发生的大事件，比如，你成为了NO.1。</p>  <p>即将上线……</p>  <h3>下载SDK</h3>  <p>访问<a href="https://developer.openxlive.com/">https://developer.openxlive.com/</a> 点击“Install SDK”按钮下载OpenXLive SDK.</p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/3036.clip_image036_2DB431C6.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-22-76-metablogapi/3036.clip_5F00_image036_5F00_2DB431C6.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="clip_image036" border="0" alt="clip_image036" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/1882.clip_image036_thumb_768AA3CC.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-22-76-metablogapi/1882.clip_5F00_image036_5F00_thumb_5F00_768AA3CC.png" width="205" height="48" /></a></p>  <h3>应用</h3>  <p>XNA Tetris WP7 俄罗斯方块</p>  <p><a href="https://game.openxlive.com/page/xnatetriswp7">https://game.openxlive.com/page/xnatetriswp7</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/22/76/metablogapi/6366.clip_image038_1C14212E.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-22-76-metablogapi/6366.clip_5F00_image038_5F00_1C14212E.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="clip_image038" border="0" alt="clip_image038" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/1488.clip_image038_thumb_27C96860.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-22-76-metablogapi/1488.clip_5F00_image038_5F00_thumb_5F00_27C96860.png" width="203" height="346" /></a></p>  <p>Puzzle Sango 华容道</p>  <p><a href="https://game.openxlive.com/page/puzzlesango">https://game.openxlive.com/page/puzzlesango</a> <a href="https://game.openxlive.com/page/c9fbdcd8-243c-43c7-bf45-439f599ab901"></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/22/76/metablogapi/6675.clip_image040_4C7A7FD7.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-22-76-metablogapi/6675.clip_5F00_image040_5F00_4C7A7FD7.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="clip_image040" border="0" alt="clip_image040" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/2577.clip_image040_thumb_3C8B3B13.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-22-76-metablogapi/2577.clip_5F00_image040_5F00_thumb_5F00_3C8B3B13.png" width="209" height="358" /></a></p>  <h3>引用</h3>  <p>OpenXLive官网：<a href="https://www.openxlive.com">https://www.openxlive.com</a></p>  <p>OpenXLive中文网：<a href="https://www.openxlive.net">https://www.openxlive.net</a></p>  <p>OpenXLive开发者网站：<a href="https://developer.openxlive.com">https://developer.openxlive.com</a></p>  <p>OpenXLive 开发指南: <a href="https://wiki.openxlive.com/Getting-Started-with-Open-XLive.ashx">https://wiki.openxlive.com/Getting-Started-with-Open-XLive.ashx</a></p>  <p>Facebook: <a href="https://www.facebook.com/openxlive">https://www.facebook.com/openxlive</a></p>  <p>Twitter: <a href="https://twitter.com/openxlive">https://twitter.com/openxlive</a></p>  <p>新浪微博: <a href="https://t.sina.com.cn/openxlive">https://t.sina.com.cn/openxlive</a></p>  <p>搜狐微博 <a href="https://openxlive.t.sohu.com/">https://openxlive.t.sohu.com/</a></p>  <p>腾讯微博 <a href="https://t.qq.com/open_xlive">https://t.qq.com/open_xlive</a></p>]]></content:encoded>
    </item>
    <item>
      <title>OpenXLive: Add Game Social Network to XNA Game on Windows Phone 7</title>
      <link>https://docs.microsoft.com/archive/blogs/ninma/openxlive-add-game-social-network-to-xna-game-on-windows-phone-7</link>
      <pubDate>Sat, 05 Mar 2011 20:03:15 GMT</pubDate>
      <dc:creator><![CDATA[ninma]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/ninma/2011/03/05/openxlive-add-game-social-network-to-xna-game-on-windows-phone-7/</guid>
      <description><![CDATA[&#160;  www.openxlive.com&#160;   Introduction       OpenXLive connects gamers on Windows Phone 7...]]></description>
      <content:encoded><![CDATA[<p>&#160;</p>  <p><a href="https://www.openxlive.com">www.openxlive.com</a>&#160; </p>  <h3>Introduction</h3>  <p><b><i></i></b></p>  <p><b><i><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/0842.logo_190x40_67D22853.jpg" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-22-76-metablogapi/0842.logo_5F00_190x40_5F00_67D22853.jpg"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="logo_190x40" border="0" alt="logo_190x40" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/6215.logo_190x40_thumb_096E5125.jpg" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-22-76-metablogapi/6215.logo_5F00_190x40_5F00_thumb_5F00_096E5125.jpg" width="190" height="40" /></a> </i></b></p>  <p>OpenXLive connects gamers on Windows Phone 7 with a social network (SNS) platform, and enables mobile game developers to add social networking features in games with minimal development efforts, including friends, leaderboards, forum, and more. OpenXLive was developed by Fulcrum Mobile Network, Inc. Similar platforms include OpenFeint and Plus+, both of which run on iOS devices.</p>  <h3>Background</h3>  <p>OpenXLive enables and simplifies the development of social networking features for Windows Phone 7 XNA games. OpenXLive provides gaming community and social network user interface to be integrated into XNA games, which is not supported by Xbox Live.</p>  <p><b><i>&#160;<a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/6403.Startup6_563217BB.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-22-76-metablogapi/6403.Startup6_5F00_563217BB.png"><img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="Startup6" border="0" alt="Startup6" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/0535.Startup6_thumb_1AEE1623.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-22-76-metablogapi/0535.Startup6_5F00_thumb_5F00_1AEE1623.png" width="411" height="223" /></a> </i></b></p>  <p align="center"><b><i>&lt;Game UI&gt;</i></b></p>  <p>OpenXLive provides real gaming social networking experience, and allows gamers to share with friends their gaming achievements and status. Every gamer is provided a user homepage, where all the leaderboard scores and achievements can be looked at and shared. In the near future, Open XLive will integrate more tightly with other SNS platforms.</p>  <p align="center"><b><i><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/5635.PlayerPage_433D4877.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-22-76-metablogapi/5635.PlayerPage_5F00_433D4877.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="PlayerPage" border="0" alt="PlayerPage" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/4744.PlayerPage_thumb_1979CD84.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-22-76-metablogapi/4744.PlayerPage_5F00_thumb_5F00_1979CD84.png" width="357" height="413" /></a> </i></b></p>  <p align="center"><b><i>&lt;User Information Page &gt;</i></b></p>  <p>Open XLive provides game official websites. Individual game developers and small development teams usually have a hard time finding resources to run their game website. Game official website supported by Open XLive saves the trouble of maintaining your own website. It helps to promote your games, and collect gamer feedbacks. Game office website also provides supports on download count and online gamer count.</p>  <p><b><i><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/4251.homepage2_72CB4136.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-22-76-metablogapi/4251.homepage2_5F00_72CB4136.png"><img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="homepage2" border="0" alt="homepage2" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/5734.homepage2_thumb_7B6B99C2.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-22-76-metablogapi/5734.homepage2_5F00_thumb_5F00_7B6B99C2.png" width="367" height="395" /></a> </i></b></p>  <p align="center"><b><i>&lt;Game official website&gt;</i></b></p>  <h3>Getting Started on OpenXLive </h3>  <p>With the introduction of XNA and related developer tools on Windows Phone 7, it became much easier to develop games on this new mobile platform than ever before. Individual developers can now build rich and interesting games on Windows Phone 7 with shorter timeframe and less development efforts. However, there are still huge gaps in terms of user experiences compared to games from major game studios. Individual developers spend a great amount of time working on features not directly related to game contents, for example, Start-up Screen, Leaderboard, Achievement, etc. It takes even longer time and more efforts to develop and integrate SNS functionalities, such as Online Player and Cloud Storage. Research shows that such features may take longer than the development of the game itself.</p>  <p>Now introducing Open XLive, which makes these features available for individual game developers and small development teams, so that their games can compete with those from major game studios.</p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/0042.clip_image0024_46EAC77A.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-22-76-metablogapi/0042.clip_5F00_image0024_5F00_46EAC77A.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image002[4]" border="0" alt="clip_image002[4]" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/5756.clip_image0024_thumb_0ADE85C5.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-22-76-metablogapi/5756.clip_5F00_image0024_5F00_thumb_5F00_0ADE85C5.png" width="240" height="50" /></a></p>  <p>Open XLive is a cloud service providing social networking services for Windows Phone 7 games. It brings cloud and SNS features to single player games, making it possible for developers to integrate cloud services into their games. These cloud services include, but are not limited to, Leaderboard, Achievements, Online Gaming, Social Networking, and Cloud Storage. OpenFeint on iOS provides similar services to iOS devices.</p>  <p>Now let’s get started on how to add Open XLive services to existing XNA games.</p>  <h3>Download and Install SDK</h3>  <p>Before we get started, we need to install Windows Phone 7 SDK:</p>  <p>Visit <a href="https://create.msdn.com/en-us/home/getting_started">https://create.msdn.com/en-us/home/getting_started</a> and click on “Install Now”.</p>  <p>Then, we need to download the latest version of Open XLive SDK:</p>  <p><a href="https://developer.openxlive.com/">https://developer.openxlive.com/</a></p>  <p>In Quick Start, the second step is “Download and install Open XLive SDK”. Click on the following icon to download the latest version of Open XLive SDK.</p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/0044.clip_image004_7363D193.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-22-76-metablogapi/0044.clip_5F00_image004_5F00_7363D193.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image004" border="0" alt="clip_image004" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/2526.clip_image004_thumb_793E752C.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-22-76-metablogapi/2526.clip_5F00_image004_5F00_thumb_5F00_793E752C.png" width="165" height="38" /></a></p>  <p>Open XLive SDK is ZIP format. After decompression, an MSI package will be available for installation:</p>  <p><u><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/5734.SDK_7F1918C5.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-22-76-metablogapi/5734.SDK_5F00_7F1918C5.png"><img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="SDK" border="0" alt="SDK" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/8715.SDK_thumb_7D684CF1.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-22-76-metablogapi/8715.SDK_5F00_thumb_5F00_7D684CF1.png" width="484" height="398" /></a> </u></p>  <p>After installation, we can find Open XLive sample projects and development guides in Windows Start menu. It will also install Visual Studio 2010 project template for Open XLive Games. For more information about using the template, please refer to: </p>  <p>Tutorial 2: Using OpenXLive Wizard</p>  <p><a href="https://wiki.openxlive.com/Tutorial-2-Using-OpenXLive-Wizard.ashx">https://wiki.openxlive.com/Tutorial-2-Using-OpenXLive-Wizard.ashx</a></p>  <h3>XNA Projects with Open XLive</h3>  <p>To take a quick look at what Open XLive can offer and how it’s integrated into an XNA game, you can look at the XnaTetrisWP7 project before and after integration of Open XLive.</p>  <p>Please use below link to download XnaTetrisWP7 Sample Code：</p>  <p><a href="https://resource.openxlive.com/resource/Download/168db9c3-53de-41d4-b963-bc2ea278459d">https://resource.openxlive.com/resource/Download/168db9c3-53de-41d4-b963-bc2ea278459d</a></p>  <p>Project before the integration: </p>  <p>\\XnaTetrisWP7\Begin </p>  <p>After the integration:</p>  <p>\\ XnaTetrisWP7\End </p>  <p>Windows Phone 7 SDK needs to be installed for any Windows Phone 7 development, including for XNA games. Here is the link to the free download:</p>  <p><a href="https://create.msdn.com/en-us/home/getting_started">https://create.msdn.com/en-us/home/getting_started</a></p>  <p>After the SDK is installed, we can open the corresponding XNA project .sln file using Visual Studio 2010. Using XnaTetrisWP7 as an example, we’ll see the game running in Windows Phone 7 Emulator:</p>  <p>&#160;<a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/4682.Starting2_0674D873.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-22-76-metablogapi/4682.Starting2_5F00_0674D873.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Starting2" border="0" alt="Starting2" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/7713.Starting2_thumb_7FE158E2.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-22-76-metablogapi/7713.Starting2_5F00_thumb_5F00_7FE158E2.png" width="181" height="336" /></a> <a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/1452.Starting1_56F643D9.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-22-76-metablogapi/1452.Starting1_5F00_56F643D9.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Starting1" border="0" alt="Starting1" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/2133.Starting1_thumb_267FBF63.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-22-76-metablogapi/2133.Starting1_5F00_thumb_5F00_267FBF63.png" width="182" height="337" /></a> </p>  <p>It contains all the game features, but to be a successful commercial product, it’s not enough. Now we take you through the steps of adding Open XLive services in the game. </p>  <h3>Adding References</h3>  <p>First of all, open OpenXLive folder under Open XLive SDK, and copy the 2 files OpenXLive.dll and OpenXLive.Form.dll to your XNA project directory, for example, XnaTetrisWP7. By copying these binary files to your project, they can always be found after you copy your projects files.</p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/8080.SDK2_447DCD57.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-22-76-metablogapi/8080.SDK2_5F00_447DCD57.png"><img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="SDK2" border="0" alt="SDK2" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/0878.SDK2_thumb_7EF8CD2B.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-22-76-metablogapi/0878.SDK2_5F00_thumb_5F00_7EF8CD2B.png" width="233" height="379" /></a> </p>  <p>Now select the project (XnaTetrisWP7) from Solution Explorer in Visual Studio 2010, right click the project name, and choose “Add Reference…” form the context menu:</p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/6735.Add0_47CF3F32.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-22-76-metablogapi/6735.Add0_5F00_47CF3F32.png"><img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="Add0" border="0" alt="Add0" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/5684.Add0_thumb_1EE42A29.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-22-76-metablogapi/5684.Add0_5F00_thumb_5F00_1EE42A29.png" width="274" height="411" /></a> </p>  <p>In the “Add Reference” dialog, select “Browse” tab, navigate to the project folder with file OpenXLive.dll and OpenXLive.Form.dll, select the two files, and click OK:</p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/6747.Add1_23E667D8.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-22-76-metablogapi/6747.Add1_5F00_23E667D8.png"><img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="Add1" border="0" alt="Add1" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/6266.Add1_thumb_3B316C49.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-22-76-metablogapi/6266.Add1_5F00_thumb_5F00_3B316C49.png" width="404" height="321" /></a> </p>  <p>When this is done, check the References node in Solution Explorer, you should see the two files OpenXLive.dll and OpenXLive.Form.dll under it:</p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/0474.Add2_4E05EFF3.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-22-76-metablogapi/0474.Add2_5F00_4E05EFF3.png"><img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="Add2" border="0" alt="Add2" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/1464.Add2_thumb_5B3C5339.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-22-76-metablogapi/1464.Add2_5F00_thumb_5F00_5B3C5339.png" width="272" height="464" /></a> </p>  <h3>Coding</h3>  <p>After references are added to the project, we’ll add code to XNA source code. Open the .cs file for the Microsoft.Xna.Framework.Game derived class (XnaTetris.cs in XnaTetrisWP7 project).</p>  <p>Add namespaces for OpenXLive classes:</p>  <pre class="csharpcode"><span class="kwrd">using</span> OpenXLive;
<span class="kwrd">using</span> OpenXLive.Forms;</pre>


<p>In the Game class, add an XLiveFormManager member:</p>

<pre class="csharpcode">    <span class="kwrd">public</span> <span class="kwrd">class</span> XnaTetris : Microsoft.Xna.Framework.Game
    {
        XLiveFormManager manager;</pre>


<p>In Initialize method in Game class, create the XLiveFormManager instance:</p>

<pre class="csharpcode">        <span class="kwrd">protected</span> <span class="kwrd">override</span> <span class="kwrd">void</span> Initialize()
        {
            <span class="rem">// TODO: Add your initialization logic here</span>
            manager = <span class="kwrd">new</span> XLiveFormManager(<span class="kwrd">this</span>, <span class="str">&quot; xxxxxxxxxxxxxxxxxxx&quot;</span>); 
            Components.Add(manager);

            <span class="kwrd">base</span>.Initialize();
        }</pre>


<p>Replace “xxxxxxxxxxxxx” with the Application Secret Key and assign it to APISecretKey.</p>

<p>Please note the second parameter in the XLiveFormManager constructor; this is what we called “API Secret Key”, a string to uniquely identify each application using Open XLive. The key can be applied on Open XLive website at <a href="https://www.openxlive.com/">https://www.openxlive.com/</a>, and please refer to the document on how to apply on the website as well.</p>

<p>Now we’ll create a start-up page. Add the following lines in LoadContent method:</p>

<p>protected override void LoadContent()</p>

<pre class="csharpcode">        <span class="kwrd">protected</span> <span class="kwrd">override</span> <span class="kwrd">void</span> LoadContent()
        {
            <span class="rem">// ...</span>
            XLiveStartupForm form = <span class="kwrd">new</span> XLiveStartupForm(<span class="kwrd">this</span>.manager);
            form.Show();
            <span class="rem">// ...</span>
       }</pre>


<p>Then we need to change the Update method. To prevent XNA game from quitting when user presses the Back button, comment out the following lines:</p>

<pre class="csharpcode">        <span class="rem">// Allows the game to exit</span>
        <span class="kwrd">if</span> (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
            <span class="kwrd">this</span>.Exit();</pre>

<p>And add the highlighted lines:</p>

<pre class="csharpcode">        <span class="kwrd">protected</span> <span class="kwrd">override</span> <span class="kwrd">void</span> Update(GameTime gameTime)
        {
            <span class="rem">// Allows the game to exit</span>
            <span class="rem">//if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)</span>
            <span class="rem">//    this.Exit();</span>

            <span class="rem">// Allows the game to Pause</span>
<strong>            <span class="kwrd">if</span> (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
            {
                <span class="kwrd">if</span> (manager.IsRunning)
                {
                    XLiveFormFactory.Factory.ShowForm(<span class="str">&quot;Pause&quot;</span>);
                }
            }

            <span class="kwrd">if</span> (manager.IsRunning)
            {
</strong>                <span class="rem">// TODO: Add your update logic here</span>
                UpdateTouchPanel();

                <span class="kwrd">if</span> (GameUsedGrid.GetfStarted &amp;&amp; !fPause)
                {
                    GameUsedGrid.IncreaseTimeRecord(1);
                    <span class="kwrd">if</span> (GameUsedGrid.GetiTimeRecord == LevelTime[(GameUsedGrid.GetiLevel - 1) % 10])
                    {
                        GameUsedGrid.ResetTimeRecord();
                        GameUsedGrid.MoveDown();
                    }
                }
            }

            <span class="kwrd">base</span>.Update(gameTime);
        }</pre>

<p>The first piece of code prevents the game from quitting when user presses Back button; rather, it will show a Pause screen. The second piece of code allows the game update logic to be executed only when XLiveFormManager.IsRunning is True. </p>

<p>Finally, we add similar logics into Draw method:</p>

<pre class="csharpcode">        <span class="kwrd">protected</span> <span class="kwrd">override</span> <span class="kwrd">void</span> Draw(GameTime gameTime)
        {
            <strong><span class="kwrd">if</span> (manager.IsRunning)</strong>
            {

                GraphicsDevice.Clear(Color.CornflowerBlue);

                <span class="rem">// TODO: Add your drawing code here</span>
                spriteBatch.Begin();

                <span class="rem">// ...</span>

                spriteBatch.End();
            }

            <span class="kwrd">base</span>.Draw(gameTime);
        }</pre>


<p>Now we can build and run the XNA project with Open XLive. And a nice beautiful background image would make it even more attractive.</p>

<p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/4617.Run1_390447B3.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-22-76-metablogapi/4617.Run1_5F00_390447B3.png"><img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="Run1" border="0" alt="Run1" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/6170.Run1_thumb_3E068562.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-22-76-metablogapi/6170.Run1_5F00_thumb_5F00_3E068562.png" width="232" height="435" /></a> </p>

<h3>Adding Background Image</h3>

<p>Open XLive start-up UI supports any background image size, and it also supports animated background. If you would like to have background image animated, image size should be larger than 800x480 (landscape) or 480x800 (portrait). Please make sure the images used in background are legitimately licensed. Please follow the following guidelines for choosing background images.</p>

<p>Now we’ve picked a background image for XnaTetrisWP7, we can add it to the project. From Solution Explorer in Visual Studio 2010, select Content project (XnaTetrisWP7Content in the sample), right click and select “Add” -&gt; “Existing Item”.</p>

<p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/2553.Content1_4308C311.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-22-76-metablogapi/2553.Content1_5F00_4308C311.png"><img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="Content1" border="0" alt="Content1" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/5518.Content1_thumb_136AA485.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-22-76-metablogapi/5518.Content1_5F00_thumb_5F00_136AA485.png" width="473" height="311" /></a> </p>

<p>We place the background image into the Images folder. You can choose another folder as you prefer, and you should use the correct path when Content is loaded.</p>

<p>Now we will modify LoadContent method and changed the instantiation of XLivStartupForm to the following:</p>

<pre class="csharpcode">            Texture2D Startup = Content.Load&lt;Texture2D&gt;(<span class="str">@&quot;Images\MyBackground&quot;</span>);

            XLiveStartupForm form = <span class="kwrd">new</span> XLiveStartupForm(<span class="kwrd">this</span>.manager);
            form.Background = Startup;
            form.BackgroundAnimation = <span class="kwrd">true</span>;
            form.AnimationSpeed = 5;
            form.Show();</pre>


<p>In this code, image is first loaded with ContentManager, and then assigned to XLiveStartupForm instance. To support animation, BackgroundAnimation property is set to true. Please note that the size of background image needs to be larger than the display area if BackgroundAnimation property is set to true. AnimationSpeed property is set to 5 (default value is 5).</p>

<p>We can now run our game by pressing F5. Pressing “New Game” will enter game UI:</p>

<p>&#160;<a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/6366.1_1F1FEBB7.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-22-76-metablogapi/6366.1_5F00_1F1FEBB7.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="1" border="0" alt="1" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/6278.1_thumb_07A53786.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-22-76-metablogapi/6278.1_5F00_thumb_5F00_07A53786.png" width="203" height="374" /></a> <a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/1563.2_733F71FA.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-22-76-metablogapi/1563.2_5F00_733F71FA.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="2" border="0" alt="2" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/4520.2_thumb_411821B0.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-22-76-metablogapi/4520.2_5F00_thumb_5F00_411821B0.png" width="203" height="374" /></a> </p>

<h3>What’s the next?</h3>

<p>We’ve learned how to add Open XLive features to existing XNA games. Next, we’ll create a new Open XLive game using Visual Studio 2010 Open XLive template.</p>

<p><a href="https://wiki.openxlive.com/Tutorial-2-Using-OpenXLive-Wizard.ashx">https://wiki.openxlive.com/Tutorial-2-Using-OpenXLive-Wizard.ashx</a></p>

<h3>Reference</h3>

<p><strong>OpenXLive Website</strong></p>

<p><a href="https://www.openxlive.com/">https://www.openxlive.com/</a><strong> </strong></p>

<p><strong>OpenXLive Developer Website</strong></p>

<p><a href="https://developer.openxlive.com/">https://developer.openxlive.com/</a><strong> </strong></p>

<p><strong>Getting Started with Open XLive</strong></p>

<p><a href="https://wiki.openxlive.com/Getting-Started-with-Open-XLive.ashx">https://wiki.openxlive.com/Getting-Started-with-Open-XLive.ashx</a></p>]]></content:encoded>
    </item>
    <item>
      <title>Windows Phone Marketplace发布攻略</title>
      <link>https://docs.microsoft.com/archive/blogs/ninma/windows-phone-marketplace</link>
      <pubDate>Thu, 16 Dec 2010 22:27:38 GMT</pubDate>
      <dc:creator><![CDATA[ninma]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/ninma/2010/12/16/windows-phone-marketplace/</guid>
      <description><![CDATA[&#160;  作者：马宁  最近Windows Phone 7很火，Windows Phone...]]></description>
      <content:encoded><![CDATA[<p>&#160;</p>  <p>作者：马宁</p>  <p>最近Windows Phone 7很火，Windows Phone 7的Marketplace也很火，开发者们都想趁Marketplace中应用数量还不算多的时候，抢占制高点。对于如何在Marketplace中发布软件的过程，相信大家都有所了解，我只是结合微软的官方流程，将自己的经验、教训写出来，希望能够节省开发者的时间。毕竟测试失败一次，就要耽误三至四天，同类的软件可能就会抢占先机。</p>  <p>至于Marketplace申请帐号的问题，我的经验可能无法给你什么实质性的帮助，所以请大家参考Jake Lin的文章《注册Windows Phone Marketplace经验》：</p>  <p><a href="https://www.cnblogs.com/procoder/archive/2010/12/13/Windows-Phone-Marketplace.html">https://www.cnblogs.com/procoder/archive/2010/12/13/Windows-Phone-Marketplace.html</a></p>  <h3><strong></strong></h3>  <h3><strong>第一步：编译XAP</strong></h3>  <p>Visual Studio 2010每次编译后，会自动生成XAP文件，大家可以在工程文件的Bin目录下找到，千万记得要 Build一个Release版的出来。提交Debug版可能会造成很多意想不到的错误。</p>  <p>在编译XAP前，记得替换两个文件：Background.png(173x173)和GameThumbnail.png(64x64)。将这两个图片替换成与你的软件主题有关的图片，<b><font color="#ff0000">绝对不要使用默认提供的图片</font></b>。这两个文件的长宽是有限制的，我们稍后会详细解释。</p>  <h3>&#160;</h3>  <h3><strong>第二步：准备发布资料</strong></h3>  <p>很多开发者会以为写完了程序，编译出XAP就可以发布了。其实不是这样，建议大家在做提交前，还是仔细阅读一下微软的《App Hub Application Submission Walkthrough》：</p>  <p><a href="https://create.msdn.com/en-US/home/about/app_submission_walkthrough_upload">https://create.msdn.com/en-US/home/about/app_submission_walkthrough_upload</a></p>  <p>下面是我总结出来的文件列表，大家可以逐项核对：</p>  <p>1. XAP文件(Release版，已经替换Background.png和GameThumbnail.png)</p>  <p>2. 应用程序名称(必须是Marketplace唯一的，所以做好改名准备)</p>  <p>3. 应用程序标题(显示在Marketplace和开始菜单里，最好不要超过16个字符)</p>  <p>4. 详细描述：</p>  <p>描述软件的主要功能、如何使用等情况。对于中国开发者来说，如果你的软件界面中主要使用了中文，必须在描述中用英文在首要位置上说明，并且<b><font color="#ff0000">提供英文、中文的两种描述</font></b>，缺一不可。</p>  <p>5. 关键字（方便用户搜索，不多做解释了）</p>  <p>6. App tile</p>  <p>软件图标，三种尺寸的相同图片：173x173，99x99，200x200。图片尺寸必须是规定格式，系统不会为你做裁剪，所以要提前准备好，省得到时候抓狂。<font color="#ff0000"><b>图片必须采用</b><b>PNG</b><b>格式</b></font>。</p>  <p>7. Background art</p>  <p>可选项，Zune应用程序里的背景图，尺寸1000x800，可以提高软件的吸引力。</p>  <p>8. Screenshots</p>  <p>软件截图，至少一张，最多8张。尺寸是480x800。因为要竖着显示软件截图，所以横屏显示的软件要考虑好对策。</p>  <p>9. 软件价格</p>  <h4>Tips</h4>  <p>1， 建议将以上提到的资料放在一个文件夹里，文字资料则放到一个文本中。因为提交时要进行修改，存放到文本中便于保存和记录；</p>  <p>2， 三种尺寸的App Tile文件名保存为173x173.png，99x99.png，200x200.png；</p>  <p>3， 第一步中提到的Background.png(173x173)和GameThumbnail.png(64x64)，应和App Tile对应尺寸的文件一致。</p>  <h3>第二步：软件提交过程</h3>  <h4>1. Upload Your Application</h4>  <p>这一步要填写的是软件的基本信息。需要注意的是这几项内容：</p>  <p><strong>Application Name</strong>：必须是Marketplace唯一，我一般的做法是将Application Title中的空格去掉，比如“My First Game”的Application Name为“MyFirstGame”或“My_First_Game”</p>  <p><strong>Application Platform</strong>：废话，当然是Windows Phone 7</p>  <p><strong>Default language</strong>：目前支持English(International)、English、French、German、Italian和Spanish，作为中国开发者，我们别无选择，只能选English(International)</p>  <p><strong>Version：</strong>版本号</p>  <p><strong>Application package：</strong>XAP软件包</p>  <p>在选择XAP软件包后，还会有几个选项，主要是提供软件验证过程中的信息。我们可以简单忽略掉。</p>  <p><font color="#ff0000"><b>Tips</b><b>：</b></font>XAP的上传是在你点击Next之后开始的，由于目前Marketplace系统还不稳定，所以经常会看到一个Exception出来(可怜的ASP.NET啊，连个Try-catch都没加)。别害怕，多试几次，直到没有异常了，再进入下一步。</p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/4456.Walk_Submit_Step1_5D3072CE.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-22-76-metablogapi/4456.Walk_5F00_Submit_5F00_Step1_5F00_5D3072CE.png"><img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="Walk_Submit_Step1" border="0" alt="Walk_Submit_Step1" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/0714.Walk_Submit_Step1_thumb_1219640D.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-22-76-metablogapi/0714.Walk_5F00_Submit_5F00_Step1_5F00_thumb_5F00_1219640D.png" width="616" height="592" /></a> </p>  <h4>2. Provide the Application Description</h4>  <p>这部分提交的主要是文字部分，我们会结合提交内容和Zune、Marketplace的情况一起来看。</p>  <p><strong>Application title：</strong>软件标题，会出现在四种情况下：Zune的应用程序列表中，Zune的应用程序详情中，Marketplace的列表中，Marketplace的详情中。由于WP7不能截图，Marketplace的图就请大家自己想象吧。</p>  <p>大家会发现，在Zune的列表里，由于Application title字体很小，所以图标的作用要远远大于标题。</p>  <p>而在Marketplace里，如果标题过长，最后的部分会被截断，什么是合适的长度？16个字符以下。下面这些都是好名字：Google Search、Send to WP7、Flight Control……</p>  <p><strong>Category：</strong>分类，比较大的分类比如Game下，还会有Sub-category。建议大家在提交前，先看看Marketplace中同类软件或近似软件的分类，与他们放在在同一个分类里，会产生群聚效应。</p>  <p><strong>Detailed description：</strong>详细描述，我提交失败就是坏在这一步上。所以再次提醒：如果你的软件界面中主要使用了中文，必须在描述中用英文在首要位置上说明，并且<b><font color="#ff0000">提供英文、中文的两种描述</font></b>，缺一不可。</p>  <p>后边的optional就不多说了，主要是各种游戏分级的认证。</p>  <p>需要特别说一下的是Legal URL，很多开发者认为这是软件的主页，其实是法律文件的链接，会在安装时显示，如果你的软件有一些特殊的法律问题需要说明，比如涉及成人内容，最好还是提供一下，避免潜在的法律风险。</p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/8171.Walk_Submit_Step2_525B8F55.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-22-76-metablogapi/8171.Walk_5F00_Submit_5F00_Step2_5F00_525B8F55.png"><img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="Walk_Submit_Step2" border="0" alt="Walk_Submit_Step2" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/1273.Walk_Submit_Step2_thumb_573D816A.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-22-76-metablogapi/1273.Walk_5F00_Submit_5F00_Step2_5F00_thumb_5F00_573D816A.png" width="563" height="725" /></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/22/76/metablogapi/5023.AppList_17DBB9DB.jpg" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-22-76-metablogapi/5023.AppList_5F00_17DBB9DB.jpg"><img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="AppList" border="0" alt="AppList" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/8004.AppList_thumb_5206BE55.jpg" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-22-76-metablogapi/8004.AppList_5F00_thumb_5F00_5206BE55.jpg" width="613" height="311" /></a> </p>  <p align="center"><b>Zune</b><b>的应用程序列表</b></p>  <h4>3. Upload the artwork</h4>  <p>这一步主要是美工的业务领域了，没有美术细胞的程序员们先找地方哭一会儿去。我挨个解释图片的。</p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/6864.Walk_Submit_Step3_1CD9E38B.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-22-76-metablogapi/6864.Walk_5F00_Submit_5F00_Step3_5F00_1CD9E38B.png"><img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="Walk_Submit_Step3" border="0" alt="Walk_Submit_Step3" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/5810.Walk_Submit_Step3_thumb_4AF393AB.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-22-76-metablogapi/5810.Walk_5F00_Submit_5F00_Step3_5F00_thumb_5F00_4AF393AB.png" width="593" height="714" /></a> </p>  <p><strong>Large mobile app tile</strong></p>  <p>尺寸：173 x 173 x 96DPI。格式：PNG。当应用程序被显示到Start界面上时，需要显示的图标，如下图：</p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/4760.LargeMobile_25A5D7D8.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-22-76-metablogapi/4760.LargeMobile_5F00_25A5D7D8.png"><img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="LargeMobile" border="0" alt="LargeMobile" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/8322.LargeMobile_thumb_1C4950FD.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-22-76-metablogapi/8322.LargeMobile_5F00_thumb_5F00_1C4950FD.png" width="254" height="469" /></a>&#160;</p>  <p><strong>Small mobile app tile</strong></p>  <p>尺寸：99 x 99 x 96DPI。格式：PNG。当应用程序在Application List中显示时，所需要的图标，如下图：</p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/1411.SmallMobile_58A17A0D.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-22-76-metablogapi/1411.SmallMobile_5F00_58A17A0D.png"><img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="SmallMobile" border="0" alt="SmallMobile" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/6138.SmallMobile_thumb_534F4104.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-22-76-metablogapi/6138.SmallMobile_5F00_thumb_5F00_534F4104.png" width="256" height="477" /></a>&#160;</p>  <p><strong>Large PC app tile</strong></p>  <p>尺寸：200 x 200 x 96DPI。格式：PNG。当应用程序在Zune的软件列表中显示时，所需要的图标。见上图“Zune的应用程序列表”。</p>  <p><strong>Background art</strong></p>  <p>可选项。尺寸：1000 x 800 x 96DPI。格式：PNG。在Marketplace中作为软件背景显示的图片。目前使用Background art的软件不多，名气最大的是Flight control，如下图：</p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/4401.FlightControl_7C863D68.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-22-76-metablogapi/4401.FlightControl_5F00_7C863D68.png"><img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="FlightControl" border="0" alt="FlightControl" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/4621.FlightControl_thumb_640EC3B4.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-22-76-metablogapi/4621.FlightControl_5F00_thumb_5F00_640EC3B4.png" width="553" height="455" /></a> </p>  <p><strong>Screenshots</strong></p>  <p>屏幕截图，尺寸：480 x 800 x 96DPI。格式：PNG。至少有一张，最多8张。大家请注意，屏幕截图是竖着显示的，对于横屏的软件来说，需要想个办法，让用户看起来舒服一些。</p>  <p>最后我们用一张图，来说明一下，填写的各种信息，最后在Zune上是如何显示的。</p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/7041.image_35C08E2E.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-22-76-metablogapi/7041.image_5F00_35C08E2E.png"><img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="image" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/6330.image_thumb_5BE29BEC.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-22-76-metablogapi/6330.image_5F00_thumb_5F00_5BE29BEC.png" width="750" height="547" /></a> </p>  <h4>4. Set the Application Pricing</h4>  <p>这一页我没有太多经验，因为没提交过收费软件。两个需要注意的地方：</p>  <p><strong>Trial supported</strong>：是否支持验证版，免费软件不需要</p>  <p><strong>Worldwide distribution</strong>：是否支持全球发布</p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/7752.Walk_Submit_Step4_4D83D762.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-22-76-metablogapi/7752.Walk_5F00_Submit_5F00_Step4_5F00_4D83D762.png"><img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="Walk_Submit_Step4" border="0" alt="Walk_Submit_Step4" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/2425.Walk_Submit_Step4_thumb_4F7064C4.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-22-76-metablogapi/2425.Walk_5F00_Submit_5F00_Step4_5F00_thumb_5F00_4F7064C4.png" width="653" height="555" /></a> </p>  <h4>5. Submit Your Application</h4>  <p>最后一步，记得要选上“Automatically publish To Marketplace after passing certification”，测试过程完成后，会自动发布到Marketplace上。</p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/0218.Walk_Submit_Step5_57F071B6.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-22-76-metablogapi/0218.Walk_5F00_Submit_5F00_Step5_5F00_57F071B6.png"><img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="Walk_Submit_Step5" border="0" alt="Walk_Submit_Step5" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/7181.Walk_Submit_Step5_thumb_5CE28998.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-22-76-metablogapi/7181.Walk_5F00_Submit_5F00_Step5_5F00_thumb_5F00_5CE28998.png" width="679" height="438" /></a> </p>  <h3><strong>第三步：错误报告</strong></h3>  <p>在提交之后，我们可以在APP HUB的my dashboard里看到整个测试流程的进展。</p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/2313.dashboard_3A5A82B8.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-22-76-metablogapi/2313.dashboard_5F00_3A5A82B8.png"><img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="dashboard" border="0" alt="dashboard" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/1667.dashboard_thumb_311E4777.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-22-76-metablogapi/1667.dashboard_5F00_thumb_5F00_311E4777.png" width="878" height="198" /></a></p>  <p>&#160;</p>  <p>如果看到status里，状态是Testing failed，那就要赶紧去看看View details里的情况。</p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/4338.detail_1F9DC0D2.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-22-76-metablogapi/4338.detail_5F00_1F9DC0D2.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="detail" border="0" alt="detail" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/4774.detail_thumb_1578F9DA.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-22-76-metablogapi/4774.detail_5F00_thumb_5F00_1578F9DA.png" width="909" height="272" /></a> </p>  <p>进入Detail页面，我们能看到软件提交状态，在Action里选择View test results，会下载一个pdf文件，里边会有一个非常详细的测试报告。如果熟悉微软BUG管理系统的人，会觉得格式很眼熟。</p>  <p>最后说一句，你的软件已经提交到Marketplace中，你想升级的话，在Action里会有“<strong>Submit application update</strong>”选项。</p>  <h3>&#160;</h3>  <h3><strong>写到最后</strong></h3>  <p>好了，絮絮叨叨说这么多，希望大家能够对Marketplace软件发布的有足够的认识，毕竟，Marketplace玩的是注意力经济，再好的软件也要有好看的外表才能吸引人。</p>  <p>目前我的帐户主要想发布一些自己写的小东西，一个帐户有五个免费软件提交的名额，除去自己要用的，还剩<b><font color="#ff0000">两三个免费软件提交机会</font></b>。如果大家找不到发布渠道，可以通过博客园、CSDN的站内信联系我(aawolf)，我可以帮大家提交。</p>]]></content:encoded>
    </item>
    <item>
      <title>Windows Phone7中的IronRuby</title>
      <link>https://docs.microsoft.com/archive/blogs/ninma/windows-phone7ironruby</link>
      <pubDate>Fri, 19 Nov 2010 07:13:13 GMT</pubDate>
      <dc:creator><![CDATA[ninma]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/ninma/2010/11/19/windows-phone7ironruby/</guid>
      <description><![CDATA[作者：马宁  示例代码下载地址：  WP7_aawolf_IronRubyWP7.rar  写这篇BLOG完全是因为看了MSDN上的这篇文章：...]]></description>
      <content:encoded><![CDATA[<p>作者：马宁</p>  <p>示例代码下载地址：</p>  <p><a title="WP7_aawolf_IronRubyWP7.rar" href="https://files.cnblogs.com/aawolf/WP7_aawolf_IronRubyWP7.rar">WP7_aawolf_IronRubyWP7.rar</a></p>  <p>写这篇BLOG完全是因为看了MSDN上的这篇文章：</p>  <p><a href="https://msdn.microsoft.com/en-us/magazine/ff960707.aspx">https://msdn.microsoft.com/en-us/magazine/ff960707.aspx</a></p>  <p>Windows Phone 7的开发工具不支持动态语言，所以IronRuby支持Windows Phone 7就显得格外重要了。刚看这篇文章的时候，还闹了个笑话，看了一遍代码，一句都不认识，心想难道语言换到.NET上，变化怎么这么大？仔细一看，原来是Ruby，而不是Python ^_^，小蟒蛇这次落后了。以前用Python写过自动化测试脚本，没接触过Ruby，所以，把Ruby看成Python了。</p>  <p>不支持动态语言，一直是Windows Mobile编程的痛，这次终于有搞头了。终于可以动态改变程序的逻辑了，光这一点就给我们提供了无限的想象空间。Windows Phone上的F#也快了吧？^_^</p>  <p>言归正传，这次我完全是照葫芦画瓢，只是将自己尝试中的一些关键点写出来，让大家少走弯路。更多信息大家可以参考Shay Friedman的BLOG：<a href="https://ironshay.com/">https://ironshay.com/</a></p>  <p>首先，我们要下载IronRuby for Windows Phone版本（.NET 3.5）：</p>  <p><a href="https://ironruby.codeplex.com/releases/view/43540#DownloadId=133276">https://ironruby.codeplex.com/releases/view/43540#DownloadId=133276</a></p>  <p>然后，在Visual Studio 2010中创建一个Silverlight for Windows Phone 7的工程，工程名叫做“IronRubyWP7”，然后选择“Project”菜单的“Add Reference”选项，在弹出的对话框中，选择“Browse”标签，我们可以找到解压后的IronRuby目录，将\silverlight\bin中的DLL文件加入到工程中来：</p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/5224.IronRuby1_3820DF80.jpg" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-22-76-metablogapi/5224.IronRuby1_5F00_3820DF80.jpg"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="IronRuby1" border="0" alt="IronRuby1" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/2577.IronRuby1_thumb_43D626B2.jpg" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-22-76-metablogapi/2577.IronRuby1_5F00_thumb_5F00_43D626B2.jpg" width="526" height="417" /></a>     <br />在忽略一些警告提示之后，程序集将被加入到工程中。我们可以在Solution Explorer中看到刚被加入的程序集：</p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/6607.IronRuby2_414CF4F4.jpg" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-22-76-metablogapi/6607.IronRuby2_5F00_414CF4F4.jpg"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="IronRuby2" border="0" alt="IronRuby2" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/6278.IronRuby2_thumb_1861DFEB.jpg" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-22-76-metablogapi/6278.IronRuby2_5F00_thumb_5F00_1861DFEB.jpg" width="323" height="460" /></a>     <br />接下来，我们在工程中添加一个文本文件，在Solution Explorer中选中IronRubyWP7，右键，“Add”-“New Item”，在对话框中选择“Text File”，将文件名改为“MainPage.rb”。</p>  <p>选中MainPage.rb文件，在属性中将“Build Action”设置为“Embedded Resource”。</p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/4628.IronRuby3_365FEDDF.jpg" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-22-76-metablogapi/4628.IronRuby3_5F00_365FEDDF.jpg"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="IronRuby3" border="0" alt="IronRuby3" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/1805.IronRuby3_thumb_1FBD9F98.jpg" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-22-76-metablogapi/1805.IronRuby3_5F00_thumb_5F00_1FBD9F98.jpg" width="492" height="366" /></a> </p>  <p>我们打开MainPage.rb文件，输入下面的Ruby代码：</p>  <p>&#160;</p> <font color="#0080ff"></font>  <pre class="csharpcode"><span class="rem"># Include namespaces for ease of use</span>

include System::Windows::Media

include System::Windows::Controls

<span class="rem"># Set the titles</span>

Phone.find_name(<span class="str">&quot;ApplicationTitle&quot;</span>).text = <span class="str">&quot;aawolf.cnblogs.com&quot;</span>

Phone.find_name(<span class="str">&quot;PageTitle&quot;</span>).text = <span class="str">&quot;IronRuby&amp; WP7&quot;</span>

<span class="rem"># Create a new text block</span>

textBlock = TextBlock.new

textBlock.text = <span class="str">&quot;IronRuby is running on Windows Phone 7!&quot;</span>

textBlock.foreground = SolidColorBrush.new(Colors.Green)

textBlock.font_size = 48

textBlock.text_wrapping = System::Windows::TextWrapping.Wrap

<span class="rem"># Add the text block to the page</span>

Phone.find_name(<span class="str">&quot;ContentPanel&quot;</span>).children.add(textBlock)</pre>


<p>请注意，我修改了最后一行的容器控件名称，原示例中的名称是“ContentGrid”，但是Silverlight for Windows Phone向导默认创建的XAML文件中容器类名称是“ContentPanel”。这里会引起一个运行期错误，因为IronRuby不能Debug，所以第一次调试起来比较痛苦。</p>

<p>接下来，我们要打开MainPage.xaml.cs文件，将IronRuby初始化代码，加入到MainPage类的构造函数中：</p>

<pre class="csharpcode">    <span class="kwrd">public</span> <span class="kwrd">partial</span> <span class="kwrd">class</span> MainPage : PhoneApplicationPage
    {
        <span class="rem">// Constructor</span>
        <span class="kwrd">public</span> MainPage()
        {
            InitializeComponent();

            <span class="rem">// Allow both portrait and landscape orientations</span>
            SupportedOrientations = SupportedPageOrientation.PortraitOrLandscape;

            <span class="rem">// Create an IronRuby engine and prevent compilation</span>
            ScriptEngine engine = Ruby.CreateEngine();

            <span class="rem">// Load the System.Windows.Media assembly to the IronRuby context</span>
            engine.Runtime.LoadAssembly(<span class="kwrd">typeof</span>(Color).Assembly);

            <span class="rem">// Add a global constant named Phone, which will allow access to this class</span>
            engine.Runtime.Globals.SetVariable(<span class="str">&quot;Phone&quot;</span>, <span class="kwrd">this</span>);

            <span class="rem">// Read the IronRuby code</span>
            Assembly execAssembly = Assembly.GetExecutingAssembly();
            Stream codeFile =
              execAssembly.GetManifestResourceStream(<span class="str">&quot;IronRubyWP7.MainPage.rb&quot;</span>);
            <span class="kwrd">string</span> code = <span class="kwrd">new</span> StreamReader(codeFile).ReadToEnd();

            <span class="rem">// Execute the IronRuby code</span>
            engine.Execute(code);
        }
    }</pre>


<p>请大家注意InitializeComponent方法的位置，在初始化IronRuby运行时之前，一定要先完成控件初始化的工作，这是我血和泪的教训。另外一个需要注意的地方，就是读取Ruby文件的路径。我们似乎也可以通过HttpRequest获取一个Stream是吧？笑而不语 ^_^</p>

<p>最后运行的效果是这样子的，整个开发过程历时两小时：</p>

<p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/3554.clip_image008_52AD2FFF.jpg" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-22-76-metablogapi/3554.clip_5F00_image008_5F00_52AD2FFF.jpg"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="clip_image008" border="0" alt="clip_image008" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/22/76/metablogapi/7762.clip_image008_thumb_230F1173.jpg" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-22-76-metablogapi/7762.clip_5F00_image008_5F00_thumb_5F00_230F1173.jpg" width="568" height="307" /></a></p>

<h4>相关资源</h4>

<p>马宁的Windows Phone 7开发教程（1）——<a href="https://www.cnblogs.com/aawolf/archive/2010/08/28/1811438.html">Windows Phone开发工具初体验</a></p>

<p>马宁的Windows Phone 7开发教程（2）——<a href="https://www.cnblogs.com/aawolf/archive/2010/08/29/1811686.html">Windows Phone XNA 4.0 3D游戏开发</a></p>

<p>马宁的Windows Phone 7开发教程（3）——<a href="https://www.cnblogs.com/aawolf/archive/2010/09/20/1831848.html">XNA下使用MessageBox和软键盘</a></p>

<p>马宁的Windows Phone 7开发教程（4）——<a href="https://www.cnblogs.com/aawolf/archive/2010/09/22/1833167.html#19458048">XNA显示中文字体</a></p>]]></content:encoded>
    </item>
  </channel>
</rss>