Живые плитки не получают изображение из изолированного хранилища - PullRequest
4 голосов
/ 27 сентября 2011

В моем приложении WP7 я создаю образ для активной плитки и сохраняю ее в изолированном хранилище. Затем моя периодическая задача может обновить текущую плитку, и в этом отношении все работает нормально для периодической задачи.

Проблема, с которой я столкнулся, заключается в том, что в моем приложении WP7 на переднем плане, когда я создаю образ активной плитки, я также обновляю живую плитку (так как я знаю, что что-то изменилось, так зачем ждать периодической задачи). Но когда происходит обновление живого тайла, кажется, что он не может найти вновь созданный файл и поэтому представляет живую плитку без растрового изображения.

С точки зрения соответствующего кода

Создание файла

var source = new BitmapImage(new Uri("Images/Tiles/Class Timetable with T.png", UriKind.Relative));
source.CreateOptions = BitmapCreateOptions.None;
source.ImageOpened += (sender, e) => // This is important. The image can't be rendered before it's loaded.
{
    // Create our image as a control, so it can be rendered to the WriteableBitmap.
    var newImage = new Image();
    newImage.Source = source;
    newImage.Width = 173;
    newImage.Height = 173;

    // Define the filename for our tile. Take note that a tile image *must* be saved in /Shared/ShellContent
    // or otherwise it won't display.
    var tileImage = string.Format("/Shared/ShellContent/{0}.jpg", Event.UniqueId);

    // Define the path to the isolatedstorage, so we can load our generated tile from there.
    var isoStoreTileImage = string.Format("isostore:{0}", tileImage);

и сам факт сохранения

// Create a stream to store our file in.
var stream = store.CreateFile(tileImage);

// Invalidate the bitmap to make it actually render.
bitmap.Invalidate();

// Save it to our stream.
bitmap.SaveJpeg(stream, 173, 173, 0, 100);

// Close the stream, and by that saving the file to the ISF.
stream.Close();

и код, который фактически извлекает изображение и обновляет активную плитку (и работает в периодической задаче, но не из самого приложения

string imageString = "isostore:/Shared/ShellContent/" + nextEvent.UniqueId + ".jpg";
ShellTile defaultTile2 = ShellTile.ActiveTiles.First();
defaultTile2.Update(new StandardTileData
{
    Title = nextTime,
    BackgroundImage = (new Uri(imageString, UriKind.Absolute)),

});

Просто не уверен, что я делаю здесь что-то принципиально неправильное? Я рассматриваю возможность сохранения сгенерированного изображения в базе данных вместе с его объектом. И у меня есть управляемое количество файлов, участвующих здесь. Я не создаю сотни вещей.

У меня есть обходной путь, который заключается в обновлении livetile из приложения WP7 без использования файла изображения.

Ответы [ 2 ]

1 голос
/ 27 сентября 2011

Эй, этот код выглядит знакомым ;-) Кроме этого, в коде, который вы разместили, нет ничего, что действительно могло бы определить проблему.

Я предполагаю, что вы вызываете NotifyComplete() на раннем этапе вашего периодического задания.Для этого я рекомендую использовать параллельную библиотеку задач, чтобы обойти эту проблему.

Я написал статью об этом сегодня утром: Как сделать: Live Tile with Scheduled Agent

Важной частью является использование Task.ContinueWith , чтобы гарантировать, что NotifyComplete() сначала будет вызываться после , когда вы закончили рендеринг фонового изображения и сохранили его в изолированном хранилище.

0 голосов
/ 27 сентября 2011

Вам не нужен префикс isostore: для пути при создании его в основном приложении. Попробуйте просто создать относительный URI для файла.

...