Windows Phone의 검색 환경 확장하는 방법

2013-12-05

적용 대상: Windows Phone 8 | Windows Phone OS 7.1

 

이 항목에서는 검색 확장성 앱을 만들어 Windows Phone 용으로 검색을 확장하는 방법을 설명합니다. 이 작업을 완료하면 앱을 사용해 제품 카드, 장소 카드, 영화 카드 등의 빠른 카드를 테스트할 수 있습니다. 이 항목에서 설명하는 앱은 딥 링크 URI에서 매개 변수를 추출한 다음 앱 페이지에 표시합니다. 검색 환경을 확장하는 방법에 대한 자세한 내용은 Windows Phone의 검색 확장성를 참조하세요.

팁팁:

이 항목에 나오는 코드는 빠른 카드 샘플에서 가져온 것입니다.

이 항목에는 다음 단원이 포함되어 있습니다.

 

이 항목의 단계를 수행하여 다음 파일을 수정하거나 만듭니다.

  • 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: 이 페이지를 수정하여 표준 앱 실행용 텍스트를 제공합니다. 이 페이지는 검색 확장성에 의해 실행되지 않습니다.

이 항목에서 만든 앱은 MVVM(Model-View-ViewModel) 패턴을 사용합니다. MVVM 앱의 다른 예는 Windows Phone 앱에서 Model-View-ViewModel 패턴 구현을 참조하세요.

이 섹션에서는 앱을 만들고 앱 매니페스트 파일을 수정하여 앱과 관련된 검색 확장을 지정합니다. 이 예제에서는 확장 세 개를 지정해 세 가지 유형의 빠른 카드를 설명합니다. 확장의 전체 목록은 Windows Phone의 검색 등록 및 실행 참조를 참조하세요.

앱 매니페스트를 구성하려면

  1. Windows Phone SDK 를 열고 Windows Phone 앱  템플릿을 사용하여 새 프로젝트를 만듭니다.

  2. 프로젝트가 로드되면 앱 매니페스트 파일을 엽니다. 솔루션 탐색기에서 속성을 확장하여 WMAppManifest.xml 파일을 찾습니다. 그런 다음 파일 이름을 마우스 오른쪽 버튼으로 클릭하고 연결 프로그램을 클릭한 다음 XML(텍스트) 편집기를 선택합니다.

  3. WMAppManifest.xml에서 App 요소의 Tokens 요소 아래에 다음 코드를 추가합니다.

        <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>
    
    

    이 코드는 각각의 빠른 카드 유형, 즉 제품 카드, 영화 카드, 장소 카드에 하나씩 세 개의 확장을 추가합니다. 이러한 확장과 연결되지 않은 빠른 카드의 경우 빠른 카드에 해당하는 피벗 페이지에 이 앱이 표시되지 않습니다. 검색 확장의 전체 목록은 Windows Phone의 검색 등록 및 실행 참조를 참조하세요.

이 섹션에서는 Extras.xml 파일을 만들고 해당 빠른 카드의 피벗 페이지에 표시되는 앱 제목과 설명을 지정합니다.

Extras.xml 파일을 만들려면

  1. 솔루션 탐색기에서 프로젝트를 마우스 오른쪽 버튼으로 클릭하고 추가, 새 폴더를 차례로 선택합니다.

  2. 새 폴더의 이름을 Extensions로 지정합니다.

  3. 솔루션 탐색기에서 Extensions 폴더를 마우스 오른쪽 버튼으로 클릭하고 추가, 새 항목을 차례로 선택합니다.

  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();
    
    

    이 코드는 QuickCardUriMapper 클래스를 응용프로그램 프레임의 UriMapper 속성에 할당합니다. 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의 검색 등록 및 실행 참조를 참조하세요.

데이터 모델을 만들려면

  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>
    
    

    이 페이지에서 ListBox 컨트롤은 ViewModel에서 관찰 가능 컬렉션인 QuickCardUriParameters에 바인딩됩니다. ListBox 내의 두 TextBlock 컨트롤은 관찰 가능 컬렉션의 각 매개 변수에 바인딩됩니다. 한 TextBlock 컨트롤은 ParamName 속성에 바인딩되고, 다른 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 확장을 사용하여 제품 카드를 테스트하려면 다음의 두 가지 항목이 필요합니다.

    • Bing에서 검색어를 동영상 게임 제품과 관련된 것으로 간주해야 합니다.

    • 검색어와 관련된 제품 카드가 Bing에 있어야 하고, Bing_Products_Video_Games 확장과 연결되어 있어야 합니다.

  4. 또는 쇼핑 피벗 페이지에서 제품 제목 아래의 제품을 선택합니다. 그러면 해당 제품과 관련된 빠른 카드가 실행됩니다.

    팁팁:

    제품 제목이 표시되지 않으면 다른 검색어를 사용해 보거나, WMAppManifest.xmlExtras.xml 파일에 제품 확장을 더 추가합니다. 검색 확장의 전체 목록은 Windows Phone의 검색 등록 및 실행 참조를 참조하세요.

  5. 제품의 빠른 카드에서 살짝 밀어 피벗 페이지로 이동한 다음 앱을 탭합니다. 설명이 제품 URI 세부 정보로 표시되는지 확인합니다.

    참고참고:

    피벗 페이지가 표시되지 않으면 특정 제품 카드가 WMAppManifest.xmlExtras.xml 파일에 나와 있는 제품 확장과 연결되어 있지 않은 것입니다. 이 경우 뒤로 버튼을 탭하고 다른 제품 카드를 사용해 보세요.

  6. 피벗 페이지에서 앱을 탭한 다음 QuickCardTargetPage.xaml 페이지에 제품 딥 링크 URI의 매개 변수가 표시되는지 확인합니다.

