左の Grid.Column の listView にブログ投稿のリストを表示する基本的な RSS リーダーがあります。右側の Grid.Column は WebView です。ユーザーが listView 内の項目を選択すると、Webview が Uri で更新され、Web ページが表示されます。
ここで、BottomAppBar を追加し、Pin/UnPin ボタンを作成しました。ピン留め機能を正常に作成しましたが、NavigationContext のクエリ文字列にデータを渡していません。したがって、ユーザーがピン留めされたタイルをクリックすると、選択した記事ではなく、ページ全体にのみディープリンクされます。これにより、選択したアイテムの URL ではなく、すべての最新の記事が読み込まれます。
ピン留めされたタイルのクエリ文字列に Url を渡す必要があることはわかっていますが、ここで立ち往生しています。Windows Phone アプリでこれを何十回も行ってきましたが、この Windows 8 アプリについてはここで立ち往生しています。WP7 では、コンテキスト メニューを使用してアイテムをピン留めしています。ここで私はアプリバーからピン留めしていますが、URLを取得してクエリ文字列として追加できないようです(TileActivationArgumentとして)
主に、選択したアイテムのデータを取得してタイルに配置する方法と、それを読み取る方法についてのガイダンスが必要です。これが私の Pin() メソッドです。
編集:先に進んで一時的な解決策を作成しましたが、選択したアイテムのプロパティを取得できないという問題は解決しません。コメントはコードとインラインです
private async void PinTileHelper(string message, object sender)
{
//This is my preferred method, but I cannot extract the SelectedItem's properties
//var item = itemListView.SelectedItem;
//I'm not able to use the sender because this is a button click
//var selectedItem = (FeedItems)((ListView)sender).SelectedItem;
//As a cheesy workaround, I just took the Uri directly from the WebView's source Uri
var ActivationArgument = this.ContentView.Source.ToString();
Uri logo = new Uri("ms-appx:///Assets/squareTile-sdk.png");
//Uri smallLogo = new Uri("ms-appx:///Assets/smallTile-sdk.png");
SecondaryTile secondaryTile = new SecondaryTile("Toolbox",
"Fantasy Football Tile",
"Article name goes here and ",
ActivationArgument,
TileOptions.ShowNameOnLogo,
logo);
secondaryTile.ForegroundText = ForegroundText.Dark;
//secondaryTile.SmallLogo = smallLogo;
bool isPinned = await secondaryTile.RequestCreateAsync();
MessageDialog dialog = new MessageDialog("Pinned?");
if (isPinned)
{
dialog.Content = "You have succesfully pinned this tile";
await dialog.ShowAsync();
}
else
{
dialog.Content = "Something went wrong. The tile wasn't pinned.";
await dialog.ShowAsync();
}
}
あなたが提供できる洞察に感謝します。
編集#2:成功!! ItemViewModel アイテムへの安全なキャストはうまくいきます。
var item = itemListView.SelectedItem as FeedItems (or your ItemViewModel items);