<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>『听风且吟』技术版 &#187; Silverlight/WPF</title>
	<atom:link href="http://coding.windstyle.cn/category/silverlightwpf/feed/" rel="self" type="application/rss+xml" />
	<link>http://coding.windstyle.cn</link>
	<description>Windie Chai&#039;s technique blog</description>
	<lastBuildDate>Wed, 01 Feb 2012 14:52:19 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>使用SharePoint 2010内置的媒体播放器</title>
		<link>http://coding.windstyle.cn/2011/11/04/using-the-media-player-built-in-sharepoint-2010/</link>
		<comments>http://coding.windstyle.cn/2011/11/04/using-the-media-player-built-in-sharepoint-2010/#comments</comments>
		<pubDate>Fri, 04 Nov 2011 10:38:17 +0000</pubDate>
		<dc:creator>Windie Chai</dc:creator>
				<category><![CDATA[SharePoint]]></category>
		<category><![CDATA[Silverlight/WPF]]></category>
		<category><![CDATA[mediaplayer.js]]></category>
		<category><![CDATA[SharePoint 2010]]></category>
		<category><![CDATA[Silverlight]]></category>
		<category><![CDATA[播放器]]></category>

		<guid isPermaLink="false">http://coding.windstyle.cn/?p=1100</guid>
		<description><![CDATA[SharePoint 2010 内置了一个基于Silverlight的媒体播放器，并且SharePoint 2010内置的一些WebPart会检测其输出内容中的链接，如果链接指向一个媒体文件，那么点击该链接之后就会在当前页面弹出这个播放器进行播放。那么如果我们自己开发了一些功能，要如何使用这个内置播放器呢？本文以一个同样基于Silverlight的幻灯片应用来举例说明，过程并不复杂，很容易应用到服务器端代码或JavaScript等其他开发方式中。 首先我们需要在页面中引入mediaplayer.js，在Silverlight里可以这样写： 之后在适当的时候，提前创建一个播放器： 当用户点击了链接时，先判断链接的扩展名是不是被支持的媒体文件，然后根据情况决定弹出播放器或者直接打开链接：]]></description>
			<content:encoded><![CDATA[<p>SharePoint 2010 内置了一个基于Silverlight的媒体播放器，并且SharePoint 2010内置的一些WebPart会检测其输出内容中的链接，如果链接指向一个媒体文件，那么点击该链接之后就会在当前页面弹出这个播放器进行播放。那么如果我们自己开发了一些功能，要如何使用这个内置播放器呢？本文以一个同样基于Silverlight的幻灯片应用来举例说明，过程并不复杂，很容易应用到服务器端代码或JavaScript等其他开发方式中。<span id="more-1100"></span></p>
<p>首先我们需要在页面中引入mediaplayer.js，在Silverlight里可以这样写：</p>
<pre class="brush: csharp; title: ; notranslate">if (!System.ComponentModel.DesignerProperties.IsInDesignTool &amp;&amp; HtmlPage.Document.GetElementById(&quot;IDS_Script_MediaPlayer&quot;) == null)
{
    HtmlElement script = HtmlPage.Document.CreateElement(&quot;script&quot;);
    script.SetAttribute(&quot;id&quot;, &quot;IDS_Script_MediaPlayer&quot;);
    script.SetAttribute(&quot;type&quot;, &quot;text/javascript&quot;);
    script.SetAttribute(&quot;src&quot;, &quot;/_layouts/mediaplayer.js&quot;);
    HtmlPage.Document.Body.AppendChild(script);
}</pre>
<p>之后在适当的时候，提前创建一个播放器：</p>
<pre class="brush: csharp; title: ; notranslate">ScriptObject mediaPlayer = HtmlPage.Window.Eval(&quot;mediaPlayer&quot;) as ScriptObject;
if (mediaPlayer != null)
{
    mediaPlayer.Invoke(&quot;createOverlayPlayer&quot;);
}</pre>
<p>当用户点击了链接时，先判断链接的扩展名是不是被支持的媒体文件，然后根据情况决定弹出播放器或者直接打开链接：</p>
<pre class="brush: csharp; title: ; notranslate">
Regex regex = new Regex(&quot;\\.wmv|\\.wma|\\.mp3|\\.mp4&quot;);
if (this.regex.IsMatch(url))
{
    ScriptObject mediaPlayer = HtmlPage.Window.Eval(&quot;mediaPlayer&quot;) as ScriptObject;
    if(mediaPlayer!=null)
    {
        ScriptObject overlayPlayer;
        try
        {
            overlayPlayer = mediaPlayer.Invoke(&quot;getOverlayPlayer&quot;) as ScriptObject;
            if(overlayPlayer==null)
                throw new Exception();
        }
        catch
        {
            mediaPlayer.Invoke(&quot;createOverlayPlayer&quot;);
            overlayPlayer = mediaPlayer.Invoke(&quot;getOverlayPlayer&quot;) as ScriptObject;
        }
        try
        {
            overlayPlayer.SetProperty(&quot;MediaSource&quot;, news.Url.ToString());
            overlayPlayer.SetProperty(&quot;MediaTitle&quot;, news.Title);
            overlayPlayer.SetProperty(&quot;DisplayMode&quot;, &quot;Overlay&quot;);
            overlayPlayer.Invoke(&quot;Play&quot;);
        }
        catch
        {
            HtmlPage.Window.Navigate(news.Url, &quot;_blank&quot;);
        }
    }
}
else
    HtmlPage.Window.Navigate(news.Url, &quot;_blank&quot;);
</pre>
]]></content:encoded>
			<wfw:commentRss>http://coding.windstyle.cn/2011/11/04/using-the-media-player-built-in-sharepoint-2010/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>用Silverlight调用SharePoint User Profile Web Service</title>
		<link>http://coding.windstyle.cn/2011/10/17/call-sharepoint-user-profile-webservice-in-silverlight/</link>
		<comments>http://coding.windstyle.cn/2011/10/17/call-sharepoint-user-profile-webservice-in-silverlight/#comments</comments>
		<pubDate>Mon, 17 Oct 2011 11:58:29 +0000</pubDate>
		<dc:creator>Windie Chai</dc:creator>
				<category><![CDATA[SharePoint]]></category>
		<category><![CDATA[Silverlight/WPF]]></category>
		<category><![CDATA[Silverlight]]></category>
		<category><![CDATA[UserProfiles]]></category>
		<category><![CDATA[异常]]></category>

		<guid isPermaLink="false">http://coding.windstyle.cn/?p=1097</guid>
		<description><![CDATA[调用SharePoint Web Service本来就不是一件令人愉悦的事情，如果期间在遇到一些诡异的问题的话……譬如我今天遇到的这件 …… 按照惯例，添加好引用，编写代码调用GetUserProfileByNameAsync方法，稍等一下，一个异常抛出了（liao），大概反序列化某个属性时发生了错误。 而这个错误竟然是因为Visual Studio生成的Reference.cs文件和SharePoint提供的WSDL文件映射错误引起的，解决方法就是手工更改Reference.cs文件，该文件的路径是：项目文件夹\Service References\引用名称\Reference.cs。 打开后定位到PropertyData类，我们需要给以下5个属性重新排序，顺序如下： IsPrivacyChanged IsValueChanged Values Name Privacy 重新排序的方法就是找到这几个属性，修改它们各自的System.Runtime.Serialization.DataMemberAttribute，修改或增加参数Order，如： 这一步完成之后，调用GetUserProfileByNameAsync方法不会再抛出异常了，但是拿到的结果中，所有的PropertyData.Values都为null，但其实SharePoint Server已经返回了结果，但这些结果并没有被正确的反序列化出来，好在我们还有办法直接去解析原始的XML结果。 我们首先需要实现一个IEndpointBehavior和IClientMessageInspector： 然后更改一下调用Web Service的代码，把刚才写的UserProfilesBehavior以Behavior和UserState的形式进去： 那么在GetUserProfileByNameAsync完成时的事件处理程序中，就可以通过UserState——也就是刚才编写的UserProfilesBehavior来拿到需要的数据了： 参考资源：http://social.msdn.microsoft.com/Forums/en-US/sharepointdevelopment/thread/d1c6a143-dc1b-4788-8431-e16f0269f8b4/]]></description>
			<content:encoded><![CDATA[<p>调用SharePoint Web Service本来就不是一件令人愉悦的事情，如果期间在遇到一些诡异的问题的话……譬如我今天遇到的这件 ……</p>
<p>按照惯例，添加好引用，编写代码调用GetUserProfileByNameAsync方法，稍等一下，一个异常抛出了（liao），大概反序列化某个属性时发生了错误。</p>
<p><span id="more-1097"></span>而这个错误竟然是因为Visual Studio生成的Reference.cs文件和SharePoint提供的WSDL文件映射错误引起的，解决方法就是手工更改Reference.cs文件，该文件的路径是：项目文件夹\Service References\引用名称\Reference.cs。</p>
<p>打开后定位到PropertyData类，我们需要给以下5个属性重新排序，顺序如下：</p>
<ol>
<li>IsPrivacyChanged</li>
<li>IsValueChanged</li>
<li>Values</li>
<li>Name</li>
<li>Privacy</li>
</ol>
<div>重新排序的方法就是找到这几个属性，修改它们各自的System.Runtime.Serialization.DataMemberAttribute，修改或增加参数Order，如：</div>
<div>
<pre class="brush: csharp; title: ; notranslate">[System.Runtime.Serialization.DataMemberAttribute(IsRequired = true, Order = 1)]
 public bool IsPrivacyChanged { ... }</pre>
</div>
<div>这一步完成之后，调用GetUserProfileByNameAsync方法不会再抛出异常了，但是拿到的结果中，所有的PropertyData.Values都为null，但其实SharePoint Server已经返回了结果，但这些结果并没有被正确的反序列化出来，好在我们还有办法直接去解析原始的XML结果。</div>
<div>我们首先需要实现一个IEndpointBehavior和IClientMessageInspector：</div>
<div>
<pre class="brush: csharp; title: ; notranslate">public class UserProfilesBehavior : IEndpointBehavior
    {
        public UserProfilesInspector Inspector { get; private set; }

        public UserProfilesBehavior()
        {
            this.Inspector = new UserProfilesInspector();
        }

        public void AddBindingParameters(ServiceEndpoint endpoint, BindingParameterCollection bindingParameters)
        { }

        public void ApplyClientBehavior(ServiceEndpoint endpoint, System.ServiceModel.Dispatcher.ClientRuntime clientRuntime)
        {
            clientRuntime.MessageInspectors.Add(Inspector);
        }

        public void ApplyDispatchBehavior(ServiceEndpoint endpoint, System.ServiceModel.Dispatcher.EndpointDispatcher endpointDispatcher)
        { }

        public void Validate(ServiceEndpoint endpoint)
        { }

    }
    public class UserProfilesInspector : IClientMessageInspector
    {
        public string Account { get; private set; }

        XNamespace xmlns = &quot;http://microsoft.com/webservices/SharePointPortalServer/UserProfileService&quot;;

        public void AfterReceiveReply(ref System.ServiceModel.Channels.Message reply, object correlationState)
        {
//像这样取出需要的内容
XDocument document = XDocument.Load(new System.IO.StringReader(reply.ToString()));
            this.Account = this.GetValue(document, &quot;AccountName&quot;).ToString();
        }

        private object GetValue(XDocument document, string propertyName)
        {
            var node = document.Descendants().FirstOrDefault((element) =&gt; { return element.Name == xmlns + &quot;PropertyData&quot; &amp;&amp; element.Element(xmlns + &quot;Name&quot;).Value == propertyName; });
            if (node != null)
            {
                var valueNode = node.Descendants(xmlns + &quot;Value&quot;).FirstOrDefault();
                if (valueNode != null)
                {
                    return valueNode.Value.Replace(&quot;_MThumb&quot;,&quot;_LThumb&quot;);
                }
            }
            return string.Empty;
        }

        public object BeforeSendRequest(ref System.ServiceModel.Channels.Message request, IClientChannel channel)
        {
            return null;
        }

    }</pre>
<p>然后更改一下调用Web Service的代码，把刚才写的UserProfilesBehavior以Behavior和UserState的形式进去：</p>
<pre class="brush: csharp; title: ; notranslate">UserProfilesBehavior behavior = new UserProfilesBehavior();
SPUserProfile.UserProfileServiceSoapClient userSoap = new SPUserProfile.UserProfileServiceSoapClient(binding, endpoint);
userSoap.Endpoint.Behaviors.Add(behavior);//添加为Behavior
userSoap.GetUserProfileByNameCompleted += new EventHandler&lt;SPUserProfile.GetUserProfileByNameCompletedEventArgs&gt;(userSoap_GetUserProfileByNameCompleted);
userSoap.GetUserProfileByNameAsync(people.Account, behavior);//添加为UserState</pre>
<p>那么在GetUserProfileByNameAsync完成时的事件处理程序中，就可以通过UserState——也就是刚才编写的UserProfilesBehavior来拿到需要的数据了：</p>
<pre class="brush: csharp; title: ; notranslate">void userSoap_GetUserProfileByNameCompleted(object sender, SPUserProfile.GetUserProfileByNameCompletedEventArgs e)
{
            if (e.Error == null)
            {
                UserProfilesBehavior behavior = (UserProfilesBehavior)e.UserState;
string account = behavior.Inspector.Account;
            }
}</pre>
<p>参考资源：<a href="http://social.msdn.microsoft.com/Forums/en-US/sharepointdevelopment/thread/d1c6a143-dc1b-4788-8431-e16f0269f8b4/">http://social.msdn.microsoft.com/Forums/en-US/sharepointdevelopment/thread/d1c6a143-dc1b-4788-8431-e16f0269f8b4/</a></p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://coding.windstyle.cn/2011/10/17/call-sharepoint-user-profile-webservice-in-silverlight/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Silverlight ChildWindow禁用父容器的bug</title>
		<link>http://coding.windstyle.cn/2011/06/21/the-bug-about-childwindow-disable-parent-container-in-silverlight/</link>
		<comments>http://coding.windstyle.cn/2011/06/21/the-bug-about-childwindow-disable-parent-container-in-silverlight/#comments</comments>
		<pubDate>Tue, 21 Jun 2011 13:34:06 +0000</pubDate>
		<dc:creator>Windie Chai</dc:creator>
				<category><![CDATA[Silverlight/WPF]]></category>
		<category><![CDATA[ChildWindow]]></category>
		<category><![CDATA[Silverlight]]></category>

		<guid isPermaLink="false">http://coding.windstyle.cn/?p=1046</guid>
		<description><![CDATA[Silverlight的ChildWindow能让我们方便地实现一个类似Windows中对话框的子窗体，子窗体会以模式对话框的形式显示，禁用父容器，直到关闭子窗体后才恢复父容器。但是在某些情况下（我遇到的情况是频繁地显示和关闭子窗体），关闭ChildWindow之后，父容器依然是Disable状态，而另一些时候，打开ChildWindow后，父容器依然是Enable状态，ChildWindow内部似乎发生了一些小混乱，这个问题似乎从Silverlight 3开始就出现了，直到现在依然存在，我们只能手动去解决这个问题，好在解决方法很简单。 我们可以重写ChildWindow的OnClosed和OnOpened方法，分别将根画布的IsEnabled属性设置为false和true，藉此来确保子窗体关闭或打开后，父容器应该处于正确的状态。代码如下： 在我的项目里，许多Silverlight App都需要使用一个ProgressDialog，于是我为UserControl类写了两个扩展方法，用来打开和关闭ProgressDialog，代码如下：]]></description>
			<content:encoded><![CDATA[<p>Silverlight的ChildWindow能让我们方便地实现一个类似Windows中对话框的子窗体，子窗体会以模式对话框的形式显示，禁用父容器，直到关闭子窗体后才恢复父容器。但是在某些情况下（我遇到的情况是频繁地显示和关闭子窗体），关闭ChildWindow之后，父容器依然是Disable状态，而另一些时候，打开ChildWindow后，父容器依然是Enable状态，ChildWindow内部似乎发生了一些小混乱，这个问题似乎从Silverlight 3开始就出现了，直到现在依然存在，我们只能手动去解决这个问题，好在解决方法很简单。</p>
<p><span id="more-1046"></span></p>
<p>我们可以重写ChildWindow的OnClosed和OnOpened方法，分别将根画布的IsEnabled属性设置为false和true，藉此来确保子窗体关闭或打开后，父容器应该处于正确的状态。代码如下：</p>
<pre class="brush: csharp; title: ; notranslate">
protected override void OnClosed(EventArgs e)
{
base.OnClosed(e);
Application.Current.RootVisual.SetValue(Control.IsEnabledProperty, true);
}

protected override void OnOpened()
{
base.OnOpened();
Application.Current.RootVisual.SetValue(Control.IsEnabledProperty, false);
}
</pre>
<p>在我的项目里，许多Silverlight App都需要使用一个ProgressDialog，于是我为UserControl类写了两个扩展方法，用来打开和关闭ProgressDialog，代码如下：</p>
<pre class="brush: csharp; title: ; notranslate">
private static ProgressDialog field_progressDialog = new ProgressDialog();

public static void ShowProgressDialog(this UserControl page, string title)
{
page.IsEnabled = false;
page.Cursor = Cursors.Wait;
field_progressDialog.Title = title;
field_progressDialog.Show();
}

public static void CloseProgressDialog(this UserControl page)
{
field_progressDialog.Close();
page.Cursor = Cursors.Arrow;
page.IsEnabled = true;
}
</pre>
]]></content:encoded>
			<wfw:commentRss>http://coding.windstyle.cn/2011/06/21/the-bug-about-childwindow-disable-parent-container-in-silverlight/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>在Silverlight中打开网页的几种方法</title>
		<link>http://coding.windstyle.cn/2011/01/01/open-web-page-in-silverlight/</link>
		<comments>http://coding.windstyle.cn/2011/01/01/open-web-page-in-silverlight/#comments</comments>
		<pubDate>Sat, 01 Jan 2011 10:43:00 +0000</pubDate>
		<dc:creator>Windie Chai</dc:creator>
				<category><![CDATA[Silverlight/WPF]]></category>
		<category><![CDATA[HyperLinkButton]]></category>
		<category><![CDATA[Navigate]]></category>
		<category><![CDATA[PopupWindow]]></category>
		<category><![CDATA[Silverlight]]></category>

		<guid isPermaLink="false">http://coding.windstyle.cn/?p=986</guid>
		<description><![CDATA[在Silverlight中打开网页是一件很简单的事情，本文来概述一下这几种方法，你会发现，每一种方法需要编写的代码都少的可怜，甚至没有。 1.HyperLinkButton控件 这是最简单的方法，只需要设置几个属性即可： NavigateUri：想要打开的网页地址 TargetName：目标框架，既_blank、_parent等 例如： 注意：如果Silverlight对象的EnableNavigation设置为“none”的话，会抛出异常。 2.HtmlWindow.Navigate 如果需要以编程的方式打开页面的话，就可以调用HtmlWindow.Navigate方法。 例如： 注意： 只有当Silverlight运行在浏览器中时才可以调用此方法。 如果Silverlight对象的EnableHtmlAccess设置为“false”的话，会抛出异常。 3.HtmlPage.PopupWindow 调用HtmlPage.PopupWindow方法会以弹出窗口的形式打开网页。 例如： 注意： 只有当Silverlight运行在浏览器中时才可以调用此方法。 如果Silverlight对象的EnableHtmlAccess设置为“false”的话，会抛出异常。 如果Silverlight对象的AllowHtmlPopupwindow需要设置为“true”。 只能在Silverlight的可见区域里、由用户触发的单击事件中调用此方法，且每个事件中只能调用一次此方法。 可以通过System.Windows.Browser.HtmlPage.IsPopupWindowAllowed属性来检查是否满足上述条件。 如果浏览器不阻止Javascript的window.open调用的话，此方法还会返回一个HtmlWindow对象，否则返回null。 4.脱离浏览器时打开网页 以上两种编程的方法都只能在浏览器中进行，如果想要在脱离浏览器运行的时候打开网页的话，需要稍微写几行代码。思路很简单，既然HyperLinkButton控件是在任何情况下都可以通用的，那么就从它来派生一个类： 然后只需要调用OOBHyperLinkButton.OpenWebPage 即可。]]></description>
			<content:encoded><![CDATA[<p>在Silverlight中打开网页是一件很简单的事情，本文来概述一下这几种方法，你会发现，每一种方法需要编写的代码都少的可怜，甚至没有。</p>
<p><span id="more-986"></span></p>
<h2>1.HyperLinkButton控件</h2>
<p>这是最简单的方法，只需要设置几个属性即可：</p>
<ul>
<li>NavigateUri：想要打开的网页地址</li>
<li>TargetName：目标框架，既_blank、_parent等</li>
</ul>
<p>例如：</p>
<pre class="brush: xml; title: ; notranslate">&lt;HyperlinkButton NavigateUri=&quot;http://coding.windstyle.cn&quot; TargetName=&quot;_blank&quot; /&gt;</pre>
<p>注意：如果Silverlight对象的<a href="http://msdn.microsoft.com/zh-cn/library/dd833071(v=VS.95).aspx" target="_blank">EnableNavigation</a>设置为“none”的话，会抛出异常。</p>
<h2>2.HtmlWindow.Navigate</h2>
<p>如果需要以编程的方式打开页面的话，就可以调用HtmlWindow.Navigate方法。</p>
<p>例如：</p>
<pre class="brush: csharp; title: ; notranslate">System.Windows.Browser.HtmlPage.Window.Navigate(new Uri(&quot;http://blog.windstyle.cn&quot;, UriKind.Absolute), &quot;_blank&quot;);</pre>
<p>注意：</p>
<ul>
<li>只有当Silverlight运行在浏览器中时才可以调用此方法。</li>
<li>如果Silverlight对象的<a href="http://msdn.microsoft.com/zh-cn/library/cc838264(v=VS.95).aspx" target="_blank">EnableHtmlAccess</a>设置为“false”的话，会抛出异常。</li>
</ul>
<h2>3.HtmlPage.PopupWindow</h2>
<p>调用HtmlPage.PopupWindow方法会以弹出窗口的形式打开网页。</p>
<p>例如：</p>
<pre class="brush: csharp; title: ; notranslate">System.Windows.Browser.HtmlPage.PopupWindow(new Uri(&quot;http://coding.windstyle.cn&quot;, UriKind.Absolute),
&quot;_blank&quot;,
new System.Windows.Browser.HtmlPopupWindowOptions()
{
Width = 500,
Height = 500
});</pre>
<p>注意：</p>
<ul>
<li>只有当Silverlight运行在浏览器中时才可以调用此方法。</li>
<li>如果Silverlight对象的<a href="http://msdn.microsoft.com/zh-cn/library/cc838264(v=VS.95).aspx" target="_blank">EnableHtmlAccess</a>设置为“false”的话，会抛出异常。</li>
<li>如果Silverlight对象的AllowHtmlPopupwindow需要设置为“true”。</li>
<li>只能在Silverlight的可见区域里、由用户触发的单击事件中调用此方法，且每个事件中只能调用一次此方法。</li>
<li>可以通过System.Windows.Browser.HtmlPage.IsPopupWindowAllowed属性来检查是否满足上述条件。</li>
<li>如果浏览器不阻止Javascript的window.open调用的话，此方法还会返回一个HtmlWindow对象，否则返回null。</li>
</ul>
<h2>4.脱离浏览器时打开网页</h2>
<p>以上两种编程的方法都只能在浏览器中进行，如果想要在脱离浏览器运行的时候打开网页的话，需要稍微写几行代码。思路很简单，既然HyperLinkButton控件是在任何情况下都可以通用的，那么就从它来派生一个类：</p>
<pre class="brush: csharp; title: ; notranslate">internal class OOBHyperLinkButton : HyperlinkButton
{
void DoClick()
{
this.OnClick();
}

public static void OpenWebPage(Uri uri, string targetName)
{
OOBHyperLinkButton btn = new OOBHyperLinkButton();
btn.NavigateUri = uri;
btn.TargetName = targetName;
btn.DoClick();
}
}</pre>
<p><span style="font-family: Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif; line-height: 19px; white-space: normal; font-size: 13px;">然后只需要调用OOBHyperLinkButton.OpenWebPage 即可。</span></p>
]]></content:encoded>
			<wfw:commentRss>http://coding.windstyle.cn/2011/01/01/open-web-page-in-silverlight/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Silverlight载入图片时的AG_E_NETWORK_ERROR错误</title>
		<link>http://coding.windstyle.cn/2010/12/28/ag_e_network_error-when-silverlight-loading-images/</link>
		<comments>http://coding.windstyle.cn/2010/12/28/ag_e_network_error-when-silverlight-loading-images/#comments</comments>
		<pubDate>Tue, 28 Dec 2010 13:49:19 +0000</pubDate>
		<dc:creator>Windie Chai</dc:creator>
				<category><![CDATA[Silverlight/WPF]]></category>
		<category><![CDATA[AG_E_NETWORK_ERROR]]></category>
		<category><![CDATA[Silverlight]]></category>
		<category><![CDATA[图片]]></category>
		<category><![CDATA[跨协议]]></category>
		<category><![CDATA[错误]]></category>

		<guid isPermaLink="false">http://coding.windstyle.cn/?p=980</guid>
		<description><![CDATA[写了一个简单的Silverlight应用来加载第三方网站的图片，图片地址没有任何问题，但却总是不显示。订阅了Image控件的ImageFailed事件之后，在该事件的处理程序中发现了错误名称“AG_E_NETWORK_ERROR”。 AG_E_NETWORK_ERROR表示由于网络原因，无法加载图片。但我在浏览器里输入图片的URL，却可以正常访问。 经过一番艰难的调查，发现其实Silverlight根本没有去请求那张图片，直接就抛出了异常。 又经过一番艰难的调查，终于弄清楚了错误的原因，是因为我所选择的调试方式。调试时，我偷懒选择了“动态生成测试页面”或者使用“Out-of-browser application”的方式，但这两种方式使用的协议是FILE，而不是HTTP，Silverlight限制了FILE协议去访问其他协议的图片。所以还是乖乖地建一个测试网站才解决这个问题。 关于各种协议下跨协议、跨域名或者跨区域的访问限制，可以查看这篇文章：《Silverlight 中的 URL 访问限制》。]]></description>
			<content:encoded><![CDATA[<p>写了一个简单的Silverlight应用来加载第三方网站的图片，图片地址没有任何问题，但却总是不显示。订阅了Image控件的ImageFailed事件之后，在该事件的处理程序中发现了错误名称“AG_E_NETWORK_ERROR”。</p>
<p><span id="more-980"></span></p>
<p>AG_E_NETWORK_ERROR表示由于网络原因，无法加载图片。但我在浏览器里输入图片的URL，却可以正常访问。</p>
<p>经过一番艰难的调查，发现其实Silverlight根本没有去请求那张图片，直接就抛出了异常。</p>
<p>又经过一番艰难的调查，终于弄清楚了错误的原因，是因为我所选择的调试方式。调试时，我偷懒选择了“动态生成测试页面”或者使用“Out-of-browser application”的方式，但这两种方式使用的协议是FILE，而不是HTTP，Silverlight限制了FILE协议去访问其他协议的图片。所以还是乖乖地建一个测试网站才解决这个问题。</p>
<p>关于各种协议下跨协议、跨域名或者跨区域的访问限制，可以查看这篇文章：《<a href="http://msdn.microsoft.com/zh-cn/library/cc189008(VS.95).aspx" target="_blank">Silverlight 中的 URL 访问限制</a>》。</p>
]]></content:encoded>
			<wfw:commentRss>http://coding.windstyle.cn/2010/12/28/ag_e_network_error-when-silverlight-loading-images/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>简单的Silverlight音乐播放器Widget</title>
		<link>http://coding.windstyle.cn/2008/06/26/simple-silverlight-music-player-widget/</link>
		<comments>http://coding.windstyle.cn/2008/06/26/simple-silverlight-music-player-widget/#comments</comments>
		<pubDate>Wed, 25 Jun 2008 17:33:00 +0000</pubDate>
		<dc:creator>Windie Chai</dc:creator>
				<category><![CDATA[Silverlight/WPF]]></category>
		<category><![CDATA[Silverlight]]></category>
		<category><![CDATA[widget]]></category>
		<category><![CDATA[音乐播放器]]></category>

		<guid isPermaLink="false">http://1230091</guid>
		<description><![CDATA[上周尝试了一下发布不久的Silverlight 2 beta2，设计了这么一个简单的播放器widget。它支持循环播放，支持自动播放，支持封面图片，支持暂停（鼠标移动到封面上就会淡入按钮）。 本来是想设计的稍微酷一点的，发现Silverlight2的矩阵变形能力还是相当弱的，其实现的功能也就是平移、平行四边形化和旋转，如果再支持梯形化就好了。 发现Silverlight 2 beta2相对beta1的一些小变化： 1.字体优化，beta1总算支持了中文显示，但却显示的非常别扭。 一句话会出现两种字体，貌似规律是这样的，如果某个汉字的繁简体一样的话，那么这个汉字在Silverlight中显示为黑体，否则为宋体。 其实微软的网站上早就有这样的先例，譬如下图： 2.Image不再像之前那样使用依赖属性赋一个Uri就可以了，而是变成了下面的样子：&#160; BitmapImage bmp = new BitmapImage(); bmp.UriSource = new Uri(cover); this.img_Cover.Source = bmp; 3.另外，之前基于beta1制作的饭否widget无法编译通过了，在异步调用的方法中，似乎无法直接操作控件的属性了，不知何解。 OK。如果你也想在blog上添加这个widget，那么编辑主题，在相应的位置加入以下代码： 稍微介绍一下InitParams的配置就可以了，它包含了音乐url（music）、封面url（cover）、标题（title）、自动播放（auto）和循环（loop），各个参数之间用半角逗号分割即可。 点击下载示例源码]]></description>
			<content:encoded><![CDATA[<p>上周尝试了一下发布不久的Silverlight 2 beta2，设计了这么一个简单的播放器widget。它支持循环播放，支持自动播放，支持封面图片，支持暂停（鼠标移动到封面上就会淡入按钮）。</p>
<p>本来是想设计的稍微酷一点的，发现<a title="TerryLee的Silverlight系列文章" href="http://www.cnblogs.com/Terrylee/archive/2008/03/19/Silverlight2-step-by-step-part29-Transform-part2.html" target="_blank">Silverlight2的矩阵变形能力</a>还是相当弱的，其实现的功能也就是平移、平行四边形化和旋转，如果再支持梯形化就好了。 <span id="more-697"></span></p>
<p><img src="http://coding.windstyle.cn/files/cnblogs/draft.jpg" border="0" alt="" /><img src="http://coding.windstyle.cn/files/cnblogs/windstyleplayer.jpg" border="0" alt="" /></p>
<p>发现Silverlight 2 beta2相对beta1的一些小变化：</p>
<p>1.字体优化，beta1总算支持了中文显示，但却显示的非常别扭。</p>
<p>一句话会出现两种字体，貌似规律是这样的，如果某个汉字的繁简体一样的话，那么这个汉字在Silverlight中显示为黑体，否则为宋体。</p>
<p>其实微软的网站上早就有这样的先例，譬如下图：</p>
<p><img src="http://coding.windstyle.cn/files/cnblogs/fontonmssite.png" border="0" alt="" /></p>
<p>2.Image不再像之前那样使用依赖属性赋一个Uri就可以了，而是变成了下面的样子：&nbsp;</p>
<p><code>BitmapImage bmp = new BitmapImage();<br />
bmp.UriSource = new Uri(cover);<br />
this.img_Cover.Source = bmp;</code><br />
3.另外，之前<a href="http://coding.windstyle.cn/2008/04/29/build-fanfou-show-using-silverlight-2/">基于beta1制作的饭否widget</a>无法编译通过了，在异步调用的方法中，似乎无法直接操作控件的属性了，不知何解。</p>
<p>OK。如果你也想在blog上添加这个widget，那么编辑主题，在相应的位置加入以下代码：</p>
<p><code></p>
<p><a href="http://go.microsoft.com/fwlink/?LinkID=115261"><br />
<img src="http://go.microsoft.com/fwlink/?LinkId=108181" alt="Get Microsoft Silverlight" style="border-style: none" /><br />
</a><br />
</code><br />
稍微介绍一下InitParams的配置就可以了，它包含了音乐url（music）、封面url（cover）、标题（title）、自动播放（auto）和循环（loop），各个参数之间用半角逗号分割即可。</p>
<p><a href="http://coding.windstyle.cn/files/2008/06/WindStylePlayer.zip">点击下载示例源码</a></p>
]]></content:encoded>
			<wfw:commentRss>http://coding.windstyle.cn/2008/06/26/simple-silverlight-music-player-widget/feed/</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
		<item>
		<title>Silverlight 2 打造饭否Show</title>
		<link>http://coding.windstyle.cn/2008/04/29/build-fanfou-show-using-silverlight-2/</link>
		<comments>http://coding.windstyle.cn/2008/04/29/build-fanfou-show-using-silverlight-2/#comments</comments>
		<pubDate>Mon, 28 Apr 2008 17:38:00 +0000</pubDate>
		<dc:creator>Windie Chai</dc:creator>
				<category><![CDATA[Silverlight/WPF]]></category>
		<category><![CDATA[Silverlight]]></category>
		<category><![CDATA[Visual Studio]]></category>
		<category><![CDATA[Web Services]]></category>
		<category><![CDATA[跨域]]></category>
		<category><![CDATA[饭否]]></category>

		<guid isPermaLink="false">http://1175401</guid>
		<description><![CDATA[在Silverlight 1.1的时候，我就像用Silverlight设计一个饭否Show，无奈1.1时代貌似只能通过Web Services来获取跨域的数据，我认为这是一种别扭的开发方式，再加上1.1对中文并不友好，所以就改用Flash实现了这个饭否Show。 Silverlight 2终于解决了上述的两个问题，支持跨域获取数据，支持中文显示，于是我迫不及待的尝试着开发了一个饭否Show（在Silverlight 2 beta SDK 发布的几日后开始开发，开发完成后便忘记了，-___-&#124;&#124;&#124;），下面来简要的分享一下开发过程，也望各位Silverlight前辈不吝指教。 UI UI的界面如下图所示： UI采用Blend 2.5和Design设计。 如果设计简单的Silverlight界面，那么Blend足矣，但稍复杂的，比如上图中的波浪渐变效果，Blend就无能为力了，而这正是Design的拿手本领。 Design的使用方法就不介绍了，设计完毕后，导出为Silverlight画布，然后我们copy需要的XAML节点即可。 具体的XAML内容就不在此展示了，文末我提供了本文的代码下载，有兴趣的朋友可以下载查看。 饭否API 从上图来分析，我们只用到了饭否中的两部分信息：我的信息和我的消息。 在饭否API中，获取这两部分数据的方法如下： 获取用户信息： http://api.fanfou.com/users/show/用户ID.xml 获取用户消息： http://api.fanfou.com/statuses/user_timeline/用户ID.rss 那么根据饭否提供的API，我编写了下面两个类： using System; using System.Windows; using System.Windows.Controls; using System.Windows.Documents; using System.Windows.Ink; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Animation; using System.Windows.Shapes; using System.IO; using System.Linq; using System.Xml; using System.Xml.Linq; using System.Collections.Generic; namespace SilverlightFanShow { [...]]]></description>
			<content:encoded><![CDATA[<p>在Silverlight 1.1的时候，我就像用Silverlight设计一个饭否Show，无奈1.1时代貌似只能通过Web Services来获取跨域的数据，我认为这是一种别扭的开发方式，再加上1.1对中文并不友好，所以就改用Flash实现了这个饭否Show。<br />
Silverlight 2终于解决了上述的两个问题，支持跨域获取数据，支持中文显示，于是我迫不及待的尝试着开发了一个饭否Show（在Silverlight 2 beta SDK 发布的几日后开始开发，开发完成后便忘记了，-___-|||），下面来简要的分享一下开发过程，也望各位Silverlight前辈不吝指教。<span id="more-699"></span></p>
<h2>UI</h2>
<p>UI的界面如下图所示：<br />
<img src="http://images.cnblogs.com/cnblogs_com/xiaoshatian/85614/SilverlightFanfouShow.png" border="0" alt="" /><br />
UI采用Blend 2.5和Design设计。<br />
如果设计简单的Silverlight界面，那么Blend足矣，但稍复杂的，比如上图中的波浪渐变效果，Blend就无能为力了，而这正是Design的拿手本领。<br />
Design的使用方法就不介绍了，设计完毕后，导出为Silverlight画布，然后我们copy需要的XAML节点即可。<br />
具体的XAML内容就不在此展示了，文末我提供了本文的代码下载，有兴趣的朋友可以下载查看。</p>
<h2>饭否API</h2>
<p>从上图来分析，我们只用到了饭否中的两部分信息：我的信息和我的消息。<br />
在<a href="http://help.fanfou.com/api.html" target="_blank">饭否API</a>中，获取这两部分数据的方法如下：<br />
获取用户信息：<br />
http://api.fanfou.com/users/show/<span style="color: #000000">用户ID</span>.xml<br />
获取用户消息：<br />
http://api.fanfou.com/statuses/user_timeline/<span style="color: #000000">用户ID</span>.rss<br />
那么根据饭否提供的API，我编写了下面两个类：</p>
<p><code>using System;<br />
using System.Windows;<br />
using System.Windows.Controls;<br />
using System.Windows.Documents;<br />
using System.Windows.Ink;<br />
using System.Windows.Input;<br />
using System.Windows.Media;<br />
using System.Windows.Media.Animation;<br />
using System.Windows.Shapes;<br />
using System.IO;<br />
using System.Linq;<br />
using System.Xml;<br />
using System.Xml.Linq;<br />
using System.Collections.Generic;</p>
<p>namespace SilverlightFanShow<br />
{<br />
 /**////<br />
<summary>
 /// 饭否用户<br />
 /// </summary>
<p> public class FanfouUser<br />
 {<br />
 /**////<br />
<summary>
 /// 用户头像的URL<br />
 /// </summary>
<p> public Uri ImageURL{get;set;}</p>
<p> /**////<br />
<summary>
 /// 用户的显示名称<br />
 /// </summary>
<p> public string Name{get;set;}</p>
<p> /**////<br />
<summary>
 /// 用户的饭否链接地址<br />
 /// </summary>
<p> public Uri URL{get;set;}</p>
<p> /**////<br />
<summary>
 /// 从Stream加载饭否用户实例<br />
 /// </summary>
<p> ///<br />
 ///<br />
 public static FanfouUser Load(Stream stream)<br />
 {<br />
            FanfouUser user = new FanfouUser();</p>
<p> try<br />
 {<br />
                XmlReader reader = XmlReader.Create(stream);<br />
                XElement doc = XElement.Load(reader);</p>
<p>                user.ImageURL = new Uri(doc.Descendants("profile_image_url").FirstOrDefault().Value);<br />
                user.Name = doc.Descendants("name").FirstOrDefault().Value;<br />
                user.URL = new Uri(doc.Descendants("url").FirstOrDefault().Value);<br />
            }<br />
 catch { }</p>
<p> return user;<br />
        }</p>
<p> /**////<br />
<summary>
 /// 默认构造函数<br />
 /// </summary>
<p> public FanfouUser()<br />
 {<br />
 this.ImageURL = new Uri("http://avatar.fanfou.com/s0/00/4q/py.jpg?1183096447");<br />
 this.Name = "Windie";<br />
 this.URL = new Uri("http://fanfou.com/笑煞天");<br />
        }<br />
    }</p>
<p> /**////<br />
<summary>
 /// 饭否消息<br />
 /// </summary>
<p> public class FanfouMessage<br />
 {<br />
 /**////<br />
<summary>
 /// 饭否消息的GUID（注：并不是.NET里的GUID）<br />
 /// </summary>
<p> public string GUID { get; set; }</p>
<p> /**////<br />
<summary>
 /// 饭否消息本体<br />
 /// </summary>
<p> public string Message { get; set; }</p>
<p> /**////<br />
<summary>
 /// 饭否消息的发布时间<br />
 /// </summary>
<p> public DateTime Time { get; set; }</p>
<p> /**////<br />
<summary>
 /// 从Stream加载饭否消息列表<br />
 /// </summary>
<p> ///<br />
 ///<br />
 public static List Load(Stream stream)<br />
 {<br />
            List msgList = new List();</p>
<p> try<br />
 {<br />
                XmlReader reader = XmlReader.Create(stream);<br />
                XElement doc = XElement.Load(reader);</p>
<p>                IEnumerable msgs = from item in doc.Descendants("item")<br />
                                             select item;<br />
 foreach (XElement item in msgs)<br />
 {<br />
                    FanfouMessage msg = new FanfouMessage();<br />
                    msg.GUID = item.Descendants("guid").FirstOrDefault().Value;<br />
                    msg.Message = item.Descendants("title").FirstOrDefault().Value;<br />
                    msg.Time = DateTime.Parse(item.Descendants("pubDate").FirstOrDefault().Value);<br />
                    msgList.Add(msg);<br />
                }<br />
            }catch{ }</p>
<p> return msgList;<br />
        }</p>
<p> /**////<br />
<summary>
 /// 默认构造函数<br />
 /// </summary>
<p> public FanfouMessage()<br />
 {<br />
 this.GUID = Guid.NewGuid().ToString();<br />
 this.Message = "欢迎使用Windie Chai设计的Silverlight饭否Show。";<br />
 this.Time = DateTime.Now;<br />
        }<br />
    }<br />
}<br />
</code></p>
<h2>传入参数</h2>
<p>其实我设计这个饭否Show并不是只为了给我一个人使用，那么如何让每位朋友都可以把它变成自己的饭否Show呢？<br />
那么必然要使Silverlight能够接受参数。<br />
在做Flash开发时，可以在HTML中通过Object的“FlashVars”参数来向Flash传递参数列表，在Silverlight中我们同样可以这样做。<br />
通过给“<span style="font-family: Verdana">InitParams”参数赋值，我们就可以向Silverlight传递参数了。<br />
</span>给“<span style="font-family: Verdana">InitParams”参数赋值</span>的方法如下：</p>
<p><code></p>
<p><a href="http://go.microsoft.com/fwlink/?LinkID=108182"><br />
<img src="http://go.microsoft.com/fwlink/?LinkId=108181" alt="Get Microsoft Silverlight" style="border-style: none" /><br />
</a></code></p>
<p>仅仅把ID参数传入到Silverlight中是不够的，我们还需要在Silverlight中接收这个参数，并做进一步处理。<br />
我们打开Silverlight项目中的App.xaml，为其Application_Startup事件添加如下代码：</p>
<p><code>private void Application_Startup(object sender, StartupEventArgs e)<br />
{<br />
 string id = "笑煞天";<br />
 if(e.InitParams.Keys.Contains("ID"))<br />
                id = e.InitParams["ID"];<br />
 this.RootVisual = new Page(id);<br />
}</code></p>
<p>要注意的是Page默认并没有带有一个String参数的构造函数，所以我们接下来还需要为Page类添加这一构造函数重载。</p>
<h2>Page.xaml.cs</h2>
<p>最后，我们开始编写最关键的代码。我将在Page.xaml.cs中添加方法或事件来调用饭否API、获取用户的信息和消息列表、实现上一条下一条的跳转等。<br />
具体的代码并不难以理解，不再详细解释，大家看注释便好：</p>
<p><code>using System;<br />
using System.Collections.Generic;<br />
using System.Linq;<br />
using System.Windows;<br />
using System.Windows.Controls;<br />
using System.Windows.Documents;<br />
using System.Windows.Input;<br />
using System.Windows.Media;<br />
using System.Windows.Media.Animation;<br />
using System.Windows.Shapes;<br />
using System.Net;<br />
using System.IO;<br />
using System.Xml;<br />
using System.Xml.Linq;<br />
using System.Threading;<br />
using System.Windows.Browser;</p>
<p>namespace SilverlightFanShow<br />
{<br />
 public partial class Page : UserControl<br />
 {<br />
 //饭否用户ID<br />
 private string userID;<br />
 //饭否用户<br />
 private FanfouUser user;</p>
<p> //当前消息<br />
 private FanfouMessage currentMessage;</p>
<p> //消息列表<br />
 private List messageList;</p>
<p> public Page(string id)<br />
 {<br />
 this.userID = id;<br />
            InitializeComponent();<br />
        }</p>
<p> /**////<br />
<summary>
 /// 布局加载事件<br />
 /// </summary>
<p> ///<br />
 ///<br />
 private void LayoutRoot_Loaded(object sender, RoutedEventArgs e)<br />
 {<br />
 //加载用户信息<br />
            Uri userUrl = new Uri("http://api.fanfou.com/users/show/"<br />
 + this.userID<br />
 + ".xml");<br />
            WebRequest userRequest = WebRequest.Create(userUrl);<br />
            userRequest.BeginGetResponse(new AsyncCallback(GetUserInfo), userRequest);</p>
<p> //加载用户消息<br />
            Uri msgUrl = new Uri("http://api.fanfou.com/statuses/user_timeline/"<br />
 + this.userID<br />
 + ".rss");<br />
            WebRequest msgRequest = WebRequest.Create(msgUrl);<br />
            msgRequest.BeginGetResponse(new AsyncCallback(GetMessages), msgRequest);<br />
        }</p>
<p> /**////<br />
<summary>
 /// 获取用户信息<br />
 /// </summary>
<p> ///<br />
 void GetUserInfo(IAsyncResult asyncResult)<br />
 {<br />
            WebRequest request = asyncResult.AsyncState as WebRequest;<br />
            WebResponse response= request.EndGetResponse(asyncResult);<br />
            Stream stream = response.GetResponseStream();</p>
<p>            user = FanfouUser.Load(stream);</p>
<p> //反映到UI<br />
 this.pic.SetValue(Image.SourceProperty, user.ImageURL);<br />
 this.userName.Text = user.Name;</p>
<p>        }</p>
<p> /**////<br />
<summary>
 /// 获取用户消息<br />
 /// </summary>
<p> ///<br />
 void GetMessages(IAsyncResult asyncResult)<br />
 {<br />
            WebRequest request = asyncResult.AsyncState as WebRequest;<br />
            WebResponse response = request.EndGetResponse(asyncResult);<br />
            Stream stream = response.GetResponseStream();</p>
<p>            messageList = FanfouMessage.Load(stream);</p>
<p> //反映到UI<br />
 if(messageList.Count &gt; 1)<br />
 this.SetMessage(messageList[0]);</p>
<p>        }</p>
<p> /**////<br />
<summary>
 /// 设置当前消息<br />
 /// </summary>
<p> ///<br />
 private void SetMessage(FanfouMessage message)<br />
 {<br />
 //去掉消息正文前边的用户名<br />
 string msg = message.Message.Substring(message.Message.IndexOf('：') + 1);<br />
 //如果消息正文过长，截短之<br />
 if (msg.Length &gt; 50)<br />
                msg = msg.Substring(0, 50) + "";<br />
 this.txt.Text = msg;<br />
 this.time.Text = message.Time.ToShortDateString();<br />
 this.currentMessage = message;<br />
        }</p>
<p> /**////<br />
<summary>
 /// 下一条消息按钮按下事件<br />
 /// </summary>
<p> ///<br />
 ///<br />
 private void btnNext_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)<br />
 {<br />
 int msgIndex = messageList.IndexOf(currentMessage);<br />
 if (msgIndex + 1  0)<br />
                SetMessage(messageList[0]);<br />
        }</p>
<p> /**////<br />
<summary>
 /// 下一条消息按钮按下事件<br />
 /// </summary>
<p> ///<br />
 ///<br />
 private void btnPrev_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)<br />
 {<br />
 int msgIndex = messageList.IndexOf(currentMessage);<br />
 if (msgIndex &gt; 0)<br />
                SetMessage(messageList[msgIndex - 1]);<br />
 else if (messageList.Count &gt; 0)<br />
                SetMessage(messageList[messageList.Count - 1]);<br />
        }</p>
<p> /**////<br />
<summary>
 /// 头像点击事件<br />
 /// </summary>
<p> ///<br />
 ///<br />
 private void goToFanfou(object sender, MouseButtonEventArgs e)<br />
 {<br />
 //打开用户的饭否页面<br />
            HtmlPage.Window.Navigate(this.user.URL, "_blank");<br />
        }<br />
    }<br />
}<br />
</code></p>
<h2>预览</h2>
<p><a href="http://go.microsoft.com/fwlink/?LinkID=108182"></p>
<p><img src="http://go.microsoft.com/fwlink/?LinkId=108181" alt="Get Microsoft Silverlight" style="border-style: none"><br />
</a><br />
如果你也想要在你的blog中添加这个Widget，那么，Copy上面的HTML代码，修改ID就可以了。</p>
<h2>源码下载</h2>
<p><a href="http://coding.windstyle.cn/files/2008/04/silverlightfanshow.zip">点击下载源码包（包括Visual Studio Solution和Expression Design文件）</a></p>
]]></content:encoded>
			<wfw:commentRss>http://coding.windstyle.cn/2008/04/29/build-fanfou-show-using-silverlight-2/feed/</wfw:commentRss>
		<slash:comments>31</slash:comments>
		</item>
	</channel>
</rss>