영화 카드를 테스트하려면

  1. F5 키를 눌러 앱을 디버깅하고 에뮬레이터 또는 장치로 배포합니다. 앱을 이미 배포한 경우에는 이 단계를 수행하지 않아도 됩니다.

  2. 앱이 로드되면 하드웨어의 검색 버튼을 탭하여 Bing을 엽니다.

  3. Bing에서 현재 상영 중인 영화와 관련된 검색어를 입력합니다. 예를 들어 "영화", "개봉 영화" 또는 개봉 영화 제목을 입력합니다. Bing_Movies 확장을 사용하여 영화 카드를 테스트하려면 다음의 두 가지 항목이 필요합니다.

    • Bing에서 검색어를 현재 상영 중인 영화와 관련된 것으로 간주해야 합니다.

    • 검색어와 관련된 영화 카드가 Bing에 있어야 하고, Bing_Movies 확장과 연결되어 있어야 합니다.

  4. 피벗 페이지에서 주변의 개봉 영화... 제목 아래의 검색 결과에 나와 있는 영화를 탭합니다. 그러면 현재 개봉 영화에 해당하는 빠른 카드 목록이 실행됩니다. 목록에서 카드를 하나 탭합니다.

    참고참고:

    검색 결과에 영화 목록이 표시되지 않으면 다른 검색어를 사용해 보세요. 영화에 대한 추가 확장은 제공되지 않습니다.

  5. 영화의 빠른 카드에서 살짝 밀어 피벗 페이지로 이동한 다음 앱을 탭합니다. 설명이 영화 URI 세부 정보로 표시되는지 확인합니다.

  6. 피벗 페이지에서 앱을 탭한 다음 QuickCardTargetPage.xaml 페이지에 영화 딥 링크 URI의 매개 변수가 표시되는지 확인합니다.

장소 카드를 테스트하려면

  1. F5 키를 눌러 앱을 디버깅하고 에뮬레이터 또는 장치로 배포합니다.

  2. 앱이 로드되면 하드웨어의 검색 버튼을 탭하여 Bing을 엽니다.

  3. Bing에서 식품 및 식사와 관련된 검색어를 입력합니다. 예를 들어 "식품" 또는 주변의 식당 이름을 입력합니다. Bing_Places_Food_and_Dining 확장을 사용하여 장소 카드를 테스트하려면 다음의 두 가지 항목이 필요합니다.

    • Bing에서 검색어를 식품 및 식사 위치와 관련된 것으로 간주해야 합니다.

    • 검색어와 관련된 장소 카드가 Bing에 있어야 하고, Bing_Places_Food_and_Dining 확장과 연결되어 있어야 합니다.

  4. 지역 피벗 페이지에서 표시되는 지도 아래의 식품 및 식사 위치를 선택합니다. 그러면 해당 장소와 관련된 빠른 카드가 실행됩니다.

    팁팁:

    지역 피벗 페이지에 결과가 표시되지 않으면 다른 검색어를 사용해 보거나, WMAppManifest.xmlExtras.xml 파일에 장소 확장을 더 추가합니다. 검색 확장의 전체 목록은 Windows Phone의 검색 등록 및 실행 참조를 참조하세요.

  5. 장소의 빠른 카드에서 살짝 밀어 피벗 페이지로 이동한 다음 앱을 탭합니다. 설명이 장소 URI 세부 정보로 표시되는지 확인합니다.

    참고참고:

    피벗 페이지가 표시되지 않으면 특정 장소 카드가 WMAppManifest.xmlExtras.xml 파일에 나와 있는 장소 확장과 연결되어 있지 않은 것입니다. 이 경우 뒤로 버튼을 탭하고 다른 장소 카드를 사용해 보세요.

  6. 피벗 페이지에서 앱을 탭한 다음 QuickCardTargetPage.xaml 페이지에 장소 딥 링크 URI의 매개 변수가 표시되는지 확인합니다.

Windows Phone OS 7.1 앱을 빠른 카드에서 실행하면 디버깅 프로세스가 중단됩니다. 앱에 대한 검색 확장성 실행을 디버깅하려면 딥 링크 URI를 시뮬레이트해야 합니다. 이렇게 하려면 다음 절차를 수행하여 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에서 다음의 임시 DefaultTask 요소를 Tasks 요소에 추가합니다.

    <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