Windows Phone 8 の検索機能の拡張方法

2014/06/18

対象: Windows Phone 8 および Windows Phone Silverlight 8.1 | Windows Phone OS 7.1

 

ここでは、検索機能拡張アプリを作成して、Windows Phone の検索を拡張する方法について説明します。作業が終了したら、アプリを使用して製品カード、場所カード、ムービー カードなどのクイック カードをテストできます。このトピックで取り上げるアプリは、ディープ リンク URI からパラメーターを抽出してアプリのページに表示します。検索機能を拡張する方法の詳細については、「Windows Phone 8 の検索の機能拡張」を参照してください。

ヒントヒント:

このトピックで取り上げるコードでは、クイック カード サンプルのものが使用されています。

このトピックは、次のセクションで構成されています。

 

このトピックの手順に従って、次のファイルを変更または作成します。

  • WMAppManifest.xml: アプリのマニフェスト ファイルを変更して、アプリに対応する検索拡張機能を指定します。

  • Extensions\Extras.xml: このファイルを作成して、対応するクイック カードのアプリ ピボット ページに表示されるアプリのタイトルとキャプションを指定します。

  • App.xaml: このファイルを変更して、クイック カード ターゲット ページへのクイック カード ディープ リンクの URI マッピングを指定します。

  • App.xaml.cs: このファイルを変更して、アプリ内で URI マッピングを有効にします。

  • Model\QuickCardUriParameters.cs: このクラス ファイルを作成して、ディープ リンク URI でパラメーターを示します。このクラスは、INotifyPropertyChanged インターフェイスを実装します。

  • ViewModel\QuickCardViewModel.cs: このクラス ファイルを作成して、クイック カード ターゲット ページの ViewModel を示します。このクラスは、ディープ リンク URI からパラメーターを抽出し、INotifyPropertyChanged インターフェイスを実装します。

  • QuickCardTargetPage.xaml: クイック カード ターゲット ページを作成して XAML コードを変更し、ディープ リンク URI からのパラメーターを示します。MVVM パターンの観点から言うと、このページはビューです。

  • QuickCardTargetPage.xaml.cs: このページを変更して ViewModel オブジェクトを作成し、ページのロード時に ViewModel にパラメーターをロードします。

  • MainPage.xaml: このページを変更して標準のアプリ起動のためのテキストを表示します。このページは、検索の機能拡張では起動されません。

このトピックで作成されるアプリは、Model-View-ViewModel (MVVM) パターンを使用します。MVVM アプリの他の例については、「Windows Phone 8 での Model-View-ViewModel パターンの実装」を参照してください。

このセクションでは、アプリを作成してアプリのマニフェスト ファイルを変更し、アプリに関連する検索拡張機能を指定します。この例では、3 つの拡張機能を指定して、3 種類のクイック カードを示します。すべての拡張機能については、「Windows Phone 8 の検索登録および起動参照」を参照してください。

アプリ マニフェストの設定

  1. Windows Phone SDK を開き、[Windows Phone アプリ ] テンプレートを使用して新しいプロジェクトを作成します。

  2. プロジェクトの読み込み後、アプリのマニフェスト ファイルが開きます。ソリューション エクスプローラーで、[プロパティ] を展開し、WMAppManifest.xml ファイルを探します。次に、ファイル名を右クリックし、[ファイルを開くアプリケーションの選択] をクリックし、[XML (テキスト) エディター] をクリックします。

  3. WMAppManifest.xml で、Tokens 要素の下にある App 要素に次のコードを追加します。

        <Extensions>
          <!-- Production extensions, for products: video games -->
          <Extension
            ExtensionName="Bing_Products_Video_Games"
            ConsumerID="{5B04B775-356B-4AA0-AAF8-6491FFEA5661}"
            TaskID="_default"
            ExtraFile="Extensions\\Extras.xml" />
    
          <!-- Production extensions, for movies. -->
          <Extension
            ExtensionName="Bing_Movies"
            ConsumerID="{5B04B775-356B-4AA0-AAF8-6491FFEA5661}"
            TaskID="_default"
            ExtraFile="Extensions\\Extras.xml" />
          
          <!-- Production extensions, for places: travel, food, and dining. -->
          <Extension
            ExtensionName="Bing_Places_Food_and_Dining"
            ConsumerID="{5B04B775-356B-4AA0-AAF8-6491FFEA5661}"
            TaskID="_default"
            ExtraFile="Extensions\\Extras.xml" />
        </Extensions>
    
    

    このコードは、製品カード、ムービー カード、場所カードの 3 種類のクイック カードにそれぞれ 1 つずつ、合計 3 つの拡張機能を追加します。これらの拡張機能に関連付けられていないクイック カードは、クイック カードに対応する [アプリ] ピボット ページでこのアプリを表示しません。すべての検索拡張機能については「Windows Phone 8 の検索登録および起動参照」を参照してください。

