2017-08-13 3 views
3

Problème: Je suis en train de créer une grille avec d'autres éléments de l'interface utilisateur (Zones de texte la plupart du temps), puis utiliser RenderTargetBitmap pour rendre la grille et enfin enregistrer dans un fichier image, sur un Contexte TâcheComment utiliser l'élément d'interface utilisateur XAML dans la tâche d'arrière-plan UWP?

ici est le code de la méthode:

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(); 
       } 
} 

Mais quand je fais appel cette méthode à partir de la méthode Run() de ma tâche de fond, je reçois l'erreur suivante: enter image description here

I googlé l'exception un peu et a constaté que pour mettre à jour des éléments de l'interface utilisateur de fil non de l'interface utilisateur que je dois utiliser:

await Windows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow.Dispatcher 
       .RunAsync(CoreDispatcherPriority.Normal, async() => { 
       await RenderGridAsync(); 
      }); 

mais même cela me donne une exception:

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 

D'après ce que j'obtiens de ceci est qu'une vue est attendue avant que les éléments d'interface utilisateur puissent être ajoutés, mais je dois rendre la grille et l'enregistrer dans une image dans la tâche d'arrière-plan. Auparavant, je l'ai atteint dans Windows Phone 8.1 sans aucun problème ..

Est-il impossible de travailler avec des éléments d'interface utilisateur sur une tâche d'arrière-plan ou une tâche non-interface utilisateur? Si oui, comment puis-je faire cela?

Répondre

3

Je crois que vous avez oublié d'implémenter XamlRenderingBackgroundTask.

Permet de créer une image bitmap à partir d'une arborescence XAML dans une tâche d'arrière-plan.

+2

C'est exactement ce dont j'avais besoin ..! L'implémentation de XamlRenderingBackgroundTask et le remplacement de la méthode OnRun (IBackgroundTaskInstance taskInstance) ont résolu mon problème ..! – Pratyay