Windows 8 的「魅力列」提供統一的搜尋、共用、裝置、設定四大合約,讓應用與系統、其他應用無縫整合。本文詳細說明如何在 Contoso Cookbook 中實作搜尋合約(含搜尋建議)與共用合約(文字、圖片、多重資料格式)。
// LoadState 中註冊
DataTransferManager.GetForCurrentView().DataRequested += OnDataRequested;
// SaveState 中取消註冊
DataTransferManager.GetForCurrentView().DataRequested -= OnDataRequested;
void OnDataRequested(DataTransferManager sender, DataRequestedEventArgs args)
{
var request = args.Request;
var item = (RecipeDataItem)this.flipView.SelectedItem;
request.Data.Properties.Title = item.Title;
request.Data.Properties.Description = "Recipe ingredients and directions";
// 共用食譜文字
var recipe = "\r\nINGREDIENTS\r\n";
recipe += String.Join("\r\n", item.Ingredients);
recipe += ("\r\n\r\nDIRECTIONS\r\n" + item.Directions);
request.Data.SetText(recipe);
// 共用食譜圖片
var reference = RandomAccessStreamReference.CreateFromUri(new Uri(item.ImagePath.AbsoluteUri));
request.Data.Properties.Thumbnail = reference;
request.Data.SetBitmap(reference);
}
共用來源支援多種資料格式(文字、位圖、檔案等),共用目標會根據自身支援能力篩選顯示。
在方案總管右鍵 → 新增項目 → 搜尋合約,Visual Studio 會產生 SearchResultsPage.xaml 並自動修改 App.xaml.cs 加入 OnSearchActivated 處理外部啟動搜尋。
// SearchResultsPage.xaml.cs LoadState 方法中
var groups = RecipeDataSource.GetGroups("AllGroups");
string query = queryText.ToLower();
var all = new List<RecipeDataItem>();
_results.Add("All", all);
foreach (var group in groups)
{
var items = new List<RecipeDataItem>();
_results.Add(group.Title, items);
foreach (var item in group.Items)
{
if (item.Title.ToLower().Contains(query) || item.Directions.ToLower().Contains(query))
{
all.Add(item);
items.Add(item);
}
}
filterList.Add(new Filter(group.Title, items.Count, false));
}
filterList[0].Count = all.Count;
搜尋範圍涵蓋標題與作法說明,結果依群組分類並提供篩選器。
// Filter_SelectionChanged 中
this.DefaultViewModel["Results"] = _results[selectedFilter.Name];
修改 StandardStyles.xaml 中的 StandardSmallIcon300x70ItemTemplate,移除 Subtitle 繫結,調整尺寸並繫結 ShortTitle。
// App.xaml.cs OnLaunched 中
SearchPane.GetForCurrentView().SuggestionsRequested += OnSuggestionsRequested;
void OnSuggestionsRequested(SearchPane sender, SearchPaneSuggestionsRequestedEventArgs args)
{
string query = args.QueryText.ToLower();
string[] terms = { "salt", "pepper", "water", "egg", "vinegar", "flour", "rice", "sugar", "oil" };
foreach(var term in terms)
{
if (term.StartsWith(query))
args.Request.SearchSuggestionCollection.AppendQuerySuggestion(term);
}
}
使用者輸入 "su" 時自動提示 "sugar",大幅提升搜尋效率。
當應用未執行時從魅力列搜尋啟動,會呼叫 OnSearchActivated 而非 OnLaunched,需手動重新初始化資料與事件註冊:
if (args.PreviousExecutionState == ApplicationExecutionState.NotRunning ||
args.PreviousExecutionState == ApplicationExecutionState.ClosedByUser ||
args.PreviousExecutionState == ApplicationExecutionState.Terminated)
{
await RecipeDataSource.LoadLocalDataAsync();
SearchPane.GetForCurrentView().SuggestionsRequested += OnSuggestionsRequested;
}
搜尋與共用合約是 Windows 8 應用生態系統的核心整合機制。透過標準化合約,應用能以一致體驗跨應用交換資料、整合系統級搜尋。下一階段將探討媒體捕獲與應用列進階應用。