あいてぃーとふぼふ

WP7のLoopingSelector(基礎編)

WP7には『LoopingSelector』というコントロールが存在するのですが、知らない人も結構多いみたいです。それもそのはず、LoopingSelectorは『Silverlight for Windows Phone Toolkit』に含まれているコントロールであり、かつ『Microsoft.Phone.Controls.Primitives』というマイナーな名前空間に属しています。しかもToolkitのサンプルプログラムにも載っていません。

コントロールの機能としては、一覧が無限にループするアイテムリストのようなものと考えてもらえれば問題ないと思います。DatePickerやTimePickerコントロールでも利用されているため、目にしたことのある人は多いハズ。今回はこれを単体で利用する方法をご紹介します。

ちょっと実装しづらい

このコントロール、実はちょっと実装しづらいです。たとえばListBoxやComboBoxといったコントロールで一覧を設定する場合、ItemsSourceプロパティにIEnumelableコレクションを設定すればOKです。同様に、LoopingSelectorにもDataSourceというプロパティが存在していますが、設定できる型が『ILoopingSelectorDataSource』となっています。このため、IEnumelableコレクションを設定すれば利用できるという代物ではありません。しかも、上記のインタフェイスを実装したクラスは標準で用意されていないため、自前で実装しなければなりません。ちょっと面倒ですが仕方ありませんね。

ILoopingSelectorDataSourceを汎用的に実装しよう

ILoopingSelectorDataSourceの実装はそれほど難しくありません。今回は汎用的なコレクションを指定できるように実装してみたいと思います。実装内容は右記画像の通りです。意外と簡単ですね!肝は『GetNext』と『GetPrevious』の2つのメソッドです。GetNextメソッドでは、コレクションの次のオブジェクトを返却するように実装するわけですが、コレクションの末尾に到達した場合は再度先頭のオブジェクトを返却するようにします。こうすることにより、コレクションを無限にループさせているわけですね~。GetPreviousメソッドはGetPrevメソッドの逆回りです。

XAMLに配置しよう

では実際にLoopingSelectorをXAMLに配置してみましょう。左記のような感じになります。LoopingSelectorのDataSourceプロパティに先程実装したクラスを指定し、適当なコレクションを指定します。なお余談ですが、LoopingSelectorのItemSizeプロパティを指定し忘れると何も表示されないのでごっそい焦ります。う~ん…でもこうなってくるとItemsSourceやSelectedItemにデータバインドができればいろいろと便利そうですよね~。よし、やってみましょう!(≧∀≦)/

データバインドで利用しよう

できません(´・ω・`)!なぜなら上記クラスはFrameworkElementの派生クラスではないので、データバインドのソースとして親のDataContextを利用することができません。となると、先程作成したクラスにFrameworkElementを継承させればよいのでは?と思いますが、そう簡単な話でもありません。しかもWP7では、Silverlight3の制約に輪をかけて制限が厳しいで、何かするとすぐさま『XamlParseException:AG_E_PARSER_BAD_PROPERTY_VALUE』エラーが発生します。にんともかんとも。

データバインドで利用したい!

それでも、どうしてもデータバインドで利用したい(>ω<、)!という人は、BehaviorとBindingListenerによる実装方法を次回の投稿でご紹介します。サンプルプログラムもその際に公開しますね!

ソフトウェア開発環境展!

SODEC(ソフトウェア開発環境展)』に行ってきました~(`・ω・́)ゝ

今年は震災の影響もあってか、来場者は心なしか少ない印象を受けました。出展ブースの傾向としては、例年に比べるとクラウド関連とスマートフォン関連が増えている感じですかね。セキュリティ関連は若干縮小したのかな?ノベルティの品質は全般的に少し低くかった気がしますが、あんな大震災の後ですから仕方ありませんね。今年は無事に開催できただけでも素直に喜びましょう!(^-^)

まず、スマートフォン関連では、やはりAndroidに関する出展が多かったです。私が見た限り、Windows Phone 7 に関する情報を公開していたのはセカンドファクトリーさんくらいでした。ブースでも少しだけお話させていただきましたが、WP7に関する検証は先行して実施しているようでして、依頼があればいつでも開発を受託する体制が整っているとのことでした。最新技術に対する対応の早さはさすがですね~。

