Windows Phoneアプリケーションを作成しました。カスタムタイルを作成し、プログラムから更新する必要があります。
ユーザーコントロールを作成しました。
<TextBlock x:Name="Count" Foreground="White" FontFamily="Segoe WP Bold" FontSize="80" Text="{Binding Count}" HorizontalAlignment="Right" Margin="0,0,10,0"/>
<TextBlock HorizontalAlignment="Left" VerticalAlignment="Bottom" Margin="0,0,0,0" Grid.Row="1" Text="Tile Demo" Foreground="White" FontFamily="Segoe WP Semibold" FontSize="35" />
MainPage.xaml.csファイルからカウントをバインドしてから、ユーザーコントロールを.jpgファイルに変換し、ISOストアに保存しています。以下のように
public void CreateOrUpdateTile(int count)
{
CustomNotificationTile frontTile = new CustomNotificationTile();
TileData tileData = new TileData() { Count = count };
frontTile.DataContext = tileData;
//frontTile.Count.Text = count.ToString();
frontTile.Measure(new Size(173, 173));
frontTile.Arrange(new Rect(0, 0, 173, 173));
var bmp = new WriteableBitmap(173, 173);
bmp.Render(frontTile, null);
bmp.Invalidate();
var isf = IsolatedStorageFile.GetUserStoreForApplication();
var filename = "/Shared/ShellContent/Tile.jpg";
if (!isf.DirectoryExists("/Shared/ShellContent"))
{
isf.CreateDirectory("/Shared/ShellContent");
}
using (var stream = isf.OpenFile(filename, System.IO.FileMode.OpenOrCreate))
{
bmp.SaveJpeg(stream, 173, 173, 0, 100);
}
ShellTile TileToFind = ShellTile.ActiveTiles.FirstOrDefault(x => x.NavigationUri.ToString().Contains("TileID=2"));
//test if Tile was created
if (TileToFind == null)
{
StandardTileData NewTileData = new StandardTileData
{
BackgroundImage = new Uri("isostore:" + filename, UriKind.Absolute),
BackBackgroundImage = new Uri("Application_TileImage_173x173.png", UriKind.Relative)
};
ShellTile.Create(new Uri("/MainPage.xaml?TileID=2", UriKind.Relative), NewTileData);
}
#region Update the Tile Not Working as expected
else
{
StandardTileData NewTileData = new StandardTileData
{
BackgroundImage = new Uri("isostore:" + filename, UriKind.Absolute)
};
TileToFind.Update(NewTileData);
}
#endregion
}
問題:
私の問題は、最初にコンストラクターから呼び出して、ダミーデータを含むタイルを作成することです。期待どおりに機能します。
しかし、機能していない他のメソッドからタイルを更新しようとすると、page_loadイベントから呼び出しているメソッドが表示されます
これらのメソッドはWCFサービスからデータをフェッチします。私は、以下のようにWCFサービスメソッドの完了したイベントからタイルを更新しています。
Service.getProductsCountAsync();
Service.getProductsCountCompleted += (o,e) => {
int count = e.Result;
Dispatcher.BeginInvoke(() =>
{
CreateOrUpdateTile(count);
});
};
コントローラーが上記のコードをヒットすると、背景が黒の数字のみが表示され、タイルカウントは更新されますが、背景色とロゴが変更されます。理由はわかりませんが、できるだけ早く解決する必要があります。
問題はバックグラウンドスレッドからUIを更新することかもしれないと思いますが、それを克服する方法がわかりません
以下は、メソッド呼び出しの前とメソッド呼び出しの後に撮影される画像です。