このセクションでは、Extras.xml ファイルを作成し、対応するクイック カードの [アプリ] ピボット ページに表示されるアプリのタイトルとキャプションを指定します。

Extras.xml ファイルの作成方法

  1. ソリューション エクスプローラーで、プロジェクトを右クリックし、[追加] を選択して、[新しいフォルダー] をクリックします。

  2. 新しいフォルダーの名前を「拡張機能」に設定します。

  3. ソリューション エクスプローラーの、[拡張機能] フォルダーを右クリックし、[追加] を選択してから [新しい項目] を選択します。

  4. [新しい項目の追加] ウィンドウで、[XML ファイル] を選択し、ファイル名を「Extras.xml」に設定します。次に、[追加] をクリックします。

  5. Extras.xml でコードを次のように置き換えます。

    <?xml version="1.0" encoding="utf-8" ?>
    <ExtrasInfo>
    
      <!-- App title (used only in Windows Phone OS 7.1 -->
      <AppTitle>
        <default>Display URI Parameters</default>
      </AppTitle>
    
      <!-- Search-related captions -->
      <Consumer ConsumerID="{5B04B775-356B-4AA0-AAF8-6491FFEA5661}">
    
        <!-- Products caption for video games -->
        <ExtensionInfo>
          <Extensions>
            <ExtensionName>Bing_Products_Video_Games</ExtensionName>
          </Extensions>
          <CaptionString>
            <default>Product URI Details</default>
          </CaptionString>
        </ExtensionInfo>
    
        <!-- Movies caption -->
        <ExtensionInfo>
          <Extensions>
            <ExtensionName>Bing_Movies</ExtensionName>
          </Extensions>
          <CaptionString>
            <default>Movie URI Details</default>
          </CaptionString>
        </ExtensionInfo>
    
        <!-- Places caption for food and dining -->
        <ExtensionInfo>
          <Extensions>
            <ExtensionName>Bing_Places_Food_and_Dining</ExtensionName>
          </Extensions>
          <CaptionString>
            <default>Place URI Details</default>
          </CaptionString>
        </ExtensionInfo>
      </Consumer>
    </ExtrasInfo>
    
    

    このコードは、クイック カードの種類によってアプリのタイトルとキャプションが [アプリ] ピボット ページにどのように表示されるかを指定します。すべてのクイック カードのアプリ ピボット ページで、アプリのタイトルは「ディープ リンク URI パラメーターを表示」です。クイック カードの種類によって、このキャプションは異なります。

    • 製品カード (Bing_Products_Electronics 拡張に関連付けられたもの): [製品 URI の詳細]

    • ムービー カード (Bing_Movies 拡張に関連付けられたもの): [ムービー URI の詳細]

    • 場所カード (Bing_Places_Food_and_Dining 拡張に関連付けられたもの): [場所 URI の詳細]

このセクションでは、クイック カード ディープ リンクから、クイック カード ターゲット ページに URI をマッピングします。これを行うには、クイック カードの URI マッパー クラスを作成し、app.xaml.cs ファイル内のアプリケーション フレームに割り当てます。クイック カード ターゲット ページは、このトピックの後半にある「クイック カード ターゲット ページの作成」で作成されます。

このセクションで作成される URI マッパー クラスは、"SearchExtras" を起動されるアプリケーションのページの名前で置き換えることによって URI を変更します。また、各 URI パラメーター値を再度エンコードして、クイック カードから送信される可能性がある特殊文字を処理します。

URI マッパー クラスを作成するには

  1. ソリューション エクスプローラーで、プロジェクトを右クリックし、[追加] を選択して、[新しい項目] をクリックします。

  2. [新しい項目の追加] ウィンドウで、[クラス] を選択し、ファイル名を「QuickCardUriMapper.cs」に設定します。次に、[追加] をクリックします。

  3. QuickCardUriMapper.cs で、ディレクティブのリストを次のように置き換えます。

    using System;
    using System.Windows.Navigation;
    using System.Net;
    
    
  4. QuickCardUriMapper.cs で、次のようにクラス ステートメントを更新し、UriMapperBase クラスから継承するようにします。

    public class QuickCardUriMapper : UriMapperBase
    
    
  5. QuickCardUriMapper クラスで次のコードを追加します。このコードは、各ディープ リンク URI パラメーター値を再度エンコードします。URI の宛先ページは、TargetPageName という名前の静的な文字列によって決定されます。

    // Navigation destination. 
    private static string TargetPageName = "QuickCardTargetPage.xaml";
    private string tempUri;
    
    public override Uri MapUri(Uri uri)
    {
        tempUri = uri.ToString();
                
        // Parse URI when launched by from a quick card.
        if (tempUri.Contains("/SearchExtras"))
        {
            // Decode all characters in the URI.
            tempUri = HttpUtility.UrlDecode(tempUri);
    
            // Create a new URI for product cards.
            if (tempUri.Contains("Bing_Products"))
            {
                return GetProductCardUri(tempUri);
            }
    
            // Create a new URI for place cards.
            if (tempUri.Contains("Bing_Places"))
            {
                return GetPlaceCardUri(tempUri);
            }
    
            // Create a new URI for movie cards.
            if (tempUri.Contains("Bing_Movies"))
            {
                return GetMovieCardUri(tempUri);
            }
        }
    
        // Immediately return the URI when it isn’t related to Search extensibility.
        return uri;
    }
    
    // Return a parsed Product Card URI.
    private Uri GetProductCardUri(string uri)
    {
        // Extract parameter values from URI.
        string ProductNameValue = GetURIParameterValue("ProductName=",uri);
        string CategoryValue = GetURIParameterValue("Category=",uri);
    
        // Create new URI.
        string NewURI = String.Format("/{0}?ProductName={1}&Category={2}", 
                                TargetPageName, ProductNameValue, CategoryValue);
    
        return new Uri(NewURI, UriKind.Relative);
    }
    
            
    // Return a parsed Place Card URI.
    private Uri GetPlaceCardUri(string uri)
    {
        // Extract parameter values from URI.
        string PlaceNameValue = GetURIParameterValue("PlaceName=", uri);
        string PlaceLatitudeValue = GetURIParameterValue("PlaceLatitude=", uri);
        string PlaceLongitudeValue = GetURIParameterValue("PlaceLongitude=", uri);
        string PlaceAddressValue = GetURIParameterValue("PlaceAddress=", uri);
        string CategoryValue = GetURIParameterValue("Category=", uri); 
    
        // Create new URI.
        string NewURI = String.Format("/{0}?PlaceName={1}&PlaceLatitude={2}&PlaceLongitude={3}&PlaceAddress={4}&Category={5}", 
                                TargetPageName, PlaceNameValue, PlaceLatitudeValue, PlaceLongitudeValue, PlaceAddressValue, CategoryValue);
    
        return new Uri(NewURI, UriKind.Relative);       
    }
    
    // Return a parsed Movie Card URI.
    private Uri GetMovieCardUri(string uri)
    {
        // Extract parameter values from URI.
        string MovieNameValue = GetURIParameterValue("MovieName=", uri);
        string CategoryValue = GetURIParameterValue("Category=", uri);
    
        // Create new URI.
        string NewURI = String.Format("/{0}?MovieName={1}&Category={2}",
                    TargetPageName, MovieNameValue, CategoryValue);
    
        return new Uri(NewURI, UriKind.Relative);
    }
    
    
    // This method extracts the string values that correspond to URI parameters from a quick card.
    private string GetURIParameterValue(string parameteridentifier, string uri)
    {
        string tempValue = "";
    
        // If the parameter exists in the string, extract the corresponding parameter value.
        if (uri.Contains(parameteridentifier))
        {
            string subUri; 
    
            // Extract the characters that contain and follow the parameter identifier.
            subUri = uri.Substring(uri.LastIndexOf(parameteridentifier));
    
            // Remove the parameter identifier from the substring.
            subUri = subUri.Replace(parameteridentifier, "");
                    
            // Obtain the position of the next parameter in the substring.
            int nextParameterPosition = FindNextParameter(subUri);
    
                    
            if (nextParameterPosition < int.MaxValue)
            {
                // Remove the characters that contain and follow the next parameter.
                tempValue = subUri.Substring(0, nextParameterPosition);
            }
            else
            {
                // No more parameters follow in the string. 
                tempValue = subUri;
            }
    
            // Encode the parameter values to help prevent issues in the URI.
            tempValue = HttpUtility.UrlEncode(tempValue);
        }
            
        return tempValue;
    }
    
    // Returns the string position of the next URI parameter, if applicable.
    private int FindNextParameter(string subUri)
    {
        int lowestPosition = int.MaxValue;
        int tempPosition;
    
        tempPosition = subUri.IndexOf("&ProductName");
        if ((tempPosition > -1) && (tempPosition < lowestPosition)) lowestPosition = tempPosition;
    
        tempPosition = subUri.IndexOf("&Category");
        if ((tempPosition > -1) && (tempPosition < lowestPosition)) lowestPosition = tempPosition;
    
        tempPosition = subUri.IndexOf("&PlaceName");
        if ((tempPosition > -1) && (tempPosition < lowestPosition)) lowestPosition = tempPosition;
    
        tempPosition = subUri.IndexOf("?PlaceName");
        if ((tempPosition > -1) && (tempPosition < lowestPosition)) lowestPosition = tempPosition;
    
        tempPosition = subUri.IndexOf("&PlaceLatitude");
        if ((tempPosition > -1) && (tempPosition < lowestPosition)) lowestPosition = tempPosition;
    
        tempPosition = subUri.IndexOf("&PlaceLongitude");
        if ((tempPosition > -1) && (tempPosition < lowestPosition)) lowestPosition = tempPosition;
    
        tempPosition = subUri.IndexOf("&PlaceAddress");
        if ((tempPosition > -1) && (tempPosition < lowestPosition)) lowestPosition = tempPosition;
    
        tempPosition = subUri.IndexOf("&MovieName");
        if ((tempPosition > -1) && (tempPosition < lowestPosition)) lowestPosition = tempPosition;
    
        return lowestPosition;
    }
    
    

アプリケーション フレームに URI マッパーを割り当てるには

  • App.xaml.cs で、InitializePhoneApplication メソッドに次のコードを追加します。メソッドを特定するには、"Phone application initialization" というタイトルのコード領域を拡張することが必要な場合があります。

    // Assign the quick card URI mapper class to the application frame.
    RootFrame.UriMapper = new QuickCardUriMapper();
    
    

    このコードは、アプリケーション フレームの UriMapper プロパティに QuickCardUriMapper クラスを割り当てます。InitializePhoneApplication メソッドの既存のコードは変更しないでください。以下の例に示すように、UriMapper の割り当ての追加のみを行います。

    private void InitializePhoneApplication()
    {
        if (phoneApplicationInitialized)
            return;
    
        // Create the frame but don't set it as RootVisual yet; this allows the splash
        // screen to remain active until the application is ready to render.
        RootFrame = new PhoneApplicationFrame();
        RootFrame.Navigated += CompleteInitializePhoneApplication;
    
        // Assign the quick card URI mapper class to the application frame.
        RootFrame.UriMapper = new QuickCardUriMapper();
    
        // Handle navigation failures
        RootFrame.NavigationFailed += RootFrame_NavigationFailed;
    
        // Ensure we don't initialize again
        phoneApplicationInitialized = true;
    }
    

このセクションでは、ディープ リンク URI のクイックカードからのパラメーターを示すデータ モデルを作成します。このクラスは、UI 内の要素にバインディングするのに使用します。各クイック カードに対応するパラメーターの完全なリストについては、「Windows Phone 8 の検索登録および起動参照」を参照してください。

データ モデルを作成するには

  1. ソリューション エクスプローラーで、プロジェクトを右クリックし、[追加] を選択して、[新しいフォルダー] をクリックします。

  2. 新しいフォルダーに Model という名前を付けます。

  3. ソリューション エクスプローラーの [Model] フォルダーを右クリックし、[追加] を選択して、[新しい項目] を選択します。

  4. [新しい項目の追加] ウィンドウで、[コード ファイル] を選択し、ファイル名を「QuickCardUriParameter.cs」に設定します。次に、[追加] をクリックします。

  5. QuickCardUriParameter.cs 内で次のコードを追加します。

    using System.ComponentModel;
    
    namespace QuickCardExample.Model
    {
        // Represents a parameter from a quick card in an deep link URI
        public class QuickCardUriParameter : INotifyPropertyChanged
        {
            // The parameter name
            private string _paramName;
            public string ParamName
            {
                get {return _paramName;}
                set
                {
                    if (_paramName != value)
                    {
                        _paramName = value;
                        NotifyPropertyChanged("ParamName");
                    }
                }
            }
    
            // The parameter value
            private string _paramValue;
            public string ParamValue
            {
                get {return _paramValue;}
                set
                {
                    if (_paramValue != value)
                    {
                        _paramValue = value;
                        NotifyPropertyChanged("ParamValue");
                    }
                }
            }
    
            // Class constructor
            public QuickCardUriParameter(string pName, string pValue)
            {
                _paramName = pName.Trim();
    
                if (_paramName == "Category")
                {
                // Place multiple categories on new lines.
                    _paramValue = pValue.Replace(",",",\n");
                }
                else
                {
                    _paramValue = pValue;
                }
            }
    
            #region INotifyPropertyChanged Members
    
            public event PropertyChangedEventHandler PropertyChanged;
    
            // Used to notify that a property changed
            private void NotifyPropertyChanged(string propertyName)
            {
                if (PropertyChanged != null)
                {
                    PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
                }
            }
    
            #endregion
        }
    }
    
    

    このクラスは、パラメーター名とパラメーター値、名前と値を受け入れるコンストラクター、および INotifyPropertyChanged のメンバーで構成されます。

このセクションでは、クイック カード ターゲット ページ QuickCardTargetPage.xaml に対応する ViewModel を作成します。この ViewModel は、クイック カードから URI パラメーターを抽出します。

ViewModel を作成するには

  1. ソリューション エクスプローラーで、プロジェクトを右クリックし、[追加] を選択して、[新しいフォルダー] をクリックします。

  2. 新しいフォルダーに ViewModel という名前を付けます。

  3. ソリューション エクスプローラーで、[ViewModel] フォルダーを右クリックし、[追加] を選択して [新しい項目] を選択します。

  4. [新しい項目の追加] ウィンドウで、[コード ファイル] を選択し、ファイル名を「QuickCardTargetPageViewModel.cs」に設定します。次に、[追加] をクリックします。

  5. QuickCardTargetPageViewModel.cs 内で次のコードを追加します。

    using System.ComponentModel;
    using System.Collections.ObjectModel;
    using System.Collections.Generic;
    
    // Reference the data model.
    using QuickCardExample.Model;
    
    namespace QuickCardExample.ViewModel
    {    
        public class QuickCardTargetPageViewModel: INotifyPropertyChanged
        {
            // Observable collection for the deep link URI parameters.
            private ObservableCollection<QuickCardUriParameter> _QuickCardUriParameters;
            public ObservableCollection<QuickCardUriParameter> QuickCardUriParameters
            {
                get {return _QuickCardUriParameters;}
                set
                {
                    if (_QuickCardUriParameters != value)
                    {
                        _QuickCardUriParameters = value;
                        NotifyPropertyChanged("QuickCardUriParameters");
                    }
                }
            }
    
            // Class constructor.
            public QuickCardTargetPageViewModel()
            {
                // Create observable collection object.
                QuickCardUriParameters = new ObservableCollection<QuickCardUriParameter>();
            }
    
            // Load parameters from quick page; extract from the NavigationContext.QueryString
            public void LoadUriParameters(IDictionary<string,string> QueryString)
            {
                // Clear parameters in the ViewModel.
                QuickCardUriParameters.Clear();
    
                // Loop through the quick card parameters in the deep link URI.
                foreach (string strKey in QueryString.Keys)
                {
                    // Set default value for parameter if no value is present.
                    string strKeyValue = "<no value present in URI>";
    
                    // Try to extract parameter value from URI.
                    QueryString.TryGetValue(strKey, out strKeyValue);
    
                    // Add parameter object to ViewModel collection.
                    QuickCardUriParameters.Add(new QuickCardUriParameter(strKey, strKeyValue));
                }
            }
    
            #region INotifyPropertyChanged Members
    
            public event PropertyChangedEventHandler PropertyChanged;
    
            // Used to notify that a property has changed.
            private void NotifyPropertyChanged(string propertyName)
            {
                if (PropertyChanged != null)
                {
                    PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
                }
            }
            #endregion
        }
    }
    
    

    LoadUriParameters メソッドで、ViewModel はディープ リンク URI からパラメーターを抽出し、タイプ QuickCardUriParameter のオブザーバブル コレクションにロードします。

このセクションでは、クイック カード ターゲット ページを作成します。これは、ディープ リンク URI を通じてクイック カードから起動されるページです。MVVM パターンの観点から言うと、このページはビューです。

クイック カード ターゲット ページの作成方法

  1. ソリューション エクスプローラーで、プロジェクトを右クリックし、[追加] を選択して、[新しい項目] をクリックします。

  2. [新しい項目の追加] ウィンドウで、[Windows Phone ポートレート ページ] を選択し、ファイル名を「QuickCardTargetPage.xaml」に設定します。次に、[追加] をクリックします。

  3. QuickCardTargetPage.xaml で、LayoutRoot という名前のグリッドを次のコードに置き換えます。

        <!--LayoutRoot is the root grid where all page content is placed-->
        <Grid x:Name="LayoutRoot" Background="Transparent">
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto"/>
                <RowDefinition Height="*"/>
            </Grid.RowDefinitions>
    
            <!--TitlePanel contains the name of the app and page title-->
            <StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="12,17,0,28">
                <TextBlock 
                    x:Name="ApplicationTitle" 
                    Text="QUICK CARD EXAMPLE" 
                    Style="{StaticResource PhoneTextNormalStyle}"/>
                <TextBlock 
                    x:Name="PageTitle" 
                    Text="URI details" 
                    Margin="9,-7,0,0" 
                    Style="{StaticResource PhoneTextTitle1Style}"/>
            </StackPanel>
     
            <!--ContentPanel contains ListBox and ListBox ItemTemplate.-->
            <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
                <ListBox x:Name="paramsListBox" Margin="0,0,-12,0" ItemsSource="{Binding QuickCardUriParameters}" >
                    <ListBox.ItemTemplate>
                        <DataTemplate>
                            <StackPanel >
                                <TextBlock 
                                    Text="{Binding ParamName}" 
                                    TextWrapping="Wrap" 
                                    Style="{StaticResource PhoneTextExtraLargeStyle}"/>
                                <TextBlock 
                                    Text="{Binding ParamValue}" 
                                    TextWrapping="Wrap" 
                                    Margin="12,-6,12,0" 
                                    Style="{StaticResource PhoneTextAccentStyle}"/>
                            </StackPanel>
                        </DataTemplate>
                    </ListBox.ItemTemplate>
                </ListBox>
            </Grid>
        </Grid>
    
    

    このページにおいて、ViewModel 内の QuickCardUriParameters という名前のオブザーバブル コレクションに ListBox コントロールがバインドされています。ListBox では、2 つの TextBlock コントロールがオブザーバブル コレクション内の各パラメーターにバインドされています。TextBlock コントロールのうちの 1 つは ParamName プロパティにバインドされ、もう 1 つの TextBlock コントロールは、ParamValue プロパティにバインドされます。

  4. クイック カード ターゲット ページの分離コードファイル QuickCardTargetPage.xaml.cs で、ページ最上部に次のディレクティブを追加します。

    // Reference the ViewModel.
    using QuickCardExample.ViewModel;
    
    
  5. QuickCardTargetPage.xaml.cs で、InitializeComponent() 呼び出しの後のクラス コンストラクターに次のコードを追加します。

                // Create the ViewModel object.
                this.DataContext = new QuickCardTargetPageViewModel();
    
                // Create event handler for the page Loaded event.
                this.Loaded += new RoutedEventHandler(QuickCardTargetPage_Loaded);
    
    
    

    このコードは新しい QuickCardTargetPageViewModel オブジェクトを作成し、ページのデータ コンテキストに割り当てます。また、ページ Loaded のイベントのイベント ハンドラーの設定も行います。

  6. QuickCardTargetPage.xaml.cs で、次のコードをページ クラスに追加します。

            // A property for the ViewModel.
            QuickCardTargetPageViewModel ViewModel
            {
                get { return (QuickCardTargetPageViewModel)DataContext; }
            }
    
    
            private void QuickCardTargetPage_Loaded(object sender, RoutedEventArgs e)
            {
                // Load the quick card parameters from the deep link URI.
                ViewModel.LoadUriParameters(this.NavigationContext.QueryString);
            }
    
    

    これによって ViewModel のプロパティが作成され、LoadUriParameters メソッドを呼び出せるようになります。ページの Loaded イベントのハンドラーで、NavigationContext QueryString プロパティが ViewModel に渡され、ディープ リンク URI からパラメーターが抽出可能になります。

このセクションでは、標準のアプリ起動のためのテキストをメイン ページに追加します。

アプリを完成させるには

  • アプリのメイン ページ MainPage.xaml で、LayoutRoot という名前のグリッドを次のコードに置き換えます。

        <!--LayoutRoot is the root grid where all page content is placed-->
        <Grid x:Name="LayoutRoot" Background="Transparent">
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto"/>
                <RowDefinition Height="*"/>
            </Grid.RowDefinitions>
    
            <!--TitlePanel contains the name of the app and page title-->
            <StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="12,17,0,28">
                <TextBlock 
                    x:Name="ApplicationTitle" 
                    Text="QUICK CARD EXAMPLE" 
                    Style="{StaticResource PhoneTextNormalStyle}"/>
                <TextBlock 
                    x:Name="PageTitle" 
                    Text="main page" 
                    Margin="9,-7,0,0" 
                    Style="{StaticResource PhoneTextTitle1Style}"/>
            </StackPanel>
    
            <!--ContentPanel - place additional content here-->
            <Grid x:Name="ContentPanel" Grid.Row="1" Margin="24,0,42,338">
                <TextBlock 
                    Text="With Search extensibility, you can navigate directly to a relevant page in your app from a quick card."
                    TextWrapping="Wrap"  
                    Style="{StaticResource PhoneTextAccentStyle}" 
                    Margin="0,0,12,181" />
    
                <TextBlock Text="To launch this app from a quick card, perform the testing steps outlined in the documentation."
                    TextWrapping="Wrap" 
                    Style="{StaticResource PhoneTextAccentStyle}" 
                    Margin="0,94,0,83" />
            </Grid>
        </Grid>
    
    

    これにより、アプリの構築が完了します。

このアプリは、実際のクイック カードを参照する一助となるように設計されています。このセクションでは、アプリのマニフェスト ファイルで構成された拡張機能に関連付けられた製品、ムービー、および場所を検索します。クイック カードを見つけてからアプリを起動し、ディープ リンク URI からアプリに渡されたパラメーターを表示します。

クイック カードから Windows Phone OS 7.1 アプリを起動すると、デバッグの接続が中断されます。この制限は、Windows Phone 8 アプリには存在しません。

重要:重要:

アプリとクイック カードをテストするには、PC または Windows Phone デバイスからのインターネット接続が必要です。

製品カードとのテスト方法

  1. F5 キーを押してアプリをデバッグし、エミュレーターまたはデバイスに展開します。

  2. アプリが読み込まれたら、ハードウェアの [検索] ボタンをタップし、Bing を開きます。

  3. Bing で、ビデオ ゲームのコンソール名など、ビデオ ゲーム製品に関連する検索用語を入力します。たとえば、「xbox 360」と入力すると、Xbox 360 に関連する製品カードが返されます。Bing_Products_Video_Games の拡張機能について製品カードをテストするには、次の 2 項目が必要です。

    • Bing によって、検索用語がビデオ ゲーム製品に関連すると見なされている必要があります。

    • 検索用語に関連する製品カードが既に Bing に存在しており、Bing_Products_Video_Games の拡張機能に関連付けられている必要があります。

  4. [Web] または [ショッピング] ピボット ページで、[製品] の見出しの下の製品を選択します。これにより、製品に関連するクイック カードが起動します。

    ヒントヒント:

    [製品] の見出しが表示されていない場合は、他の検索用語を試してみるか、または WMAppManifest.xml および Extras.xml ファイルに製品の拡張機能を追加します。すべての検索拡張機能については「Windows Phone 8 の検索登録および起動参照」を参照してください。

  5. 製品のクイック カード上で、[アプリ] ピボット ページをスワイプし、アプリをタップします。キャプションは「製品 URI の詳細」となっています。

    メモメモ:

    [アプリ] ピボット ページが表示されない場合は、その製品カードは WMAppManifest.xml および Extras.xml ファイルに示される製品の拡張に関連付けられていません。[戻る] ボタンをタップして他の製品のカードを試してください。

  6. [アプリ] ピボット ページでアプリをタップしてから、[QuickCardTargetPage.xaml] ページがその製品のディープ リンク URI 内のパラメーターを表示するのを確認します。

ムービー カードとのテスト方法

  1. F5 キーを押してアプリをデバッグし、エミュレーターまたはデバイスに展開します。アプリを既に展開済みの場合は、この手順はオプションです。

  2. アプリが読み込まれたら、ハードウェアの [検索] ボタンをタップし、Bing を開きます。

  3. Bing で、「ムービー」、「映画館の映画」、近隣で上映中の映画のタイトルなど、映画館で現在上映中の映画に関連する検索用語を入力します。Bing_Movies の拡張機能についてムービー カードをテストするには、次の 2 項目が必要です。

    • Bing によって、検索用語が映画館で現在上映中の映画に関連すると見なされている必要があります。

    • 検索用語に関連するムービー カードが既に Bing に存在しており、Bing_Movies の拡張機能に関連付けられている必要があります。

  4. [Web] ピボット ページで、[付近で上映中の映画] の見出しの下の検索結果に表示される映画をタップします。これにより、現在の映画のクイック カードのリストが起動します。一覧から映画を 1 つタップします。

    メモメモ:

    検索結果に映画が表示されていない場合は、他の検索用語を試してください。映画については他の拡張機能はありません。

  5. ムービーのクイック カード上で、[アプリ] ピボット ページをスワイプし、アプリをタップします。キャプションは「ムービー URI の詳細」となっています。

  6. [アプリ] ピボット ページでアプリをタップしてから、[QuickCardTargetPage.xaml] ページがそのムービーのディープ リンク URI 内のパラメーターを表示するのを確認します。

場所カードとのテスト方法

  1. F5 キーを押してアプリをデバッグし、エミュレーターまたはデバイスに展開します。

  2. アプリが読み込まれたら、ハードウェアの [検索] ボタンをタップし、Bing を開きます。

  3. Bing で、「食事」や近隣のレストラン名など、食事やレストランに関連する検索用語を入力します。Bing_Places_Food_and_Dining の拡張機能について場所カードをテストするには、次の 2 項目が必要です。

    • Bing によって、検索用語が食事やレストランの場所に関連すると見なされている必要があります。

    • 検索用語に関連する場所カードが既に Bing に存在しており、Bing_Places_Food_and_Dining の拡張機能に関連付けられている必要があります。

  4. [近隣] ピボット ページ上で、表示された地図上の食事およびレストランの場所を選択します。これにより、その場所に関連するクイック カードが起動します。

    ヒントヒント:

    [近隣] ピボット ページに結果が表示されない場合は、他の検索用語を試してみるか、または WMAppManifest.xml および Extras.xml ファイルに場所の拡張を追加します。すべての検索拡張機能については「Windows Phone 8 の検索登録および起動参照」を参照してください。

  5. 場所のクイック カード上で、[アプリ] ピボット ページをスワイプし、アプリをタップします。キャプションは「場所 URI の詳細」となっています。

    メモメモ:

    [アプリ] ピボット ページが表示されない場合は、その場所カードは WMAppManifest.xml および Extras.xml ファイルに示される場所の拡張に関連付けられていません。[戻る] ボタンをタップして他の場所カードを試してください。

  6. [アプリ] ピボット ページでアプリをタップしてから、[QuickCardTargetPage.xaml] ページがその場所のアプリ コネクト ディープ リンク URI 内のパラメーターを表示するのを確認します。

クイック カードから Windows Phone OS 7.1 アプリを起動すると、デバッグ プロセスが中断されます。アプリに対する検索機能拡張の起動をデバッグするには、ディープ リンク URL をシミュレートする必要があります。これには、次の手順を実行して WMAppManifest.xml ファイルの DefaultTask 要素を一時的に置き換えます。

このデバッグの制約は Windows Phone 8 アプリには該当しません。Windows Phone 8 アプリをデバッグするとき、URI マッパーにブレークポイントを設定し、デバッグ ツールを使用して、ディープ リンク URI のコンテンツを調査できます。Windows Phone 8 で検索機能拡張の起動をシミュレートするのは必須ではありませんが、特定の URI でアプリを起動するための便利な方法として使用できます。

Windows Phone 8 でアプリをデバッグするには

  1. アプリ内のどこかにデバッグ ブレーク ポイントを設定します。クイック カードから送信されたディープ リンク URI を表示するには、URI マッパー コードにデバッグ ブレークポイントを設定します。

  2. このトピックで前に説明したテストの手順に従って、さまざまなクイック カードからアプリを起動します。

Windows Phone OS 7.1 でアプリをデバッグするには

  1. アプリのマニフェスト ファイル WMAppManifest.xml で、元の DefaultTask 要素に一時的にコメントをつけます。

    重要:重要:

    元の DefaultTask 要素をコメント化すると、アプリはメイン ページへの標準の起動を実行しません。デバッグ終了時には、この要素のコメント化を必ず解除する必要があります。

  2. WMAppManifest.xml で、Tasks 要素に次の一時的な DefaultTask 要素を追加します。

    <DefaultTask Name="_default" NavigationPage="SearchExtras?MovieName=Test&amp;Category=Bing_Movies" />
    

    この DefaultTask 要素は、"Test" という名前の映画に対してムービー カードをシミュレートします。

  3. F5 キーを押してアプリをデバッグし、エミュレーターまたはデバイスに展開します。

  4. アプリが [QuickCardTargetPage.xaml] ページから直接起動し、Test という名前の映画のディープ リンク URI 内のパラメーターを表示するのを確認します。

  5. WMAppManifest.xml で、一時的な DefaultTask 要素をコメント化して元の要素のコメント化を解除します。終了すると、Tasks 要素は次のコードのようになります。

    <Tasks>
      <DefaultTask  Name ="_default" NavigationPage="MainPage.xaml"/>
      <!--<DefaultTask  Name="_default" NavigationPage="SearchExtras?MovieName=Test&amp;Category=Bing_Movies" />-->
    </Tasks>
    

表示:
© 2014 Microsoft