(本エントリーの下部に補足、訂正がございますので、そちらもご確認ください)
Windows8のMetroStyleAppでは、以前に紹介したFileOpenPickerクラスなどのようにOSの機能を利用して様々な処理を行うことができます。
これらの機能をコントラクトと呼びます。
参考:アプリで Windows 8 のコントラクトのアクティベーションを行う
今回はWindows8のCharmを利用して検索文字列をアプリ側で取得する方法を紹介します。
アプリの検索などランチャー的に利用できるCharmの検索ですが、アプリ側でもこれを利用することができます。
逆に言うとWindows8ではアプリ側で検索フォームなどを配置せずにCharmを使うのがユーザビリティを高めそうですね。
Charmの検索をアプリ側で利用するにはPackage.appxmanifestに宣言を追加します。
続いてコードビハインドに以下のようなコードを記述します。
public sealed partial class BlankPage : Page { public BlankPage() { this.InitializeComponent(); this.Loaded += (e, s) => { // using Windows.ApplicationModel.Search;を追記 var pane = SearchPane.GetForCurrentView(); pane.QuerySubmitted += pane_QuerySubmitted; }; } void pane_QuerySubmitted(SearchPane sender, SearchPaneQuerySubmittedEventArgs args) { this.search_query.Text = args.QueryText; }
アプリ起動後に[Windowsキー]+[C]でCharmを起動。
検索フォームから検索すると・・・
アプリ側で検索ワードを取得できた!!
WindowsPhoneにも同様にChooserやTaskというOSの機能を利用するAPIがありましたね。
OSの機能を利用する方法をしっかり学んで効率よく開発していきたいものです。
コメントにて指摘を受けました。
青柳様ありがとうございます!!
ちょっとコントラクトのことを勘違いしてませんか?
コントラクトってのは文字通り「契約」のことで、検索コントラクトを追加するってことは「自分は検索に対応している」と表明することになります。
このアプリを一度インストールすると、アプリを起動して無くてもチャームの検索で自分のアプリを指定されると自動的に起動されるようになります。なので検索チャームから Launch されたときは検索ビューを表示するようにちゃんと対応させとかなくちゃいけません。
ちなみに、「新しい項目の追加」で「検索コントラクト」を追加すると App.xaml.cs に OnSearchActivated を追加してくれたりと必要なことを一通りやってくれます。きちんと検索に対応してないのに検索コントラクトを追加すると Windows Store の審査に通らなくなっちゃうと思うのでこのあたりはちゃんとしておいた方がいいんじゃないかと思います。
すみません、勘違い&しっかり理解しておりませんでした。
検索コントラクトをアプリ側から宣言する場合、OSの機能を利用するというだけでなく、しっかり検索として機能する必要があるということを念頭に置かないといけないようです。
おーっ検索窓の情報を取れたーと喜んでいましたが、宣言と同時に契約として責務を果たさないとアプリの審査にひっかかる恐れがあるということでした。
Please give us your valuable comment