次に、天下のマイクロソフトさんブースの出展は、今年はDynamics CRMのみでした。ここ数年、Dynamics CRMには非常に力を入れている印象を受けます。でもせっかくこういった場があるのですから、やはりWP7に関する情報も公開してほしかったような気もします。WP7が日本で成功するかどうかは、マイクロソフトさんのマーケティングと、技術者が魅力的なアプリケーションを提供できるかどうかにかかっていると思いますので…(; ̄ー ̄

最後に、今年のSODECで一番記憶に残っているのは、何と言ってもインターネットイニシアティブさんのコンパニオンさんがものごっそいかわいかったこと、これに尽きます!なんとコスチュームが赤ずきんちゃん的な感じで、それに加えてミニスカ&黒ブーツで絶対領域を完備!(*´д`*)「どうして赤ずきんである必要があるんですかぁ?」とか「お前の趣味と仕事を混同するな!」とか、いろいろな軋轢の末にこの衣装を通した担当者さんのことを思うと胸が熱くなります!なお、写真は撮れなかった撮らなかったので、上記の画像はイメージです。だってチキン紳士だもの(´・ω・`)。なにはともあれ、IT業界人の趣向を非常によく分析されていることにいたく感心させられました!

そんなこんなで、SODECは今週の金曜日まで開催されます。都合のよろしい方は、事前登録の上で是非ともご参加ください!

WP7のPivotの中のScrollViewer

今日は凄くニッチなお話です。Pivotコントロールの中にScrollViewerを配置して、横長のコンテンツを水平スクロールできるようにしようとしたのですが、これが一筋縄ではいきませんでした。

上記の構成において、ScrollViewer上で水平フリックを行うと、親のPivotにも水平フリックが伝達されてしまいます。このため、結果としてPivotが意図せず遷移してしまうのです。これは困りましたね~(;´∀`)

…え?そんなことする状況なんてめったにないからどうでもいい?とんでもない!(゚Д゚#)たとえば、上記の画像の右端にはまだ続きがあるのですが、水平スクロールさえできればパンツ続きが見れるとしましょう!こんな状態で勝手にPivotが遷移しようものなら、ユーザビリティの低下なんて生易しいものじゃありません。営業妨害です!ここでいうところのユーザビリティがどんなものであるかは敢えて触れませんが、これは死活問題なのです!(`Д´)

でも解決方法は意外と簡単で、ScrollViewerのManipulationCompletedイベントを利用して、水平スクロールが完了するまでPivotにイベントが伝達されないようにすればOKです。ソースコードはこんな感じですね。

private void ScrollViewer_ManipulationCompleted(
object sender, ManipulationCompletedEventArgs e)
{
var scrollViewer = sender as ScrollViewer;
e.Handled = e.TotalManipulation.Translation.X > 0 ?
scrollViewer.HorizontalOffset > 0 :
scrollViewer.HorizontalOffset + scrollViewer.ViewportWidth < scrollViewer.ExtentWidth;
}

この程度ならビヘイビアにしなくてもよさそうですが、せっかくなのでサンプルコードはビヘイビアとして作成してみました。詳細な実装方法が知りたい方や、画像の右端が気になるという方は、以下のサンプルコードをどうぞ。
ScrollViewerOnPivotSample

今日は3年ぶりにSODEC(ソフトウェア開発環境展)に行ってきます~( ´∀`)

青の祓魔師が…

面白いです~!(≧▽≦)

GWを利用して一気に視聴したのですが、やっぱりこの手のファンタジーものは大好物です!

さて、青エク(って略すらしい)で個人的に一番の萌えキャラは、なんといってもこの理事長さんです!原作は未読なので素性や実力は知りませんが、格好や肩書からして只者でないのは間違いなさそうですぜ!なんかもうカッコよすぎー(;´Д`)

ナウシカのクロトワ参謀然り、ゼノギアスのシタン先生然り、こういった腹に一物ある大人なキャラクターがいるからこそ、物語により一層の深みがでるんでしょうなぁ~。いやもちろん、しえみちゃんやいずもちゃん萌えあっての青エクですけどね(`・ω・´)b

そしてさすがはアニプレックス様!OPとEDに、ものごっそいイイ曲を充ててきました。特にUVERworldさんの『Core Pride』は早くも2011年第二四半期の私的テーマソングに決定です!あー早くカラオケで熱唱したい~!(≧△≦)

WP7のスプラッシュスクリーン

スプラッシュスクリーンとは、アプリケーションを起動した時に初期化が完了するまで表示される画面のことです。Now Loading…的なアレですね。

WindowsPhone7のSilverlightアプリでは、スプラッシュスクリーンとして『SplashScreenImage.jpg』が表示される仕様になっています。しかしこれは逆に、上記のJPEG画像以外をスプラッシュスクリーンに指定することができないことを意味します。

通常ならこれでも何ら問題はないのですが、初期化処理に時間がかかるような場合などでは、どうしてもスプラッシュスクリーンをアニメーションさせたくなります。たとえば何秒間も同じ画像がただ表示されているよりも、砂時計が回っていたりしてくれた方がユーザさんは安心できるわけです。ところが、WindowsPhone7アプリでは上記の仕様が存在するため、スプラッシュスクリーンでアニメーションを再生させることはできません。これはションボリものです(´・ω・`)ので、これを解決するための方法として以下のような力技はいかがでしょうか?

プロジェクトの構成

まずプロジェクトを以下のような構成とします。AとBはプロジェクト作成時に生成されますので、新規に追加するのはCとDのユーザコントロールです。Cには初期化中に表示するアニメーションを定義し、 Dには初期化後に操作の起点となるコントロールを配置します。この際、AとCは似た構成にしておくと、アニメーションが違和感なく開始されていい感じになります。

  • A:SplashScreenImage.jpg
  • B:MainPage.xaml
  • C:SplashScreenContent.xaml
  • D:MainContent.xaml

処理の流れ

処理の流れは以下のような感じです。

  1. アプリケーションが起動されるとAが表示され、次いでBが表示されます。
  2. 次に、BのLayoutRootにCを設定して、初期化処理を実施している間アニメーションを再生します。
  3. 初期化処理が完了したら、BのLayoutRootにDを設定して完了です。

注意するべき事柄

『SplashScreenContent.xaml』をページとして作成すればもっとスマートに実現できそうですが、その方法だと『MainPage.xaml』で戻るボタンが押下された際に、再度スプラッシュスクリーンが表示されてしまいます(通常はアプリケーションが終了しなければいけません)。あと『MainContent.xaml』にPanoramaコントロールを利用する場合、LayoutRootに設定する直前にインスタンスを生成する必要があります。これはPanoramaコントロールに設定されている既定のトランジション(画面遷移効果)がインスタンスの生成時に開始されるためです。

サンプルプログラム

…なんか文章で書いてもあまり伝わらないので、よろしければサンプルプログラムもご覧ください(; ̄ー ̄
SplashScreenSample

将来的には?

現在のバージョンでは『SplashScreenImage.jpg』以外をスプラッシュスクリーンに指定することはできませんが、ビルドアクションには既に『SplashScreen』が定義されています(WPFなどの名残かもですが…)。なので将来的にはPageや他のメディアなどをSplashScreenに指定することができるようになるとうれしいですね~!(≧ω≦)

新装開店です!

  • 2011年05月08日
  • カテゴリー:未分類
ウェブサイトリニューアル!

ウェブサイトリニューアル!

このたび、GWを利用して当サイトをリニューアル致しました!かねてより計画していたブログへの完全移行を完了です(≧ω≦)ゞ

さてさて、当サイトをブログ化するにあたり、今回は世界的にシェアの高い『WordPress』をCMS(コンテンツ管理システム)として採用してみました。WordPressは『Windows Live スペース』のデフォルトブログサービスであることでも有名ですね。

WordPressを採用した理由としては、ズバリ管理が簡単であることに尽きます。これまでに発注していただいたブログ構築のお仕事では、日本でシェアの高い『MovableType』を利用しておりました。もちろんこれも素晴らしいCMSなのですが、管理が難しかったり再構築という概念がわかりにくかったりと、実際に運営していく上でお客様にいろいろな負担を強いてしまうのが悩みの種でした…(≧~≦)

対してWordPressは、国内シェアこそ低いものの、海外でのシェアは圧倒的であり、テーマやプラグインなどが非常に豊富です。このため、これ らを上手に組み合わせていくことにより、ウィジェットの切り替えやメニューの編集、ページの作成や背景画像の変更など、あらゆる操作を管理画面に集約する ことが可能となります!

ちなみに、当サイトは構成が簡素なのであまり複雑なことはやっていませんが、それでも管理画面のGUIから細部にわたる調整が行えるようになったのは便利なこと極まりないです!d(`・ω´・+)

これで少しは更新頻度もあげられる…ハズですし、色々と情報も発信していきたいと考えております。どうぞ今後とも当サイトをよろしくお願い致します!