Как использовать элемент пользовательского интерфейса XAML в фоновой задаче UWP?
Проблема: я пытаюсь создать сетку с некоторыми другими элементами пользовательского интерфейса (в основном это текстовые блоки), а затем использую RenderTargetBitmap
сделать сетку и, наконец, сохранить ее в файл изображения в фоновом режиме
Вот код для метода:
private async Task<bool> RenderGridAsync()
{
Grid mainGrid = new Grid();
TextBlock tText = new TextBlock()
{
HorizontalAlignment = HorizontalAlignment.Left,
TextWrapping = TextWrapping.Wrap,
Text = "Some Example Text",
VerticalAlignment = VerticalAlignment.Top,
FontSize = 72,
FontWeight = FontWeights.SemiLight
};
mainGrid.Children.add(tText);
RenderTargetBitmap rtb = new RenderTargetBitmap();
await rtb.RenderAsync(mainGrid);
var pixelBuffer = await rtb.GetPixelsAsync();
var pixels = pixelBuffer.ToArray();
var displayInformation = DisplayInformation.GetForCurrentView();
var file = await ApplicationData.Current.LocalFolder.CreateFileAsync("CurrentImage" + ".png", CreationCollisionOption.ReplaceExisting);
using (var stream = await file.OpenAsync(FileAccessMode.ReadWrite))
{
var encoder = await BitmapEncoder.CreateAsync(BitmapEncoder.PngEncoderId, stream);
encoder.SetPixelData(BitmapPixelFormat.Bgra8,
BitmapAlphaMode.Premultiplied,
(uint)rtb.PixelWidth,
(uint)rtb.PixelHeight,
displayInformation.RawDpiX,
displayInformation.RawDpiY,
pixels);
await encoder.FlushAsync();
}
}
Но когда я вызываю этот метод из метода Run() моей фоновой задачи, я получаю следующую ошибку:
Я немного погуглил исключение и обнаружил, что для обновления элементов пользовательского интерфейса из потока, не являющегося пользовательским интерфейсом, мне нужно использовать это:
await Windows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow.Dispatcher
.RunAsync(CoreDispatcherPriority.Normal, async () => {
await RenderGridAsync();
});
но даже это дает мне исключение:
Exception thrown: 'System.Runtime.InteropServices.COMException' in BackgroundTask.winmd
WinRT information: Could not create a new view because the main window has not yet been created
Из этого я получаю то, что представление ожидается до того, как элементы пользовательского интерфейса могут быть добавлены к нему, но я должен визуализировать сетку и сохранить ее в изображение в фоновой задаче. Ранее я добился этого в Windows Phone 8.1 без каких-либо проблем..
Разве нельзя работать с элементами пользовательского интерфейса над фоновой задачей или задачей без пользовательского интерфейса? Если да, как я могу это сделать?
1 ответ
Я полагаю, вы забыли осуществить XamlRenderingBackgroundTask
,
Предоставляет возможность создания растрового изображения из дерева XAML в фоновой задаче.