UWP应用程序 - TrySetWallpaperImageAsync在台式机上失败

时间:2016-07-20 19:23:06

标签: c# uwp desktop

我一直在开发应用程序,将Microsoft Bing Image设置为壁纸,但出于某种原因,代码可以在移动设备上运行,但似乎无法在桌面上运行。

以下是设置壁纸的主要代码:

  

注意: imageViewModel.Bitmap 是一种 WriteableBitmap

const string fileName = "start_temp.jpg";

        var file = await ApplicationData.Current.LocalFolder.CreateFileAsync(fileName, CreationCollisionOption.ReplaceExisting);

        using (IRandomAccessStream stream = await file.OpenAsync(FileAccessMode.ReadWrite))
        {
            BitmapEncoder encoder = await BitmapEncoder.CreateAsync(BitmapEncoder.JpegEncoderId, stream);
            Stream pixelStream = imageViewModel.Bitmap.PixelBuffer.AsStream();
            byte[] pixels = new byte[pixelStream.Length];
            await pixelStream.ReadAsync(pixels, 0, pixels.Length);

            encoder.SetPixelData(BitmapPixelFormat.Bgra8, BitmapAlphaMode.Ignore,
                (uint)imageViewModel.Bitmap.PixelWidth, (uint)imageViewModel.Bitmap.PixelHeight, 96.0, 96.0, pixels);
            await encoder.FlushAsync();
        }

        if (await Windows.System.UserProfile.UserProfilePersonalizationSettings.Current.TrySetWallpaperImageAsync(file))
        {
            showToastNotification("Start background image set successfull!");
        }

这些代码在移动设备上完美运行,但在桌面设备上却不一样。我使用 UserProfilePersonalizationSettings.IsSupported() 并确认支持该设备。

有一种方案可行:

  1. 首先将 WriteableBitmap 保存为桌面等地方的jpg图像。
  2. 将jpg图像复制到 ApplicationData.Current.LocalFolder
  3. 最后使用 TrySetWallpaperImageAsync(...) 来设置壁纸。
  4. 我不知道为什么上面的代码不适用于desktop =(

      

    以下是我下载图片的代码:

    private async Task<WriteableBitmap> loadImage(string url)
        {
            var response = await new HttpClient().GetAsync(url);
            byte[] imageByte = await response.Content.ReadAsByteArrayAsync();
    
            WriteableBitmap bitmap = new WriteableBitmap(1920, 1080);
    
            using (InMemoryRandomAccessStream randomStream = new InMemoryRandomAccessStream())
            {
                using (DataWriter writer = new DataWriter(randomStream))
                {
                    writer.WriteBytes(imageByte);
    
                    await writer.StoreAsync();
    
                    await writer.FlushAsync();
    
                    writer.DetachStream();
                }
    
                randomStream.Seek(0);
    
                await bitmap.SetSourceAsync(randomStream);
            }
            return bitmap;
        }
    

1 个答案:

答案 0 :(得分:-1)

在两个差异设备上测试我的应用程序并且工作正常后,我的PC似乎遇到了TrySetWallpaperImageAsyncTrySetLockscreenImageAsync API的问题。

经过一番研究后,问题是开发人员环境问题,我的PC上的Visual Studio / Windows SDK在运行代码时遇到了一些问题。

我部署了一个软件包并将其安装在我的电脑上,一切都很好。