Я пытаюсь изменить фоновые обои рабочего стола и Windows Mobile с помощью С#. Все работает на рабочем столе, но не в Windows Mobile. У меня просто есть кнопка с событием click, которое выполняет ChangeBackground:
private async void ChangeBackgroundButton_Click(object sender, RoutedEventArgs e)
{
await ChangeBackground();
updateTask();
}
private static async Task ChangeBackground()
{
if (UserProfilePersonalizationSettings.IsSupported())
{
StorageFile file = Task.Run(async () => {
Uri uri = new Uri("https://source.unsplash.com/random/1080x1920");
StorageFile f = await StorageFile.CreateStreamedFileFromUriAsync("background.jpg", uri, RandomAccessStreamReference.CreateFromUri(uri));
return await f.CopyAsync(ApplicationData.Current.LocalFolder, "background.jpg", NameCollisionOption.ReplaceExisting);
}).Result;
UserProfilePersonalizationSettings settings = UserProfilePersonalizationSettings.Current;
await settings.TrySetWallpaperImageAsync(file);
}
}
Когда я нажимаю кнопку на Windows Mobile, приложение зависает. Кнопка остается в наведенном состоянии, а обои не меняются.
Что я делаю не так?
Изменить: я переписал код, чтобы исправить проблемы с CopyAsync. Теперь код выглядит так:
private static async Task<StorageFile> ChangeBackground()
{
if (UserProfilePersonalizationSettings.IsSupported())
{
Uri uri = new Uri("https://source.unsplash.com/random/1920x1080");
string filename = DateTime.Now.ToString("yyyyMMddHHmmssfff") + ".jpg";
HttpClient httpClient = new HttpClient();
HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, uri);
HttpResponseMessage response = await httpClient.SendAsync(request, HttpCompletionOption.ResponseHeadersRead);
var imageFile = await ApplicationData.Current.LocalFolder.CreateFileAsync(filename, CreationCollisionOption.ReplaceExisting);
var fs = await imageFile.OpenAsync(FileAccessMode.ReadWrite);
DataWriter writer = new DataWriter(fs.GetOutputStreamAt(0));
writer.WriteBytes(await response.Content.ReadAsByteArrayAsync());
await writer.StoreAsync();
writer.DetachStream();
await fs.FlushAsync();
StorageFile file = await ApplicationData.Current.LocalFolder.GetFileAsync(filename);
UserProfilePersonalizationSettings settings = UserProfilePersonalizationSettings.Current;
if (!await settings.TrySetWallpaperImageAsync(file))
{
Debug.WriteLine("Failed");
} else
{
Debug.WriteLine("Success");
}
return file;
}
return null;
}
В Windows 10 показывает успех, в Windows 10 Mobile показывает ошибку.
Task.Run()
иasync
/await
? Кроме того, каким должен быть API вsettings.TrySetWallpaperImageAsync()
для мобильных устройств? - person Berin Loritsch   schedule 08.02.2016