Tôi đã thấy một số ví dụ hiển thị CycleTile đang hoạt động, nhưng chúng có tất cả các hình ảnh cục bộ được sử dụng. Có thể thiết lập những hình ảnh này khi ứng dụng được chạy lần đầu và trỏ CycleTile đến các hình ảnh từ xa không? Hoặc nếu tôi cần phải lưu chúng vào điện thoại trước, làm thế nào tôi có thể lấy CycleTile để tham khảo chúng?Tạo CycleTile với các hình ảnh từ xa
Trả lời
CycleTileTemplate & CycleTileData chỉ hỗ trợ URI địa phương và không hỗ trợ URI web từ xa.. Có nghĩa là bạn chỉ có thể đặt nguồn của một hình ảnh chu kỳ từ các tệp được cài đặt từ XAP hoặc từ các tệp trong IsoStore.
Để hỗ trợ hình ảnh từ xa trong CycleTileData, bạn sẽ cần tải xuống hình ảnh trong một tác nhân nền định kỳ, lưu chúng vào IsoStore và sau đó cập nhật CycleTileData bằng những hình ảnh đó. Thông báo đẩy sẽ không hoạt động ở đây vì các hình ảnh cần phải là cục bộ và ShellTileSchedule cũng sẽ không hoạt động.
Đảm bảo lưu hình ảnh vào IsoStore trong "/ Shared/ShellContent" và đặt URI là "isostore: /Shared/Shellcontent/myImage.png" hoặc chúng sẽ không thể truy cập được vào ô màn hình bắt đầu.
Hãy xem ví dụ về điều đó. Đầu tiên chúng tôi bắt đầu bằng cách viết lên một thuật toán luồng song song mà ra mắt 9 chủ đề tải về, chờ đợi kết quả và sau đó cập nhật gạch:
private IsolatedStorageFile isoStore = IsolatedStorageFile.GetUserStoreForApplication();
private void MainPage_Loaded(object sender, RoutedEventArgs e)
{
var threadFinishEvents = new List<WaitHandle>();
DownloadImages(threadFinishEvents);
new Thread(()=>
{
Mutex.WaitAll(threadFinishEvents.ToArray());
UpdateTiles();
isoStore.Dispose();
}).Start();
}
Tiếp theo, chúng tôi sẽ tải về những hình ảnh 9 thành IsoStore "/ Shared/ShellContent ". Chúng tôi sẽ lưu ý đặc biệt để thêm cờ luồng mới cho mỗi lần tải xuống web và đặt cờ là xong khi tệp nằm trong IsoStore.
private void DownloadImages(List<WaitHandle> threadFinishEvents)
{
for (int i = 0; i < 9; i++)
{
var localI = i;
var threadFinish = new EventWaitHandle(false, EventResetMode.ManualReset);
threadFinishEvents.Add(threadFinish);
var request = WebRequest.CreateHttp("http://www.justinangel.net/storage/691x336.png");
request.BeginGetResponse(ir =>
{
var result = request.EndGetResponse(ir);
using (var isoStoreFile = isoStore.OpenFile("shared/shellcontent/myImage" + localI + ".png",
FileMode.Create,
FileAccess.ReadWrite))
using (var response = result.GetResponseStream())
{
var dataBuffer = new byte[1024];
while (response.Read(dataBuffer, 0, dataBuffer.Length) > 0)
{
isoStoreFile.Write(dataBuffer, 0, dataBuffer.Length);
}
}
threadFinish.Set();
}, null);
}
}
Cuối cùng, chúng tôi sẽ cập nhật ô trực tiếp để sử dụng hình ảnh mới trong IsoStore.
private void UpdateTiles()
{
ShellTile.ActiveTiles
.First()
.Update(new CycleTileData()
{
Title = "Cyclical",
CycleImages = new Uri[]
{
new Uri("isostore:/Shared/ShellContent/myImage0.png", UriKind.Absolute),
new Uri("isostore:/Shared/ShellContent/myImage1.png", UriKind.Absolute),
new Uri("isostore:/Shared/ShellContent/myImage2.png", UriKind.Absolute),
new Uri("isostore:/Shared/ShellContent/myImage3.png", UriKind.Absolute),
new Uri("isostore:/Shared/ShellContent/myImage4.png", UriKind.Absolute),
new Uri("isostore:/Shared/ShellContent/myImage5.png", UriKind.Absolute),
new Uri("isostore:/Shared/ShellContent/myImage6.png", UriKind.Absolute),
new Uri("isostore:/Shared/ShellContent/myImage7.png", UriKind.Absolute),
new Uri("isostore:/Shared/ShellContent/myImage8.png", UriKind.Absolute),
}
});
}
Có một vài điều thú vị để xem xét:
- đại lý nền kỳ chỉ có 25 giây để hoàn thành hoạt động của họ, vì vậy nó có thể làm cho tinh thần để thêm timer thresehold khi kích hoạt Mutex.WaitAll và có nó thất bại một cách duyên dáng.
- Tải xuống 9 hình ảnh trong 25 giây có thể không hoạt động chút nào trong một số điều kiện mạng để có thể tốt nhất là tối ưu hóa điều đó. Bạn có thể sử dụng ít hình ảnh hơn hoặc chỉ cập nhật một vài hình ảnh sau mỗi 30 phút.
- Cập nhật CycleTileData vào cùng một tệp URI sẽ không kích hoạt bản cập nhật của ô (AFAIK). Vì vậy, bạn sẽ cần tên tập tin tốt hơn sau đó myImage0, nhưng thay vì có tên tập tin duy nhất cho hình ảnh.
Đối với CycleTile, hình ảnh phải là cục bộ. Bạn có thể thiết lập periodic task để làm mới hình ảnh, sau đó lưu trữ những hình ảnh đó trong thư mục đặc biệt/thư mục được chia sẻ trong bộ nhớ cục bộ/bị cô lập (ví dụ: ms-appdata: ///local/shared/shellcontent/image01.png)
Session 7 of the Windows Phone 8 Jumpstart là một tài liệu tham khảo tốt cho việc này - đặc biệt về 25:30 trong
Tôi khuyên bạn nên sử dụng chuyển tệp nền cho tải xuống, rất đáng tin cậy và bạn không bị giới hạn trong giới hạn 25 giây. –
+1 về khuyến nghị matthijs. Cuộc gọi tốt. – JustinAngel