<?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>SharpLab. &#187; C#Programing</title>
	<atom:link href="http://blog.sharplab.net/category/computer/cprograming/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.sharplab.net</link>
	<description>Shiroicaが学び、経験したことを綴る個人サイト。</description>
	<lastBuildDate>Thu, 12 Jan 2012 00:57:03 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>あけましておめでとうございます</title>
		<link>http://blog.sharplab.net/blog/2012/01/02/%e3%81%82%e3%81%91%e3%81%be%e3%81%97%e3%81%a6%e3%81%8a%e3%82%81%e3%81%a7%e3%81%a8%e3%81%86%e3%81%94%e3%81%96%e3%81%84%e3%81%be%e3%81%99/</link>
		<comments>http://blog.sharplab.net/blog/2012/01/02/%e3%81%82%e3%81%91%e3%81%be%e3%81%97%e3%81%a6%e3%81%8a%e3%82%81%e3%81%a7%e3%81%a8%e3%81%86%e3%81%94%e3%81%96%e3%81%84%e3%81%be%e3%81%99/#comments</comments>
		<pubDate>Mon, 02 Jan 2012 09:48:26 +0000</pubDate>
		<dc:creator>shiroica</dc:creator>
				<category><![CDATA[C#Programing]]></category>
		<category><![CDATA[Diary]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Network]]></category>

		<guid isPermaLink="false">http://blog.sharplab.net/uncategorized/3469/</guid>
		<description><![CDATA[あけましておめでとうございます。今年もよろしくお願いします。 新年の抱負を語る前に、去年のことを振り返ってみると、去年の初めも、「今年こそはBlogでしっかりアウトプットを出していく！」と考えていたのですが、結局またアウトプットを出せなかった一年となってしまいました。でも！今年こそは！今年こそは！書きます！・・・と宣言するだけでは去年から進歩がないので、Blogを書くネタにできるようなソフトウェアを今書いています。今春から働き始める会社が、IPネットワーク関係の会社なので、その辺の流行のトピックと絡めたソフトウェアをC#で書くことで、ネットワーク技術の流行とモダンなC#のコーディングスタイルのキャッチアップを図りつつ、Blogのネタにしていきたいと考えています。働き始めると慣れるまで時間がとりにくくなるかと思うので、とりあえず4月までを目途に、リリースしたいなと考えています。頑張ります。]]></description>
			<content:encoded><![CDATA[<p>あけましておめでとうございます。今年もよろしくお願いします。</p>
<p>新年の抱負を語る前に、去年のことを振り返ってみると、去年の初めも、「今年こそはBlogでしっかりアウトプットを出していく！」と考えていたのですが、結局またアウトプットを出せなかった一年となってしまいました。でも！今年こそは！今年こそは！書きます！・・・と宣言するだけでは去年から進歩がないので、Blogを書くネタにできるようなソフトウェアを今書いています。今春から働き始める会社が、IPネットワーク関係の会社なので、その辺の流行のトピックと絡めたソフトウェアをC#で書くことで、ネットワーク技術の流行とモダンなC#のコーディングスタイルのキャッチアップを図りつつ、Blogのネタにしていきたいと考えています。働き始めると慣れるまで時間がとりにくくなるかと思うので、とりあえず4月までを目途に、リリースしたいなと考えています。頑張ります。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.sharplab.net/blog/2012/01/02/%e3%81%82%e3%81%91%e3%81%be%e3%81%97%e3%81%a6%e3%81%8a%e3%82%81%e3%81%a7%e3%81%a8%e3%81%86%e3%81%94%e3%81%96%e3%81%84%e3%81%be%e3%81%99/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>学生の場合、App Hubへの登録プロセスが簡素化されたようです</title>
		<link>http://blog.sharplab.net/blog/2011/07/24/%e5%ad%a6%e7%94%9f%e3%81%ae%e5%a0%b4%e5%90%88%e3%80%81app-hub%e3%81%b8%e3%81%ae%e7%99%bb%e9%8c%b2%e3%83%97%e3%83%ad%e3%82%bb%e3%82%b9%e3%81%8c%e7%b0%a1%e7%b4%a0%e5%8c%96%e3%81%95%e3%82%8c%e3%81%9f/</link>
		<comments>http://blog.sharplab.net/blog/2011/07/24/%e5%ad%a6%e7%94%9f%e3%81%ae%e5%a0%b4%e5%90%88%e3%80%81app-hub%e3%81%b8%e3%81%ae%e7%99%bb%e9%8c%b2%e3%83%97%e3%83%ad%e3%82%bb%e3%82%b9%e3%81%8c%e7%b0%a1%e7%b4%a0%e5%8c%96%e3%81%95%e3%82%8c%e3%81%9f/#comments</comments>
		<pubDate>Sun, 24 Jul 2011 01:03:06 +0000</pubDate>
		<dc:creator>shiroica</dc:creator>
				<category><![CDATA[Windows Mobile]]></category>
		<category><![CDATA[App Hub]]></category>
		<category><![CDATA[Windows Phone 7]]></category>

		<guid isPermaLink="false">http://blog.sharplab.net/computer/cprograming/windows-mobile/3459/</guid>
		<description><![CDATA[忙しくてとりあえず登録したものの放置していたApp Hubからメールが来ていました。Winodws Phone Marketplaceのアップデートに伴い、学生の身分証明プロセスが簡素化されたみたいです。折角だし端末unlockしてMango Beta化してみようかな。 Important Enhancement to App Hub Registration Process for Students July 22, 2011 Now that the next release of the Windows Phone Marketplace App Hub has launched, we are reaching out to make you aware of a change to the registration process and how it may impact your account. In the [...]]]></description>
			<content:encoded><![CDATA[<p>忙しくてとりあえず登録したものの放置していたApp Hubからメールが来ていました。Winodws Phone Marketplaceのアップデートに伴い、学生の身分証明プロセスが簡素化されたみたいです。折角だし端末unlockしてMango Beta化してみようかな。</p>
<blockquote><p>Important Enhancement to App Hub Registration Process for Students</p>
<p>July 22, 2011</p>
<p>Now that the next release of the Windows Phone Marketplace App Hub has launched, we are reaching out to make you aware of a change to the registration process and how it may impact your account.</p>
<p>In the new release of App Hub, publisher identification for Student accounts happens in real-time during account registration. You no longer have to submit an application to trigger a separate publisher identity verification process.</p>
<p>Since you have not yet submitted an application, the next time you sign in to App Hub, you will notice your account will be reverted back to Step 1 of the registration process. All of the information you have previously provided will be pre-populated and you will be asked to follow the onscreen instructions to complete your account activation.</p>
<p>Once you&#8217;ve completed registration your account will be immediately activated and you can unlock your phone for in-device testing. This will greatly simplify the process of getting your account activated and, ultimately, your apps published to the Windows Phone Marketplace.</p>
<p>If you have any questions or concerns, please contact     <br />mailto:apphub@microsoft.com       <br />apphub@microsoft.com&#160;&#160; <br />and we will be happy to assist you.</p>
<p>Best regards,</p>
<p>The Windows Phone Marketplace Team</p>
<p>Microsoft respects your privacy. Please read our online     <br /><a href="http://privacy.microsoft.com/en-us/default.mspx">http://privacy.microsoft.com/en-us/default.mspx</a>       <br />Privacy Statement .</p>
<p>Microsoft Corporation</p>
<p>One Microsoft Way</p>
<p>Redmond, WA 98052 USA</p>
</blockquote>
]]></content:encoded>
			<wfw:commentRss>http://blog.sharplab.net/blog/2011/07/24/%e5%ad%a6%e7%94%9f%e3%81%ae%e5%a0%b4%e5%90%88%e3%80%81app-hub%e3%81%b8%e3%81%ae%e7%99%bb%e9%8c%b2%e3%83%97%e3%83%ad%e3%82%bb%e3%82%b9%e3%81%8c%e7%b0%a1%e7%b4%a0%e5%8c%96%e3%81%95%e3%82%8c%e3%81%9f/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Silverlight 4のTrusted modeでRESTサービス</title>
		<link>http://blog.sharplab.net/blog/2010/05/05/silverlight-4%e3%81%aetrusted-mode%e3%81%a7rest%e3%82%b5%e3%83%bc%e3%83%93%e3%82%b9/</link>
		<comments>http://blog.sharplab.net/blog/2010/05/05/silverlight-4%e3%81%aetrusted-mode%e3%81%a7rest%e3%82%b5%e3%83%bc%e3%83%93%e3%82%b9/#comments</comments>
		<pubDate>Tue, 04 May 2010 15:48:51 +0000</pubDate>
		<dc:creator>shiroica</dc:creator>
				<category><![CDATA[Silverlight]]></category>

		<guid isPermaLink="false">http://blog.sharplab.net/computer/cprograming/silverlight/3396/</guid>
		<description><![CDATA[厳しいかも。 Silverlight 4で追加されたTrusted mode、とりあえず試してみているのだけど、結構制限が厳しくてつらい感じ。。Cookieは使えないし、GETメソッド使っているときに、headerを追加することもできない。これは、SilverlightがHTTP通信のスタックに、OSのTCP/IPスタックを直接たたいているのではなく、ブラウザのPlugin APIを叩いているためだとか。 Silverlight only supports setting headers using the POST method not the GET method. This is due to a limitation in how the TCP/IP stack is implemented in Silverlight. It uses the browser extension APIs instead of going directly against the host OS&#8217;s APIs. http://stackoverflow.com/questions/622897/how-can-i-set-headers-with-silverlight-get-httpwebrequest この問題を回避する方法としては、@jz5さん曰く、Socketを自分で叩いてHTTP通信すればいい、ということらしい。なんだかなぁ。。Silverlight 4でTrusted Modeをどれぐらい使う需要があるかは知らないけど（自分ならWPF＋ClickOnceでいいや）、Windows PhoneアプリをSilverlightで書こうか、という場合に結構辛い気が。。WindowsPhoneは微妙に普通のSilverlightとビルディングブロックが違ってるから、案外動くのかもしれないけど（希望的観測）。 (追記) 試しにWindows [...]]]></description>
			<content:encoded><![CDATA[<p>厳しいかも。</p>
<p>Silverlight 4で追加されたTrusted mode、とりあえず試してみているのだけど、結構制限が厳しくてつらい感じ。。Cookieは使えないし、GETメソッド使っているときに、headerを追加することもできない。これは、SilverlightがHTTP通信のスタックに、OSのTCP/IPスタックを直接たたいているのではなく、ブラウザのPlugin APIを叩いているためだとか。</p>
<blockquote><p>Silverlight only supports setting headers using the POST method not the GET method. This is due to a limitation in how the TCP/IP stack is implemented in Silverlight. It uses the browser extension APIs instead of going directly against the host OS&#8217;s APIs.      <br /><a title="http://stackoverflow.com/questions/622897/how-can-i-set-headers-with-silverlight-get-httpwebrequest" href="http://stackoverflow.com/questions/622897/how-can-i-set-headers-with-silverlight-get-httpwebrequest">http://stackoverflow.com/questions/622897/how-can-i-set-headers-with-silverlight-get-httpwebrequest</a></p>
</blockquote>
<p>この問題を回避する方法としては、@jz5さん曰く、Socketを自分で叩いてHTTP通信すればいい、ということらしい。なんだかなぁ。。Silverlight 4でTrusted Modeをどれぐらい使う需要があるかは知らないけど（自分ならWPF＋ClickOnceでいいや）、<strike>Windows PhoneアプリをSilverlightで書こうか、という場合に結構辛い気が。。WindowsPhoneは微妙に普通のSilverlightとビルディングブロックが違ってるから、案外動くのかもしれないけど（希望的観測）。</strike></p>
<p>(追記) 試しにWindows Phoneでやってみたらheader追加できたｗ 嬉しいんだけど、HttpWebRequestみたいな非常に一般的なクラスでこのように挙動が違うというのは、困るので、正直複雑。何とかならんのか。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.sharplab.net/blog/2010/05/05/silverlight-4%e3%81%aetrusted-mode%e3%81%a7rest%e3%82%b5%e3%83%bc%e3%83%93%e3%82%b9/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>第二回プログラミング生放送勉強会行ってきました。</title>
		<link>http://blog.sharplab.net/blog/2009/12/27/%e7%ac%ac%e4%ba%8c%e5%9b%9e%e3%83%97%e3%83%ad%e3%82%b0%e3%83%a9%e3%83%9f%e3%83%b3%e3%82%b0%e7%94%9f%e6%94%be%e9%80%81%e5%8b%89%e5%bc%b7%e4%bc%9a%e8%a1%8c%e3%81%a3%e3%81%a6%e3%81%8d%e3%81%be%e3%81%97/</link>
		<comments>http://blog.sharplab.net/blog/2009/12/27/%e7%ac%ac%e4%ba%8c%e5%9b%9e%e3%83%97%e3%83%ad%e3%82%b0%e3%83%a9%e3%83%9f%e3%83%b3%e3%82%b0%e7%94%9f%e6%94%be%e9%80%81%e5%8b%89%e5%bc%b7%e4%bc%9a%e8%a1%8c%e3%81%a3%e3%81%a6%e3%81%8d%e3%81%be%e3%81%97/#comments</comments>
		<pubDate>Sun, 27 Dec 2009 04:23:11 +0000</pubDate>
		<dc:creator>shiroica</dc:creator>
				<category><![CDATA[C#Programing]]></category>
		<category><![CDATA[Gainer]]></category>
		<category><![CDATA[Pivot]]></category>
		<category><![CDATA[XNA]]></category>

		<guid isPermaLink="false">http://blog.sharplab.net/computer/cprograming/3295/</guid>
		<description><![CDATA[昨日開催された、 プログラミング生放送勉強会 第2回 ＠新宿に行ってきました。ニコニコ生放送のプログラミング関係のオフ会ということなのですが、自分はそれまでニコニコ生放送というものを見たことがなかったので、若干どんなノリの会なのか分からずに行ったのですが、まぁ、わんくま勉強会と似たようなノリで、楽しんで帰ることができました。やはり、動画でセッションの模様を中継でき、それに対する反応がネットの向こう側で観ている側から帰ってくるというインタラクションは大変面白いですね。ただ、帰ってくる反応も、ニコニコ動画のカルチャーに影響されているところがあり、もっとフォーマルなイベントで公式に使うのは難しいだろうなということも身をもって感じました。 さて肝心の内容。色々面白い話が多かったですが、.NET好きという自分の性格も手伝って、Live Labs Pivotの紹介話とXBox LIVE インディーズゲーム製作苦労話、Gainer紹介といくつかのLTが特に面白かったです。 Live Labs Pivotは、事前に名前しか知らずに行ったのですが、あれはある形式に則ったデータを食わせたら、それをSeaDragonテクノロジ他を使って綺麗に整理して見せるデモアプリケーションというイメージで良いんでしょうか。インビテーションを取得するのが手間そうなので実際に使ったわけでないのですが、デモを見る限りWPFで実装されているのかな？いつかLive wave xでWindows LiveやBingのオプション機能として、このようなインターフェイスがSiverlightを使って実装されて欲しいものです。 XBox LIVE インディーズゲームの話は、XBox LIVE インディーズゲームを実際に製作されている方が、製作にあたっての技術的でない苦労点を語ったセッションでした。やっぱり、家庭用ゲームコンソールで動くゲームを作って販売できるというのは大変魅力的な話のようですが、それに見合った苦労もされていうようで、iPhoneアプリ同様アメリカへの税金払い方の話だとか、表現の規制に関する話だとか、インターフェイスに使う言語の話だとか。表現の規制の話は、まぁ家庭用ゲーム機なら控えめにならざるを得ないというのはよくわかる話だったのですが、ゲームのインターフェイスに使われる言語に、日本向けのゲームにアルファベットが使われているだけで外国人からピアレビューで差し戻しを受けて直さざるを得なかったというのは、どう考えても運営方針が間違っているような。。まだ始まったばかりの仕組みなので運営側も試行錯誤している段階なのでしょうが、聞いている限りだと、製作者と運営側のコミュニケーションロスによる問題のような気も。やっぱり海外で作られているスキームを使う場合には、こちらも交渉できるだけの英語力が求められるのだなぁと勝手に納得してました。 Gainer。イケメンのための雑誌の方じゃないよ、電子工作の方だよ、というギャグほか、スピーカーの方のしゃべりの上手さに大いに笑わせてもらったセッションでした。Gainer、面白そうですね。なんちゃって理系ですらないSFCでぼんやり過ごしていると、電子工作方面への知識が全く欠けているのですが、Gainerは自分みたいな高級言語ばっかり触っている人間が電子工作始めるのに最適なおもちゃだということがよく分かりました。PCの中に立てたローカルなサーバーを叩いてやるだけでいいというのは非常に手軽ですね。。近いうちに買いたいと思います。 そいういえば場所はMicrosoftの新宿オフィスのセッションルームの一室だったのですが、新宿のサザンテラス口側は結構イルミネーションが綺麗なんですね。向かいの高島屋や紀伊国屋側も綺麗ですし。]]></description>
			<content:encoded><![CDATA[<p>昨日開催された、 <a href="http://co9320.spaces.live.com/blog/cns!F8FA3BD6ABDDDB63!224.entry">プログラミング生放送勉強会 第2回 ＠新宿</a>に行ってきました。ニコニコ生放送のプログラミング関係のオフ会ということなのですが、自分はそれまでニコニコ生放送というものを見たことがなかったので、若干どんなノリの会なのか分からずに行ったのですが、まぁ、わんくま勉強会と似たようなノリで、楽しんで帰ることができました。やはり、動画でセッションの模様を中継でき、それに対する反応がネットの向こう側で観ている側から帰ってくるというインタラクションは大変面白いですね。ただ、帰ってくる反応も、ニコニコ動画のカルチャーに影響されているところがあり、もっとフォーマルなイベントで公式に使うのは難しいだろうなということも身をもって感じました。</p>
<p>さて肝心の内容。色々面白い話が多かったですが、.NET好きという自分の性格も手伝って、Live Labs Pivotの紹介話とXBox LIVE インディーズゲーム製作苦労話、Gainer紹介といくつかのLTが特に面白かったです。</p>
<p>Live Labs Pivotは、事前に名前しか知らずに行ったのですが、あれはある形式に則ったデータを食わせたら、それをSeaDragonテクノロジ他を使って綺麗に整理して見せるデモアプリケーションというイメージで良いんでしょうか。インビテーションを取得するのが手間そうなので実際に使ったわけでないのですが、デモを見る限りWPFで実装されているのかな？いつかLive wave xでWindows LiveやBingのオプション機能として、このようなインターフェイスがSiverlightを使って実装されて欲しいものです。</p>
<p>XBox LIVE インディーズゲームの話は、XBox LIVE インディーズゲームを実際に製作されている方が、製作にあたっての技術的でない苦労点を語ったセッションでした。やっぱり、家庭用ゲームコンソールで動くゲームを作って販売できるというのは大変魅力的な話のようですが、それに見合った苦労もされていうようで、iPhoneアプリ同様アメリカへの税金払い方の話だとか、表現の規制に関する話だとか、インターフェイスに使う言語の話だとか。表現の規制の話は、まぁ家庭用ゲーム機なら控えめにならざるを得ないというのはよくわかる話だったのですが、ゲームのインターフェイスに使われる言語に、日本向けのゲームにアルファベットが使われているだけで外国人からピアレビューで差し戻しを受けて直さざるを得なかったというのは、どう考えても運営方針が間違っているような。。まだ始まったばかりの仕組みなので運営側も試行錯誤している段階なのでしょうが、聞いている限りだと、製作者と運営側のコミュニケーションロスによる問題のような気も。やっぱり海外で作られているスキームを使う場合には、こちらも交渉できるだけの英語力が求められるのだなぁと勝手に納得してました。</p>
<p>Gainer。イケメンのための雑誌の方じゃないよ、電子工作の方だよ、というギャグほか、スピーカーの方のしゃべりの上手さに大いに笑わせてもらったセッションでした。Gainer、面白そうですね。なんちゃって理系ですらないSFCでぼんやり過ごしていると、電子工作方面への知識が全く欠けているのですが、Gainerは自分みたいな高級言語ばっかり触っている人間が電子工作始めるのに最適なおもちゃだということがよく分かりました。PCの中に立てたローカルなサーバーを叩いてやるだけでいいというのは非常に手軽ですね。。近いうちに買いたいと思います。</p>
<p><a href="http://blog.sharplab.net/wp-content/uploads/2009/12/P1020471.jpg" rel="lightbox"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; margin-left: 0px; border-left-width: 0px; margin-right: 0px" title="P1020471" border="0" alt="P1020471" align="right" src="http://blog.sharplab.net/wp-content/uploads/2009/12/P1020471_thumb.jpg" width="324" height="244" /></a>そいういえば場所はMicrosoftの新宿オフィスのセッションルームの一室だったのですが、新宿のサザンテラス口側は結構イルミネーションが綺麗なんですね。向かいの高島屋や紀伊国屋側も綺麗ですし。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.sharplab.net/blog/2009/12/27/%e7%ac%ac%e4%ba%8c%e5%9b%9e%e3%83%97%e3%83%ad%e3%82%b0%e3%83%a9%e3%83%9f%e3%83%b3%e3%82%b0%e7%94%9f%e6%94%be%e9%80%81%e5%8b%89%e5%bc%b7%e4%bc%9a%e8%a1%8c%e3%81%a3%e3%81%a6%e3%81%8d%e3%81%be%e3%81%97/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>E30HT</title>
		<link>http://blog.sharplab.net/blog/2009/10/10/e30ht/</link>
		<comments>http://blog.sharplab.net/blog/2009/10/10/e30ht/#comments</comments>
		<pubDate>Fri, 09 Oct 2009 16:36:35 +0000</pubDate>
		<dc:creator>shiroica</dc:creator>
				<category><![CDATA[Hardware]]></category>
		<category><![CDATA[Windows Mobile]]></category>
		<category><![CDATA[E30HT]]></category>
		<category><![CDATA[Touch Diamond]]></category>
		<category><![CDATA[Touch Pro]]></category>
		<category><![CDATA[WindowsMobile]]></category>

		<guid isPermaLink="false">http://blog.sharplab.net/computer/hardware/3270/</guid>
		<description><![CDATA[研究室にAU初のスマートフォン、E30HTが届きました。いわゆるTouch Pro。なんかのプロジェクトで使う端末らしいです。折角なので姉妹機である自分のTouch Diamondと並べてみました。 Touch Proのキーボードがある側だけでTouch Diamondと同じ厚みがある。。まぁ、Touch Diamondが薄くて良い端末だと信じることにします（ぇ]]></description>
			<content:encoded><![CDATA[<p>研究室にAU初のスマートフォン、E30HTが届きました。いわゆるTouch Pro。なんかのプロジェクトで使う端末らしいです。折角なので姉妹機である自分のTouch Diamondと並べてみました。</p>
<p><a rel="lightbox" href="http://blog.sharplab.net/wp-content/uploads/2009/10/091005_150201.jpg"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="091005_1502~01" border="0" alt="091005_1502~01" src="http://blog.sharplab.net/wp-content/uploads/2009/10/091005_150201_thumb.jpg" width="404" height="244" /></a> <a rel="lightbox" href="http://blog.sharplab.net/wp-content/uploads/2009/10/091005_150801.jpg"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="091005_1508~01" border="0" alt="091005_1508~01" src="http://blog.sharplab.net/wp-content/uploads/2009/10/091005_150801_thumb.jpg" width="404" height="244" /></a></p>
<p>Touch Proのキーボードがある側だけでTouch Diamondと同じ厚みがある。。まぁ、Touch Diamondが薄くて良い端末だと信じることにします（ぇ</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.sharplab.net/blog/2009/10/10/e30ht/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>UnhandledExceptionイベントは、サブスレッドの例外も捕捉可能</title>
		<link>http://blog.sharplab.net/blog/2009/09/23/unhandledexception%e3%82%a4%e3%83%99%e3%83%b3%e3%83%88%e3%81%af%e3%80%81%e3%82%b5%e3%83%96%e3%82%b9%e3%83%ac%e3%83%83%e3%83%89%e3%81%ae%e4%be%8b%e5%a4%96%e3%82%82%e6%8d%95%e6%8d%89%e5%8f%af%e8%83%bd/</link>
		<comments>http://blog.sharplab.net/blog/2009/09/23/unhandledexception%e3%82%a4%e3%83%99%e3%83%b3%e3%83%88%e3%81%af%e3%80%81%e3%82%b5%e3%83%96%e3%82%b9%e3%83%ac%e3%83%83%e3%83%89%e3%81%ae%e4%be%8b%e5%a4%96%e3%82%82%e6%8d%95%e6%8d%89%e5%8f%af%e8%83%bd/#comments</comments>
		<pubDate>Wed, 23 Sep 2009 06:35:02 +0000</pubDate>
		<dc:creator>shiroica</dc:creator>
				<category><![CDATA[C#Programing]]></category>
		<category><![CDATA[Async Operation]]></category>
		<category><![CDATA[BeginInvoke]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[UnhandledException]]></category>

		<guid isPermaLink="false">http://blog.sharplab.net/computer/cprograming/3253/</guid>
		<description><![CDATA[以前あげたC# .NETアプリケーション開発 徹底攻略 Listing2.26への疑問 &#8211; SharpLab.というエントリに対して、なちゃさんから、 なちゃ 09-09-23 09:15:19 JST 本来、デリゲートでBeginInvokeした場合は、必ずEndInvokeする必要がありますね。 リソースリークなども発生する危険があります。 ※デリゲート以外でもBegin～系は基本的には同じですが EndInvokeさえすれば、きちんと発生した例外がスローされてきます。 けして例外が握りつぶされているのではなく、正しく使っていないために握りつぶされているように見えているだけですね。 ちょっと書籍の記述がまずいと思います。 という指摘がありました。なるほど！指摘の通り、Begin EndパターンなのでEndInvokeを必ず呼び出す必要がありました。恥ずかしながらすっかり失念していました。。というわけでEndInvokeを使うように修正。 using System; using System.Collections.Generic; using System.Linq; using System.Windows.Forms; using System.Threading; namespace SharpLab.ThreadExceptionTest { static class Program { static Form form; /// &#60;summary&#62; /// アプリケーションのメイン エントリ ポイントです。 /// &#60;/summary&#62; [STAThread] static void Main() { Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException); [...]]]></description>
			<content:encoded><![CDATA[<p>以前あげた<a href="http://blog.sharplab.net/computer/cprograming/3149/#comments">C# .NETアプリケーション開発 徹底攻略 Listing2.26への疑問 &#8211; SharpLab.</a>というエントリに対して、なちゃさんから、</p>
<blockquote><p>なちゃ 09-09-23 09:15:19 JST </p>
<p>本来、デリゲートでBeginInvokeした場合は、必ずEndInvokeする必要がありますね。      <br />リソースリークなども発生する危険があります。       <br />※デリゲート以外でもBegin～系は基本的には同じですが </p>
<p>EndInvokeさえすれば、きちんと発生した例外がスローされてきます。      <br />けして例外が握りつぶされているのではなく、正しく使っていないために握りつぶされているように見えているだけですね。       <br />ちょっと書籍の記述がまずいと思います。</p>
</blockquote>
<p>という指摘がありました。なるほど！指摘の通り、Begin EndパターンなのでEndInvokeを必ず呼び出す必要がありました。恥ずかしながらすっかり失念していました。。というわけでEndInvokeを使うように修正。</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:c1a69e42-940e-4c04-9db2-55c28372650c" class="wlWriterEditableSmartContent">
<pre name="code" class="c#">using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
using System.Threading;

namespace SharpLab.ThreadExceptionTest {
	static class Program {

		static Form form;

		/// &lt;summary&gt;
		/// アプリケーションのメイン エントリ ポイントです。
		/// &lt;/summary&gt;
		[STAThread]
		static void Main() {

			Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);
			Thread.GetDomain().UnhandledException += new UnhandledExceptionEventHandler(Program_UnhandledException);

			Application.EnableVisualStyles();
			Application.SetCompatibleTextRenderingDefault(false);
			form = new Form();
			Application.Run(new Form1());
		}

		static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e) {
			MessageBox.Show(e.Exception.Message);
		}

		static void Program_UnhandledException(object sender, UnhandledExceptionEventArgs e) {
			Exception ex = (Exception)e.ExceptionObject;
			MessageBox.Show(ex.Message);
			Application.Exit();
			Environment.Exit(0);
		}

	}
}</pre>
</div>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:f2bb3009-b823-403f-b67d-997f4b5d6ba4" class="wlWriterEditableSmartContent">
<pre name="code" class="c#">using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;

namespace SharpLab.ThreadExceptionTest {
	public partial class Form1 : Form {
		public Form1() {
			InitializeComponent();
		}

		private delegate void SampleDelegate();

		private void button1_Click(object sender, EventArgs e) {

			SampleDelegate a = new SampleDelegate(ThreadMethod);
			a.BeginInvoke((asyncResult) =&gt; {
				a.EndInvoke(asyncResult);
			}, null);
		}

		private void ThreadMethod() {
			//意図的に起こした例外
			Thread.Sleep(5000);
			throw new Exception("非同期スレッドで起こった例外です。");
		}

	}
}</pre>
</div>
<p><a rel="lightbox" href="http://blog.sharplab.net/wp-content/uploads/2009/09/image9.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; margin-left: 0px; border-left-width: 0px; margin-right: 0px" title="image" border="0" alt="image" align="right" src="http://blog.sharplab.net/wp-content/uploads/2009/09/image_thumb9.png" width="304" height="235" /></a></p>
<p>こんな感じでしょうか。ちゃんとサブスレッドで例外が発生した時にUnhandledExceptionが呼び出されるようになりました！これで正しく確実な終了処理ができそうです。サブスレッドの処理内容をすべてtry~catchで括って必要に応じて例外をリスローする必要があると憶えていたのですが、そうではなかったのですね。いつもtry~catch書きながらなんかおかしい気がしていたのですが、これですっきりしました。なちゃさん、ありがとうございました。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.sharplab.net/blog/2009/09/23/unhandledexception%e3%82%a4%e3%83%99%e3%83%b3%e3%83%88%e3%81%af%e3%80%81%e3%82%b5%e3%83%96%e3%82%b9%e3%83%ac%e3%83%83%e3%83%89%e3%81%ae%e4%be%8b%e5%a4%96%e3%82%82%e6%8d%95%e6%8d%89%e5%8f%af%e8%83%bd/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Webkit.NETのDOMをJavaScriptを使って操作する方法</title>
		<link>http://blog.sharplab.net/blog/2009/09/18/webkit-net%e3%81%aedom%e3%82%92javascript%e3%81%8b%e3%82%89%e6%93%8d%e4%bd%9c%e3%81%99%e3%82%8b%e6%96%b9%e6%b3%95/</link>
		<comments>http://blog.sharplab.net/blog/2009/09/18/webkit-net%e3%81%aedom%e3%82%92javascript%e3%81%8b%e3%82%89%e6%93%8d%e4%bd%9c%e3%81%99%e3%82%8b%e6%96%b9%e6%b3%95/#comments</comments>
		<pubDate>Fri, 18 Sep 2009 06:50:21 +0000</pubDate>
		<dc:creator>shiroica</dc:creator>
				<category><![CDATA[C#Programing]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Cocoa]]></category>
		<category><![CDATA[Webkit]]></category>
		<category><![CDATA[Webkit.NET]]></category>

		<guid isPermaLink="false">http://blog.sharplab.net/computer/cprograming/3249/</guid>
		<description><![CDATA[前のエントリで紹介したWebkit.NETはまだC#などのコードからDOMにアクセスする方法は実装中であるため、正式には提供されていません。提供されているのは基本的なナビゲーションなどに限られています。そのため、出来ることは相当制限されています。がしかし、表示されているページの中でJavaScriptのコードを実行させる方法がForumに上がっていましたので紹介します。これがあれば多少の助けにはなりそうです。 ソースコードはこんな感じ。 private void button1_Click(object sender, EventArgs e) { FieldInfo fi = typeof(WebKitBrowser).GetField("webView", BindingFlags.NonPublic&#124; BindingFlags.Instance); WebView webView = (WebView)fi.GetValue(this.webBrowser1); webView.stringByEvaluatingJavaScriptFromString(@"document.body.innerHTML = 'Hello Webkit DOM!';"); } リフレクションを使っています。WebKitBrowserにはwebViewというprivateなメンバがあり、それはWebViewインターフェイスを実装しています。このwebViewをリフレクションで取得し、そのメンバにstringByEvaluatingJavaScriptFromStringというJavaScriptコードを引数として渡してやると実行してくれるメソッドがあるので、これを利用するという方法です。このメソッドの戻り値の型はstringなのですが、実行結果を取得することはどうもできないようです。 WebViewの他のメンバの実装がどれぐらい進んでいるかはまだ試していないのでわからないのですが、WebViewについては、Webkitですし、Cocoaのリファレンスを参照するとよさそうな感じがします。]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.sharplab.net/computer/cprograming/3247/">前のエントリ</a>で紹介した<a href="http://webkitdotnet.sourceforge.net/">Webkit.NET</a>はまだC#などのコードからDOMにアクセスする方法は実装中であるため、正式には提供されていません。提供されているのは基本的なナビゲーションなどに限られています。そのため、出来ることは相当制限されています。がしかし、<a href="http://sourceforge.net/projects/webkitdotnet/forums/forum/939856/topic/3348839">表示されているページの中でJavaScriptのコードを実行させる方法</a>がForumに上がっていましたので紹介します。これがあれば多少の助けにはなりそうです。</p>
<p>ソースコードはこんな感じ。</p>
</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:2d249c4a-6133-4423-94ea-81a41deebc0b" class="wlWriterEditableSmartContent">
<pre name="code" class="c#">private void button1_Click(object sender, EventArgs e) {
    FieldInfo fi = typeof(WebKitBrowser).GetField("webView", BindingFlags.NonPublic| BindingFlags.Instance);
    WebView webView = (WebView)fi.GetValue(this.webBrowser1);
    webView.stringByEvaluatingJavaScriptFromString(@"document.body.innerHTML = 'Hello Webkit DOM!';");
}</pre>
</div>
<p>リフレクションを使っています。WebKitBrowserにはwebViewというprivateなメンバがあり、それはWebViewインターフェイスを実装しています。このwebViewをリフレクションで取得し、そのメンバにstringByEvaluatingJavaScriptFromStringというJavaScriptコードを引数として渡してやると実行してくれるメソッドがあるので、これを利用するという方法です。このメソッドの戻り値の型はstringなのですが、実行結果を取得することはどうもできないようです。 WebViewの他のメンバの実装がどれぐらい進んでいるかはまだ試していないのでわからないのですが、WebViewについては、Webkitですし、Cocoaのリファレンスを参照するとよさそうな感じがします。 </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.sharplab.net/blog/2009/09/18/webkit-net%e3%81%aedom%e3%82%92javascript%e3%81%8b%e3%82%89%e6%93%8d%e4%bd%9c%e3%81%99%e3%82%8b%e6%96%b9%e6%b3%95/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Webkit.NETを触ってみた</title>
		<link>http://blog.sharplab.net/blog/2009/09/18/webkit-net%e3%82%92%e8%a7%a6%e3%81%a3%e3%81%a6%e3%81%bf%e3%81%9f/</link>
		<comments>http://blog.sharplab.net/blog/2009/09/18/webkit-net%e3%82%92%e8%a7%a6%e3%81%a3%e3%81%a6%e3%81%bf%e3%81%9f/#comments</comments>
		<pubDate>Thu, 17 Sep 2009 16:52:13 +0000</pubDate>
		<dc:creator>shiroica</dc:creator>
				<category><![CDATA[C#Programing]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Visual Studio]]></category>
		<category><![CDATA[Webkit]]></category>
		<category><![CDATA[Webkit.NET]]></category>

		<guid isPermaLink="false">http://blog.sharplab.net/computer/cprograming/3247/</guid>
		<description><![CDATA[「C#凄い使いやすくて良い言語なんだけど、WebBrowserコントロールは残念だよなー、Trident最近頑張ってるんだけどWebkitとかに比べるとまだまだだよなー」とか常日頃から感じていたのですが、ふと「WebkitをC#から扱うためのラッパーとか探せばあるんじゃね？」という思いつきで「Webkit .net」とググってみると、ありましたありました、「Webkit.NET」というまんまなタイトルのプロジェクトが。オープンソース恐るべし。コンパイル済みのバイナリと共に、サンプルアプリがあったので実行してみました。 ･･･なにこれ凄い。日本語も全く普通に通りますし、普通に使えそうです。というわけで自分でもテスト用にWinFormsプロジェクトを作って動かすテストをしてみたので、メモを残しておきます。 まず、WebKit.NETライブラリをWebKit .NET &#124; Get WebKit .NET at SourceForge.netからDLしてきます。その中のbinフォルダ内のファイルがライブラリを構成しています。WebKitBrowser.dllがC#から参照するラッパーです。 まず、WebKitBrowserをツールボックスに追加してやります。ツールボックスのコンテキストメニューの「アイテムの選択」という項目をクリックします。 この際、ダイアログが表示されるまで、めちゃ重たいかもしれませんが、ぐっとこらえましょう。 そして参照ボタンをクリックして、WebKitBrowser.dllを選択してやれば、ツールボックスにWebKitBrowserが追加されます。 あとは普通にコントロールをポトベタしておわり…でもありません。。 まず、プロジェクトのプロパティから、プラットフォームターゲットをx86に設定します。Webkitは、現在、x86版のみ提供されているそうです。 続いて、デバッグのタブにある、「Visual Studio ホスティング プロセスを有効にする」という項目のチェックを外します。Visual Studioホスティングプロセスは、Visual Studioでのデバッグを効率化させるためのもののようですが、今回のようにアンマネージドコードを連携する場合は上手く働かず、エラーの原因になることがあるようです（Visual Studioホスティングプロセスの解説：VSホスト・プロセス（*.vshost.exe）とは何か？［VS 2005のみ、C#、VB］ － ＠IT）。これが原因のエラーにぶつかって、@JZ5さんに助けを求めたところ、このオプションを教えていただけました。ありがとうございました。 こうしてビルドした上で、最後に仕上げに、ビルドして出来た実行ファイルやWebKitBrowser.dllと同じディレクトリに、Webkit本体であるWebkit.dllや、その依存するdll群を放り込みます。ビルド後のイベントでコピーするコマンドを発行してやると良いようです。 というわけで出来ました。よいよい。素晴らしい。DOM周りのメンバの実装が未だらしく、出来ることは結構限定されていますが、Monoでも動かせるようにしたいよねー、とREADMEに書かれていたりと、これからの進展に期待したいプロジェクトです。]]></description>
			<content:encoded><![CDATA[<p><a rel="lightbox" href="http://blog.sharplab.net/wp-content/uploads/2009/09/image1.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; margin-left: 0px; border-left-width: 0px; margin-right: 0px" title="image" border="0" alt="image" align="right" src="http://blog.sharplab.net/wp-content/uploads/2009/09/image_thumb1.png" width="244" height="142" /></a> 「C#凄い使いやすくて良い言語なんだけど、WebBrowserコントロールは残念だよなー、Trident最近頑張ってるんだけどWebkitとかに比べるとまだまだだよなー」とか常日頃から感じていたのですが、ふと「WebkitをC#から扱うためのラッパーとか探せばあるんじゃね？」という思いつきで「Webkit .net」とググってみると、ありましたありました、「Webkit.NET」というまんまなタイトルのプロジェクトが。オープンソース恐るべし。コンパイル済みのバイナリと共に、サンプルアプリがあったので実行してみました。 </p>
<p><a rel="lightbox" href="http://blog.sharplab.net/wp-content/uploads/2009/09/image2.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="image" border="0" alt="image" src="http://blog.sharplab.net/wp-content/uploads/2009/09/image_thumb2.png" width="404" height="267" /></a></p>
<p>･･･なにこれ凄い。日本語も全く普通に通りますし、普通に使えそうです。というわけで自分でもテスト用にWinFormsプロジェクトを作って動かすテストをしてみたので、メモを残しておきます。</p>
<p>まず、WebKit.NETライブラリを<a href="http://sourceforge.net/projects/webkitdotnet/">WebKit .NET | Get WebKit .NET at SourceForge.net</a>からDLしてきます。その中のbinフォルダ内のファイルがライブラリを構成しています。WebKitBrowser.dllがC#から参照するラッパーです。</p>
<p>まず、WebKitBrowserをツールボックスに追加してやります。ツールボックスのコンテキストメニューの「アイテムの選択」という項目をクリックします。</p>
<p><a rel="lightbox" href="http://blog.sharplab.net/wp-content/uploads/2009/09/image3.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://blog.sharplab.net/wp-content/uploads/2009/09/image_thumb3.png" width="244" height="185" /></a> </p>
<p>この際、ダイアログが表示されるまで、めちゃ重たいかもしれませんが、ぐっとこらえましょう。</p>
<p><a rel="lightbox" href="http://blog.sharplab.net/wp-content/uploads/2009/09/image4.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://blog.sharplab.net/wp-content/uploads/2009/09/image_thumb4.png" width="244" height="176" /></a></p>
<p>そして参照ボタンをクリックして、WebKitBrowser.dllを選択してやれば、ツールボックスにWebKitBrowserが追加されます。</p>
<p><a rel="lightbox" href="http://blog.sharplab.net/wp-content/uploads/2009/09/image5.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://blog.sharplab.net/wp-content/uploads/2009/09/image_thumb5.png" width="242" height="159" /></a> </p>
<p>あとは普通にコントロールをポトベタしておわり…でもありません。。</p>
<p>まず、プロジェクトのプロパティから、プラットフォームターゲットをx86に設定します。Webkitは、現在、x86版のみ提供されているそうです。    <br /><a rel="lightbox" href="http://blog.sharplab.net/wp-content/uploads/2009/09/image6.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://blog.sharplab.net/wp-content/uploads/2009/09/image_thumb6.png" width="404" height="242" /></a></p>
<p>続いて、デバッグのタブにある、「Visual Studio ホスティング プロセスを有効にする」という項目のチェックを外します。Visual Studioホスティングプロセスは、Visual Studioでのデバッグを効率化させるためのもののようですが、今回のようにアンマネージドコードを連携する場合は上手く働かず、エラーの原因になることがあるようです（Visual Studioホスティングプロセスの解説：<a href="http://www.atmarkit.co.jp/fdotnet/dotnettips/410vshost/vshost.html">VSホスト・プロセス（*.vshost.exe）とは何か？［VS 2005のみ、C#、VB］ － ＠IT</a>）。これが原因のエラーにぶつかって、<a href="http://blogs.wankuma.com/katamari/">@JZ5さん</a>に助けを求めたところ、このオプションを教えていただけました。ありがとうございました。</p>
<p><a rel="lightbox" href="http://blog.sharplab.net/wp-content/uploads/2009/09/image7.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://blog.sharplab.net/wp-content/uploads/2009/09/image_thumb7.png" width="304" height="125" /></a></p>
<p>こうしてビルドした上で、最後に仕上げに、ビルドして出来た実行ファイルやWebKitBrowser.dllと同じディレクトリに、Webkit本体であるWebkit.dllや、その依存するdll群を放り込みます。ビルド後のイベントでコピーするコマンドを発行してやると良いようです。</p>
<p><a rel="lightbox" href="http://blog.sharplab.net/wp-content/uploads/2009/09/image8.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; margin-left: 0px; border-left-width: 0px; margin-right: 0px" title="image" border="0" alt="image" align="left" src="http://blog.sharplab.net/wp-content/uploads/2009/09/image_thumb8.png" width="284" height="172" /></a></p>
<p>というわけで出来ました。よいよい。素晴らしい。DOM周りのメンバの実装が未だらしく、出来ることは結構限定されていますが、Monoでも動かせるようにしたいよねー、とREADMEに書かれていたりと、これからの進展に期待したいプロジェクトです。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.sharplab.net/blog/2009/09/18/webkit-net%e3%82%92%e8%a7%a6%e3%81%a3%e3%81%a6%e3%81%bf%e3%81%9f/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>悲しいけどこれ、仕様なのよね。。（Silverlightの愚痴エントリ）</title>
		<link>http://blog.sharplab.net/blog/2009/07/18/%e6%82%b2%e3%81%97%e3%81%84%e3%81%91%e3%81%a9%e3%81%93%e3%82%8c%e3%80%81%e4%bb%95%e6%a7%98%e3%81%aa%e3%81%ae%e3%82%88%e3%81%ad%e3%80%82%e3%80%82%ef%bc%88silverlight%e3%81%ae%e6%84%9a%e7%97%b4%e3%82%a8/</link>
		<comments>http://blog.sharplab.net/blog/2009/07/18/%e6%82%b2%e3%81%97%e3%81%84%e3%81%91%e3%81%a9%e3%81%93%e3%82%8c%e3%80%81%e4%bb%95%e6%a7%98%e3%81%aa%e3%81%ae%e3%82%88%e3%81%ad%e3%80%82%e3%80%82%ef%bc%88silverlight%e3%81%ae%e6%84%9a%e7%97%b4%e3%82%a8/#comments</comments>
		<pubDate>Sat, 18 Jul 2009 13:32:21 +0000</pubDate>
		<dc:creator>shiroica</dc:creator>
				<category><![CDATA[Silverlight]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[M-V-VM]]></category>

		<guid isPermaLink="false">http://blog.sharplab.net/computer/cprograming/silverlight/3182/</guid>
		<description><![CDATA[CardSafe/EはMVVMパターンに則って作るように心掛けたのですが、WPFと同じ感覚でSilverlightにMVVMパターンを適用しようとすると、色々と不都合が出てきて苦労させられました。Silverlightではオミットされている機能が結構あるので、そこに引っかかるとしばしば手戻りが発生します。このエントリではCardSafe/Eを書いていて気付いた点をとりあえず二点ほど。 SilverlightにはDataTemplate.Datatypeが存在しない 地味に痛いですこの仕様。ItemsControlから派生したコントロール（ListBoxなど）のItemをItemsSourceにセットしたINotifyPoropertyChangedを実装したコレクションから生成する際に、コレクションが列挙するインスタンスの型によってDataTemplateを切り替える場合、WPFではDataTemplate.Datatypeがあるので重宝するのですが、Silverlightでは3 RTWでもサポートされていません。DataTemplateSelectorもサポートされていないので、インスタンスの型や状態によってDataTemplateを切り替えることはできないようです。とりあえず逃げ道として自分はDataContextにセットされたインスタンスをみてContentを書き換えるロジックを書いたUserControlを用意しているのですが、面倒ですね。XAMLで宣言的に書きたいのでDataTemplate.Datatypeは是非サポートしてもらいたいものです。 TabcotrolのItemsSourceはTabItemのコレクションしか受け付けない なんでー！？これまたあんまりな仕様。WPFではItemsControlから派生したコントロールのItemsSourceにINotifyPoropertyChangedを実装したコレクションをセットすると、その列挙する内容をListBoxItemやTabItemなど適当なコンテナに包んで表示してくれるので、あとはDataTemplateで表示内容を好きなようにカスタマイズしてやればよかったのですが、SilverlightのTabControlのItemsSourceはTabItemのコレクションしか受けてつけてくれないという。。これではTabItemに対応するViewModelのインスタンスをセットし、DataTemplateでViewを設定して表示内容をカスタマイズするというM-V-VMでよく知られたパターンが使えません。SilverlightでもListBoxではListBoxItem以外も受け付けてくれたのですけどねぇ。。ではどうするか。自分の場合はViewModelのコレクションをラップしてTabItemのコレクションとして公開するラッパークラスとConverterを用意することで凌ぎました。 ラッパークラスはこんな感じです。ViewModelのコレクションとViewModelからTabItemへの変換を行うFuncをコンストラクタの引数として取ります。 using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Collections.Specialized; using System.Windows.Controls; namespace SharpLab.CredentialsLockerSilverlight.ViewModels { public class ReadOnlyObservableTabItemCollection&#60;TViewModel, TViewModelCollection&#62; : ICollection&#60;TabItem&#62;, INotifyCollectionChanged where TViewModelCollection : ICollection&#60;TViewModel&#62;, INotifyCollectionChanged { private TViewModelCollection _viewModels; private ObservableCollection&#60;TabItem&#62; _tabItems; private Func&#60;TViewModel, TabItem&#62; _converter; public ReadOnlyObservableTabItemCollection(TViewModelCollection viewModels, Func&#60;TViewModel, TabItem&#62; converter) { _converter = converter; _viewModels = [...]]]></description>
			<content:encoded><![CDATA[</p>
<p><a href="http://blog.sharplab.net/cardsafeeverywhere/">CardSafe/E</a>はMVVMパターンに則って作るように心掛けたのですが、WPFと同じ感覚でSilverlightにMVVMパターンを適用しようとすると、色々と不都合が出てきて苦労させられました。Silverlightではオミットされている機能が結構あるので、そこに引っかかるとしばしば手戻りが発生します。このエントリではCardSafe/Eを書いていて気付いた点をとりあえず二点ほど。</p>
<h3>SilverlightにはDataTemplate.Datatypeが存在しない</h3>
<p>地味に痛いですこの仕様。ItemsControlから派生したコントロール（ListBoxなど）のItemをItemsSourceにセットしたINotifyPoropertyChangedを実装したコレクションから生成する際に、コレクションが列挙するインスタンスの型によってDataTemplateを切り替える場合、WPFではDataTemplate.Datatypeがあるので重宝するのですが、Silverlightでは3 RTWでもサポートされていません。DataTemplateSelectorもサポートされていないので、インスタンスの型や状態によってDataTemplateを切り替えることはできないようです。とりあえず逃げ道として自分はDataContextにセットされたインスタンスをみてContentを書き換えるロジックを書いたUserControlを用意しているのですが、面倒ですね。XAMLで宣言的に書きたいのでDataTemplate.Datatypeは是非サポートしてもらいたいものです。</p>
<h3>TabcotrolのItemsSourceはTabItemのコレクションしか受け付けない</h3>
<p>なんでー！？これまたあんまりな仕様。WPFではItemsControlから派生したコントロールのItemsSourceにINotifyPoropertyChangedを実装したコレクションをセットすると、その列挙する内容をListBoxItemやTabItemなど適当なコンテナに包んで表示してくれるので、あとはDataTemplateで表示内容を好きなようにカスタマイズしてやればよかったのですが、SilverlightのTabControlのItemsSourceはTabItemのコレクションしか受けてつけてくれないという。。これでは<a href="http://msdn.microsoft.com/ja-jp/magazine/dd419663.aspx">TabItemに対応するViewModelのインスタンスをセットし、DataTemplateでViewを設定して表示内容をカスタマイズするというM-V-VMでよく知られたパターン</a>が使えません。SilverlightでもListBoxではListBoxItem以外も受け付けてくれたのですけどねぇ。。ではどうするか。自分の場合はViewModelのコレクションをラップしてTabItemのコレクションとして公開するラッパークラスとConverterを用意することで凌ぎました。</p>
<p>ラッパークラスはこんな感じです。ViewModelのコレクションとViewModelからTabItemへの変換を行うFuncをコンストラクタの引数として取ります。</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:e205b002-58ba-48fa-9380-15d6a59c54a1" class="wlWriterEditableSmartContent">
<pre name="code" class="c#">using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Collections.Specialized;
using System.Windows.Controls;

namespace SharpLab.CredentialsLockerSilverlight.ViewModels {
	public class ReadOnlyObservableTabItemCollection&lt;TViewModel, TViewModelCollection&gt; : ICollection&lt;TabItem&gt;, INotifyCollectionChanged where TViewModelCollection : ICollection&lt;TViewModel&gt;, INotifyCollectionChanged {

		private TViewModelCollection _viewModels;
		private ObservableCollection&lt;TabItem&gt; _tabItems;
		private Func&lt;TViewModel, TabItem&gt; _converter;

		public ReadOnlyObservableTabItemCollection(TViewModelCollection viewModels, Func&lt;TViewModel, TabItem&gt; converter) {
			_converter = converter;
			_viewModels = viewModels;
			_tabItems = new ObservableCollection&lt;TabItem&gt;();

			foreach (var item in _viewModels) {
				_tabItems.Add(_converter(item));
			}

			_viewModels.CollectionChanged += new NotifyCollectionChangedEventHandler(_viewModels_CollectionChanged);

			_tabItems.CollectionChanged += new NotifyCollectionChangedEventHandler(_tabItems_CollectionChanged);
		}

		void _viewModels_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e) {
			switch (e.Action) {
				case NotifyCollectionChangedAction.Add:
					_tabItems.Insert(e.NewStartingIndex, _converter((TViewModel)e.NewItems[0]));
					break;
				case NotifyCollectionChangedAction.Remove:
					_tabItems.RemoveAt(e.OldStartingIndex);
					break;
				case NotifyCollectionChangedAction.Replace:
					_tabItems.RemoveAt(e.OldStartingIndex);
					_tabItems.Insert(e.NewStartingIndex, _converter((TViewModel)e.NewItems[0]));
					break;
				case NotifyCollectionChangedAction.Reset:
					_tabItems.Clear();
					foreach (var item in _viewModels) {
						_tabItems.Add(_converter(item));
					}
					break;
			}
		}

		void _tabItems_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e) {
			if (CollectionChanged != null) {
				CollectionChanged(this, e);
			}
		}

		public event NotifyCollectionChangedEventHandler CollectionChanged;

		#region ICollection&lt;TabItem&gt; メンバ

		public void Add(TabItem item) {
			throw new NotSupportedException();
		}

		public void Clear() {
			throw new NotSupportedException();
		}

		public bool Contains(TabItem item) {
			throw new NotImplementedException();
		}

		public void CopyTo(TabItem[] array, int arrayIndex) {
			throw new NotSupportedException();
		}

		public int Count {
			get {
				throw new NotImplementedException();
			}
		}

		public bool IsReadOnly {
			get {
				return true;
			}
		}

		public bool Remove(TabItem item) {
			throw new NotSupportedException();
		}

		#endregion

		#region IEnumerable&lt;TabItem&gt; メンバ

		public IEnumerator&lt;TabItem&gt; GetEnumerator() {
			foreach (var item in _tabItems) {
				yield return item;
			}
		}

		#endregion

		#region IEnumerable メンバ

		System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() {
			return GetEnumerator();
		}

		#endregion
	}
}
</pre>
</div>
<p>これを以下のようなConverterから利用します。</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:1a134c19-118b-4526-9580-4b33d288c890" class="wlWriterEditableSmartContent">
<pre name="code" class="c#">using System;
using System.Collections.ObjectModel;
using System.Windows.Controls;
using System.Windows.Data;
using SharpLab.CredentialsLockerSilverlight.ViewModels;

namespace SharpLab.CredentialsLockerSilverlight.Views.Converter {
	public class CardVMCol2TabItemColConverter : IValueConverter{
		#region IValueConverter メンバ

		public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) {
			return new ReadOnlyObservableTabItemCollection&lt;CardViewModel, ObservableCollection&lt;CardViewModel&gt;&gt;((ObservableCollection&lt;CardViewModel&gt;)value,
				(each) =&gt; {
					var newTabItem = new TabItem() {
						DataContext = each,
						Header = new CardTabHeaderView(),
						Content = new SharpLab.CredentialsLockerSilverlight.Views.CardView()
					};
					return newTabItem;

				});
		}

		public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) {
			throw new NotImplementedException();
		}

		#endregion
	}
}
</pre>
</div>
<p>こうしてやることでTabControlのItemsSourceにViewModelのコレクションをバインドできるようになります。Converterは無理を通すのに便利な機能ですね。。</p>
</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:35c84690-fda2-43d6-98b5-f6090cbc317f" class="wlWriterEditableSmartContent">
<pre name="code" class="xml"> ItemsSource="{Binding Path=CardViewModels, Converter={StaticResource CardVMCol2TabItemColConverter}}"</pre>
</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.sharplab.net/blog/2009/07/18/%e6%82%b2%e3%81%97%e3%81%84%e3%81%91%e3%81%a9%e3%81%93%e3%82%8c%e3%80%81%e4%bb%95%e6%a7%98%e3%81%aa%e3%81%ae%e3%82%88%e3%81%ad%e3%80%82%e3%80%82%ef%bc%88silverlight%e3%81%ae%e6%84%9a%e7%97%b4%e3%82%a8/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Silverlight3 RTWリリースに関する変更</title>
		<link>http://blog.sharplab.net/blog/2009/07/13/silverlight3-rtw%e3%83%aa%e3%83%aa%e3%83%bc%e3%82%b9%e3%81%ab%e9%96%a2%e3%81%99%e3%82%8b%e5%a4%89%e6%9b%b4/</link>
		<comments>http://blog.sharplab.net/blog/2009/07/13/silverlight3-rtw%e3%83%aa%e3%83%aa%e3%83%bc%e3%82%b9%e3%81%ab%e9%96%a2%e3%81%99%e3%82%8b%e5%a4%89%e6%9b%b4/#comments</comments>
		<pubDate>Mon, 13 Jul 2009 13:33:44 +0000</pubDate>
		<dc:creator>shiroica</dc:creator>
				<category><![CDATA[Silverlight]]></category>
		<category><![CDATA[Attached Behavior]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[M-V-VM]]></category>

		<guid isPermaLink="false">http://blog.sharplab.net/computer/cprograming/silverlight/3181/</guid>
		<description><![CDATA[Silverlight 3のRTWがリリースされましたね。Silverlight Tools for Visual Studio 2008やExpression BlendのRCもリリースされています。version3から本気出すというMSの本領発揮とばかりに、結構便利になってきました。このエントリでは、自分が弄ってみて気づいたSilverlight 3 Betaからの変更点を書いてみたいと思います。 Silverlight 3 SDK Betaに含まれていたコントロールの一部がSilverlight Toolkitに移動 DataForm, DockPanel, WrapPanel, Expander, HeaderedContentControl, ViewboxがToolkitに移動したようです。それに伴って所属する名前空間が変わっているので注意が必要です。 Interactivity.dllの名前空間の変更 Expressionでは、3 MixPreviewからBehaviorというパターンがサポートされました。3 MixPreviewではプロジェクトでMicrosoft.Expression.Interactivity.dllというアセンブリを参照した上で、Behavior&#60;T&#62;クラスなどを継承して自分でBehaviorを作成するか、Microsoft Expression Community Galleryなどからダウンロードして使うという流れでした。今回リリースされたExpression 3RCでは、Microsoft.Expression.Interactivity.dllがSystem.Windows.Interactivity.dllと改名され、名前空間も変更されているので注意が必要です。この改名はBlend SDKの絡みでしょうか。また、BehaviorやTriggerActionの組み込み実装として、StoryBoardActionなどがMicrosoft.Expression.Interactions.dll内で提供されていますので、Microsoft Expression Community Galleryと共に活用していくよいでしょう。 DataGridのItemsSourceへのBindingが上手くいかない問題が修正 Silverlight 3 Betaの頃はDataGridのItemsSourceへのBindingが上手く動かないという問題がありました（DataGrid &#8212; binding to ItemsSource is broken : The Official Microsoft Silverlight Site）。今は修正されています。（これはむしろSilverlight Toolkitの話？） Silverlight Tools for VS2008のSilverlightデザイナ削除 Silverlight [...]]]></description>
			<content:encoded><![CDATA[<p>Silverlight 3のRTWがリリースされましたね。Silverlight Tools for Visual Studio 2008やExpression BlendのRCもリリースされています。version3から本気出すというMSの本領発揮とばかりに、結構便利になってきました。このエントリでは、自分が弄ってみて気づいたSilverlight 3 Betaからの変更点を書いてみたいと思います。</p>
<h3>Silverlight 3 SDK Betaに含まれていたコントロールの一部がSilverlight Toolkitに移動</h3>
<p>DataForm, DockPanel, WrapPanel, Expander, HeaderedContentControl, ViewboxがToolkitに移動したようです。それに伴って所属する名前空間が変わっているので注意が必要です。</p>
<h3>Interactivity.dllの名前空間の変更</h3>
<p>Expressionでは、3 MixPreviewからBehaviorというパターンがサポートされました。3 MixPreviewではプロジェクトでMicrosoft.Expression.Interactivity.dllというアセンブリを参照した上で、Behavior&lt;T&gt;クラスなどを継承して自分でBehaviorを作成するか、<a href="http://gallery.expression.microsoft.com/en-us/site/search?f[0].Type=Tag&amp;f[0].Value=Behavior">Microsoft Expression Community Gallery</a>などからダウンロードして使うという流れでした。今回リリースされたExpression 3RCでは、Microsoft.Expression.Interactivity.dllがSystem.Windows.Interactivity.dllと改名され、名前空間も変更されているので注意が必要です。この改名は<a href="http://shinichiaoyagi.blog25.fc2.com/blog-entry-186.html">Blend SDK</a>の絡みでしょうか。また、BehaviorやTriggerActionの組み込み実装として、StoryBoardActionなどがMicrosoft.Expression.Interactions.dll内で提供されていますので、<a href="http://gallery.expression.microsoft.com/en-us/site/search?f[0].Type=Tag&amp;f[0].Value=Behavior">Microsoft Expression Community Gallery</a>と共に活用していくよいでしょう。</p>
<h3>DataGridのItemsSourceへのBindingが上手くいかない問題が修正</h3>
<p>Silverlight 3 Betaの頃はDataGridのItemsSourceへのBindingが上手く動かないという問題がありました（<a href="http://silverlight.net/forums/t/85303.aspx">DataGrid &#8212; binding to ItemsSource is broken : The Official Microsoft Silverlight Site</a>）。今は修正されています。（これはむしろSilverlight Toolkitの話？）</p>
<h3>Silverlight Tools for VS2008のSilverlightデザイナ削除</h3>
<p>Silverlight 3 Tools for VS2008ではSilverlightデザイナが削除されています。まぁプレビューが上手く出来ない場合も多かったので、VS2010に期待ですね。今のうちにBlend 3に習熟しておきたいものです。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.sharplab.net/blog/2009/07/13/silverlight3-rtw%e3%83%aa%e3%83%aa%e3%83%bc%e3%82%b9%e3%81%ab%e9%96%a2%e3%81%99%e3%82%8b%e5%a4%89%e6%9b%b4/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>CardSafe/E公開！</title>
		<link>http://blog.sharplab.net/blog/2009/07/11/cardsafee%e5%85%ac%e9%96%8b%ef%bc%81/</link>
		<comments>http://blog.sharplab.net/blog/2009/07/11/cardsafee%e5%85%ac%e9%96%8b%ef%bc%81/#comments</comments>
		<pubDate>Sat, 11 Jul 2009 13:49:49 +0000</pubDate>
		<dc:creator>shiroica</dc:creator>
				<category><![CDATA[Live Framework]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[CardSafe/E]]></category>
		<category><![CDATA[Live Mesh]]></category>
		<category><![CDATA[Silverlight]]></category>

		<guid isPermaLink="false">http://blog.sharplab.net/computer/cprograming/live-framework/3179/</guid>
		<description><![CDATA[&#160; ここ一か月ほど、週末やらに暇を見つけては作っていたアプリケーションが完成しました。CardSafe/Eというタイトルで、いわゆるパスワードマネージャなのですが、特長としてはMesh enabled webアプリケーションとして実装していることが挙げられます。Mesh enabled webアプリケーションとは、Microsoftが開発中のLive Frameworkを利用したアプリケーションの一形態です。Mesh enabled webアプリケーションは、Live Meshという、MicrosoftによるDropBox的なデータ同期サービス上に配置され、複数デバイス・サーバー間でのアプリケーションとそのデータの同期が自動的に行われるという特長があり、開発に用いる技術がAjaxやSilverlightであることから、デスクトップアプリケーションとして動かすだけでなく、Webブラウザ上の通常のWebアプリケーションとしても動かすことが出来ます。CardSafe/Eはこれを利用し、データ同期機能を持ったパスワードマネージャを実現しています。 利用方法 残念なことに、このLive Frameworkという技術はまだCTP版という扱いであり、通常のLive Mesh Beta版ではMesh enabled webアプリケーションであるCardSafe/Eは利用できません。CardSafe/Eを利用するには、https://developer.mesh-ctp.com/という開発者用のLive Meshを利用する必要があります。開発者用Live Meshは、テスト用ということもあり、Mesh enabled webアプリが使えるほかは、Live Mesh Beta版に比べて機能がかなり省かれており、CardSafe/E共々常用には向かないかと思います。それでもLive Frameworkを触ってみたいという場合は、 Microsoft ConnectのAzure Services Invitation ProgramからLive ServicesのInvitation Codeを取得 そのInvitation Codeを利用してAzure Services Developer Portalに登録 開発者用Live Meshにサインイン 開発者用Live MeshのDeviceタブからLive Framework Clientをインストール MeshにCardSafe/Eをインストール←このURLを踏んでMeshにCardSafe/Eをインストール という手順になります。開発者用Live Meshへの登録手順などは、使ってみよう！ Live Framework：第3回 はじめようLive Framework CTP｜gihyo.jp … 技術評論社という記事が非常に分かりやすいので是非参照して進めてください。 new CloudApp() ところで。このアプリケーションはnew [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.sharplab.net/cardsafeeverywhere/"><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="CardSafeEverywhere" border="0" alt="CardSafeEverywhere" src="http://blog.sharplab.net/wp-content/uploads/2009/07/CardSafeEverywhere2.png" width="610" height="317" /></a>&#160;
<p>ここ一か月ほど、週末やらに暇を見つけては作っていたアプリケーションが完成しました。<a href="http://blog.sharplab.net/cardsafeeverywhere/">CardSafe/E</a>というタイトルで、いわゆるパスワードマネージャなのですが、特長としてはMesh enabled webアプリケーションとして実装していることが挙げられます。Mesh enabled webアプリケーションとは、Microsoftが開発中のLive Frameworkを利用したアプリケーションの一形態です。Mesh enabled webアプリケーションは、Live Meshという、MicrosoftによるDropBox的なデータ同期サービス上に配置され、複数デバイス・サーバー間でのアプリケーションとそのデータの同期が自動的に行われるという特長があり、開発に用いる技術がAjaxやSilverlightであることから、デスクトップアプリケーションとして動かすだけでなく、Webブラウザ上の通常のWebアプリケーションとしても動かすことが出来ます。CardSafe/Eはこれを利用し、データ同期機能を持ったパスワードマネージャを実現しています。</p>
<h3>利用方法</h3>
<p>残念なことに、このLive Frameworkという技術はまだCTP版という扱いであり、通常のLive Mesh Beta版ではMesh enabled webアプリケーションであるCardSafe/Eは利用できません。CardSafe/Eを利用するには、<a href="https://developer.mesh-ctp.com/">https://developer.mesh-ctp.com/</a>という開発者用のLive Meshを利用する必要があります。開発者用Live Meshは、テスト用ということもあり、Mesh enabled webアプリが使えるほかは、Live Mesh Beta版に比べて機能がかなり省かれており、CardSafe/E共々常用には向かないかと思います。それでもLive Frameworkを触ってみたいという場合は、</p>
<ol>
<li>Microsoft Connectの<a href="http://go.microsoft.com/fwlink/?LinkID=130226">Azure Services Invitation Program</a>からLive ServicesのInvitation Codeを取得 </li>
<li>そのInvitation Codeを利用してAzure Services Developer Portalに登録 </li>
<li><a href="https://developer.mesh-ctp.com/">開発者用Live Mesh</a>にサインイン </li>
<li><a href="https://developer.mesh-ctp.com/Web/Devices.aspx">開発者用Live MeshのDeviceタブ</a>からLive Framework Clientをインストール </li>
<li><a href="https://developer.mesh-ctp.com/Web/Apps/AppConsent.aspx?AppUrl=Mesh%2fApplications%2fWJMUWBWCWAUUFAZ7F7CLQJHYJ4">MeshにCardSafe/Eをインストール</a>←このURLを踏んでMeshにCardSafe/Eをインストール </li>
</ol>
<p>という手順になります。開発者用Live Meshへの登録手順などは、<a href="http://gihyo.jp/dev/serial/01/live-fw/0003?page=2">使ってみよう！ Live Framework：第3回 はじめようLive Framework CTP｜gihyo.jp … 技術評論社</a>という記事が非常に分かりやすいので是非参照して進めてください。</p>
<h3>new CloudApp()</h3>
<p>ところで。このアプリケーションは<a href="http://msdn.microsoft.com/ja-jp/azure/dd939048.aspx">new CloudApp()</a>というMicrosoftのコンテストに出しています。気に入って頂けた場合は、<a href="http://www.newcloudapp.com/vote.aspx">new CloudApp(): The Azure™ Services Platform Developer Challenge &#8211; Vote</a>という投票ページでCardSafe/Eにご投票頂けると励みになります。CardSafe/Eに清き一票を！（ぇ</p>
<h3>CardSafe/Eの公開ページ</h3>
<p><a href="http://blog.sharplab.net/cardsafeeverywhere/">CardSafe/E &#8211; SharpLab.</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.sharplab.net/blog/2009/07/11/cardsafee%e5%85%ac%e9%96%8b%ef%bc%81/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>C# .NETアプリケーション開発 徹底攻略 Listing2.26への疑問</title>
		<link>http://blog.sharplab.net/blog/2009/06/02/c-net%e3%82%a2%e3%83%97%e3%83%aa%e3%82%b1%e3%83%bc%e3%82%b7%e3%83%a7%e3%83%b3%e9%96%8b%e7%99%ba-%e5%be%b9%e5%ba%95%e6%94%bb%e7%95%a5-listing226%e3%81%b8%e3%81%ae%e7%96%91%e5%95%8f/</link>
		<comments>http://blog.sharplab.net/blog/2009/06/02/c-net%e3%82%a2%e3%83%97%e3%83%aa%e3%82%b1%e3%83%bc%e3%82%b7%e3%83%a7%e3%83%b3%e9%96%8b%e7%99%ba-%e5%be%b9%e5%ba%95%e6%94%bb%e7%95%a5-listing226%e3%81%b8%e3%81%ae%e7%96%91%e5%95%8f/#comments</comments>
		<pubDate>Tue, 02 Jun 2009 14:39:32 +0000</pubDate>
		<dc:creator>shiroica</dc:creator>
				<category><![CDATA[C#Programing]]></category>
		<category><![CDATA[Book]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Multi Thread]]></category>

		<guid isPermaLink="false">http://blog.sharplab.net/computer/cprograming/3149/</guid>
		<description><![CDATA[追補エントリを書きました。こちらもあわせてご参照ください： UnhandledExceptionイベントは、サブスレッドの例外も捕捉可能 &#8211; SharpLab. &#160; 先日C# .NETアプリケーション開発 徹底攻略という本を購入しました。C#での業務アプリケーション開発におけるノウハウをまとめた本で、プロファイリングの方法など、普段、趣味グラマをしていると考えない部分について色々と触れているので大変参考になる本なのですが、一点、マルチスレッド処理における例外処理についての記述でおかしなところがありました。 2章6節4項の、サブスレッドで発生した例外の捕捉の仕方についての部分です。まず、93~95ページで、集約例外ハンドラではサブスレッドで発生した例外が捕捉出来ない、という部分があります。このようなコードです。 Program.cs using System; using System.Collections.Generic; using System.Linq; using System.Windows.Forms; using System.Threading; namespace ThreadExceptionBehavior { static class Program { /// &#60;summary&#62; /// アプリケーションのメイン エントリ ポイントです。 /// &#60;/summary&#62; [STAThread] static void Main() { Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException); Thread.GetDomain().UnhandledException += new UnhandledExceptionEventHandler(Program_UnhandledException); Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Form1()); } static void [...]]]></description>
			<content:encoded><![CDATA[<p><strong>追補エントリを書きました。こちらもあわせてご参照ください：     <br /></strong><a href="http://blog.sharplab.net/computer/cprograming/3253/"><strong>UnhandledExceptionイベントは、サブスレッドの例外も捕捉可能 &#8211; SharpLab.</strong></a></p>
<p>&#160;</p>
<p>先日<a href="http://www.amazon.co.jp/NET%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E9%96%8B%E7%99%BA-%E5%BE%B9%E5%BA%95%E6%94%BB%E7%95%A5-NET-Framework-3-5%E5%AF%BE%E5%BF%9C/dp/4839930422">C# .NETアプリケーション開発 徹底攻略</a>という本を購入しました。C#での業務アプリケーション開発におけるノウハウをまとめた本で、プロファイリングの方法など、普段、趣味グラマをしていると考えない部分について色々と触れているので大変参考になる本なのですが、一点、マルチスレッド処理における例外処理についての記述でおかしなところがありました。</p>
<p>2章6節4項の、サブスレッドで発生した例外の捕捉の仕方についての部分です。まず、93~95ページで、集約例外ハンドラではサブスレッドで発生した例外が捕捉出来ない、という部分があります。このようなコードです。</p>
<p>Program.cs</p>
</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:81b00071-4932-4930-b709-88549b1ad295" class="wlWriterEditableSmartContent">
<pre name="code" class="c#">using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
using System.Threading;

namespace ThreadExceptionBehavior {
	static class Program {
		/// &lt;summary&gt;
		/// アプリケーションのメイン エントリ ポイントです。
		/// &lt;/summary&gt;
		[STAThread]
		static void Main() {

			Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);
			Thread.GetDomain().UnhandledException += new UnhandledExceptionEventHandler(Program_UnhandledException);

			Application.EnableVisualStyles();
			Application.SetCompatibleTextRenderingDefault(false);
			Application.Run(new Form1());
		}

		static void Program_UnhandledException(object sender, UnhandledExceptionEventArgs e) {
			Exception ex = e.ExceptionObject as Exception;
			MessageBox.Show(ex.Message);
		}

		static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e) {
			MessageBox.Show(e.Exception.Message);
		}
	}
}
</pre>
</div>
<p>Form1.cs</p>
</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:b0fdf375-b7f8-41dc-afe9-9a1386281615" class="wlWriterEditableSmartContent">
<pre name="code" class="c#">using System;
using System.Windows.Forms;

namespace ThreadExceptionBehavior {
	public partial class Form1 : Form {
		public Form1() {
			InitializeComponent();
		}

		private delegate void SampleDelegate();

		private void button1_Click(object sender, EventArgs e) {
			//非同期スレッドの実行
			SampleDelegate a = new SampleDelegate(ThreadMethod);
			a.BeginInvoke(null, null);
		}

		private void ThreadMethod() {
			//意図的に起こした例外
			throw new Exception("非同期スレッドで起こった例外です。");
		}
	}
}
</pre>
</div>
<p>ここは良いのです。</p>
<p>そして続いての96~97ページで例外をメインスレッドへの通知して捕捉出来るように書き換える方法が書かれているのですが、このようになっています。</p>
<p>Form1.cs</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:c38975da-5b8f-44f0-88ec-f578c178a366" class="wlWriterEditableSmartContent">
<pre name="code" class="c#">using System;
using System.Windows.Forms;

namespace ThreadExceptionBehavior {
	public partial class Form1 : Form {
		public Form1() {
			InitializeComponent();
		}

		private delegate void SampleDelegate();

		private void button1_Click(object sender, EventArgs e) {
			//非同期スレッドの実行
			SampleDelegate a = new SampleDelegate(ThreadMethod);
			a.BeginInvoke(null, null);
		}

		private void ThreadMethod() {
			if (this.InvokeRequired) {
				//メインスレッドに呼び戻して実行
				this.BeginInvoke(new SampleDelegate(ThreadMethod));
				return;
			}
			throw new Exception("非同期スレッドで起こった例外です。");
		}
	}
}
</pre>
</div>
<p>19~23行目が加わった部分です。FormのInvokeRequiredプロパティがtrueの場合、つまりメインスレッド（UIスレッド）で実行されていない場合は、非同期にUIスレッドで実行しなおすようになっているのですが、これではサブスレッドでの例外処理の仕方の説明になっていません。ボタンをクリックした後直ぐに処理が帰ってくるという意味では非同期ではありますが、結局UIスレッド上で、ThreadMethodメソッドは動いているわけで、ThreadMethodメソッドに重たい処理を書いた場合は、UIがブロックされてしまうので無意味です。</p>
<p>本来ならば、以下のように書くべきではないでしょうか？</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:35779a26-def3-4a51-877f-53cae740e5ca" class="wlWriterEditableSmartContent">
<pre name="code" class="c#">using System;
using System.Windows.Forms;

namespace ThreadExceptionBehavior {
	public partial class Form1 : Form {
		public Form1() {
			InitializeComponent();
		}

		private delegate void SampleDelegate();

		private void button1_Click(object sender, EventArgs e) {
			//非同期スレッドの実行
			SampleDelegate a = new SampleDelegate(ThreadMethod);
			a.BeginInvoke(null, null);
		}

		private void ThreadMethod() {
			try {

				//何らかの重たい処理

				throw new Exception("非同期スレッドで起こった例外です。");
			}
			catch(Exception e){
				this.BeginInvoke((MethodInvoker)delegate() {
					throw new ApplicationException("サブスレッドで例外が発生しました。", e);
				});
			}
		}
	}
}
</pre>
</div>
<p>これならば重たい処理によってUIがブロックされることもなく、またサブスレッドで発生した例外も例外集約ハンドラで集めることが可能です。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.sharplab.net/blog/2009/06/02/c-net%e3%82%a2%e3%83%97%e3%83%aa%e3%82%b1%e3%83%bc%e3%82%b7%e3%83%a7%e3%83%b3%e9%96%8b%e7%99%ba-%e5%be%b9%e5%ba%95%e6%94%bb%e7%95%a5-listing226%e3%81%b8%e3%81%ae%e7%96%91%e5%95%8f/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Windows API Code Pack for Microsoft .NET Framework (v0.85)さわってみた。</title>
		<link>http://blog.sharplab.net/blog/2009/05/22/windows-api-code-pack-for-microsoft-net-framework-v085%e3%81%95%e3%82%8f%e3%81%a3%e3%81%a6%e3%81%bf%e3%81%9f%e3%80%82/</link>
		<comments>http://blog.sharplab.net/blog/2009/05/22/windows-api-code-pack-for-microsoft-net-framework-v085%e3%81%95%e3%82%8f%e3%81%a3%e3%81%a6%e3%81%bf%e3%81%9f%e3%80%82/#comments</comments>
		<pubDate>Fri, 22 May 2009 00:56:27 +0000</pubDate>
		<dc:creator>shiroica</dc:creator>
				<category><![CDATA[C#Programing]]></category>
		<category><![CDATA[Shell]]></category>
		<category><![CDATA[Windows 7]]></category>
		<category><![CDATA[Windows API Code Pack for Microsoft .NET Framework]]></category>

		<guid isPermaLink="false">http://blog.sharplab.net/computer/cprograming/3148/</guid>
		<description><![CDATA[中身は Windows 7 ライブラリを含む Windows Shell 名前空間オブジェクト、既知のフォルダーと非ファイルシステム コンテナ Windows Vista と Windows 7 のタスクダイアログ WPF と Windows Forms での Windows 7 Explorer Browser Control のサポート シェル プロパティ システムのサポート Windows 7 タスクバー ジャンプリスト、アイコン オーバーレイ、プログレスバー用のヘルパー Windows Vista と Windows 7 コモン ファイル ダイアログのサポート（カスタム ファイル ダイアログを含む） Direct3D 11.0とDXGI 1.0/1.1 APIのサポート センサー プラットフォーム API 拡張言語サービス API 川西 裕幸のブログ : [...]]]></description>
			<content:encoded><![CDATA[<p>中身は</p>
<blockquote style="margin-right: 0px" dir="ltr"><ul>
<li>Windows 7 ライブラリを含む Windows Shell 名前空間オブジェクト、既知のフォルダーと非ファイルシステム コンテナ </li>
<li>Windows Vista と Windows 7 のタスクダイアログ </li>
<li>WPF と Windows Forms での Windows 7 Explorer Browser Control のサポート </li>
<li>シェル プロパティ システムのサポート </li>
<li>Windows 7 タスクバー ジャンプリスト、アイコン オーバーレイ、プログレスバー用のヘルパー </li>
<li>Windows Vista と Windows 7 コモン ファイル ダイアログのサポート（カスタム ファイル ダイアログを含む） </li>
<li>Direct3D 11.0とDXGI 1.0/1.1 APIのサポート </li>
<li>センサー プラットフォーム API </li>
<li>拡張言語サービス API </li>
</ul>
<p><a href="http://blogs.msdn.com/hiroyuk/archive/2009/05/08/9595475.aspx">川西 裕幸のブログ : Windows API Code Pack for Microsoft .NET Framework (v0.85)</a></p>
</blockquote>
<p>だそうです。以下では同梱のサンプル（DirectX以外）を動かしてみた際のメモ。</p>
<h3>Explorer Browser Control</h3>
<p><a rel="lightbox" href="http://blog.sharplab.net/wp-content/uploads/2009/05/image11.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://blog.sharplab.net/wp-content/uploads/2009/05/image-thumb11.png" width="244" height="182" /></a> <a rel="lightbox" href="http://blog.sharplab.net/wp-content/uploads/2009/05/image12.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://blog.sharplab.net/wp-content/uploads/2009/05/image-thumb12.png" width="244" height="183" /></a> </p>
<p>Explorerのコントロール。使い場所は色々ありそうですね。左がWPF版、右がWin Forms版。もちろんWPF版の主要なプロパティは依存関係プロパティになっていまして、Thumbnail Sizeというスライダーを動かせば、バインドされたサムネイルの大きさがスルスルと変わっていきました。良いですね。</p>
<h3>Shell</h3>
<h4>KnownFoldersBrowser</h4>
<p><a rel="lightbox" href="http://blog.sharplab.net/wp-content/uploads/2009/05/image13.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://blog.sharplab.net/wp-content/uploads/2009/05/image-thumb13.png" width="244" height="184" /></a></p>
<p>既知のフォルダ？（<a href="http://msdn.microsoft.com/en-us/library/bb776911(VS.85).aspx">knownFolders</a>）の一覧を表示するデモ。一覧はMicrosoft.WindowsAPICodePack.Shell.KnownFoldersクラスで取得しています。knownFoldersはVistaで導入されたものらしい。また、standard foldersとは異なり、ベンダが追加（削除）することができるらしい。knownFoldersについて詳しくは<a href="http://msdn.microsoft.com/en-us/library/bb776911(VS.85).aspx">MSDNのknownFoldersについてのページ</a>を参照のこと。</p>
<h4>PropertyEdit</h4>
<p><a rel="lightbox" href="http://blog.sharplab.net/wp-content/uploads/2009/05/image14.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://blog.sharplab.net/wp-content/uploads/2009/05/image-thumb14.png" width="244" height="178" /></a></p>
<p>ファイルのプロパティを操作するデモ</p>
<h4>ShellHierarchyTreeDemo</h4>
<p><a rel="lightbox" href="http://blog.sharplab.net/wp-content/uploads/2009/05/image15.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://blog.sharplab.net/wp-content/uploads/2009/05/image-thumb15.png" width="244" height="142" /></a>&#160;</p>
<p>階層ツリーのデモ</p>
<h4>ShellObjectCFDBrowser</h4>
<p><a rel="lightbox" href="http://blog.sharplab.net/wp-content/uploads/2009/05/image16.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://blog.sharplab.net/wp-content/uploads/2009/05/image-thumb16.png" width="244" height="158" /></a> <a rel="lightbox" href="http://blog.sharplab.net/wp-content/uploads/2009/05/image17.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://blog.sharplab.net/wp-content/uploads/2009/05/image-thumb17.png" width="244" height="184" /></a></p>
<p>CommonFileDialogのデモ。表示する場所の初期値として設定できるのはフォルダだけではないのが特徴。<a href="http://msdn.microsoft.com/ja-jp/windows/dd459213.aspx#14">Windows 7で追加された「ライブラリ」</a>を初期値として設定出来たり、検索条件を初期値として指定して開くことが出来ます。これはちょっと感動ものでした。二枚目のSSは検索条件として「最近使ったファイル」という条件を付加して開いたCommonFileDialog。</p>
<h4>StarBackUp</h4>
<p><a rel="lightbox" href="http://blog.sharplab.net/wp-content/uploads/2009/06/image27.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://blog.sharplab.net/wp-content/uploads/2009/06/image27_thumb.png" width="404" height="186" /></a> </p>
<p>いまいちよくわからない。フォルダ選択ダイアログのサンプル？</p>
<h4>StockIconsDemo</h4>
<p>システムのアイコンを取得するのに使えるMicrosoft.WindowsAPICodePack.StockIconsクラスのデモ</p>
<p><a rel="lightbox" href="http://blog.sharplab.net/wp-content/uploads/2009/05/image19.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://blog.sharplab.net/wp-content/uploads/2009/05/image-thumb19.png" width="244" height="223" /></a> </p>
<h4>TaskBarDemo</h4>
<p><a rel="lightbox" href="http://blog.sharplab.net/wp-content/uploads/2009/05/image20.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://blog.sharplab.net/wp-content/uploads/2009/05/image-thumb20.png" width="205" height="284" /></a><a rel="lightbox" href="http://blog.sharplab.net/wp-content/uploads/2009/05/image21.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://blog.sharplab.net/wp-content/uploads/2009/05/image-thumb21.png" width="146" height="150" /></a>&#160; <a rel="lightbox" href="http://blog.sharplab.net/wp-content/uploads/2009/05/image22.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://blog.sharplab.net/wp-content/uploads/2009/05/image-thumb22.png" width="244" height="222" /></a> </p>
<p>Windows7でのタスクバーでの通知を活用するためのデモ。タスクバー上でのプログレス表示や、ジャンプリストの作成のデモなど。</p>
<h4>ThumbnailBrowserDemo</h4>
<p><a rel="lightbox" href="http://blog.sharplab.net/wp-content/uploads/2009/05/image23.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://blog.sharplab.net/wp-content/uploads/2009/05/image-thumb23.png" width="244" height="161" /></a></p>
<p>選択された要素のサムネイルをMicrosoft.WindowsAPICodePack.Shell.ShellObjectクラスのThumbnailプロパティから取得してPictureBoxに描画するサンプル。</p>
<h3>センサー プラットフォーム API</h3>
<p>サンプル動かそうとしたら落ちた。まぁ対応するセンサデバイスがないわけだから当然ですね。 </p>
</p>
</p>
</p>
</p>
</p>
</p>
</p>
<h3>拡張言語サービス API</h3>
<blockquote><h5>多言語ユーザー インターフェイスのサポートと言語サービス</h5>
<p>Windows 7 は、多言語ユーザー インターフェイスのサポートを強化し、アプリケーションから言語サービスを利用できるようにすることで、開発者がスタンダードな手法で国際市場に向けたアプリケーションを作成できるようになっています。</p>
<p>Extended Linguistic Services は、小規模の同じAPI 群を使用して、さまざまな先進の言語機能を有効活用できる、Windows 7 の新機能です。開発者は Extended Linguistic Services の API を使用することにより、任意の Unicode テキストから言語を自動検出し、その情報を元にして適切な言語が選択されるような、世界中のユーザーが快適に利用できるしくみを構築できます。 Extended Linguistic Services には、テキストの書記体系を変換する、組み込みの表記変換機能もサポートされています。たとえば、簡体字中国語と繁体字中国語間でテキストを自動的に変換すれば、言語の境界を越えた相互コミュニケーションを促進することが可能です。 Extended Linguistic Services の API を使用することにより、開発者は、既存の Extended Linguistic Services に加え、将来、新しいサービスが公開されたときには、新たにコードを覚え直すことなく、必要なサービスを選ぶだけで済むようになります。</p>
<p><a href="http://msdn.microsoft.com/ja-jp/windows/dd459213.aspx">Windows 7 開発者ガイド</a></p>
</blockquote>
<p>この機能を利用するためのものみたい。あんまり弄れてないです。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.sharplab.net/blog/2009/05/22/windows-api-code-pack-for-microsoft-net-framework-v085%e3%81%95%e3%82%8f%e3%81%a3%e3%81%a6%e3%81%bf%e3%81%9f%e3%80%82/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>VS2010でのスマートデバイス開発</title>
		<link>http://blog.sharplab.net/blog/2009/05/21/visual-studio%e3%81%a7%e3%81%ae%e3%82%b9%e3%83%9e%e3%83%bc%e3%83%88%e3%83%87%e3%83%90%e3%82%a4%e3%82%b9%e9%96%8b%e7%99%ba/</link>
		<comments>http://blog.sharplab.net/blog/2009/05/21/visual-studio%e3%81%a7%e3%81%ae%e3%82%b9%e3%83%9e%e3%83%bc%e3%83%88%e3%83%87%e3%83%90%e3%82%a4%e3%82%b9%e9%96%8b%e7%99%ba/#comments</comments>
		<pubDate>Thu, 21 May 2009 04:47:16 +0000</pubDate>
		<dc:creator>shiroica</dc:creator>
				<category><![CDATA[C#Programing]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Visual Studio]]></category>
		<category><![CDATA[WindowsMobile]]></category>

		<guid isPermaLink="false">http://blog.sharplab.net/computer/cprograming/3118/</guid>
		<description><![CDATA[Templateのツリーにスマートデバイスがないのですが、はて、これはどういうことだろう…？]]></description>
			<content:encoded><![CDATA[<p><a rel="lightbox" href="http://blog.sharplab.net/wp-content/uploads/2009/05/image10.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; margin-left: 0px; border-top: 0px; margin-right: 0px; border-right: 0px" title="image" border="0" alt="image" align="right" src="http://blog.sharplab.net/wp-content/uploads/2009/05/image-thumb10.png" width="404" height="259" /></a> </p>
<p>Templateのツリーにスマートデバイスがないのですが、はて、これはどういうことだろう…？</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.sharplab.net/blog/2009/05/21/visual-studio%e3%81%a7%e3%81%ae%e3%82%b9%e3%83%9e%e3%83%bc%e3%83%88%e3%83%87%e3%83%90%e3%82%a4%e3%82%b9%e9%96%8b%e7%99%ba/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Visual Studio 2010のアドインサポート</title>
		<link>http://blog.sharplab.net/blog/2009/05/21/visual-studio-2010%e3%81%ae%e3%82%a2%e3%83%89%e3%82%a4%e3%83%b3%e3%82%b5%e3%83%9d%e3%83%bc%e3%83%88/</link>
		<comments>http://blog.sharplab.net/blog/2009/05/21/visual-studio-2010%e3%81%ae%e3%82%a2%e3%83%89%e3%82%a4%e3%83%b3%e3%82%b5%e3%83%9d%e3%83%bc%e3%83%88/#comments</comments>
		<pubDate>Thu, 21 May 2009 04:28:26 +0000</pubDate>
		<dc:creator>shiroica</dc:creator>
				<category><![CDATA[C#Programing]]></category>
		<category><![CDATA[VisualStudioExtention]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[iKnow]]></category>
		<category><![CDATA[iKnowItemBankPanel]]></category>
		<category><![CDATA[Visual Studio]]></category>

		<guid isPermaLink="false">http://blog.sharplab.net/computer/cprograming/3112/</guid>
		<description><![CDATA[Visual Studioのアドインは、Managed Extension Frameworkベースになるという話なので、VS2008以前のアドインはどうなるのかと気になっていたのですが、一応サポートされているようです。自作のアドインの構成ファイルをVS2010用に書き換えて試してみたところ、 確かに読み込まれるのが確認できました（まぁiKnowの仕様変更によって今は検索は動作しなくなってしまっているのですけれども）。一応いい感じに読み込まれているように見えるのですけれども、ツールバー周りが多少違和感のあるようになってしまっていますね。まぁそのうち直したものを作れればと思います。]]></description>
			<content:encoded><![CDATA[<p><a rel="lightbox" href="http://blog.sharplab.net/wp-content/uploads/2009/05/image9.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; margin-left: 0px; border-top: 0px; margin-right: 0px; border-right: 0px" title="image" border="0" alt="image" align="right" src="http://blog.sharplab.net/wp-content/uploads/2009/05/image-thumb9.png" width="244" height="240" /></a> Visual Studioのアドインは、Managed Extension Frameworkベースになるという話なので、VS2008以前のアドインはどうなるのかと気になっていたのですが、一応サポートされているようです。自作のアドインの構成ファイルをVS2010用に書き換えて試してみたところ、 確かに読み込まれるのが確認できました（まぁiKnowの仕様変更によって今は検索は動作しなくなってしまっているのですけれども）。一応いい感じに読み込まれているように見えるのですけれども、ツールバー周りが多少違和感のあるようになってしまっていますね。まぁそのうち直したものを作れればと思います。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.sharplab.net/blog/2009/05/21/visual-studio-2010%e3%81%ae%e3%82%a2%e3%83%89%e3%82%a4%e3%83%b3%e3%82%b5%e3%83%9d%e3%83%bc%e3%83%88/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Visual Studio 2010 Beta1</title>
		<link>http://blog.sharplab.net/blog/2009/05/21/visual-studio-2010-beta1/</link>
		<comments>http://blog.sharplab.net/blog/2009/05/21/visual-studio-2010-beta1/#comments</comments>
		<pubDate>Thu, 21 May 2009 03:58:22 +0000</pubDate>
		<dc:creator>shiroica</dc:creator>
				<category><![CDATA[C#Programing]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Visual Studio]]></category>

		<guid isPermaLink="false">http://blog.sharplab.net/computer/cprograming/3109/</guid>
		<description><![CDATA[きましたね、Visual Studio 2010 Beta1。乗るしかないでしょう！このビックウェーブに！ということで、一応インストールしてみました。まだよくわかっちゃいないのですが、やはりWPFベースで再構築されたというUIが目を引きます。これからぼちぼち弄っていければと思います。]]></description>
			<content:encoded><![CDATA[<p><a rel="lightbox" href="http://blog.sharplab.net/wp-content/uploads/2009/05/image7.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://blog.sharplab.net/wp-content/uploads/2009/05/image-thumb7.png" width="614" height="385" /></a> </p>
<p>きましたね、Visual Studio 2010 Beta1。乗るしかないでしょう！このビックウェーブに！ということで、一応インストールしてみました。まだよくわかっちゃいないのですが、やはりWPFベースで再構築されたというUIが目を引きます。これからぼちぼち弄っていければと思います。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.sharplab.net/blog/2009/05/21/visual-studio-2010-beta1/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Southridge Hands-on-Labが公開されています</title>
		<link>http://blog.sharplab.net/blog/2009/05/03/southridge-hands-on-lab/</link>
		<comments>http://blog.sharplab.net/blog/2009/05/03/southridge-hands-on-lab/#comments</comments>
		<pubDate>Sun, 03 May 2009 03:26:56 +0000</pubDate>
		<dc:creator>shiroica</dc:creator>
				<category><![CDATA[WPF]]></category>
		<category><![CDATA[M-V-VM]]></category>
		<category><![CDATA[Ribbon]]></category>
		<category><![CDATA[WPF Model-View-ViewModel Toolkit]]></category>

		<guid isPermaLink="false">http://blog.sharplab.net/computer/cprograming/wpf/3089/</guid>
		<description><![CDATA[WPF Futuresには、WPF Model-View-ViewModel Toolkitの他にも色々な参考になるサンプルが含まれています。Southridge Hands-on-LabはWPF Ribbon ControlとDataGridを使ったリッチなアプリケーション開発のチュートリアルとなっており、PDCのセッションでも出てきていたものがチュートリアルの形式としてまとめられた物のようですね。結構大きなアプリケーションですが、手取り足取り細かく解説してくれるので、参考になるところが多いのではないでしょうか。 ただ、M-V-VMパターンには則っていないところがあり、ViewModelに書くべきロジックをViewのコードビハインドに書いていたりするのでM-V-VMパターンのサンプルとするには注意が必要です。WPF Ribbon Controlのメニュー等は、CommandとしてExecuteメソッドやCanExecuteメソッド以外にも、LabelTitleプロパティなどを持ったオブジェクトを必要とするため、View側でCommandとしてセットするオブジェクトを用意する必要があります。その制約に引きずられてViewのコードビハインドにCommandの処理ロジックを記述しているようです。 では、Ribbon Controlを使用する場合はM-V-VMパターンが使えないかというとそういう訳でもなく、SouthridgeをM-V-VMパターンに則って書き直したバージョンも存在しているようです。自分は詳しく調べられていないのですが、先ほどの問題はNonRoutedRibbonCommandDelegatorというRibbonCommandと同じインターフェイスを備えたプロキシクラスをはさむことで解決しているようです。 ･･･とここまで書いたところで気づいたのですが、Ribbon V1 Roadmapをみたところ、Ribbon関係のCommandに設計変更が入るみたいですね。LabelTitleとかまでRibbonCommandに纏めるのをやめて、通常のコントロールと同じようなスタイルに戻るようです。これは素直に新しいバージョンがリリースされるのを待ったほうが楽かもしれません。]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.sharplab.net/wp-content/uploads/2009/05/image4.png" rel="lightbox"><img style="border-bottom: 0px; border-left: 0px; display: inline; margin-left: 0px; border-top: 0px; margin-right: 0px; border-right: 0px" title="image" border="0" alt="image" align="right" src="http://blog.sharplab.net/wp-content/uploads/2009/05/image-thumb4.png" width="304" height="189" /></a> WPF Futuresには、WPF Model-View-ViewModel Toolkitの他にも色々な参考になるサンプルが含まれています。<a href="http://wpf.codeplex.com/Wiki/View.aspx?title=Southridge%20Lab">Southridge Hands-on-Lab</a>は<a href="http://www.codeplex.com/wpf/Wiki/View.aspx?title=WPF%20Ribbon%20Preview">WPF Ribbon Control</a>とDataGridを使ったリッチなアプリケーション開発のチュートリアルとなっており、<a href="http://channel9.msdn.com/pdc2008/PC45/">PDCのセッションでも出てきていたもの</a>がチュートリアルの形式としてまとめられた物のようですね。結構大きなアプリケーションですが、手取り足取り細かく解説してくれるので、参考になるところが多いのではないでしょうか。</p>
<p>ただ、M-V-VMパターンには則っていないところがあり、ViewModelに書くべきロジックをViewのコードビハインドに書いていたりするのでM-V-VMパターンのサンプルとするには注意が必要です。WPF Ribbon Controlのメニュー等は、CommandとしてExecuteメソッドやCanExecuteメソッド以外にも、LabelTitleプロパティなどを持ったオブジェクトを必要とするため、View側でCommandとしてセットするオブジェクトを用意する必要があります。その制約に引きずられてViewのコードビハインドにCommandの処理ロジックを記述しているようです。</p>
<p>では、Ribbon Controlを使用する場合はM-V-VMパターンが使えないかというとそういう訳でもなく、<a href="http://blogs.msdn.com/jaimer/archive/2009/02/10/m-v-vm-training-day-sample-application-and-decks.aspx">SouthridgeをM-V-VMパターンに則って書き直したバージョン</a>も存在しているようです。自分は詳しく調べられていないのですが、先ほどの問題はNonRoutedRibbonCommandDelegatorというRibbonCommandと同じインターフェイスを備えたプロキシクラスをはさむことで解決しているようです。</p>
<p>･･･とここまで書いたところで気づいたのですが、<a href="http://wpf.codeplex.com/Wiki/View.aspx?title=Ribbon%20V1%20Roadmap&amp;referringTitle=Home">Ribbon V1 Roadmap</a>をみたところ、Ribbon関係のCommandに設計変更が入るみたいですね。LabelTitleとかまでRibbonCommandに纏めるのをやめて、通常のコントロールと同じようなスタイルに戻るようです。これは素直に新しいバージョンがリリースされるのを待ったほうが楽かもしれません。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.sharplab.net/blog/2009/05/03/southridge-hands-on-lab/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>DelegateCommand in WPF Model-View-ViewModel Toolkit 0.1</title>
		<link>http://blog.sharplab.net/blog/2009/05/03/delegatecommand-in-wpf-model-view-viewmodel-toolkit-01/</link>
		<comments>http://blog.sharplab.net/blog/2009/05/03/delegatecommand-in-wpf-model-view-viewmodel-toolkit-01/#comments</comments>
		<pubDate>Sat, 02 May 2009 18:01:25 +0000</pubDate>
		<dc:creator>shiroica</dc:creator>
				<category><![CDATA[WPF]]></category>
		<category><![CDATA[M-V-VM]]></category>
		<category><![CDATA[WPF Model-View-ViewModel Toolkit]]></category>

		<guid isPermaLink="false">http://blog.sharplab.net/uncategorized/3083/</guid>
		<description><![CDATA[WPF Model-View-ViewModel Toolkitのテンプレートやサンプルに含まれるDelegateCommand.cs、とりあえずコメントを日本語訳しながら読んでみました。DelegateCommandという名前ですが、Composite Application Guidance for WPFのDelegateCommandとは異なります。MSDN MagazineのWPF のための MODEL-VIEW-VIEWMODEL (MVVM) デザイン パターンという記事で使われているRelayCommandに、CommandManagerのRequerySuggestedイベントへの応答の有効/無効の設定プロパティ（IsAutomaticRequeryDisabled）と、CanExecuteChangedイベントを発生させるパブリックメソッド（RaiseCanExecuteChanged）を追加し、メモリリークを防ぐためにCanExecuteChangedイベントへのハンドラを弱参照で持つようにした？感じですね。 // This source code is licensed by Microsoft under Ms-PL license. using System; using System.Collections.Generic; using System.Windows; using System.Windows.Input; namespace WpfModelViewApplication1.Commands { /// &#60;summary&#62; /// &#60;para&#62; /// This class allows delegating the commanding logic to methods passed as parameters, /// and enables [...]]]></description>
			<content:encoded><![CDATA[<p>WPF Model-View-ViewModel Toolkitのテンプレートやサンプルに含まれるDelegateCommand.cs、とりあえずコメントを日本語訳しながら読んでみました。DelegateCommandという名前ですが、Composite Application Guidance for WPFのDelegateCommandとは異なります。MSDN Magazineの<a href="http://msdn.microsoft.com/ja-jp/magazine/dd419663.aspx">WPF のための MODEL-VIEW-VIEWMODEL (MVVM) デザイン パターン</a>という記事で使われているRelayCommandに、CommandManagerのRequerySuggestedイベントへの応答の有効/無効の設定プロパティ（IsAutomaticRequeryDisabled）と、CanExecuteChangedイベントを発生させるパブリックメソッド（RaiseCanExecuteChanged）を追加し、メモリリークを防ぐためにCanExecuteChangedイベントへのハンドラを弱参照で持つようにした？感じですね。
</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:03ed3ce7-c91a-4e06-8c55-31be5b5721f2" class="wlWriterEditableSmartContent">
<pre name="code" class="c#">// This source code is licensed by Microsoft under Ms-PL license.
using System;
using System.Collections.Generic;
using System.Windows;
using System.Windows.Input;

namespace WpfModelViewApplication1.Commands
{
    /// &lt;summary&gt;
    /// &lt;para&gt;
    ///     This class allows delegating the commanding logic to methods passed as parameters,
    ///     and enables a View to bind commands to objects that are not part of the element tree.
    /// &lt;/para&gt;
    /// &lt;para&gt;
    ///     このクラスはパラメータとして渡されたメソッドへのコマンドのロジックの委譲を実現します。
    ///     また、Viewが要素ツリーに含まれないオブジェクトにコマンドをバインドすることを可能にします。
    /// &lt;/para&gt;
    /// &lt;/summary&gt;
    public class DelegateCommand : ICommand
    {
        #region Constructors

        /// &lt;summary&gt;
        ///     Constructor
        /// &lt;/summary&gt;
        public DelegateCommand(Action executeMethod)
            : this(executeMethod, null, false)
        {
        }

        /// &lt;summary&gt;
        ///     Constructor
        /// &lt;/summary&gt;
        public DelegateCommand(Action executeMethod, Func&lt;bool&gt; canExecuteMethod)
            : this(executeMethod, canExecuteMethod, false)
        {
        }

        /// &lt;summary&gt;
        ///     Constructor
        /// &lt;/summary&gt;
        public DelegateCommand(Action executeMethod, Func&lt;bool&gt; canExecuteMethod, bool isAutomaticRequeryDisabled)
        {
            if (executeMethod == null)
            {
                throw new ArgumentNullException("executeMethod");
            }

            _executeMethod = executeMethod;
            _canExecuteMethod = canExecuteMethod;
            _isAutomaticRequeryDisabled = isAutomaticRequeryDisabled;
        }

        #endregion

        #region Public Methods

        /// &lt;summary&gt;
        /// &lt;para&gt;
        ///     Method to determine if the command can be executed
        /// &lt;/para&gt;
        /// &lt;para&gt;
        ///     コマンドが実行可能かを返す
        /// &lt;/para&gt;
        /// &lt;/summary&gt;
        public bool CanExecute()
        {
            if (_canExecuteMethod != null)
            {
                return _canExecuteMethod();
            }
            return true;
        }

        /// &lt;summary&gt;
        /// &lt;para&gt;
        ///     Execution of the command
        /// &lt;/para&gt;
        /// &lt;para&gt;
        ///     コマンドを実行する
        /// &lt;/para&gt;
        /// &lt;/summary&gt;
        public void Execute()
        {
            if (_executeMethod != null)
            {
                _executeMethod();
            }
        }

        /// &lt;summary&gt;
        /// &lt;para&gt;
        ///     Property to enable or disable CommandManager's automatic requery on this command
        /// &lt;/para&gt;
        /// &lt;para&gt;
        ///     CommandManagerのこのコマンドに対する自動再要求の有効/無効を設定する
        /// &lt;/para&gt;
        /// &lt;/summary&gt;
        public bool IsAutomaticRequeryDisabled
        {
            get
            {
                return _isAutomaticRequeryDisabled;
            }
            set
            {
                if (_isAutomaticRequeryDisabled != value)
                {
                    if (value)
                    {
                        CommandManagerHelper.RemoveHandlersFromRequerySuggested(_canExecuteChangedHandlers);
                    }
                    else
                    {
                        CommandManagerHelper.AddHandlersToRequerySuggested(_canExecuteChangedHandlers);
                    }
                    _isAutomaticRequeryDisabled = value;
                }
            }
        }

        /// &lt;summary&gt;
        /// &lt;para&gt;
        ///     Raises the CanExecuteChaged event
        /// &lt;/para&gt;
        /// &lt;para&gt;
        ///     CanExecuteChangedイベントを発生させる
        /// &lt;/para&gt;
        /// &lt;/summary&gt;
        public void RaiseCanExecuteChanged()
        {
            OnCanExecuteChanged();
        }

        /// &lt;summary&gt;
        /// &lt;para&gt;
        ///     Protected virtual method to raise CanExecuteChanged event
        /// &lt;/para&gt;
        /// &lt;para&gt;
        ///     CanExecuteChangedイベントを発生させるprotected virtualメソッド
        /// &lt;/para&gt;
        /// &lt;/summary&gt;
        protected virtual void OnCanExecuteChanged()
        {
            CommandManagerHelper.CallWeakReferenceHandlers(_canExecuteChangedHandlers);
        }

        #endregion

        #region ICommand Members

        /// &lt;summary&gt;
        /// &lt;para&gt;
        ///     ICommand.CanExecuteChanged implementation
        /// &lt;/para&gt;
        /// &lt;para&gt;
        ///     ICommand.CanExecuteChangedの実装
        /// &lt;/para&gt;
        /// &lt;/summary&gt;
        public event EventHandler CanExecuteChanged
        {
            add
            {
                if (!_isAutomaticRequeryDisabled)
                {
                    CommandManager.RequerySuggested += value;
                }
                CommandManagerHelper.AddWeakReferenceHandler(ref _canExecuteChangedHandlers, value, 2);
            }
            remove
            {
                if (!_isAutomaticRequeryDisabled)
                {
                    CommandManager.RequerySuggested -= value;
                }
                CommandManagerHelper.RemoveWeakReferenceHandler(_canExecuteChangedHandlers, value);
            }
        }

        bool ICommand.CanExecute(object parameter)
        {
            return CanExecute();
        }

        void ICommand.Execute(object parameter)
        {
            Execute();
        }

        #endregion

        #region Data

        private readonly Action _executeMethod = null;
        private readonly Func&lt;bool&gt; _canExecuteMethod = null;
        private bool _isAutomaticRequeryDisabled = false;
        private List&lt;WeakReference&gt; _canExecuteChangedHandlers;

        #endregion
    }

    /// &lt;summary&gt;
    /// &lt;para&gt;
    ///     This class allows delegating the commanding logic to methods passed as parameters,
    ///     and enables a View to bind commands to objects that are not part of the element tree.
    /// &lt;/para&gt;
    /// &lt;para&gt;
    ///     このクラスはパラメータとして渡されたメソッドへのコマンドのロジックの委譲を実現します。
    ///     また、Viewが要素ツリーに含まれないオブジェクトにコマンドをバインドすることを可能にします。
    /// &lt;/para&gt;
    /// &lt;/summary&gt;
    /// &lt;typeparam name="T"&gt;Type of the parameter passed to the delegates&lt;/typeparam&gt;
    public class DelegateCommand&lt;T&gt; : ICommand
    {
        #region Constructors

        /// &lt;summary&gt;
        ///     Constructor
        /// &lt;/summary&gt;
        public DelegateCommand(Action&lt;T&gt; executeMethod)
            : this(executeMethod, null, false)
        {
        }

        /// &lt;summary&gt;
        ///     Constructor
        /// &lt;/summary&gt;
        public DelegateCommand(Action&lt;T&gt; executeMethod, Func&lt;T, bool&gt; canExecuteMethod)
            : this(executeMethod, canExecuteMethod, false)
        {
        }

        /// &lt;summary&gt;
        ///     Constructor
        /// &lt;/summary&gt;
        public DelegateCommand(Action&lt;T&gt; executeMethod, Func&lt;T, bool&gt; canExecuteMethod, bool isAutomaticRequeryDisabled)
        {
            if (executeMethod == null)
            {
                throw new ArgumentNullException("executeMethod");
            }

            _executeMethod = executeMethod;
            _canExecuteMethod = canExecuteMethod;
            _isAutomaticRequeryDisabled = isAutomaticRequeryDisabled;
        }

        #endregion

        #region Public Methods

        /// &lt;summary&gt;
        /// &lt;para&gt;
        ///     Method to determine if the command can be executed
        /// &lt;/para&gt;
        /// &lt;para&gt;
        ///     コマンドが実行可能かを返す
        /// &lt;/para&gt;
        /// &lt;/summary&gt;
        public bool CanExecute(T parameter)
        {
            if (_canExecuteMethod != null)
            {
                return _canExecuteMethod(parameter);
            }
            return true;
        }

        /// &lt;summary&gt;
        /// &lt;para&gt;
        ///     Execution of the command
        /// &lt;/para&gt;
        /// &lt;para&gt;
        ///     コマンドを実行する
        /// &lt;/para&gt;
        /// &lt;/summary&gt;
        public void Execute(T parameter)
        {
            if (_executeMethod != null)
            {
                _executeMethod(parameter);
            }
        }

        /// &lt;summary&gt;
        /// &lt;para&gt;
        ///     Raises the CanExecuteChaged event
        /// &lt;/para&gt;
        /// &lt;para&gt;
        ///     CanExecuteChangedイベントを発生させる
        /// &lt;/para&gt;
        /// &lt;/summary&gt;
        public void RaiseCanExecuteChanged()
        {
            OnCanExecuteChanged();
        }

        /// &lt;summary&gt;
        /// &lt;para&gt;
        ///     Protected virtual method to raise CanExecuteChanged event
        /// &lt;/para&gt;
        /// &lt;para&gt;
        ///     CanExecuteChangedイベントを発生させるprotected virtualメソッド
        /// &lt;/para&gt;
        /// &lt;/summary&gt;
        protected virtual void OnCanExecuteChanged()
        {
            CommandManagerHelper.CallWeakReferenceHandlers(_canExecuteChangedHandlers);
        }

        /// &lt;summary&gt;
        /// &lt;para&gt;
        ///     Property to enable or disable CommandManager's automatic requery on this command
        /// &lt;/para&gt;
        /// &lt;para&gt;
        ///     CommandManagerのこのコマンドに対する自動再要求の有効/無効を設定する
        /// &lt;/para&gt;
        /// &lt;/summary&gt;
        public bool IsAutomaticRequeryDisabled
        {
            get
            {
                return _isAutomaticRequeryDisabled;
            }
            set
            {
                if (_isAutomaticRequeryDisabled != value)
                {
                    if (value)
                    {
                        CommandManagerHelper.RemoveHandlersFromRequerySuggested(_canExecuteChangedHandlers);
                    }
                    else
                    {
                        CommandManagerHelper.AddHandlersToRequerySuggested(_canExecuteChangedHandlers);
                    }
                    _isAutomaticRequeryDisabled = value;
                }
            }
        }

        #endregion

        #region ICommand Members

        /// &lt;summary&gt;
        /// &lt;para&gt;
        ///     ICommand.CanExecuteChanged implementation
        /// &lt;/para&gt;
        /// &lt;para&gt;
        ///     ICommand.CanExecuteChangedの実装
        /// &lt;/para&gt;
        /// &lt;/summary&gt;
        public event EventHandler CanExecuteChanged
        {
            add
            {
                if (!_isAutomaticRequeryDisabled)
                {
                    CommandManager.RequerySuggested += value;
                }
                CommandManagerHelper.AddWeakReferenceHandler(ref _canExecuteChangedHandlers, value, 2);
            }
            remove
            {
                if (!_isAutomaticRequeryDisabled)
                {
                    CommandManager.RequerySuggested -= value;
                }
                CommandManagerHelper.RemoveWeakReferenceHandler(_canExecuteChangedHandlers, value);
            }
        }

        bool ICommand.CanExecute(object parameter)
        {
            // if T is of value type and the parameter is not
            // set yet, then return false if CanExecute delegate
            // exists, else return true

            // Tが値型でかつ、parameterがセットされていない場合、
            // CanExecuteデリゲートが存在するならfalseを返します。
            // そうでなければtrueを返します。
            if (parameter == null &amp;&amp;
                typeof(T).IsValueType)
            {
                return (_canExecuteMethod == null);
            }
            return CanExecute((T)parameter);
        }

        void ICommand.Execute(object parameter)
        {
            Execute((T)parameter);
        }

        #endregion

        #region Data

        private readonly Action&lt;T&gt; _executeMethod = null;
        private readonly Func&lt;T, bool&gt; _canExecuteMethod = null;
        private bool _isAutomaticRequeryDisabled = false;
        private List&lt;WeakReference&gt; _canExecuteChangedHandlers;

        #endregion
    }

    /// &lt;summary&gt;
    /// &lt;para&gt;
    ///     This class contains methods for the CommandManager that help avoid memory leaks by
    ///     using weak references.
    /// &lt;/para&gt;
    /// &lt;para&gt;
    ///     このクラスはCommandManagerに対する、弱参照を使うことでメモリリークを防ぐ助けとなるメソッドを含んでいます。
    /// &lt;/para&gt;
    /// &lt;/summary&gt;
    internal class CommandManagerHelper
    {
        internal static void CallWeakReferenceHandlers(List&lt;WeakReference&gt; handlers)
        {
            if (handlers != null)
            {
                // Take a snapshot of the handlers before we call out to them since the handlers
                // could cause the array to me modified while we are reading it.

                // 我々が私への配列を読んでいる間にハンドラはそれの変更を引き起こしうるので、
                // それらを呼び出す前にハンドラのスナップショットをとります。

                EventHandler[] callees = new EventHandler[handlers.Count];
                int count = 0;

                for (int i = handlers.Count - 1; i &gt;= 0; i--)
                {
                    WeakReference reference = handlers[i];
                    EventHandler handler = reference.Target as EventHandler;
                    if (handler == null)
                    {
                        // Clean up old handlers that have been collected
                        // 収集されたハンドラを削除します
                        handlers.RemoveAt(i);
                    }
                    else
                    {
                        callees[count] = handler;
                        count++;
                    }
                }

                // Call the handlers that we snapshotted

                // スナップショットをとったハンドラを呼びます
                for (int i = 0; i &lt; count; i++)
                {
                    EventHandler handler = callees[i];
                    handler(null, EventArgs.Empty);
                }
            }
        }

        internal static void AddHandlersToRequerySuggested(List&lt;WeakReference&gt; handlers)
        {
            if (handlers != null)
            {
                foreach (WeakReference handlerRef in handlers)
                {
                    EventHandler handler = handlerRef.Target as EventHandler;
                    if (handler != null)
                    {
                        CommandManager.RequerySuggested += handler;
                    }
                }
            }
        }

        internal static void RemoveHandlersFromRequerySuggested(List&lt;WeakReference&gt; handlers)
        {
            if (handlers != null)
            {
                foreach (WeakReference handlerRef in handlers)
                {
                    EventHandler handler = handlerRef.Target as EventHandler;
                    if (handler != null)
                    {
                        CommandManager.RequerySuggested -= handler;
                    }
                }
            }
        }

        internal static void AddWeakReferenceHandler(ref List&lt;WeakReference&gt; handlers, EventHandler handler)
        {
            AddWeakReferenceHandler(ref handlers, handler, -1);
        }

        internal static void AddWeakReferenceHandler(ref List&lt;WeakReference&gt; handlers, EventHandler handler, int defaultListSize)
        {
            if (handlers == null)
            {
                handlers = (defaultListSize &gt; 0 ? new List&lt;WeakReference&gt;(defaultListSize) : new List&lt;WeakReference&gt;());
            }

            handlers.Add(new WeakReference(handler));
        }

        internal static void RemoveWeakReferenceHandler(List&lt;WeakReference&gt; handlers, EventHandler handler)
        {
            if (handlers != null)
            {
                for (int i = handlers.Count - 1; i &gt;= 0; i--)
                {
                    WeakReference reference = handlers[i];
                    EventHandler existingHandler = reference.Target as EventHandler;
                    if ((existingHandler == null) || (existingHandler == handler))
                    {
                        // Clean up old handlers that have been collected
                        // in addition to the handler that is to be removed.

                        // 削除されるハンドラに加えて、収集された古いハンドラ
                        // を削除します。
                        handlers.RemoveAt(i);
                    }
                }
            }
        }
    }
}</pre>
</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.sharplab.net/blog/2009/05/03/delegatecommand-in-wpf-model-view-viewmodel-toolkit-01/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>WPF Model-View-ViewModel Toolkit 0.1がリリースされました</title>
		<link>http://blog.sharplab.net/blog/2009/05/02/wpf-model-view-viewmodel-toolkit-01%e3%81%8c%e3%83%aa%e3%83%aa%e3%83%bc%e3%82%b9%e3%81%95%e3%82%8c%e3%81%be%e3%81%97%e3%81%9f/</link>
		<comments>http://blog.sharplab.net/blog/2009/05/02/wpf-model-view-viewmodel-toolkit-01%e3%81%8c%e3%83%aa%e3%83%aa%e3%83%bc%e3%82%b9%e3%81%95%e3%82%8c%e3%81%be%e3%81%97%e3%81%9f/#comments</comments>
		<pubDate>Sat, 02 May 2009 14:13:27 +0000</pubDate>
		<dc:creator>shiroica</dc:creator>
				<category><![CDATA[WPF]]></category>
		<category><![CDATA[M-V-VM]]></category>
		<category><![CDATA[WPF Model-View-ViewModel Toolkit]]></category>

		<guid isPermaLink="false">http://blog.sharplab.net/computer/cprograming/wpf/3081/</guid>
		<description><![CDATA[5/1にCodePlexのWPFのサイトでリリースされたWPF Futures、様々なサンプルやテンプレートが含まれていて興味深いのですが、この中には、WPF Model-View-ViewModel Toolkitというものも含まれていました。 内容は、 Visual Studio 2008用のテンプレート (Visual C# Express 2008もサポート) 文書&#160; M-V-VMの概略紹介 VSテンプレート利用の手引き MVVMパターンの適用されたWPFアプリケーションのデモ となっています。 Visual Studioテンプレート 規約というほどのものではありませんが、M-V-VMパターンもRuby on RailsやASP.NET MVC、CakePHPなどのMVCパターンのフレームワークのように命名規則やディレクトリ構造の作法が存在します。Model、View、ViewModel毎にディレクトリを作成し、その中にModelやViewといった接尾辞をつけたクラスを配置するといったものです。この作法に則ったプロジェクトを簡単に作成するために、WPF Model-View-ViewModel ToolkitにはVisual Studioのテンプレートが含まれています。 テンプレートのインストール ダウンロードしてきたToolkitのzipファイルの中には、WPFModelViewTemplate.msiが含まれています。まずはこれを実行してインストールを行います。 ただし、Visual Studioの日本語環境では、これだけでは利用可能になりません。ASP.NET MVCのPreview版がそうであったように、Visual Studio のテンプレート が英語環境用(1033)にしかセットアップされませんので、英語環境用にインストールされたファイルを日本語環境用(1041)にコピーしてやる必要があります。 以下の位置に存在するファイルを、 &#60;Visual Studioのインストールディレクトリ&#62;\Common7\IDE\ProjectTemplates\CSharp\Windows\1033\WpfModelViewApplicationProjectTemplateV0.1.cs.zip こちらのディレクトリにコピーします。 &#60;Visual Studioのインストールディレクトリ&#62;\Common7\IDE\ProjectTemplates\CSharp\Windows\1041\ その上で、管理者として実行したVisual Studioコマンドプロンプトから devenv /InstallVSTemplates を実行し、VisualStudioに変更を反映させます。 これで、テンプレートが追加されました。 作成されたプロジェクトはこのような構造となります。 CommandやViewModelの基本クラスも用意されています。CommandやViewModelの基本クラスは様々な人が公開しているものの中からどれを選択すべきか迷うところがありましたが、これからWPF Model-View-ViewModel Toolkitが標準として育っていけば、迷うことも少なくなりそうですね。 DelegateCommandやViewModelBaseについては、追って解説エントリをあげられればと思います。]]></description>
			<content:encoded><![CDATA[<p>5/1に<a href="http://wpf.codeplex.com/">CodePlexのWPFのサイト</a>でリリースされた<a href="http://wpf.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=14962">WPF Futures</a>、様々なサンプルやテンプレートが含まれていて興味深いのですが、この中には、<a href="http://wpf.codeplex.com/Wiki/View.aspx?title=WPF%20Model-View-ViewModel%20Toolkit">WPF Model-View-ViewModel Toolkit</a>というものも含まれていました。     <br />内容は、</p>
<ul>
<li>Visual Studio 2008用のテンプレート (Visual C# Express 2008もサポート) </li>
<li>文書&#160;
<ul>
<li>M-V-VMの概略紹介 </li>
<li>VSテンプレート利用の手引き </li>
</ul>
</li>
<li>MVVMパターンの適用されたWPFアプリケーションのデモ </li>
</ul>
<p>となっています。</p>
<h3>Visual Studioテンプレート</h3>
<p>規約というほどのものではありませんが、M-V-VMパターンもRuby on RailsやASP.NET MVC、CakePHPなどのMVCパターンのフレームワークのように命名規則やディレクトリ構造の作法が存在します。Model、View、ViewModel毎にディレクトリを作成し、その中にModelやViewといった接尾辞をつけたクラスを配置するといったものです。この作法に則ったプロジェクトを簡単に作成するために、WPF Model-View-ViewModel ToolkitにはVisual Studioのテンプレートが含まれています。</p>
<h4>テンプレートのインストール</h4>
<p>ダウンロードしてきたToolkitのzipファイルの中には、WPFModelViewTemplate.msiが含まれています。まずはこれを実行してインストールを行います。    <br /><a href="http://blog.sharplab.net/wp-content/uploads/2009/05/image.png" rel="lightbox"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://blog.sharplab.net/wp-content/uploads/2009/05/image-thumb.png" width="424" height="333" /></a> </p>
<p>ただし、Visual Studioの日本語環境では、これだけでは利用可能になりません。ASP.NET MVCのPreview版がそうであったように、Visual Studio のテンプレート が英語環境用(1033)にしかセットアップされませんので、英語環境用にインストールされたファイルを日本語環境用(1041)にコピーしてやる必要があります。</p>
<p>以下の位置に存在するファイルを、    <br />&lt;Visual Studioのインストールディレクトリ&gt;\Common7\IDE\ProjectTemplates\CSharp\Windows\1033\WpfModelViewApplicationProjectTemplateV0.1.cs.zip</p>
<p>こちらのディレクトリにコピーします。    <br />&lt;Visual Studioのインストールディレクトリ&gt;\Common7\IDE\ProjectTemplates\CSharp\Windows\1041\</p>
<p><a href="http://blog.sharplab.net/wp-content/uploads/2009/05/image1.png" rel="lightbox"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; margin-left: 0px; border-left-width: 0px; margin-right: 0px" title="image" border="0" alt="image" align="right" src="http://blog.sharplab.net/wp-content/uploads/2009/05/image-thumb1.png" width="204" height="308" /></a>その上で、管理者として実行したVisual Studioコマンドプロンプトから</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:c6779857-ceb6-4f79-ae86-4422719e4d7a" class="wlWriterEditableSmartContent">
<pre name="code" class="c">devenv /InstallVSTemplates </pre>
</div>
<p>を実行し、VisualStudioに変更を反映させます。 </p>
<p>これで、テンプレートが追加されました。</p>
<p><a href="http://blog.sharplab.net/wp-content/uploads/2009/05/image2.png" rel="lightbox"><img style="border-bottom: 0px; border-left: 0px; display: inline; margin-left: 0px; border-top: 0px; margin-right: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://blog.sharplab.net/wp-content/uploads/2009/05/image-thumb2.png" width="384" height="308" /></a> </p>
<p>作成されたプロジェクトはこのような構造となります。<br />
  <br /><a href="http://blog.sharplab.net/wp-content/uploads/2009/05/image3.png" rel="lightbox"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://blog.sharplab.net/wp-content/uploads/2009/05/image-thumb3.png" width="365" height="352" /></a> </p>
<p>CommandやViewModelの基本クラスも用意されています。CommandやViewModelの基本クラスは様々な人が公開しているものの中からどれを選択すべきか迷うところがありましたが、これからWPF Model-View-ViewModel Toolkitが標準として育っていけば、迷うことも少なくなりそうですね。</p>
<p>DelegateCommandやViewModelBaseについては、追って解説エントリをあげられればと思います。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.sharplab.net/blog/2009/05/02/wpf-model-view-viewmodel-toolkit-01%e3%81%8c%e3%83%aa%e3%83%aa%e3%83%bc%e3%82%b9%e3%81%95%e3%82%8c%e3%81%be%e3%81%97%e3%81%9f/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>【翻訳】ViewとViewModel間でアニメーション化された遷移を仕立てる～　原題&#8221;Orchestrating Animated Transitions between View and ViewModel&#8221;</title>
		<link>http://blog.sharplab.net/blog/2009/04/29/%e3%80%90%e7%bf%bb%e8%a8%b3%e3%80%91view%e3%81%a8viewmodel%e9%96%93%e3%81%a7%e3%82%a2%e3%83%8b%e3%83%a1%e3%83%bc%e3%82%b7%e3%83%a7%e3%83%b3%e5%8c%96%e3%81%95%e3%82%8c%e3%81%9f%e9%81%b7%e7%a7%bb/</link>
		<comments>http://blog.sharplab.net/blog/2009/04/29/%e3%80%90%e7%bf%bb%e8%a8%b3%e3%80%91view%e3%81%a8viewmodel%e9%96%93%e3%81%a7%e3%82%a2%e3%83%8b%e3%83%a1%e3%83%bc%e3%82%b7%e3%83%a7%e3%83%b3%e5%8c%96%e3%81%95%e3%82%8c%e3%81%9f%e9%81%b7%e7%a7%bb/#comments</comments>
		<pubDate>Wed, 29 Apr 2009 02:38:10 +0000</pubDate>
		<dc:creator>shiroica</dc:creator>
				<category><![CDATA[WPF]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[M-V-VM]]></category>

		<guid isPermaLink="false">http://blog.sharplab.net/computer/cprograming/wpf/3065/</guid>
		<description><![CDATA[M-V-VMパターンとアニメーションをどのようにして組み合わせるのかは、MVVMパターンを使う上で常に頭を悩ませる問題です。この問題に対して、Josh SmithさんがOrchestrating Animated Transitions between View and ViewModel &#62;&#62; Josh Smith on WPFというエントリでひとつの方法を示していたので、今回はこれを訳してみました。 Introduction Model-View-ViewModel（MVVM）パターンを使う場合、Viewに表示されるデータはほぼ常にデータバインディングを通じてやり取りされます。ViewModelオブジェクトのプロパティに対する変更はすぐにViewのバインディングターゲットに対して伝達されます。これは普通は良いことです。しかしながら、時によっては、伝達が即時に行われることが問題になることがあります。 When working with the Model-View-ViewModel (MVVM) pattern, the data shown in a View is almost always transferred to it via data binding.&#160; Changes made to properties on a ViewModel object immediately propagate to the binding targets in the View.&#160; This [...]]]></description>
			<content:encoded><![CDATA[</p>
<p>M-V-VMパターンとアニメーションをどのようにして組み合わせるのかは、MVVMパターンを使う上で常に頭を悩ませる問題です。この問題に対して、<a href="http://joshsmithonwpf.wordpress.com/">Josh Smith</a>さんが<a title="http://joshsmithonwpf.wordpress.com/2009/04/25/orchestrating-animated-transitions-between-view-and-viewmodel/" href="http://joshsmithonwpf.wordpress.com/2009/04/25/orchestrating-animated-transitions-between-view-and-viewmodel/">Orchestrating Animated Transitions between View and ViewModel &gt;&gt; Josh Smith on WPF</a>というエントリでひとつの方法を示していたので、今回はこれを訳してみました。</p>
<h4>Introduction</h4>
<p>Model-View-ViewModel（MVVM）パターンを使う場合、Viewに表示されるデータはほぼ常にデータバインディングを通じてやり取りされます。ViewModelオブジェクトのプロパティに対する変更はすぐにViewのバインディングターゲットに対して伝達されます。これは普通は良いことです。しかしながら、時によっては、伝達が即時に行われることが問題になることがあります。</p>
<blockquote><p>When working with the Model-View-ViewModel (MVVM) pattern, the data shown in a View is almost always transferred to it via data binding.&#160; Changes made to properties on a ViewModel object immediately propagate to the binding targets in the View.&#160; This is normally a good thing.&#160; Sometimes, however, the immediacy of the propagation can be a problem.</p>
</blockquote>
<p>なぜ新しいプロパティの値がUIに即座には現われて欲しくないと思うのでしょうか？では、古い値と新しい値との間でのアニメーション化された遷移を表示したい場合を考えてみてください。新しい値が即座にViewに表示された場合、新しい値を”アニメートイン”する前に古い値を”アニメートアウト”するチャンスがありません。例えば、プロパティの値がリストとして表示される１ページのデータ項目だと考えてみてください。新しい項目のページをフェードする前に最初のページのアイテムをフェードアウトしたい場合、新しい項目のページが表示される前に、フェードアウトアニメーションを始める必要があります。</p>
<blockquote><p>Why would you want a new property value to not immediately show up in the UI?&#160; Well, suppose you want to display an animated transition between the old value and the new value.&#160; If the new value immediately shows up in the View, you won’t have a chance to animate “out” the old value before animating “in” the new value.&#160;&#160; For example, suppose the property’s value is a page of data items to show in a list.&#160; If we want to fade away the first page of items before fading in the new page of items, we need to start the fade-away animations before the new page of items is displayed.</p>
</blockquote>
<p>これは、Visual State Manager（VSM）が解決する種類の問題です。VSMは未だ正式なWPFの一部になっておらず（.NET 4.0まではなりません）、我々は未だそれをアプリケーション作成に役立てることはできません。また、VSMはカスタムコントロールの中で使われるために設計されているので、私達がこれから探そうというものとは完全に同じという訳ではありません。</p>
<blockquote><p>This is the type of problem that the Visual State Manager (VSM) solves.&#160; Since the VSM is not yet part of WPF proper (it won’t be until .NET 4.0), we cannot make use of it yet in production applications.&#160; Also, the VSM is designed to be used inside of custom controls, so it is not exactly equivalent to what we are going to explore below.</p>
</blockquote>
<h4>The AnimatedTransition Class</h4>
<p>私はWPFやSilverlightのアプリケーションに取り組んでいる際に、まさにこの問題に何回も直面しました。プロパティの変化をアニメーション化された遷移と協調させるための様々なアプローチを試したあと、私は核となる問題を、より鮮明に理解し始めました。昨日私は<a href="http://www.youtube.com/watch?v=3dLhSZLIpvA">Scherzo from Mendelssohn’s “A Midsummer’s Night Dream”</a>のこのとてつもなく素晴らしい演奏を聴き、そしてパッと閃きました。私は二つのプロパティ値間でのアニメーション化された遷移を作成するための、ViewModelとViewをして協調させるシンプルで、タイプセーフで、再利用可能な方法を悟りました。AnimatedTransitionクラスが生まれたのです！</p>
<blockquote><p>I faced this exact problem many times while working on WPF and Silverlight applications.&#160; After experimenting with several approaches to coordinating property changes with animated transitions, I started to understand the core problem more clearly.&#160;&#160; Yesterday I listened to this incredible rendition of the <a href="http://www.youtube.com/watch?v=3dLhSZLIpvA">Scherzo from Mendelssohn’s “A Midsummer’s Night Dream”</a> and was hit by a flash of inspiration.&#160; I realized a way to create a simple, type-safe, reusable way of having a ViewModel and View work together to create animated transitions between two property values.&#160; The AnimatedTransition class was born!</p>
</blockquote>
<p><a rel="lightbox" href="http://blog.sharplab.net/wp-content/uploads/2009/04/image7.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://blog.sharplab.net/wp-content/uploads/2009/04/image-thumb7.png" width="355" height="329" /></a> </p>
<p>AnimatedTransitionのインスタンスはどのViewModelクラスにでも埋め込むことが出来ます。遷移を行う必要のあるViewは、遷移を何時始めるべきかを知るために、AnimatedTransitionオブジェクトにアクセスし、そのイベントの一つ以上をフックする必要があります。</p>
<blockquote><p>An instance of AnimatedTransition can be embedded in any ViewModel class.&#160; The View(s) that need to perform transitions must access the AnimatedTransition object and hook one or more of its events in order to know when transitions should start.</p>
</blockquote>
<h4>The Demo App</h4>
<p>このエントリの最後に載せたデモアプリでは、以下のように「ページ」毎に四つのハローキティを表示するItemsControlがあります。</p>
<blockquote><p>In the demo app, which is available at the bottom of this post, there is an ItemsControl that displays four Hello Kitty images per “page,” as seen below…</p>
</blockquote>
<p><a rel="lightbox" href="http://blog.sharplab.net/wp-content/uploads/2009/04/image8.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://blog.sharplab.net/wp-content/uploads/2009/04/image-thumb8.png" width="412" height="521" /></a> </p>
<p>ユーザ―が下の四角を通じて別のページに遷移する際に、古いキティがフェードアウトし、新しいのがフェードインします。</p>
<blockquote><p>When the user navigates to a different page, via the circles below, the old kitties fade away and then the new ones fade in.</p>
</blockquote>
<p>この小さいアプリを動かすのに関係している全てのクラスを精査していくことはしません。ViewModelクラスについてしっかりと理解したい場合は、このクラスダイアグラムをクリックしてフルサイズのを見てください。</p>
<blockquote><p>We are not going to examine all of the classes involved in making this little app work.&#160; If you want to get a high-level understanding of the ViewModel classes, click on this class diagram to view it at full size:</p>
</blockquote>
<p><a rel="lightbox" href="http://blog.sharplab.net/wp-content/uploads/2009/04/image9.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://blog.sharplab.net/wp-content/uploads/2009/04/image-thumb9.png" width="610" height="319" /></a> </p>
<p>ItemsControlに表示されるキティの現在のページはKittyKatTerraceViewModelのSelectedPageプロパティに含まれます。あのプロパティの二つの値の間での遷移を必要とする場合、我々はAnimatedTransitionを埋め込んで使います。KittyKatTerraceViewModelがAnimatedTransitionを使用し、公開する方法はこのようになっています：</p>
<blockquote><p>The current page of kitties to show in the ItemsControl is contained in SelectedPage property of KittyKatTerraceViewModel.&#160; Since we need to have a transition between the two values of that property, we use an AnimatedTransition to enable that.&#160; Here is how KittyKatTerraceViewModel uses and exposes an AnimatedTransition:</p>
</blockquote>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:b7963b42-6627-4199-b444-870556a8019b" class="wlWriterSmartContent">
<pre class="c#" name="code">public AnimatedTransition&lt;PageOfKittyKatsViewModel&gt; GetSelectedPageTransition()
{
    if (_selectedPageTransition == null)
        _selectedPageTransition =
            new AnimatedTransition&lt;PageOfKittyKatsViewModel&gt;(page =&gt; this.SelectedPage = page);

    return _selectedPageTransition;
}</pre>
</div>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:560c92e9-5c50-40ac-82db-1cd5206c59b6" class="wlWriterSmartContent">
<pre class="c#" name="code">public PageOfKittyKatsViewModel SelectedPage
{
    get { return _selectedPage; }
    private set
    {
        if (value == _selectedPage)
            return;

        _selectedPage = value;

        foreach (var page in this.Pages)
            page.RefreshSelectionState();

        this.OnPropertyChanged(&quot;SelectedPage&quot;);
    }
}</pre>
</div>
<p>ユーザーがページを選択するためにItemsControlの真下の小さい四角をクリックしたとき、PageOfKittyKatsViewModelクラスのこのメソッドが実行されます：</p>
<blockquote>
<p>When the user clicks on a little circle beneath the ItemsControl to select a page, this method in the PageOfKittyKatsViewModel class executes:</p>
</blockquote>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:d2b1bb43-5e1a-49ed-b578-1e548e5a3ad1" class="wlWriterSmartContent">
<pre class="c#" name="code">void Select()
{
	// Tell the KittyKatTerraceViewModel to begin
	// a transition of the SelectedPage property
	// so that it references this page.
    _owner.GetSelectedPageTransition().Start(this);
}</pre>
</div>
<p>KittyKatTerraceViewコントロールのコードビハインドにある全ての関連するロジックを以下にリストアップします。これはViewがどうやってAnimatedTransitionオブジェクトを使用し、相互作用しているかを示しています。</p>
<blockquote>
<p>All of the relevant logic in the KittyKatTerraceView control’s code-behind is listed below.&#160; This shows how a View can consume and interact with an AnimatedTransition object.</p>
</blockquote>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:ed3b22ff-cb99-4ea1-a6d2-e163920b7106" class="wlWriterSmartContent">
<pre class="c#" name="code">void OnItemsHostPanelLoaded(object sender, RoutedEventArgs e)
{
    _itemsHost = sender as Panel;
}

void OnLoaded(object sender, RoutedEventArgs e)
{
    var viewModel = base.DataContext as KittyKatTerraceViewModel;

    viewModel.SetKittyLocations(new List&lt;Point&gt;
    {
        new Point(255, 65),
        new Point(115, 145),
        new Point(280, 225),
        new Point(135, 340)
    });

    _transition = viewModel.GetSelectedPageTransition();
    _transition.BeforeApplyNewValue += this.OnBeforeNewSelectedPage;
    _transition.AfterApplyNewValue += this.OnAfterNewSelectedPage;
}

void OnBeforeNewSelectedPage(object sender, EventArgs e)
{
    Storyboard sb = this.CreateStoryboard(&quot;FadeOutAnim&quot;);
    sb.Completed += delegate { _transition.Finish(); };
    sb.Begin();
}

void OnAfterNewSelectedPage(object sender, EventArgs e)
{
    // Wait until the panel has new children before animating.
    _itemsHost.LayoutUpdated += this.OnItemsHostLayoutUpdated;
}

void OnItemsHostLayoutUpdated(object sender, EventArgs e)
{
    _itemsHost.LayoutUpdated -= this.OnItemsHostLayoutUpdated;
    this.CreateStoryboard(&quot;FadeInAnim&quot;).Begin();
}</pre>
</div>
<p>古いアイテムをフェードアウトさせるStoryboardのCompletedイベントにハンドラをアタッチする必要があることによく気を付けて下さい。そのイベントが発生したとき、新しい値への遷移を終わらせるために、AnimatedTransitionは発生を伝えられる必要があり、それをうけて実際にその値を設定します。それはFinish()メソッドを呼ぶことによって実現されます。一度新しい値が設定されたならば、AfterApplyNewValueイベントが発生し、その際あなたは新しいアイテムにフェードインすることが出来ます。</p>
<blockquote>
<p>It’s important to note that you must attach a handler to the Completed event of the Storyboard that fades away the old items.&#160; When the event is raised, the AnimatedTransition must be told to finish transitioning to the new value, and actually apply the value.&#160; That is accomplished by calling the Finish() method.&#160; Once the new value has been applied, the AfterApplyNewValue event is raised, at which time you can fade in the new items.</p>
</blockquote>
<p>ソースコードは<a href="http://joshsmithonwpf.files.wordpress.com/2009/04/animationwithviewmodelzip.doc">ここ</a>からダウンロードすることが出来ます。注意：ファイルの拡張子を.DOCから.ZIPに変更して解凍して下さい。</p>
<blockquote>
<p>You can download the source code <a href="http://joshsmithonwpf.files.wordpress.com/2009/04/animationwithviewmodelzip.doc">here</a>.&#160; Note: Be sure to change the file extension from <strong>.DOC to .ZIP</strong> and then decompress it.</p>
</blockquote>
]]></content:encoded>
			<wfw:commentRss>http://blog.sharplab.net/blog/2009/04/29/%e3%80%90%e7%bf%bb%e8%a8%b3%e3%80%91view%e3%81%a8viewmodel%e9%96%93%e3%81%a7%e3%82%a2%e3%83%8b%e3%83%a1%e3%83%bc%e3%82%b7%e3%83%a7%e3%83%b3%e5%8c%96%e3%81%95%e3%82%8c%e3%81%9f%e9%81%b7%e7%a7%bb/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>null結合演算子</title>
		<link>http://blog.sharplab.net/blog/2009/04/27/null%e7%b5%90%e5%90%88%e6%bc%94%e7%ae%97%e5%ad%90/</link>
		<comments>http://blog.sharplab.net/blog/2009/04/27/null%e7%b5%90%e5%90%88%e6%bc%94%e7%ae%97%e5%ad%90/#comments</comments>
		<pubDate>Mon, 27 Apr 2009 01:54:10 +0000</pubDate>
		<dc:creator>shiroica</dc:creator>
				<category><![CDATA[C#Programing]]></category>
		<category><![CDATA[C#]]></category>

		<guid isPermaLink="false">http://blog.sharplab.net/computer/cprograming/3054/</guid>
		<description><![CDATA[先日のわんくま勉強会でtakeshikさんが使われているのをみて思い出したのですが、null結合演算子なんてものもありましたね。 private RelayCommand _startSearchCommand; public ICommand StartSearchCommand { get { if (_startSearchCommand == null) { _startSearchCommand = new RelayCommand(param =&#62; Model.SearchItemAsync(Keyword, null, 15, 0), null); } return _startSearchCommand; } } 今までM-V-VMのViewModelでのCommandの定義で、上のように書いていたのを、 public ICommand StartSearchCommand { get { return _startSearchCommand = _startSearchCommand ?? new RelayCommand(param =&#62; Model.SearchItemAsync(Keyword, null, 15, 0), null); } } こう書き換えられると。便利便利。 （※Reinさんの指摘を受けて修正。有難うございました。）]]></description>
			<content:encoded><![CDATA[<p>先日のわんくま勉強会でtakeshikさんが使われているのをみて思い出したのですが、null結合演算子なんてものもありましたね。</p>
<div class="wlWriterEditableSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:feab0327-4729-4291-8ec9-9cc348b11cc8" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px">
<pre name="code" class="c#">private RelayCommand _startSearchCommand;

public ICommand StartSearchCommand {
    get {
        if (_startSearchCommand == null) {
            _startSearchCommand = new RelayCommand(param =&gt; Model.SearchItemAsync(Keyword, null, 15, 0), null);
        }
        return _startSearchCommand;
    }
}</pre>
</div>
<p>今までM-V-VMのViewModelでのCommandの定義で、上のように書いていたのを、</p>
<div class="wlWriterEditableSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:9afa13ea-f03d-413d-9f9d-4bcb31efa066" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px">
<pre name="code" class="c#">public ICommand StartSearchCommand {
    get {
        return _startSearchCommand = _startSearchCommand ?? new RelayCommand(param =&gt; Model.SearchItemAsync(Keyword, null, 15, 0), null);
    }
}</pre>
</div>
<p>こう書き換えられると。便利便利。<br />
  <br />（※Reinさんの指摘を受けて修正。有難うございました。）</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.sharplab.net/blog/2009/04/27/null%e7%b5%90%e5%90%88%e6%bc%94%e7%ae%97%e5%ad%90/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Expression Blend向けに、Behaviorを自作してみた。</title>
		<link>http://blog.sharplab.net/blog/2009/04/24/expression-blend%e5%90%91%e3%81%91%e3%81%ab%e3%80%81behavior%e3%82%92%e8%87%aa%e4%bd%9c%e3%81%97%e3%81%a6%e3%81%bf%e3%81%9f%e3%80%82/</link>
		<comments>http://blog.sharplab.net/blog/2009/04/24/expression-blend%e5%90%91%e3%81%91%e3%81%ab%e3%80%81behavior%e3%82%92%e8%87%aa%e4%bd%9c%e3%81%97%e3%81%a6%e3%81%bf%e3%81%9f%e3%80%82/#comments</comments>
		<pubDate>Fri, 24 Apr 2009 12:39:28 +0000</pubDate>
		<dc:creator>shiroica</dc:creator>
				<category><![CDATA[WPF]]></category>
		<category><![CDATA[Attached Behavior]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Expression Blend]]></category>
		<category><![CDATA[M-]]></category>

		<guid isPermaLink="false">http://blog.sharplab.net/computer/cprograming/wpf/3052/</guid>
		<description><![CDATA[※今回のエントリはWPFでの話ですが、Silverlightでも参考になると思います。 Expression Blend 3で追加されたBehavior、元はと言えば、Attached Behavior（添付ビヘイビア）という名前でWPF/Silverlight開発者の間で親しまれていたパターンが、Expression Blend 3でデザイナのサポートを受けれるようになったものです。 添付ビヘイビアとは、内部的には添付プロパティを利用し、添付された要素への参照を得ることでそのイベントを購読し、そのイベントハンドラにおいて、オブジェクトに対する様々な操作を実現する便利なテクニックです。 BehaviorがExpression Blendでサポートされたことにより、要素に対する添付ビヘイビアの追加、削除を、コードを書かずにGUI操作だけでできるようになりました。また、Microsoft.Expression.Interactivity.dll内の抽象クラスを利用することで、実装もより容易になっています。 Preview版では現在のところBehaviorはExpression Blendに付属しておらず、別途ダウンロードしてきて参照に加えることが必要ですが（Sample Silverlight 3 Behaviors（Silverlight）やMicrosoft Expression Community Gallery）、自分で書いたBehaviorを使うことももちろん可能です。 今回は試しにBehaviorを自分で書いてみました。お題は以前書いた添付ビヘイビアでTextBoxにCommandを実装してみた &#8211; SharpLab.の再実装。 まずは&#60;Expression Blend3 Previewのインストールディレクトリ&#62;\Libraries\WPF以下に存在するMicrosoft.Expression.Interactivity.dllを参照を加えます。このアセンブリに含まれているBehavior&#60;T&#62;や、TriggerAction&#60;T&#62;などが、Behaviorを作る上での基本クラスとなるようです（他にもあるようですが、まだ追えていません）。さて、今回はTextBoxに添付するBehaviorなので、Behavior&#60;TextBox&#62;を継承したクラスを作ります。 using System.Windows; using System.Windows.Input; using Microsoft.Expression.Interactivity; using System.Windows.Controls; namespace SharpLab.IKnow.ItemBankPane { public class ExecuteCommandOnEnterKeyDownBehavior : Behavior&#60;TextBox&#62; { } } 続いて、アタッチ/デタッチされる時に実行されるOnAttach/OnDetachingメソッドを作成します。AssociatedObjectプロパティに添付対象の要素が入っているので、ここからイベントの購読/購読解消を行います。 using System.Windows; using System.Windows.Input; using Microsoft.Expression.Interactivity; using System.Windows.Controls; namespace SharpLab.IKnow.ItemBankPane { [...]]]></description>
			<content:encoded><![CDATA[<p>※今回のエントリはWPFでの話ですが、Silverlightでも参考になると思います。</p>
<p>Expression Blend 3で追加されたBehavior、元はと言えば、Attached Behavior（添付ビヘイビア）という名前でWPF/Silverlight開発者の間で親しまれていたパターンが、Expression Blend 3でデザイナのサポートを受けれるようになったものです。</p>
<p>添付ビヘイビアとは、内部的には添付プロパティを利用し、添付された要素への参照を得ることでそのイベントを購読し、そのイベントハンドラにおいて、オブジェクトに対する様々な操作を実現する便利なテクニックです。</p>
<p>BehaviorがExpression Blendでサポートされたことにより、要素に対する添付ビヘイビアの追加、削除を、コードを書かずにGUI操作だけでできるようになりました。また、Microsoft.Expression.Interactivity.dll内の抽象クラスを利用することで、実装もより容易になっています。</p>
<p><a rel="lightbox" href="http://blog.sharplab.net/wp-content/uploads/2009/04/image4.png"><img title="image" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="113" alt="image" src="http://blog.sharplab.net/wp-content/uploads/2009/04/image-thumb4.png" width="435" border="0" /></a></p>
<p>Preview版では現在のところBehaviorはExpression Blendに付属しておらず、<a href="http://blog.sharplab.net/computer/cprograming/wpf/3042/">別途ダウンロードしてきて参照に加えることが必要</a>ですが（<a href="http://gallery.expression.microsoft.com/SampleSLBehaviors">Sample Silverlight 3 Behaviors</a>（Silverlight）や<a href="http://gallery.expression.microsoft.com/site/items/behaviors">Microsoft Expression Community Gallery</a>）、自分で書いたBehaviorを使うことももちろん可能です。 今回は試しにBehaviorを自分で書いてみました。お題は以前書いた<a href="http://blog.sharplab.net/computer/cprograming/wpf/1862/">添付ビヘイビアでTextBoxにCommandを実装してみた &#8211; SharpLab.</a>の再実装。</p>
<p>まずは&lt;Expression Blend3 Previewのインストールディレクトリ&gt;\Libraries\WPF以下に存在するMicrosoft.Expression.Interactivity.dllを参照を加えます。このアセンブリに含まれているBehavior&lt;T&gt;や、TriggerAction&lt;T&gt;などが、Behaviorを作る上での基本クラスとなるようです（他にもあるようですが、まだ追えていません）。さて、今回はTextBoxに添付するBehaviorなので、Behavior&lt;TextBox&gt;を継承したクラスを作ります。</p>
</p>
<div class="wlWriterEditableSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:34b1b9fc-d676-4fec-b6fb-d59b6ebd3346" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px">
<pre name="code" class="c#">using System.Windows;
using System.Windows.Input;
using Microsoft.Expression.Interactivity;
using System.Windows.Controls;

namespace SharpLab.IKnow.ItemBankPane {
	public class ExecuteCommandOnEnterKeyDownBehavior : Behavior&lt;TextBox&gt; {
	}
}</pre>
</div>
<p>続いて、アタッチ/デタッチされる時に実行されるOnAttach/OnDetachingメソッドを作成します。AssociatedObjectプロパティに添付対象の要素が入っているので、ここからイベントの購読/購読解消を行います。</p>
</p>
<div class="wlWriterEditableSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:0cf72074-8e99-40ee-9df5-a70db9093612" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px">
<pre name="code" class="c#">using System.Windows;
using System.Windows.Input;
using Microsoft.Expression.Interactivity;
using System.Windows.Controls;

namespace SharpLab.IKnow.ItemBankPane {
	public class ExecuteCommandOnEnterKeyDownBehavior : Behavior&lt;TextBox&gt; {

		protected override void OnAttached() {
			base.OnAttached();

			this.AssociatedObject.KeyDown += OnKeyDown;
		}

		protected override void OnDetaching() {
			base.OnDetaching();

			this.AssociatedObject.KeyDown -= OnKeyDown;
		}

		void OnKeyDown(object sender, KeyEventArgs e) {

		}
	}
}</pre>
</div>
<p>さて、今回はCommandをEnterキーが押された時に実行するのが目的なので、まずはCommandを受け取れるように依存関係プロパティを実装します。</p>
</p>
<div class="wlWriterEditableSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:06a2d85a-c720-4ee9-84cb-6d66752748b0" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px">
<pre name="code" class="c#">using System.Windows;
using System.Windows.Input;
using Microsoft.Expression.Interactivity;
using System.Windows.Controls;

namespace SharpLab.IKnow.ItemBankPane {
	public class ExecuteCommandOnEnterKeyDownBehavior : Behavior&lt;TextBox&gt; {

		public string Command {
			get {
				return (string)GetValue(CommandProperty);
			}
			set {
				SetValue(CommandProperty, value);
			}
		}

		public static readonly DependencyProperty CommandProperty =
									DependencyProperty.Register("Command",
										typeof(string),
										typeof(ExecuteCommandOnEnterKeyDownBehavior));

		protected override void OnAttached() {
			base.OnAttached();

			this.AssociatedObject.KeyDown += OnKeyDown;
		}

		protected override void OnDetaching() {
			base.OnDetaching();

			this.AssociatedObject.KeyDown -= OnKeyDown;
		}

		void OnKeyDown(object sender, KeyEventArgs e) {
		}
	}
}</pre>
</div>
<p>Enterキーが押された時に、Commandが実行されるようにします。</p>
</p>
<div class="wlWriterEditableSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:82cdcbee-be58-48a3-8740-e6c73ae0e08d" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px">
<pre name="code" class="c#">using System.Windows;
using System.Windows.Input;
using Microsoft.Expression.Interactivity;
using System.Windows.Controls;

namespace SharpLab.IKnow.ItemBankPane {
	public class ExecuteCommandOnEnterKeyDownBehavior : Behavior&lt;TextBox&gt; {

		public string Command {
			get {
				return (string)GetValue(CommandProperty);
			}
			set {
				SetValue(CommandProperty, value);
			}
		}

		public static readonly DependencyProperty CommandProperty =
									DependencyProperty.Register("Command",
										typeof(string),
										typeof(ExecuteCommandOnEnterKeyDownBehavior));

		protected override void OnAttached() {
			base.OnAttached();

			this.AssociatedObject.KeyDown += OnKeyDown;
		}

		protected override void OnDetaching() {
			base.OnDetaching();

			this.AssociatedObject.KeyDown -= OnKeyDown;
		}

		void OnKeyDown(object sender, KeyEventArgs e) {
			if (e.Key == Key.Enter) {
				string path = Command;
				object dataContext = AssociatedObject.DataContext;
				ICommand command = dataContext.GetType().GetProperty(path).GetValue(dataContext, null) as ICommand;

				if (command != null &amp;&amp; command.CanExecute(AssociatedObject)) {
					command.Execute(AssociatedObject);
				}
			}
		}
	}
}</pre>
</div>
<p>これで完成しました！…と言いたいところですが、どうもMicrosoft.Expression.Interactivity.dllのバグか、これだけではコンパイルが通りません。どうもアセンブリ内にMicrosoft.Expression.Interactivity.Layout名前空間がないとコンパイルが通らないようで、適当にdummy.csというファイルを作っておき、</p>
<div class="wlWriterEditableSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:e66c83ba-7fe5-4662-854d-8333cfed3005" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px">
<pre name="code" class="c#">namespace Microsoft.Expression.Interactivity.Layout {}</pre>
</div>
<p>と一行書いておきましょう。</p>
<p><a rel="lightbox" href="http://blog.sharplab.net/wp-content/uploads/2009/04/image5.png"><img title="image" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="381" alt="image" src="http://blog.sharplab.net/wp-content/uploads/2009/04/image-thumb5.png" width="444" border="0" /></a> </p>
<p>これで、作成したBehaviorを参照に加えれば、AssetLibraryのBehaviorsタブに作ったBehaviorが追加されるようになります。</p>
<p><a rel="lightbox" href="http://blog.sharplab.net/wp-content/uploads/2009/04/image6.png"><img title="image" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="196" alt="image" src="http://blog.sharplab.net/wp-content/uploads/2009/04/image-thumb6.png" width="320" border="0" /></a> </p>
<p>あとは要素にD&amp;Dで添付した上で、プロパティペインから、諸々のプロパティを設定すれば使えるようになります。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.sharplab.net/blog/2009/04/24/expression-blend%e5%90%91%e3%81%91%e3%81%ab%e3%80%81behavior%e3%82%92%e8%87%aa%e4%bd%9c%e3%81%97%e3%81%a6%e3%81%bf%e3%81%9f%e3%80%82/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Expression Blend 3のBehaviorサポート</title>
		<link>http://blog.sharplab.net/blog/2009/04/21/expression-blend-3%e3%81%aebehavior%e3%82%b5%e3%83%9d%e3%83%bc%e3%83%88/</link>
		<comments>http://blog.sharplab.net/blog/2009/04/21/expression-blend-3%e3%81%aebehavior%e3%82%b5%e3%83%9d%e3%83%bc%e3%83%88/#comments</comments>
		<pubDate>Tue, 21 Apr 2009 07:38:44 +0000</pubDate>
		<dc:creator>shiroica</dc:creator>
				<category><![CDATA[WPF]]></category>
		<category><![CDATA[Attached Behavior]]></category>
		<category><![CDATA[Expression Blend]]></category>
		<category><![CDATA[M-V-VM]]></category>

		<guid isPermaLink="false">http://blog.sharplab.net/computer/cprograming/wpf/3042/</guid>
		<description><![CDATA[昨日はMicrosoft新宿本社で開かれたCodeseek勉強会に参加させて頂きました。今回はMicrosoftのエバンジェリストである大西さんによるSilverlight3とExpression Blend 3についての話でした。大変興味深い話ばかりが凝縮された二時間で、大いに勉強になりました。皆様どうも有難うございました。 全体を通して感じたのは、Expression Blendのツールとしての有用性。正直、今まで自分はExpression BlendをVisualStudioよりちょっとデザイナが使いやすいXAMLエディタとしてしか使えておらず、タグは手書きすることが多くて有効活用できているとは言い難かったのですが、これからはBlendの支援機能も使いこなせるようになったほうが得だなと感じました。 さて、紹介された中で、特に自分が気になったのはExpression Blend 3によるBehaviorのサポート。Expression Blend3ではBehaviorがサポートされ、それはどうも添付ビヘイビアのことらしい…、というのはネットでちらちら聞いていたのですが、実際にBehaviorを使った開発のデモを見せて頂いて、動いているのを見ると非常に便利そうな印象を受けたので、早速自分でも試してみました。 実際のExpression Blendの操作については大西さんによるAkira Onishi&#8217;s weblog : Expression Blend 3: Behaviorを使ったコーディングレスでのSilverlight 3アプリのインタラクションデザインというエントリに詳しいのですが、一点補足しますと、Expression Blend 3 PreviewでBehaviorを使うに当たっては、Behaviorを定義したアセンブリを自分で参照に加える必要があります。kirupaBlog &#8211; If it isn’t broken, take it apart and fix it! » Blog Archive » Using Behaviors : A Quick Walkthroughというエントリにある通り、Sample Silverlight 3 Behaviors辺りから適切なのを探してMicrosoft.Expression.Interactivity.dllと、ビヘイビアのdllを参照に加えて下さい。そうしないと、[Asset Library]の[Behaviors]の項には何も表示されません。製品版ではMSお手製ビヘイビアのアセンブリもFCLに同梱されるか、Silverlight Extentionに同梱されてほしいですね。 この例ではBehaviorである必要ありませんが、一応、テストしてみたときのXAMLソースを載せておきます。もちろんコードビハインドはありません。 ボタンがY軸を中心に回転する例： &#60;UserControl xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" [...]]]></description>
			<content:encoded><![CDATA[<p>昨日はMicrosoft新宿本社で開かれたCodeseek勉強会に参加させて頂きました。今回はMicrosoftのエバンジェリストである大西さんによるSilverlight3とExpression Blend 3についての話でした。大変興味深い話ばかりが凝縮された二時間で、大いに勉強になりました。皆様どうも有難うございました。</p>
<p>全体を通して感じたのは、Expression Blendのツールとしての有用性。正直、今まで自分はExpression BlendをVisualStudioよりちょっとデザイナが使いやすいXAMLエディタとしてしか使えておらず、タグは手書きすることが多くて有効活用できているとは言い難かったのですが、これからはBlendの支援機能も使いこなせるようになったほうが得だなと感じました。</p>
<p>さて、紹介された中で、特に自分が気になったのは<a href="http://blogs.msdn.com/aonishi/archive/2009/03/24/9503769.aspx">Expression Blend 3によるBehaviorのサポート</a>。Expression Blend3ではBehaviorがサポートされ、それはどうも<a href="http://blog.sharplab.net/computer/cprograming/wpf/1856/">添付ビヘイビア</a>のことらしい…、というのは<a href="http://geekswithblogs.net/lbugnion/archive/2009/04/05/using-a-behavior-to-magnify-your-wpf-applications.aspx">ネットでちらちら聞いていた</a>のですが、実際にBehaviorを使った開発のデモを見せて頂いて、動いているのを見ると非常に便利そうな印象を受けたので、早速自分でも試してみました。</p>
<p>実際のExpression Blendの操作については大西さんによる<a href="http://blogs.msdn.com/aonishi/archive/2009/03/24/9503769.aspx">Akira Onishi&#8217;s weblog : Expression Blend 3: Behaviorを使ったコーディングレスでのSilverlight 3アプリのインタラクションデザイン</a>というエントリに詳しいのですが、一点補足しますと、Expression Blend 3 PreviewでBehaviorを使うに当たっては、Behaviorを定義したアセンブリを自分で参照に加える必要があります。<a href="http://blog.kirupa.com/?p=351">kirupaBlog &#8211; If it isn’t broken, take it apart and fix it! » Blog Archive » Using Behaviors : A Quick Walkthrough</a>というエントリにある通り、<a href="http://gallery.expression.microsoft.com/SampleSLBehaviors">Sample Silverlight 3 Behaviors</a>辺りから適切なのを探してMicrosoft.Expression.Interactivity.dllと、ビヘイビアのdllを参照に加えて下さい。そうしないと、[Asset Library]の[Behaviors]の項には何も表示されません。製品版ではMSお手製ビヘイビアのアセンブリもFCLに同梱されるか、Silverlight Extentionに同梱されてほしいですね。</p>
<p>この例ではBehaviorである必要ありませんが、一応、テストしてみたときのXAMLソースを載せておきます。もちろんコードビハインドはありません。   <br />ボタンがY軸を中心に回転する例：</p>
<p>
<div class="wlWriterEditableSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:75f38d5b-5fe8-4cb1-b2c6-0df06693c0c3" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px">
<pre name="code" class="xml">&lt;UserControl
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:i="clr-namespace:Microsoft.Expression.Interactivity;assembly=Microsoft.Expression.Interactivity" xmlns:SLPreviewBehaviorsLibrary="clr-namespace:SLPreviewBehaviorsLibrary;assembly=SLPreviewBehaviorsLibrary" x:Class="Silverlight3Testbed.MainPage"
    Width="400" Height="300" mc:Ignorable="d"&gt;
	&lt;UserControl.Resources&gt;
		&lt;Storyboard x:Name="Storyboard1" AutoReverse="True" RepeatBehavior="Forever"&gt;
			&lt;DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="button" Storyboard.TargetProperty="(UIElement.Projection).(PlaneProjection.RotationX)"&gt;
				&lt;EasingDoubleKeyFrame KeyTime="00:00:00" Value="0"/&gt;
				&lt;EasingDoubleKeyFrame KeyTime="00:00:03" Value="180"/&gt;
			&lt;/DoubleAnimationUsingKeyFrames&gt;
			&lt;DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="button" Storyboard.TargetProperty="(UIElement.Projection).(PlaneProjection.RotationY)" Duration="00:00:00.0010000"&gt;
				&lt;EasingDoubleKeyFrame KeyTime="00:00:00" Value="0"/&gt;
			&lt;/DoubleAnimationUsingKeyFrames&gt;
			&lt;DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="button" Storyboard.TargetProperty="(UIElement.Projection).(PlaneProjection.RotationZ)" Duration="00:00:00.0010000"&gt;
				&lt;EasingDoubleKeyFrame KeyTime="00:00:00" Value="0"/&gt;
			&lt;/DoubleAnimationUsingKeyFrames&gt;
		&lt;/Storyboard&gt;
	&lt;/UserControl.Resources&gt;
    &lt;Grid x:Name="LayoutRoot" Background="White"&gt;
    	&lt;Button x:Name="button" Height="57" Margin="84,86,196,0" VerticalAlignment="Top" Content="Button"&gt;
    		&lt;Button.Projection&gt;
    			&lt;PlaneProjection RotationX="0" RotationY="0" RotationZ="0"/&gt;
    		&lt;/Button.Projection&gt;
    		&lt;i:Interaction.Triggers&gt;
    			&lt;i:EventTrigger EventName="Click"&gt;
    				&lt;SLPreviewBehaviorsLibrary:PlayStoryboardAction StoryboardName="Storyboard1"/&gt;
    			&lt;/i:EventTrigger&gt;
    		&lt;/i:Interaction.Triggers&gt;
    	&lt;/Button&gt;

    &lt;/Grid&gt;
&lt;/UserControl&gt;
</pre>
</div>
<p>Behaviorについては、もう少し追ってみようと思います。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.sharplab.net/blog/2009/04/21/expression-blend-3%e3%81%aebehavior%e3%82%b5%e3%83%9d%e3%83%bc%e3%83%88/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ItemsControlのItemTemplate</title>
		<link>http://blog.sharplab.net/blog/2009/04/20/itemscontrol%e3%81%aeitemtemplate/</link>
		<comments>http://blog.sharplab.net/blog/2009/04/20/itemscontrol%e3%81%aeitemtemplate/#comments</comments>
		<pubDate>Mon, 20 Apr 2009 06:16:28 +0000</pubDate>
		<dc:creator>shiroica</dc:creator>
				<category><![CDATA[WPF]]></category>
		<category><![CDATA[C#]]></category>

		<guid isPermaLink="false">http://blog.sharplab.net/computer/cprograming/wpf/3041/</guid>
		<description><![CDATA[ここ数日System.Windows.Controls.Primitives.Selectorを継承したコントロールを作ろうとしてもがいていたのですが、 ItemTemplateのデータテンプレートはItemsSourceを使ったときだけ有効だと思っていましたが、WPFのListBoxコントロールやComboBoxコントロールはコンテンツに対しても有効なようです。なお、なぜかItemsControlを使うと無効になります。 WPFではコンテンツに対してもデータテンプレートを利用できる &#8211; Yuya Yamaki’s blog で大いに悩まされました。SelectorとかItemsControlではItemTemplateをコンテンツに対して適用できないんですね･･･。不便。]]></description>
			<content:encoded><![CDATA[<p>ここ数日<a href="http://msdn.microsoft.com/ja-jp/library/system.windows.controls.primitives.selector%28VS.95%29.aspx">System.Windows.Controls.Primitives.Selector</a>を継承したコントロールを作ろうとしてもがいていたのですが、</p>
<blockquote><p>ItemTemplateのデータ<a href="http://d.hatena.ne.jp/keyword/%a5%c6%a5%f3%a5%d7%a5%ec%a1%bc%a5%c8">テンプレート</a>はItemsSourceを使ったときだけ有効だと思っていましたが、WPFのListBoxコントロールやComboBoxコントロールはコンテンツに対しても有効なようです。なお、なぜかItemsControlを使うと無効になります。       <br /><a href="http://d.hatena.ne.jp/Yamaki/20090326/1238050638">WPFではコンテンツに対してもデータテンプレートを利用できる &#8211; Yuya Yamaki’s blog</a></p>
</blockquote>
<p>で大いに悩まされました。SelectorとかItemsControlではItemTemplateをコンテンツに対して適用できないんですね･･･。不便。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.sharplab.net/blog/2009/04/20/itemscontrol%e3%81%aeitemtemplate/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>WPCustomFieldsEditor更新</title>
		<link>http://blog.sharplab.net/blog/2009/04/17/wpcustomfieldseditor%e6%9b%b4%e6%96%b0/</link>
		<comments>http://blog.sharplab.net/blog/2009/04/17/wpcustomfieldseditor%e6%9b%b4%e6%96%b0/#comments</comments>
		<pubDate>Fri, 17 Apr 2009 08:13:29 +0000</pubDate>
		<dc:creator>shiroica</dc:creator>
				<category><![CDATA[WPCustomFieldsEditor]]></category>
		<category><![CDATA[Windows Live Writer]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[XML-RPC]]></category>

		<guid isPermaLink="false">http://blog.sharplab.net/?p=3029</guid>
		<description><![CDATA[動かなくなったまま放置していたWPCustomFieldsEditor、修正したものと差し替えました。WPCustomFieldsEditorは、その名の通り、WordPressのカスタムフィールドを修正するためのWindows Live Writerのプラグインです。 Windows Live Writerがアップデートしたら動かなくなっていたのは、横着してWLWの内部的なアセンブリを直接参照した時点でまぁ予見出来た話ではあるのですが･･･。今回はちゃんとリフレクションで書き直しております。また、WordPressとのやり取りも、WP-XML-RPCLib2で行うように変更しました。 WPCustomFieldsEditor.zip ソースコード：WPCustomFieldsEditor.sln.zip]]></description>
			<content:encoded><![CDATA[<p>動かなくなったまま放置していた<a href="http://blog.sharplab.net/computer/cprograming/windowslivewriter/wpcustomfieldseditor/789/">WPCustomFieldsEditor</a>、修正したものと差し替えました。WPCustomFieldsEditorは、その名の通り、WordPressのカスタムフィールドを修正するためのWindows Live Writerのプラグインです。</p>
<p>Windows Live Writerがアップデートしたら動かなくなっていたのは、横着してWLWの内部的なアセンブリを直接参照した時点でまぁ予見出来た話ではあるのですが･･･。今回はちゃんとリフレクションで書き直しております。また、WordPressとのやり取りも、WP-XML-RPCLib2で行うように変更しました。</p>
<p><a href="http://depot.sharplab.net/CSharp/WLWPlugin/WPCustomFieldsEditor.zip">WPCustomFieldsEditor.zip</a></p>
<p>ソースコード：<a href="http://depot.sharplab.net/CSharp/WLWPlugin/WPCustomFieldsEditor.sln.zip">WPCustomFieldsEditor.sln.zip</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.sharplab.net/blog/2009/04/17/wpcustomfieldseditor%e6%9b%b4%e6%96%b0/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>idがずれてもパーマリンクが切れないようにする方法</title>
		<link>http://blog.sharplab.net/blog/2009/04/14/id%e3%81%8c%e3%81%9a%e3%82%8c%e3%81%a6%e3%82%82%e3%83%91%e3%83%bc%e3%83%9e%e3%83%aa%e3%83%b3%e3%82%af%e3%81%8c%e5%88%87%e3%82%8c%e3%81%aa%e3%81%84%e3%82%88%e3%81%86%e3%81%ab%e3%81%99%e3%82%8b%e6%96%b9/</link>
		<comments>http://blog.sharplab.net/blog/2009/04/14/id%e3%81%8c%e3%81%9a%e3%82%8c%e3%81%a6%e3%82%82%e3%83%91%e3%83%bc%e3%83%9e%e3%83%aa%e3%83%b3%e3%82%af%e3%81%8c%e5%88%87%e3%82%8c%e3%81%aa%e3%81%84%e3%82%88%e3%81%86%e3%81%ab%e3%81%99%e3%82%8b%e6%96%b9/#comments</comments>
		<pubDate>Tue, 14 Apr 2009 04:38:49 +0000</pubDate>
		<dc:creator>shiroica</dc:creator>
				<category><![CDATA[WP-XML-RPCLIB]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[XML-RPC]]></category>

		<guid isPermaLink="false">http://blog.sharplab.net/computer/cprograming/wp-xml-rpclib/3019/</guid>
		<description><![CDATA[WordPressではpost_idをパーマリンクの中に入れておくと、移転時にpost_idがずれたときにパーマリンクが切れてしまうという問題があるらしいです。idがずれるとか、そんなバカな話があるか！とも思いますが、致し方ないので対応策を考えてみました。 結論から言うとまだ上手くいっていないのですが、とりあえず何を試してどこで躓いているかを記したいと思います。 まずよく言われるのが、パーマリンクをpost_nameで指定するという方法。でもこれでは記事のタイトルを後で変更したときに、タイトルとスラッグに不一致が出てしまい、個人的に好きじゃありません。一度エントリをあげてからよく手直しをする自分としては嬉しくなく、数字のIDが使いたいのです。そこで他の方法を探してみました。で参考になったのは池田百合子さんによる以下のページへのコメント欄。 「過去記事の post_name として post_id を指定すれば単純に解決」 WordPress のパーマリンク設定を変更 &#124; Numb. なるほど～。投稿スラッグにpost_idを入れればいいのか！過去記事に対して投稿スラッグにpost_idを指定するバッチ処理をした上で、投稿時に投稿スラッグにpost_idを設定するWordPressのプラグインを作っておくというやり方が良いかもしれないですね。 そこでまずバッチ処理用のコンソールアプリを作成。WordPressのXML-RPC APIを利用して全てのエントリのスラッグをidで上書きします。SQL文でも出来るような気もしますが、せっかく作ったライブラリを使ってみます。 ※実行には.Net Framework 3.5 SP1がインストールされている必要があります。 SharpLab.WP-PostSlugRewriter.zip ソースコード：SharpLab.WP-PostSlugRewriter.sln.zip 実行するに当たっては、前もって必ずBlogのデータのバックアップを取っておいてください。万が一データが破損した場合でも責任は負えません。また、このコンソールアプリでは既に設定されている投稿スラッグも構わず上書きします。あえて残しておきたいスラッグがある場合は（特にページ）、メモしておいて後で直してください。 続いて作りたるは投稿時にスラッグを書き換えるWordPressのプラグイン。フィルタするだけなので簡単お手軽。 中身はこの通り。 &#60;?php /* Plugin Name:wp-idslug Plugin URI:http://www.sharplab.net/ Description:新規エントリの投稿時にエントリのスラッグにidをセットします。 Author:shiroica Version:1.00 Author URI:http://blog.sharplab.net/ */ function sharplab_wpidslug_rewriteNewPost($id){ $currentState = get_post($id); if($currentState-&#62;post_name != $currentState-&#62;ID){ $post = array(); $post['ID'] = $currentState-&#62;ID; $post['post_name'] = $currentState-&#62;ID; wp_update_post($post); } [...]]]></description>
			<content:encoded><![CDATA[<p>WordPressではpost_idをパーマリンクの中に入れておくと、<a href="http://wp.tekapo.com/2008/12/23/the-very-first-steps-after-a-fresh-wordpress-install/">移転時にpost_idがずれたときにパーマリンクが切れてしまうという問題があるらしい</a>です。idがずれるとか、そんなバカな話があるか！とも思いますが、致し方ないので対応策を考えてみました。</p>
<p>結論から言うとまだ上手くいっていないのですが、とりあえず何を試してどこで躓いているかを記したいと思います。</p>
<p>まずよく言われるのが、パーマリンクをpost_nameで指定するという方法。でもこれでは記事のタイトルを後で変更したときに、タイトルとスラッグに不一致が出てしまい、個人的に好きじゃありません。一度エントリをあげてからよく手直しをする自分としては嬉しくなく、数字のIDが使いたいのです。そこで他の方法を探してみました。で参考になったのは<a href="http://www.yuriko.net/">池田百合子</a>さんによる以下のページへのコメント欄。</p>
<blockquote><p>「過去記事の post_name として post_id を指定すれば単純に解決」      <br /><a href="http://wp.graphact.com/2009/03/21/wp_permalink-redirect">WordPress のパーマリンク設定を変更 | Numb.</a></p>
</blockquote>
<p>なるほど～。投稿スラッグにpost_idを入れればいいのか！過去記事に対して投稿スラッグにpost_idを指定するバッチ処理をした上で、投稿時に投稿スラッグにpost_idを設定するWordPressのプラグインを作っておくというやり方が良いかもしれないですね。</p>
<p>そこでまずバッチ処理用のコンソールアプリを作成。WordPressのXML-RPC APIを利用して全てのエントリのスラッグをidで上書きします。SQL文でも出来るような気もしますが、せっかく作ったライブラリを使ってみます。</p>
<p>※実行には<a href="http://www.microsoft.com/downloads/details.aspx?familyid=AB99342F-5D1A-413D-8319-81DA479AB0D7&amp;displaylang=ja">.Net Framework 3.5 SP1</a>がインストールされている必要があります。</p>
<p><a href="http://depot.sharplab.net/CSharp/XMLRPC/SharpLab.WP-PostSlugRewriter.zip">SharpLab.WP-PostSlugRewriter.zip</a> </p>
<p>ソースコード：<a href="http://depot.sharplab.net/CSharp/XMLRPC/SharpLab.WP-PostSlugRewriter.sln.zip">SharpLab.WP-PostSlugRewriter.sln.zip</a></p>
<p><strong>実行するに当たっては、前もって必ずBlogのデータのバックアップを取っておいてください。万が一データが破損した場合でも責任は負えません。また、このコンソールアプリでは既に設定されている投稿スラッグも構わず上書きします。あえて残しておきたいスラッグがある場合は（特にページ）、メモしておいて後で直してください。</strong></p>
<p>続いて作りたるは投稿時にスラッグを書き換えるWordPressのプラグイン。フィルタするだけなので簡単お手軽。</p>
<p>中身はこの通り。    </p>
<div class="wlWriterEditableSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:54c1e521-b2f2-4f10-a203-52af93f6eaec" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px">
<pre name="code" class="php">&lt;?php
/*
Plugin Name:wp-idslug
Plugin URI:http://www.sharplab.net/
Description:新規エントリの投稿時にエントリのスラッグにidをセットします。
Author:shiroica
Version:1.00
Author URI:http://blog.sharplab.net/
*/

function sharplab_wpidslug_rewriteNewPost($id){

	$currentState = get_post($id);
	if($currentState-&gt;post_name != $currentState-&gt;ID){
		$post = array();
		$post['ID'] = $currentState-&gt;ID;
		$post['post_name'] = $currentState-&gt;ID;
		wp_update_post($post);
	}

}

add_filter('save_post','sharplab_wpidslug_rewriteNewPost')

?&gt;</pre>
</div>
<p>これをWordPressのプラグインフォルダに放り込んでおいた上で、有効化しておきます。これで、全ての記事のスラッグにidが入るようになりました。そこでパーマリンク設定を変更します。</p>
<p>post_idになっているものを<br />
  </p>
</p>
<div class="wlWriterEditableSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:ee5fc36f-271f-45cb-8428-d72ade938729" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px">
<pre name="code" class="xml">/%category%/%post_id%/</pre>
</div>
<p>postnameに。<br />
  </p>
<div class="wlWriterEditableSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:b691b851-c7e1-4b2c-a1e9-d9b58bd8fa12" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px">
<pre name="code" class="xml">/%category%/%postname%/</pre>
</div>
<p>postnameにはpost_idが入っているはずなので、これで上手くいくはず…なのですが、なぜか上手くいきません。上手く表示されるページもあるのですが、ページによっては404 Not Foundが返されるのですね。 </p>
</p>
<p>しかし、年月とpostnameによるパーマリンクでは、（パーマリンクは変わりますが）上手く表示されるという…。</p>
</p>
<div class="wlWriterEditableSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:21c1de2f-1d25-4f2a-b131-1c68eb122e4e" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px">
<pre name="code" class="xml">/%year%/%monthnum%/%postname%/</pre>
</div>
<p>どなたか解決策が分かる方いらっしゃいませんでしょうか…。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.sharplab.net/blog/2009/04/14/id%e3%81%8c%e3%81%9a%e3%82%8c%e3%81%a6%e3%82%82%e3%83%91%e3%83%bc%e3%83%9e%e3%83%aa%e3%83%b3%e3%82%af%e3%81%8c%e5%88%87%e3%82%8c%e3%81%aa%e3%81%84%e3%82%88%e3%81%86%e3%81%ab%e3%81%99%e3%82%8b%e6%96%b9/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>WP-XML-RPCLib2</title>
		<link>http://blog.sharplab.net/blog/2009/04/12/wp-xml-rpclib2/</link>
		<comments>http://blog.sharplab.net/blog/2009/04/12/wp-xml-rpclib2/#comments</comments>
		<pubDate>Sun, 12 Apr 2009 03:07:40 +0000</pubDate>
		<dc:creator>shiroica</dc:creator>
				<category><![CDATA[WP-XML-RPCLIB]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[XML-RPC]]></category>

		<guid isPermaLink="false">http://blog.sharplab.net/computer/cprograming/wp-xml-rpclib/3015/</guid>
		<description><![CDATA[今日はWordCamp Tokyoですね。自分も参加していて、WordPressの開発者、Matt Mullenwegによる基調講演を聴き終わり、今昼飯を食べながらMattへの質問を考えているところです。いや～P2（WordPress Prologue）は初めて知ったのですが、WordPressをtwitterクローンに出来るWPテーマだそうで、結構期待したいですね。 さて、WordPressといえば前にWordPressのXML-RPC APIを叩くための.netのライブラリを作ったものの、呼び出しの書き難い状態のままで放置していて、まずい状態だなぁということで、一念奮起して一から書き直してみました。今度はLINQ to XMLを使って書き直し。前のに比べたらソースコードもすっきりして、使いやすく、またメンテし易くなったかと思います。（ただ、XML-RPCの値を表すクラスをバリューオブジェクトとして実装したのは設計としてちょっと失敗だったかもしれません。。。） SharpLab.XML-RPCLib2.zip 前のバージョンと同じく、XML-RPCを使うための汎用ライブラリと、それを利用して実装したWordPressのXML-RPC API操作用のライブラリ、及びそれらのCompact Framework版を用意しています。 APIを通じたBlog操作の自動化はなかなか面白いものですので、一度お試しいただければと思います。]]></description>
			<content:encoded><![CDATA[<p><a rel="lightbox" href="http://blog.sharplab.net/wp-content/uploads/2009/04/image2.png"><img title="image" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; margin-left: 0px; margin-right: 0px; border-right-width: 0px" height="1077" alt="image" src="http://blog.sharplab.net/wp-content/uploads/2009/04/image-thumb2.png" width="235" align="right" border="0" /></a> 今日はWordCamp Tokyoですね。自分も参加していて、WordPressの開発者、Matt Mullenwegによる基調講演を聴き終わり、今昼飯を食べながらMattへの質問を考えているところです。いや～P2（WordPress Prologue）は初めて知ったのですが、WordPressをtwitterクローンに出来るWPテーマだそうで、結構期待したいですね。</p>
<p>さて、WordPressといえば前にWordPressのXML-RPC APIを叩くための.netのライブラリを作ったものの、呼び出しの書き難い状態のままで放置していて、まずい状態だなぁということで、一念奮起して一から書き直してみました。今度はLINQ to XMLを使って書き直し。前のに比べたらソースコードもすっきりして、使いやすく、またメンテし易くなったかと思います。（ただ、XML-RPCの値を表すクラスをバリューオブジェクトとして実装したのは設計としてちょっと失敗だったかもしれません。。。）</p>
<p><a href="http://depot.sharplab.net/CSharp/XMLRPC/SharpLab.XML-RPCLib2.zip">SharpLab.XML-RPCLib2.zip</a></p>
<p>前のバージョンと同じく、XML-RPCを使うための汎用ライブラリと、それを利用して実装したWordPressのXML-RPC API操作用のライブラリ、及びそれらのCompact Framework版を用意しています。</p>
<p>APIを通じたBlog操作の自動化はなかなか面白いものですので、一度お試しいただければと思います。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.sharplab.net/blog/2009/04/12/wp-xml-rpclib2/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>WindowsMobieでの開発ねぇ&#8230;。</title>
		<link>http://blog.sharplab.net/blog/2009/03/24/1873/</link>
		<comments>http://blog.sharplab.net/blog/2009/03/24/1873/#comments</comments>
		<pubDate>Mon, 23 Mar 2009 16:33:10 +0000</pubDate>
		<dc:creator>shiroica</dc:creator>
				<category><![CDATA[Windows Mobile]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Mobile]]></category>
		<category><![CDATA[Silverlight]]></category>
		<category><![CDATA[WindowsMobile]]></category>

		<guid isPermaLink="false">http://blog.sharplab.net/computer/cprograming/windows-mobile/1873/</guid>
		<description><![CDATA[「Windows Mobile のアプリケーションプラットフォームは古すぎる」 という点である。 確かにOSのバージョンもFramework のバージョンもあがっているが、できることはほぼまったく変わっていない。比較的作りやすくなっただけでできることは変わっていない。特にUI周りは壊滅的である。 高橋 忍のブログ : 古すぎる Windows Mobile アプリケーション環境 ですよねぇ。この前のPDCでのSilverlight2 for Mobileのセッションでの発表で、ついにWMでも高機能なUIコントロールが利用できるようになるのか！と心踊らされたものの、Mixでも新しい発表がなく、前に発表されたロードマップはまったくあてになりそうにない。救いとしては、最近の流行のタッチ操作に最適化されたコントロールとしてFluid &#8211; Windows Mobile .NET Touch Controls &#8211; HomeというのがCodePlexにあがってはいることだけれど、本来はコントロール位標準で用意されていないと手間がかかって仕方がない。Fluidにはデザイナのサポート、整備されたドキュメントは当然期待できないし、実際試してみたところどうも日本語入力が出来ないようでもある。なまじWPFの自由なUIデザインの世界を知っているだけに、なんでWindowsMobileは…と思わずにはいられない。（ついでに言うとVS2010でのスマートデバイス開発がどうなるかも結構気になっている。C#4.0やら出てくるわけだけど、Compact Frameworkはどう進むのか。VS2010の次のCTPだかβリリースだかで情報が出てこないかなぁとちょっと期待しているとこ。） しかしまぁ何にせよ時間がかかりそうだなぁ…。最近じゃSilverlight(1) for MobileのリリースとWindows Mobile 6.5の発表位で、WM関係では小粒なニュースばかりだから、（まさか携帯端末市場を捨てた訳でなければ）そろそろ大きな花火を打ち上げて欲しいんですけどねぇ…。そうでないと、それこそWM上でリッチなアプリケーションを手軽に作る方法が、.net CFではなく、FennecのアドインとしてXUL+JavaScriptで何か作る、という話になりかねない。]]></description>
			<content:encoded><![CDATA[<blockquote><p>「Windows Mobile のアプリケーションプラットフォームは古すぎる」</p>
<p>という点である。</p>
<p>確かにOSのバージョンもFramework のバージョンもあがっているが、できることはほぼまったく変わっていない。比較的作りやすくなっただけでできることは変わっていない。特にUI周りは壊滅的である。</p>
<p><a href="http://blogs.msdn.com/shintak/archive/2009/03/23/9500697.aspx">高橋 忍のブログ : 古すぎる Windows Mobile アプリケーション環境</a></p>
</blockquote>
<p>ですよねぇ。この前のPDCでのSilverlight2 for Mobileのセッションでの発表で、ついにWMでも高機能なUIコントロールが利用できるようになるのか！と心踊らされたものの、Mixでも新しい発表がなく、前に発表された<a href="http://uchukamen.spaces.live.com/blog/cns!7CB203A44BF94940!532.entry?wa=wsignin1.0&amp;sa=699209494">ロードマップ</a>はまったくあてになりそうにない。救いとしては、最近の流行のタッチ操作に最適化されたコントロールとして<a href="http://fluid.codeplex.com/">Fluid &#8211; Windows Mobile .NET Touch Controls &#8211; Home</a>というのがCodePlexにあがってはいることだけれど、本来はコントロール位標準で用意されていないと手間がかかって仕方がない。Fluidにはデザイナのサポート、整備されたドキュメントは当然期待できないし、実際試してみたところどうも日本語入力が出来ないようでもある。なまじWPFの自由なUIデザインの世界を知っているだけに、なんでWindowsMobileは…と思わずにはいられない。（ついでに言うとVS2010でのスマートデバイス開発がどうなるかも結構気になっている。C#4.0やら出てくるわけだけど、Compact Frameworkはどう進むのか。VS2010の次のCTPだかβリリースだかで情報が出てこないかなぁとちょっと期待しているとこ。）</p>
<p>しかしまぁ何にせよ時間がかかりそうだなぁ…。最近じゃSilverlight(1) for MobileのリリースとWindows Mobile 6.5の発表位で、WM関係では小粒なニュースばかりだから、（まさか携帯端末市場を捨てた訳でなければ）そろそろ大きな花火を打ち上げて欲しいんですけどねぇ…。そうでないと、それこそWM上でリッチなアプリケーションを手軽に作る方法が、.net CFではなく、FennecのアドインとしてXUL+JavaScriptで何か作る、という話になりかねない。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.sharplab.net/blog/2009/03/24/1873/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>M-V-VMパターンでsmart.fmの辞書アプリを書きなおしてみた</title>
		<link>http://blog.sharplab.net/blog/2009/03/15/1866/</link>
		<comments>http://blog.sharplab.net/blog/2009/03/15/1866/#comments</comments>
		<pubDate>Sun, 15 Mar 2009 08:58:25 +0000</pubDate>
		<dc:creator>shiroica</dc:creator>
				<category><![CDATA[iKnowItemBankPanel]]></category>
		<category><![CDATA[WPF]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[iKnow]]></category>
		<category><![CDATA[M-V-VM]]></category>

		<guid isPermaLink="false">http://blog.sharplab.net/computer/cprograming/wpf/1866/</guid>
		<description><![CDATA[以前公開したiKnow ItemBankPanel for VisualStudioをM-V-VMパターンを使って書き直しています。まだ途中ですが、一応辞書を引いて結果を表示するとこまでは出来たので、M-V-VMパターンの参考までに公開してみます。WPF自体よく分かっていなかった前のコードと比べると見違えるような綺麗さになりましたｗ &#160; SharpLab.IKnow.ItemBankPanes.zip &#160; 添付ビヘイビアでTextBoxにCommandを実装してみた &#8211; SharpLab.の添付ビヘイビアは上の検索ツールバーで、添付ビヘイビア試してみた &#8211; SharpLab.で紹介した添付ビヘイビアは検索結果を表示しているListBoxで実際に使用しています。 M-V-VMパターンの威力 埋め草までに、ViewのXAMLコードを貼っておきます。このアプリではUIロジックに複雑なところがなかったので、実際、コードビハインドにイベントハンドラを書かずに済みました。ボタンクリックやTextBoxでのEnterキー押下時の処理は、全てCommandを使ってViewModelに移譲しています。 &#60;UserControl x:Class="SharpLab.IKnow.ItemBankPane.ItemBankPaneView" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="clr-namespace:SharpLab.IKnow.ItemBankPane" &#62; &#60;UserControl.Resources&#62; &#60;ResourceDictionary&#62; &#60;local:ItemBankPaneViewModel x:Key="viewModel" /&#62; &#60;/ResourceDictionary&#62; &#60;/UserControl.Resources&#62; &#60;UserControl.DataContext&#62; &#60;Binding Mode="OneTime" Source="{StaticResource viewModel}" /&#62; &#60;/UserControl.DataContext&#62; &#60;DockPanel&#62; &#60;ToolBar DockPanel.Dock="Top" Height="30" VerticalAlignment="Top"&#62; &#60;TextBox local:TextBoxBehavior.Command="{Binding Mode=OneTime, Path=StartSearchCommand}" HorizontalAlignment="Left" Text="{Binding Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, Path=Keyword}" VerticalAlignment="Top" Width="184" /&#62; &#60;Button Command="{Binding Mode=OneTime, Path=StartSearchCommand}" [...]]]></description>
			<content:encoded><![CDATA[<p><a rel="lightbox" href="http://blog.sharplab.net/wp-content/uploads/2009/03/image.png"><img title="image" style="border-right: 0px; border-top: 0px; display: inline; margin-left: 0px; border-left: 0px; margin-right: 0px; border-bottom: 0px" height="285" alt="image" src="http://blog.sharplab.net/wp-content/uploads/2009/03/image-thumb.png" width="254" align="right" border="0" /></a>以前公開した<a href="http://blog.sharplab.net/iknowitembankforvisualstudio/">iKnow ItemBankPanel for VisualStudio</a>をM-V-VMパターンを使って書き直しています。まだ途中ですが、一応辞書を引いて結果を表示するとこまでは出来たので、M-V-VMパターンの参考までに公開してみます。WPF自体よく分かっていなかった前のコードと比べると見違えるような綺麗さになりましたｗ</p>
<p>&#160;</p>
<p><a href="http://depot.sharplab.net/CSharp/VSAddIn/SharpLab.IKnow.ItemBankPanes.zip">SharpLab.IKnow.ItemBankPanes.zip</a></p>
<p>&#160;</p>
<p><a href="http://blog.sharplab.net/computer/cprograming/wpf/1862/">添付ビヘイビアでTextBoxにCommandを実装してみた &#8211; SharpLab.</a>の添付ビヘイビアは上の検索ツールバーで、<a href="http://blog.sharplab.net/computer/cprograming/wpf/1858/">添付ビヘイビア試してみた &#8211; SharpLab.</a>で紹介した添付ビヘイビアは検索結果を表示しているListBoxで実際に使用しています。</p>
<h3></h3>
<h3>M-V-VMパターンの威力</h3>
<p>埋め草までに、ViewのXAMLコードを貼っておきます。このアプリではUIロジックに複雑なところがなかったので、実際、コードビハインドにイベントハンドラを書かずに済みました。ボタンクリックやTextBoxでのEnterキー押下時の処理は、全てCommandを使ってViewModelに移譲しています。</p>
<div class="wlWriterEditableSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:29b3499b-1260-4535-a747-219885bfcadb" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px">
<pre name="code" class="xml">&lt;UserControl x:Class="SharpLab.IKnow.ItemBankPane.ItemBankPaneView"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:SharpLab.IKnow.ItemBankPane"
	&gt;
    &lt;UserControl.Resources&gt;
    	&lt;ResourceDictionary&gt;
			&lt;local:ItemBankPaneViewModel x:Key="viewModel" /&gt;
		&lt;/ResourceDictionary&gt;
	&lt;/UserControl.Resources&gt;
	&lt;UserControl.DataContext&gt;
		&lt;Binding Mode="OneTime" Source="{StaticResource viewModel}" /&gt;
	&lt;/UserControl.DataContext&gt;
	&lt;DockPanel&gt;
		&lt;ToolBar DockPanel.Dock="Top" Height="30" VerticalAlignment="Top"&gt;
			&lt;TextBox local:TextBoxBehavior.Command="{Binding Mode=OneTime, Path=StartSearchCommand}"  HorizontalAlignment="Left" Text="{Binding Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, Path=Keyword}" VerticalAlignment="Top" Width="184" /&gt;
			&lt;Button Command="{Binding Mode=OneTime, Path=StartSearchCommand}" Content="Search"&gt;&lt;/Button&gt;
		&lt;/ToolBar&gt;
		&lt;ContentControl&gt;
				&lt;local:ResultPageView DataContext="{Binding Mode=OneTime, Path=ResultPage}" /&gt;
		&lt;/ContentControl&gt;
	&lt;/DockPanel&gt;
&lt;/UserControl&gt;</pre>
</div>
<div class="wlWriterEditableSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:4945b7ff-c118-442f-8935-efea041796c2" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px">
<pre name="code" class="xml">&lt;UserControl x:Class="SharpLab.IKnow.ItemBankPane.ResultPageView"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
	xmlns:local="clr-namespace:SharpLab.IKnow.ItemBankPane"
	xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" d:DesignWidth="300" d:DesignHeight="300"
    &gt;
	&lt;UserControl.Resources&gt;
		&lt;ResourceDictionary&gt;
			&lt;ResourceDictionary.MergedDictionaries&gt;
				&lt;ResourceDictionary Source="Resources/ResultPageResources.xaml"/&gt;
				&lt;ResourceDictionary Source="Resources/VocabularyViewerStyle.xaml"/&gt;
			&lt;/ResourceDictionary.MergedDictionaries&gt;
		&lt;/ResourceDictionary&gt;
	&lt;/UserControl.Resources&gt;
	&lt;Grid DockPanel.Dock="Bottom"&gt;
		&lt;Grid.RowDefinitions&gt;
			&lt;RowDefinition /&gt;
			&lt;RowDefinition Height="35" /&gt;
		&lt;/Grid.RowDefinitions&gt;
		&lt;Grid.ColumnDefinitions&gt;
			&lt;ColumnDefinition /&gt;
			&lt;ColumnDefinition Width="40" /&gt;
			&lt;ColumnDefinition /&gt;
		&lt;/Grid.ColumnDefinitions&gt;
		&lt;ListBox Name="VocabularyViewer" Grid.Row="0" Grid.ColumnSpan="3" ItemsSource="{Binding Mode=OneWay, NotifyOnTargetUpdated=true, Path=Items}" Style="{StaticResource VocabularyViewerStyle}" /&gt;
		&lt;Button Grid.Row="1"  Grid.Column="0" Margin="6,6,6,6" Command="{Binding Mode=OneTime, Path=NavigatePrevPageCommand}" Content="Prev"/&gt;
		&lt;Button Grid.Row="1" Grid.Column="2" Margin="6,6,6,6" Command="{Binding Mode=OneTime, Path=NavigateNextPageCommand}" Content="Next"/&gt;
		&lt;TextBlock Grid.Row="1" Grid.Column="1" Text="{Binding Mode=OneWay, Path=PageCounter}" HorizontalAlignment="Center" VerticalAlignment="Center" /&gt;
	&lt;/Grid&gt;
&lt;/UserControl&gt;</pre>
</div>
<div class="wlWriterEditableSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:7c4171e6-3ac2-44d8-a2cc-644d3b946f2f" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px">
<pre name="code" class="xml">&lt;UserControl x:Class="SharpLab.IKnow.ItemBankPane.ItemView"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:SharpLab.IKnow.ItemBankPane"
	&gt;

	&lt;UserControl.Resources&gt;
		&lt;ResourceDictionary&gt;
			&lt;ResourceDictionary.MergedDictionaries&gt;
				&lt;ResourceDictionary Source="Resources/PlusButton.xaml"/&gt;
				&lt;ResourceDictionary Source="Resources/PlayButton.xaml"/&gt;
				&lt;ResourceDictionary Source="Resources/SentenceListViewerStyle.xaml"/&gt;
			&lt;/ResourceDictionary.MergedDictionaries&gt;
		&lt;/ResourceDictionary&gt;
	&lt;/UserControl.Resources&gt;

	&lt;DockPanel&gt;
		&lt;Expander x:Name="Sentences" DockPanel.Dock="Bottom" TabIndex="3" Visibility="{Binding Mode=OneTime, Path=SentencesVisility}" &gt;
			&lt;Expander.Header&gt;
				&lt;TextBlock Text="Example Sentences:" /&gt;
			&lt;/Expander.Header&gt;
			&lt;ItemsControl Name="SentenceListViewer" ItemsSource="{Binding Mode=OneTime, Path=Sentences}" Style="{StaticResource SentenceListViewerStyle}"  /&gt;
		&lt;/Expander&gt;
		&lt;!--DropDown="{DynamicResource VocabularyViewerItemContextMenu}"--&gt;
		&lt;local:DropDownButton DockPanel.Dock="Right" Width="24" Height="24" Style="{StaticResource PlusButtonStyle}"  TabIndex="1" Margin="0,0,8,0" /&gt;
		&lt;DockPanel DockPanel.Dock="Top" LastChildFill="true"&gt;
			&lt;MediaElement x:Name="mp3Player" LoadedBehavior="Manual" Source="{Binding Mode=OneTime, Path=CueSound}" Width="0"  Height="0"  /&gt;
			&lt;Button DockPanel.Dock="Left" Width="18" Height="18" Margin="2,0,4,0" TabIndex="0" Style="{StaticResource PlayButtonStyle}" Command="{Binding Mode=OneTime, Path=PlaySoundCommand}" CommandParameter="{Binding ElementName=mp3Player}" /&gt;
			&lt;ContentControl Content="{Binding Mode=OneTime, Path=CueText}" IsTabStop="False" /&gt;
		&lt;/DockPanel&gt;
		&lt;TextBlock DockPanel.Dock="Top" FontSize="12" Margin="20,0,0,0" Text="{Binding Mode=OneTime, Path=Meaning}" TextWrapping="Wrap" /&gt;
	&lt;/DockPanel&gt;
&lt;/UserControl&gt;</pre>
</div>
<div class="wlWriterEditableSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:39197a0a-9a09-43a2-b278-ab23cd654fa0" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px">
<pre name="code" class="xml">&lt;UserControl x:Class="SharpLab.IKnow.ItemBankPane.SentenceView"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
	xmlns:local="clr-namespace:SharpLab.IKnow.ItemBankPane"
	&gt;
	&lt;UserControl.Resources&gt;
		&lt;local:StringToTextBlockConverter x:Key="StringToTextBlockConverter" /&gt;
	&lt;/UserControl.Resources&gt;

	&lt;UserControl.Content&gt;
		&lt;Binding Path="Text" Mode="OneTime"  Converter="{StaticResource StringToTextBlockConverter}" /&gt;
	&lt;/UserControl.Content&gt;
&lt;/UserControl&gt;</pre>
</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.sharplab.net/blog/2009/03/15/1866/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>添付ビヘイビアでTextBoxにCommandを実装してみた</title>
		<link>http://blog.sharplab.net/blog/2009/03/14/1862/</link>
		<comments>http://blog.sharplab.net/blog/2009/03/14/1862/#comments</comments>
		<pubDate>Sat, 14 Mar 2009 05:12:37 +0000</pubDate>
		<dc:creator>shiroica</dc:creator>
				<category><![CDATA[WPF]]></category>
		<category><![CDATA[Attached Behavior]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[M-V-VM]]></category>

		<guid isPermaLink="false">http://blog.sharplab.net/computer/cprograming/wpf/1862/</guid>
		<description><![CDATA[TextBox内でEnterキーが押下された時に、割り当てたCommandが実行されたりすると便利ですよね。ちょっと必要になったので添付ビヘイビアを利用して実装してみました。ちなみにKeyBindingも試しましたが、あれCommandプロパティが依存関係プロパティになっていないのでバインドが出来ないんですね…。不便。 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows.Input; using System.Windows.Controls; using System.Windows; namespace SharpLab.IKnow.ItemBankPane { public class TextBoxBehavior { #region Command public static ICommand GetCommand(TextBox textBox) { return (ICommand)textBox.GetValue(CommandProperty); } public static void SetCommand( TextBox textBox, bool value) { textBox.SetValue(CommandProperty, value); } public static readonly DependencyProperty CommandProperty = DependencyProperty.RegisterAttached( "Command", typeof(ICommand), typeof(TextBoxBehavior), [...]]]></description>
			<content:encoded><![CDATA[<p>TextBox内でEnterキーが押下された時に、割り当てたCommandが実行されたりすると便利ですよね。ちょっと必要になったので添付ビヘイビアを利用して実装してみました。ちなみにKeyBindingも試しましたが、あれCommandプロパティが依存関係プロパティになっていないのでバインドが出来ないんですね…。不便。   <br /> 
<div class="wlWriterEditableSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:7749ce71-f45e-453f-95c4-873d63a9248b" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px">
<pre name="code" class="c#">using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Input;
using System.Windows.Controls;
using System.Windows;

namespace SharpLab.IKnow.ItemBankPane {
	public class TextBoxBehavior {

		#region Command

		public static ICommand GetCommand(TextBox textBox) {
			return (ICommand)textBox.GetValue(CommandProperty);
		}

		public static void SetCommand(
		  TextBox textBox, bool value) {
			textBox.SetValue(CommandProperty, value);
		}

		public static readonly DependencyProperty CommandProperty =
			DependencyProperty.RegisterAttached(
			"Command",
			typeof(ICommand),
			typeof(TextBoxBehavior),
			new UIPropertyMetadata(null, OnCommandPropertyChanged));

		static void OnCommandPropertyChanged(DependencyObject depObj, DependencyPropertyChangedEventArgs e) {
			TextBox textBox = depObj as TextBox;
			if (textBox == null)
				return;

			if (e.NewValue is ICommand == false)
				return;

			ICommand command = (ICommand)e.NewValue;

			textBox.KeyDown += new KeyEventHandler(OnTextBoxKeyDown);
		}

		static void OnTextBoxKeyDown(object sender, KeyEventArgs e) {
			TextBox textBox = (TextBox)e.OriginalSource;
			ICommand command = TextBoxBehavior.GetCommand(textBox);
			if (e.Key == Key.Enter &amp;&amp; command != null &amp;&amp; command.CanExecute(TextBoxBehavior.GetCommandParameter(textBox))) {
				command.Execute(TextBoxBehavior.GetCommandParameter(textBox));
			}
		}

		#endregion

		#region CommandParameter

		public static object GetCommandParameter(TextBox textBox) {
			return textBox.GetValue(CommandParameterProperty);
		}

		public static void SetCommandParameter(
		  TextBox textBox, object value) {
			textBox.SetValue(CommandParameterProperty, value);
		}

		public static readonly DependencyProperty CommandParameterProperty =
			DependencyProperty.RegisterAttached(
			"CommandParameter",
			typeof(object),
			typeof(TextBoxBehavior),
			new UIPropertyMetadata(null));

		#endregion
	}
}
</pre>
</div>
<p>利用する側はこんな感じ。スマート！</p>
<p><div class="wlWriterEditableSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:fffe20f3-fcba-4961-8ed7-e559dde44752" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px">
<pre name="code" class="xml">&lt;TextBox v:TextBoxBehavior.Command="{Binding Path=StartSearchCommand}" /&gt;</pre>
</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.sharplab.net/blog/2009/03/14/1862/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

