5

私のWindowsPhoneアプリのメインページでは、ユーザーはボタンをクリックしていくつかの操作を実行できます。これにより、ライブタイルが更新されます。

私が抱えている問題は、ユーザーがボタンをクリックしてから電話の[戻る]ボタンをすばやく押すと、ライブタイルが正しくレンダリングされない場合があることです。この問題はめったに発生しませんが、発生し、発生すると見た目が悪くなります...

ここに画像の説明を入力してください

ライブタイルを実装する方法は、ライブタイルとまったく同じように見えるユーザーコントロールを作成し、それを分離されたストレージに保存することです。次に、それを取得してFliptileDataオブジェクトに保存します。最後に、ShellTileでUpdateメソッドを呼び出します。プロセスを示すために、次のコードを参照してください。

    // the function that saves the user control to isolated storage
    public Uri SaveJpegToIsolatedStorage(FrameworkElement tile, string suffix, int tileWidth = 336, int tileHeight = 336)
    {
        var bmp = new WriteableBitmap(tileWidth, tileHeight);

        // Force the content to layout itself properly
        tile.Measure(new Size(tileWidth, tileHeight));
        tile.Arrange(new Rect(0, 0, tileWidth, tileHeight));

        bmp.Render(tile, null);
        bmp.Invalidate();

        // Obtain the virtual store for the application
        IsolatedStorageFile myStore = IsolatedStorageFile.GetUserStoreForApplication();
        using (IsolatedStorageFileStream fileStream = new IsolatedStorageFileStream(IsolatedStorageFileName + suffix, FileMode.Create, myStore))
        {
            try
            {
                bmp.SaveJpeg(fileStream, tileWidth, tileHeight, 0, 100);
            }
            catch (Exception)
            {
                return null;
            }
        }

        return new Uri("isostore:/" + IsolatedStorageFileName + suffix, UriKind.Absolute);
    }

    // save the user control to isolated storage and prepare the FlipTileData object
    wideFrontTileImage = SaveJpegToIsolatedStorage((UserControl)this.WideFrontTile, "_wide_front", 691);
    var flipTileData = new FlipTileData();
    flipTileData.WideBackgroundImage = wideFrontTileImage;
    return flipTileData;

    // update the live tile
   var shellTile = ShellTile.ActiveTiles.FirstOrDefault();
   shellTile.Update(customTile.GetFlipTileData(data.UndoneMemosCount == "0" && data.TotalMemosCount == "0"));

これを引き起こしている理由は、ユーザーが[戻る]ボタンをクリックするのが速すぎると、OSがアプリ内で実行されているすべてのプロセスを終了し、その時点でレンダリングが行われなかったためだと思います。レンダリングがいつ終了したかを知る方法があるかどうかを考えているので、[戻る]ボタンをキャンセルして、終了するまで待ってから手動でアプリを終了できます。しかし、私は単にどのようにわからない...

これに関するどんな助けも大いに感謝されるでしょう!

4

1 に答える 1

5

WP8 アプリで同様の問題が発生しました。問題は、ApplicationDeactivated イベント ハンドラーでタイルを更新していたことです。問題は、そこでタイルを更新するのではなく、MainPage.OnNavigatedFrom オーバーライドで更新することです。これを変更すると、問題なく動作します。

于 2013-01-09T08:41:08.860 に答える